REDROOM
PHP 7.4.33
Path:
Logout
Edit File
Size: 2.73 MB
Close
/home/godevadmin/public_html/upload_images/home/000~ROOT~000/proc/self/root/opt/cpanel/composer/bin/composer
Text
Base64
IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCi8qCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENvbXBvc2VyLgogKgogKiAoYykgTmlscyBBZGVybWFubiA8bmFkZXJtYW5AbmFkZXJtYW4uZGU+CiAqICAgICBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKgogKiBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldwogKiB0aGUgbGljZW5zZSB0aGF0IGlzIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuCiAqLwoKLy8gQXZvaWQgQVBDIGNhdXNpbmcgcmFuZG9tIGZhdGFsIGVycm9ycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy8yNjQKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2FwYycpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZV9jbGknKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmNhY2hlX2J5X2RlZmF1bHQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oJ2FwYycpLCAnMy4wLjEyJywgJz49JykpIHsKICAgICAgICBpbmlfc2V0KCdhcGMuY2FjaGVfYnlfZGVmYXVsdCcsIDApOwogICAgfSBlbHNlIHsKICAgICAgICBmd3JpdGUoU1RERVJSLCAnV2FybmluZzogQVBDIDw9IDMuMC4xMiBtYXkgY2F1c2UgZmF0YWwgZXJyb3JzIHdoZW4gcnVubmluZyBjb21wb3NlciBjb21tYW5kcy4nLlBIUF9FT0wpOwogICAgICAgIGZ3cml0ZShTVERFUlIsICdVcGRhdGUgQVBDLCBvciBzZXQgYXBjLmVuYWJsZV9jbGkgb3IgYXBjLmNhY2hlX2J5X2RlZmF1bHQgdG8gMCBpbiB5b3VyIHBocC5pbmkuJy5QSFBfRU9MKTsKICAgIH0KfQoKaWYgKCFjbGFzc19leGlzdHMoJ1BoYXInKSkgewogICAgZWNobyAnUEhQXCdzIHBoYXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIENvbXBvc2VyIHJlcXVpcmVzIGl0IHRvIHJ1bi4gRW5hYmxlIHRoZSBleHRlbnNpb24gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1waGFyIHRoZW4gdHJ5IGFnYWluLicgLiBQSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKUGhhcjo6bWFwUGhhcignY29tcG9zZXIucGhhcicpOwpyZXF1aXJlICdwaGFyOi8vY29tcG9zZXIucGhhci9iaW4vY29tcG9zZXInOwoKX19IQUxUX0NPTVBJTEVSKCk7ID8+DQqHwQAAiQIAABEAAAABAA0AAABjb21wb3Nlci5waGFyAAAAACEAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvQXVkaXRvci5waHBuJAAASMEfZW4kAACbUoBmpAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0Fkdmlzb3J5L0lnbm9yZWRTZWN1cml0eUFkdmlzb3J5LnBocC8DAABIwR9lLwMAALTIHhukAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvUGFydGlhbFNlY3VyaXR5QWR2aXNvcnkucGhw7QQAAEjBH2XtBAAAGOiCMqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9BZHZpc29yeS9TZWN1cml0eUFkdmlzb3J5LnBocJ0EAABIwR9lnQQAAMOEZz6kAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvQXV0b2xvYWQvQXV0b2xvYWRHZW5lcmF0b3IucGhw3oYAAEjBH2XehgAAE3DeVqQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9BdXRvbG9hZC9DbGFzc01hcEdlbmVyYXRvci5waHCSBgAASMEfZZIGAACPqHxTpAEAAAAAAAAWAAAAc3JjL0NvbXBvc2VyL0NhY2hlLnBocFEbAABIwR9lURsAAMM7InykAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9BYm91dENvbW1hbmQucGhwVwMAAEjBH2VXAwAA4jqGIaQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0FyY2hpdmVDb21tYW5kLnBocCQbAABIwR9lJBsAAGRTV0GkAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9BdWRpdENvbW1hbmQucGhwvgoAAEjBH2W+CgAAhgnRNaQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0Jhc2VDb21tYW5kLnBocOQmAABIwR9l5CYAACBeL0WkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9CYXNlRGVwZW5kZW5jeUNvbW1hbmQucGhwwB0AAEjBH2XAHQAAnmnv46QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0J1bXBDb21tYW5kLnBocI4cAABIwR9ljhwAAHtWJ32kAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9DaGVja1BsYXRmb3JtUmVxc0NvbW1hbmQucGhwYBYAAEjBH2VgFgAAH/k8dKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NsZWFyQ2FjaGVDb21tYW5kLnBocBIJAABIwR9lEgkAABUDxSqkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Db21wbGV0aW9uVHJhaXQucGhwVxMAAEjBH2VXEwAAQM6K9qQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NvbmZpZ0NvbW1hbmQucGhwJXAAAEjBH2UlcAAA63Ac+qQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NyZWF0ZVByb2plY3RDb21tYW5kLnBocI1KAABIwR9ljUoAADZKYoekAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EZXBlbmRzQ29tbWFuZC5waHBFBQAASMEfZUUFAACBFHoSpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRGlhZ25vc2VDb21tYW5kLnBocK5RAABIwR9lrlEAANV9CZukAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EdW1wQXV0b2xvYWRDb21tYW5kLnBocM0SAABIwR9lzRIAADKr0EKkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9FeGVjQ29tbWFuZC5waHAODAAASMEfZQ4MAADPV6YApAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRnVuZENvbW1hbmQucGhwwQ4AAEjBH2XBDgAANWDIR6QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0dsb2JhbENvbW1hbmQucGhwjw8AAEjBH2WPDwAAIRLbuqQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0hvbWVDb21tYW5kLnBocF4PAABIwR9lXg8AAOsiK0OkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Jbml0Q29tbWFuZC5waHCkQgAASMEfZaRCAABkf/GzpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvSW5zdGFsbENvbW1hbmQucGhwXBoAAEjBH2VcGgAA9o2dt6QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0xpY2Vuc2VzQ29tbWFuZC5waHC9DwAASMEfZb0PAADGg2ldpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvT3V0ZGF0ZWRDb21tYW5kLnBocIURAABIwR9lhREAAKa2hfekAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9QYWNrYWdlRGlzY292ZXJ5VHJhaXQucGhwazYAAEjBH2VrNgAAViwh5aQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1Byb2hpYml0c0NvbW1hbmQucGhw5QUAAEjBH2XlBQAAykRy+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlaW5zdGFsbENvbW1hbmQucGhwhBoAAEjBH2WEGgAAKCG7ZaQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlbW92ZUNvbW1hbmQucGhwIy0AAEjBH2UjLQAAOKNboqQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlcXVpcmVDb21tYW5kLnBocO9YAABIwR9l71gAALwl94mkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9SdW5TY3JpcHRDb21tYW5kLnBocBISAABIwR9lEhIAAB9mvwSkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TY3JpcHRBbGlhc0NvbW1hbmQucGhw4AYAAEjBH2XgBgAAOMlU9aQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1NlYXJjaENvbW1hbmQucGhwbw8AAEjBH2VvDwAAx0+BqKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1NlbGZVcGRhdGVDb21tYW5kLnBocJhLAABIwR9lmEsAAGHK09+kAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TaG93Q29tbWFuZC5waHDTqgAASMEfZdOqAACRankGpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU3RhdHVzQ29tbWFuZC5waHCyFgAASMEfZbIWAAC6F2/EpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU3VnZ2VzdHNDb21tYW5kLnBocMkLAABIwR9lyQsAAPnPZmukAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9VcGRhdGVDb21tYW5kLnBocBE1AABIwR9lETUAAB2u2wikAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9WYWxpZGF0ZUNvbW1hbmQucGhwHhsAAEjBH2UeGwAAy5gO5KQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9Db21wb3Nlci5waHCdBwAASMEfZZ0HAAD5j++XpAEAAAAAAAAXAAAAc3JjL0NvbXBvc2VyL0NvbmZpZy5waHClNwAASMEfZaU3AACP/BFypAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0NvbmZpZy9Db25maWdTb3VyY2VJbnRlcmZhY2UucGhwugIAAEjBH2W6AgAAf70Y06QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db25maWcvSnNvbkNvbmZpZ1NvdXJjZS5waHBjGgAASMEfZWMaAADIIVQtpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvQXBwbGljYXRpb24ucGhwqk0AAEjBH2WqTQAA8LKXAaQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db25zb2xlL0dpdGh1YkFjdGlvbkVycm9yLnBocA8FAABIwR9lDwUAAGCxieakAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9IdG1sT3V0cHV0Rm9ybWF0dGVyLnBocD4HAABIwR9lPgcAANIM71KkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9JbnB1dC9JbnB1dEFyZ3VtZW50LnBocLYEAABIwR9ltgQAAKoPvEukAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9JbnB1dC9JbnB1dE9wdGlvbi5waHBnBQAASMEfZWcFAACINyc0pAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9EZWNpc2lvbnMucGhwjxEAAEjBH2WPEQAAKYOyJqQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvRGVmYXVsdFBvbGljeS5waHBsFQAASMEfZWwVAAA8RxWRpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9HZW5lcmljUnVsZS5waHCWAwAASMEfZZYDAABaGSntpAEAAAAAAAA4AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Mb2NhbFJlcG9UcmFuc2FjdGlvbi5waHC9AQAASMEfZb0BAADfmkiapAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Mb2NrVHJhbnNhY3Rpb24ucGhwSQsAAEjBH2VJCwAAVuiQr6QBAAAAAAAANQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvTXVsdGlDb25mbGljdFJ1bGUucGhwKwUAAEjBH2UrBQAAD8N37KQBAAAAAAAAPgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL0luc3RhbGxPcGVyYXRpb24ucGhw/wIAAEjBH2X/AgAAPfqnp6QBAAAAAAAASQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL01hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbi5waHAWAwAASMEfZRYDAAAAMU5KpAEAAAAAAABLAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9PcGVyYXRpb24vTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24ucGhwHAMAAEjBH2UcAwAAdHcNDaQBAAAAAAAAQAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL09wZXJhdGlvbkludGVyZmFjZS5waHD4AAAASMEfZfgAAAAW91f9pAEAAAAAAAA9AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9PcGVyYXRpb24vU29sdmVyT3BlcmF0aW9uLnBocEgBAABIwR9lSAEAAAQaFaekAQAAAAAAAEAAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9Vbmluc3RhbGxPcGVyYXRpb24ucGhw5wIAAEjBH2XnAgAAfMFSE6QBAAAAAAAAPQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL1VwZGF0ZU9wZXJhdGlvbi5waHCfBwAASMEfZZ8HAADcN+akpAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qb2xpY3lJbnRlcmZhY2UucGhwngEAAEjBH2WeAQAA+AHO4aQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9vbC5waHCgEgAASMEfZaASAAB4RiEXpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qb29sQnVpbGRlci5waHBSRgAASMEfZVJGAADsTPvspAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qb29sT3B0aW1pemVyLnBocNspAABIwR9l2ykAAKUhElykAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1Byb2JsZW0ucGhw+E4AAEjBH2X4TgAA4sjyMaQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUmVxdWVzdC5waHCPEAAASMEfZY8QAADAm3PcpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlLnBocDwwAABIwR9lPDAAAMCz+QSkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1J1bGUyTGl0ZXJhbHMucGhwAQUAAEjBH2UBBQAADzN2/qQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVNldC5waHCjCwAASMEfZaMLAAB18qnEpAEAAAAAAAA0AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlU2V0R2VuZXJhdG9yLnBocD0bAABIwR9lPRsAAGvFGAGkAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1J1bGVTZXRJdGVyYXRvci5waHD1BQAASMEfZfUFAACcDHkTpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlV2F0Y2hDaGFpbi5waHB7AQAASMEfZXsBAACCaPNEpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlV2F0Y2hHcmFwaC5waHCcCQAASMEfZZwJAABanHt8pAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlV2F0Y2hOb2RlLnBocHYEAABIwR9ldgQAAHCZCLekAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1NvbHZlci5waHCzNwAASMEfZbM3AAATsnvXpAEAAAAAAAA2AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Tb2x2ZXJCdWdFeGNlcHRpb24ucGhwuQEAAEjBH2W5AQAAeq0WPaQBAAAAAAAAOwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvU29sdmVyUHJvYmxlbXNFeGNlcHRpb24ucGhwnBAAAEjBH2WcEAAAvC69wKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvVHJhbnNhY3Rpb24ucGhwLRsAAEjBH2UtGwAAyekBk6QBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0FyY2hpdmVEb3dubG9hZGVyLnBocPoRAABIwR9l+hEAANOQJZqkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9DaGFuZ2VSZXBvcnRJbnRlcmZhY2UucGhw9QAAAEjBH2X1AAAArcPCQqQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0Rvd25sb2FkTWFuYWdlci5waHCqHwAASMEfZaofAACynD9npAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRG93bmxvYWRlckludGVyZmFjZS5waHDTAwAASMEfZdMDAABibVvIpAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRHZjc0Rvd25sb2FkZXJJbnRlcmZhY2UucGhw+gAAAEjBH2X6AAAA4BElJ6QBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0ZpbGVEb3dubG9hZGVyLnBocAIyAABIwR9lAjIAAFdjykSkAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9GaWxlc3lzdGVtRXhjZXB0aW9uLnBocC8BAABIwR9lLwEAACGL5SakAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9Gb3NzaWxEb3dubG9hZGVyLnBocGkNAABIwR9laQ0AAKGLWhqkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9HaXREb3dubG9hZGVyLnBocABFAABIwR9lAEUAAEH1m0CkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9HemlwRG93bmxvYWRlci5waHCxBQAASMEfZbEFAADtiXb3pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvSGdEb3dubG9hZGVyLnBocD8LAABIwR9lPwsAAIAvjBKkAQAAAAAAADgAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9NYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uLnBocIwAAABIwR9ljAAAANq6HdSkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9QYXRoRG93bmxvYWRlci5waHAqHwAASMEfZSofAACvEz9hpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUGVyZm9yY2VEb3dubG9hZGVyLnBocIsJAABIwR9liwkAAJA8rZ2kAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9QaGFyRG93bmxvYWRlci5waHCqAQAASMEfZaoBAABYyMgSpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUmFyRG93bmxvYWRlci5waHCbBgAASMEfZZsGAAAaRxJVpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvU3ZuRG93bmxvYWRlci5waHCDGAAASMEfZYMYAACFfSUipAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVGFyRG93bmxvYWRlci5waHCoAQAASMEfZagBAADXct+CpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVHJhbnNwb3J0RXhjZXB0aW9uLnBocHMDAABIwR9lcwMAABX4BQ2kAQAAAAAAADkAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9WY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZS5waHD9AAAASMEfZf0AAAAd5DakpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVmNzRG93bmxvYWRlci5waHA2HQAASMEfZTYdAABfd5j4pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvWHpEb3dubG9hZGVyLnBocK0CAABIwR9lrQIAACbYcoKkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9aaXBEb3dubG9hZGVyLnBocJcjAABIwR9llyMAAJ7WypukAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvRXZlbnREaXNwYXRjaGVyL0V2ZW50LnBocNgCAABIwR9l2AIAAIX3ofCkAQAAAAAAADAAAABzcmMvQ29tcG9zZXIvRXZlbnREaXNwYXRjaGVyL0V2ZW50RGlzcGF0Y2hlci5waHCyQAAASMEfZbJAAABBhTjApAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL0V2ZW50RGlzcGF0Y2hlci9FdmVudFN1YnNjcmliZXJJbnRlcmZhY2UucGhwwgAAAEjBH2XCAAAAfT3pCKQBAAAAAAAAOQAAAHNyYy9Db21wb3Nlci9FdmVudERpc3BhdGNoZXIvU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uLnBocJEAAABIwR9lkQAAAFh26M+kAQAAAAAAADkAAABzcmMvQ29tcG9zZXIvRXhjZXB0aW9uL0lycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbi5waHCPAAAASMEfZY8AAAAw3jQNpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0V4Y2VwdGlvbi9Ob1NzbEV4Y2VwdGlvbi5waHCBAAAASMEfZYEAAADYVabSpAEAAAAAAAAYAAAAc3JjL0NvbXBvc2VyL0ZhY3RvcnkucGhwkk8AAEjBH2WSTwAA+FRsqaQBAAAAAAAAVAAAAHNyYy9Db21wb3Nlci9GaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci9JZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLnBocFMBAABIwR9lUwEAAH5KHeWkAQAAAAAAAFUAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIucGhwWQcAAEjBH2VZBwAA0YikFqQBAAAAAAAAWAAAAHNyYy9Db21wb3Nlci9GaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci9JZ25vcmVOb3RoaW5nUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci5waHAHAQAASMEfZQcBAAB+uiYjpAEAAAAAAABSAAAAc3JjL0NvbXBvc2VyL0ZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5LnBocHcDAABIwR9ldwMAANFUA7+kAQAAAAAAAFQAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZS5waHC/AAAASMEfZb8AAADXHIBupAEAAAAAAAAaAAAAc3JjL0NvbXBvc2VyL0lPL0Jhc2VJTy5waHDYFgAASMEfZdgWAAAghB0IpAEAAAAAAAAcAAAAc3JjL0NvbXBvc2VyL0lPL0J1ZmZlcklPLnBocHsHAABIwR9lewcAABlAGE2kAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvSU8vQ29uc29sZUlPLnBocOsZAABIwR9l6xkAAAar/eKkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvSU8vSU9JbnRlcmZhY2UucGhw0AcAAEjBH2XQBwAAfv9oraQBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9JTy9OdWxsSU8ucGhwTwUAAEjBH2VPBQAAYoioc6QBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIucGhwi4gAAEjBH2WLiAAAQxUuN6QBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvQmluYXJ5SW5zdGFsbGVyLnBocHApAABIwR9lcCkAAHzb4kukAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0JpbmFyeVByZXNlbmNlSW50ZXJmYWNlLnBocOYAAABIwR9l5gAAAK4zl4ykAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxhdGlvbk1hbmFnZXIucGhwnTUAAEjBH2WdNQAAJda916QBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvSW5zdGFsbGVyRXZlbnQucGhwKgQAAEjBH2UqBAAARlrk2aQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvSW5zdGFsbGVyRXZlbnRzLnBocKUAAABIwR9lpQAAAD6V7cekAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxlckludGVyZmFjZS5waHB+BAAASMEfZX4EAAAAzZTVpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9MaWJyYXJ5SW5zdGFsbGVyLnBocA8eAABIwR9lDx4AALodYzKkAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL01ldGFwYWNrYWdlSW5zdGFsbGVyLnBocNYIAABIwR9l1ggAAPsK9SKkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL05vb3BJbnN0YWxsZXIucGhwYQcAAEjBH2VhBwAA6nhRbqQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvUGFja2FnZUV2ZW50LnBocPQEAABIwR9l9AQAAGKRXEGkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1BhY2thZ2VFdmVudHMucGhw+wEAAEjBH2X7AQAA8qt/S6QBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvUGx1Z2luSW5zdGFsbGVyLnBocDQNAABIwR9lNA0AABTF8xukAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1Byb2plY3RJbnN0YWxsZXIucGhwOQkAAEjBH2U5CQAAAVXRhqQBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlci5waHClEQAASMEfZaURAAD2lE/rpAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL0pzb24vSnNvbkZpbGUucGhwWRwAAEjBH2VZHAAAOPJoEKQBAAAAAAAAIwAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25Gb3JtYXR0ZXIucGhwwAYAAEjBH2XABgAA+EFx5aQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25NYW5pcHVsYXRvci5waHBMNgAASMEfZUw2AADEtfAYpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0pzb24vSnNvblZhbGlkYXRpb25FeGNlcHRpb24ucGhwlwEAAEjBH2WXAQAAnV5etKQBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9QSFBTdGFuL0NvbmZpZ1JldHVyblR5cGVFeHRlbnNpb24ucGhwlhQAAEjBH2WWFAAAdW8G/KQBAAAAAAAAOgAAAHNyYy9Db21wb3Nlci9QSFBTdGFuL1J1bGVSZWFzb25EYXRhUmV0dXJuVHlwZUV4dGVuc2lvbi5waHB+CAAASMEfZX4IAACm56xIpAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQWxpYXNQYWNrYWdlLnBocGsYAABIwR9laxgAAK4aiemkAQAAAAAAADcAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9BcmNoaXZhYmxlRmlsZXNGaWx0ZXIucGhwUwIAAEjBH2VTAgAAJzI1ZqQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0FyY2hpdmFibGVGaWxlc0ZpbmRlci5waHBsBgAASMEfZWwGAABtdRIhpAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQXJjaGl2ZU1hbmFnZXIucGhwIRQAAEjBH2UhFAAAaugq3qQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0FyY2hpdmVySW50ZXJmYWNlLnBocFMBAABIwR9lUwEAAP/sP+6kAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9CYXNlRXhjbHVkZUZpbHRlci5waHAQBwAASMEfZRAHAAB4xjbIpAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQ29tcG9zZXJFeGNsdWRlRmlsdGVyLnBocD8BAABIwR9lPwEAAD+PYF6kAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9HaXRFeGNsdWRlRmlsdGVyLnBocCQDAABIwR9lJAMAAHSPOE6kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9QaGFyQXJjaGl2ZXIucGhwxgYAAEjBH2XGBgAALe3ZqqQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL1ppcEFyY2hpdmVyLnBocI4GAABIwR9ljgYAAGFF0BGkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9CYXNlUGFja2FnZS5waHD2EQAASMEfZfYRAAD/ocLMpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQ29tcGFyZXIvQ29tcGFyZXIucGhwpgkAAEjBH2WmCQAANwNG4qQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0NvbXBsZXRlQWxpYXNQYWNrYWdlLnBocHEKAABIwR9lcQoAAPogI7ekAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Db21wbGV0ZVBhY2thZ2UucGhwBQoAAEjBH2UFCgAAhqBKsaQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0NvbXBsZXRlUGFja2FnZUludGVyZmFjZS5waHCdBQAASMEfZZ0FAACJkZQXpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvRHVtcGVyL0FycmF5RHVtcGVyLnBocEgNAABIwR9lSA0AACiqHKCkAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9MaW5rLnBocPYHAABIwR9l9gcAAKAiaqWkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvQXJyYXlMb2FkZXIucGhw2y0AAEjBH2XbLQAAddDkx6QBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9JbnZhbGlkUGFja2FnZUV4Y2VwdGlvbi5waHCEAgAASMEfZYQCAADoTfyVpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9hZGVyL0pzb25Mb2FkZXIucGhwkwMAAEjBH2WTAwAA6KSiNKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9Mb2FkZXJJbnRlcmZhY2UucGhwngEAAEjBH2WeAQAAF0ZCpKQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9Sb290UGFja2FnZUxvYWRlci5waHAZHAAASMEfZRkcAADRaJu9pAEAAAAAAAA1AAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9hZGVyL1ZhbGlkYXRpbmdBcnJheUxvYWRlci5waHAJTgAASMEfZQlOAABMFvMnpAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9ja2VyLnBocJsvAABIwR9lmy8AAOqnifmkAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9QYWNrYWdlLnBocF8kAABIwR9lXyQAAFLzQkqkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9QYWNrYWdlSW50ZXJmYWNlLnBocNMLAABIwR9l0wsAAF3AxOGkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Sb290QWxpYXNQYWNrYWdlLnBocOcLAABIwR9l5wsAAEE6lkSkAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Sb290UGFja2FnZS5waHCpBQAASMEfZakFAAAdGwm6pAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUm9vdFBhY2thZ2VJbnRlcmZhY2UucGhwOQUAAEjBH2U5BQAAiKgQ7KQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vU3RhYmlsaXR5RmlsdGVyLnBocBUCAABIwR9lFQIAALXqcvqkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1ZlcnNpb25CdW1wZXIucGhwDQsAAEjBH2UNCwAAYAVP8aQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vVmVyc2lvbkd1ZXNzZXIucGhw5ScAAEjBH2XlJwAAGkiskaQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vVmVyc2lvblBhcnNlci5waHDUBwAASMEfZdQHAADY4JLmpAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvVmVyc2lvbi9WZXJzaW9uU2VsZWN0b3IucGhwiRgAAEjBH2WJGAAAUag0nKQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9QYXJ0aWFsQ29tcG9zZXIucGhw/gUAAEjBH2X+BQAAqPkLmqQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9QbGF0Zm9ybS9IaHZtRGV0ZWN0b3IucGhwLQUAAEjBH2UtBQAAkILAI6QBAAAAAAAAIQAAAHNyYy9Db21wb3Nlci9QbGF0Zm9ybS9SdW50aW1lLnBocO8EAABIwR9l7wQAAG9eMSWkAQAAAAAAACEAAABzcmMvQ29tcG9zZXIvUGxhdGZvcm0vVmVyc2lvbi5waHCoBwAASMEfZagHAAAWuxoYpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9DYXBhYmlsaXR5L0NhcGFiaWxpdHkucGhwcAAAAEjBH2VwAAAAmiNjO6QBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ2FwYWJpbGl0eS9Db21tYW5kUHJvdmlkZXIucGhwsAAAAEjBH2WwAAAARvzZpKQBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ2FwYWJsZS5waHCYAAAASMEfZZgAAAD7sGiqpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9Db21tYW5kRXZlbnQucGhwPwMAAEjBH2U/AwAAfFVgHqQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbi5waHCnAAAASMEfZacAAAAR9vlypAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QbHVnaW5FdmVudHMucGhwqAEAAEjBH2WoAQAAXEuT1qQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUGx1Z2luSW50ZXJmYWNlLnBocKsBAABIwR9lqwEAAPUxaQ2kAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvUGx1Z2luL1BsdWdpbk1hbmFnZXIucGhwjU0AAEjBH2WNTQAADnYOpaQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUG9zdEZpbGVEb3dubG9hZEV2ZW50LnBocL8FAABIwR9lvwUAAOBAPomkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvUGx1Z2luL1ByZUNvbW1hbmRSdW5FdmVudC5waHAvAgAASMEfZS8CAAAzCbEUpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QcmVGaWxlRG93bmxvYWRFdmVudC5waHCgBQAASMEfZaAFAAC0cYpspAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QcmVQb29sQ3JlYXRlRXZlbnQucGhwsQcAAEjBH2WxBwAABfO826QBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9RdWVzdGlvbi9TdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbi5waHCVBQAASMEfZZUFAAB4lLtBpAEAAAAAAAA1AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQWR2aXNvcnlQcm92aWRlckludGVyZmFjZS5waHCpAQAASMEfZakBAAAQldCwpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQXJyYXlSZXBvc2l0b3J5LnBocDQaAABIwR9lNBoAALqN0tWkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9BcnRpZmFjdFJlcG9zaXRvcnkucGhwdAwAAEjBH2V0DAAAkBnU46QBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0Nhbm9uaWNhbFBhY2thZ2VzVHJhaXQucGhwxAIAAEjBH2XEAgAAG6Z766QBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0NvbXBvc2VyUmVwb3NpdG9yeS5waHDUsgAASMEfZdSyAACSvrW8pAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQ29tcG9zaXRlUmVwb3NpdG9yeS5waHCFDAAASMEfZYUMAAD7qxrfpAEAAAAAAAA7AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZS5waHChAAAASMEfZaEAAABjZSoypAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvRmlsZXN5c3RlbVJlcG9zaXRvcnkucGhwFyMAAEjBH2UXIwAAbf20c6QBAAAAAAAALAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0ZpbHRlclJlcG9zaXRvcnkucGhwZxAAAEjBH2VnEAAAK69GvqQBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZEFycmF5UmVwb3NpdG9yeS5waHBYAQAASMEfZVgBAAC8LFt/pAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvSW5zdGFsbGVkRmlsZXN5c3RlbVJlcG9zaXRvcnkucGhwSgEAAEjBH2VKAQAAJ2tD6KQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZFJlcG9zaXRvcnkucGhwSxgAAEjBH2VLGAAAeZnhkqQBAAAAAAAAOAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UucGhw4AAAAEjBH2XgAAAAvrL/Z6QBAAAAAAAANgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0ludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uLnBocIcAAABIwR9lhwAAAA1XPF+kAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Mb2NrQXJyYXlSZXBvc2l0b3J5LnBocOIAAABIwR9l4gAAAABehvqkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9QYWNrYWdlUmVwb3NpdG9yeS5waHAMBAAASMEfZQwEAABcLyr+pAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUGF0aFJlcG9zaXRvcnkucGhwjRIAAEjBH2WNEgAA5yxqDaQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1BlYXJSZXBvc2l0b3J5LnBocAcBAABIwR9lBwEAAFF1z2qkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9QbGF0Zm9ybVJlcG9zaXRvcnkucGhwqFYAAEjBH2WoVgAAHIl9qaQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1JlcG9zaXRvcnlGYWN0b3J5LnBocFcXAABIwR9lVxcAAOgRESikAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5SW50ZXJmYWNlLnBocKQDAABIwR9lpAMAACwEDTqkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5TWFuYWdlci5waHCiCwAASMEfZaILAAAHLH1+pAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uLnBocIgAAABIwR9liAAAAHGc13SkAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5U2V0LnBocDAhAABIwR9lMCEAAFRkHOSkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5VXRpbHMucGhwEgQAAEjBH2USBAAASRezeqQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Jvb3RQYWNrYWdlUmVwb3NpdG9yeS5waHBcAQAASMEfZVwBAAC+YDn8pAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0Zvc3NpbERyaXZlci5waHBCFAAASMEfZUIUAAB+Kp2mpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdEJpdGJ1Y2tldERyaXZlci5waHDWJgAASMEfZdYmAADreSGGpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdERyaXZlci5waHBzFwAASMEfZXMXAAC8hCXdpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdEh1YkRyaXZlci5waHAhOQAASMEfZSE5AAC6lDe+pAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0dpdExhYkRyaXZlci5waHCGMgAASMEfZYYyAADghNy4pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL0hnRHJpdmVyLnBocOUTAABIwR9l5RMAAGzr8TmkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvUGVyZm9yY2VEcml2ZXIucGhwEQsAAEjBH2URCwAAziX/2qQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9Tdm5Ecml2ZXIucGhwKx8AAEjBH2UrHwAA31RjrKQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9WY3NEcml2ZXIucGhwDQsAAEjBH2UNCwAAzib+OqQBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9WY3NEcml2ZXJJbnRlcmZhY2UucGhwsQMAAEjBH2WxAwAAVIqE+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjc1JlcG9zaXRvcnkucGhwaTQAAEjBH2VpNAAAYnH5B6QBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1ZlcnNpb25DYWNoZUludGVyZmFjZS5waHC5AAAASMEfZbkAAACCaAiHpAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvV3JpdGFibGVBcnJheVJlcG9zaXRvcnkucGhw2QIAAEjBH2XZAgAAbCa0I6QBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1dyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZS5waHB3AgAASMEfZXcCAADVfrwwpAEAAAAAAAAdAAAAc3JjL0NvbXBvc2VyL1NjcmlwdC9FdmVudC5waHDlBAAASMEfZeUEAACKvKB5pAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1NjcmlwdC9TY3JpcHRFdmVudHMucGhwSQMAAEjBH2VJAwAApKNENKQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9TZWxmVXBkYXRlL0tleXMucGhw2QEAAEjBH2XZAQAAyQyoc6QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9TZWxmVXBkYXRlL1ZlcnNpb25zLnBocFwJAABIwR9lXAkAAG5N6DCkAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvVXRpbC9BdXRoSGVscGVyLnBocHYjAABIwR9ldiMAADPMHrGkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvVXRpbC9CaXRidWNrZXQucGhwOBoAAEjBH2U4GgAAWYLU66QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9VdGlsL0NvbXBvc2VyTWlycm9yLnBocAwGAABIwR9lDAYAALfNSXOkAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvVXRpbC9Db25maWdWYWxpZGF0b3IucGhwZRcAAEjBH2VlFwAA0TO2sKQBAAAAAAAAIgAAAHNyYy9Db21wb3Nlci9VdGlsL0Vycm9ySGFuZGxlci5waHBMBQAASMEfZUwFAABRJczjpAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1V0aWwvRmlsZXN5c3RlbS5waHCWPwAASMEfZZY/AAD4va8qpAEAAAAAAAAZAAAAc3JjL0NvbXBvc2VyL1V0aWwvR2l0LnBocPc6AABIwR9l9zoAAP9lOQikAQAAAAAAABwAAABzcmMvQ29tcG9zZXIvVXRpbC9HaXRIdWIucGhwHBQAAEjBH2UcFAAA71XriKQBAAAAAAAAHAAAAHNyYy9Db21wb3Nlci9VdGlsL0dpdExhYi5waHCOHAAASMEfZY4cAADkcwsApAEAAAAAAAAYAAAAc3JjL0NvbXBvc2VyL1V0aWwvSGcucGhwRAgAAEjBH2VECAAA+bp2QaQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvQ3VybERvd25sb2FkZXIucGhwDkwAAEjBH2UOTAAAmON4gqQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvQ3VybFJlc3BvbnNlLnBocJUBAABIwR9llQEAAJI7qbmkAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL1Byb3h5SGVscGVyLnBocJEKAABIwR9lkQoAAC9cXwmkAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL1Byb3h5TWFuYWdlci5waHB6CgAASMEfZXoKAABGEqhRpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cC9SZXF1ZXN0UHJveHkucGhwZwMAAEjBH2VnAwAAzIfytaQBAAAAAAAAIwAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvUmVzcG9uc2UucGhw4wUAAEjBH2XjBQAA1m1SXqQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHBEb3dubG9hZGVyLnBocO8pAABIwR9l7ykAAPMna/akAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvVXRpbC9JbmlIZWxwZXIucGhwjgIAAEjBH2WOAgAAmW2uQqQBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9VdGlsL0xvb3AucGhw/QcAAEjBH2X9BwAAn/sOo6QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9VdGlsL01ldGFkYXRhTWluaWZpZXIucGhwQwEAAEjBH2VDAQAAZBgMmKQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9VdGlsL05vUHJveHlQYXR0ZXJuLnBocCgXAABIwR9lKBcAAE37DaGkAQAAAAAAACEAAABzcmMvQ29tcG9zZXIvVXRpbC9QYWNrYWdlSW5mby5waHDgAgAASMEfZeACAACPUhhYpAEAAAAAAAAjAAAAc3JjL0NvbXBvc2VyL1V0aWwvUGFja2FnZVNvcnRlci5waHDFCAAASMEfZcUIAAD2tZuepAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL1V0aWwvUGVyZm9yY2UucGhwIjQAAEjBH2UiNAAARY9RW6QBAAAAAAAAHgAAAHNyYy9Db21wb3Nlci9VdGlsL1BsYXRmb3JtLnBocNQRAABIwR9l1BEAAIiTks2kAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvVXRpbC9Qcm9jZXNzRXhlY3V0b3IucGhwmyAAAEjBH2WbIAAArp/73qQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9VdGlsL1JlbW90ZUZpbGVzeXN0ZW0ucGhw1kAAAEjBH2XWQAAACopSVaQBAAAAAAAAHgAAAHNyYy9Db21wb3Nlci9VdGlsL1NpbGVuY2VyLnBocPwCAABIwR9l/AIAANDllcCkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvVXRpbC9TdHJlYW1Db250ZXh0RmFjdG9yeS5waHCAFAAASMEfZYAUAAD9KX/FpAEAAAAAAAAZAAAAc3JjL0NvbXBvc2VyL1V0aWwvU3ZuLnBocPQUAABIwR9l9BQAANVMpTikAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvVXRpbC9TeW5jSGVscGVyLnBocP8EAABIwR9l/wQAANB6G0GkAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvVXRpbC9UYXIucGhwhQQAAEjBH2WFBAAA98x0P6QBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9VdGlsL1Rsc0hlbHBlci5waHBqCwAASMEfZWoLAADQp4ZRpAEAAAAAAAAZAAAAc3JjL0NvbXBvc2VyL1V0aWwvVXJsLnBocNkMAABIwR9l2QwAAFGXX0+kAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvVXRpbC9aaXAucGhwDwgAAEjBH2UPCAAAo0TZkaQBAAAAAAAAEQAAAHNyYy9ib290c3RyYXAucGhwCgIAAEjBH2UKAgAA0cQtyKQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9BdXRvbG9hZC9DbGFzc0xvYWRlci5waHD6PwAASMEfZfo/AAAyQBx1pAEAAAAAAAAiAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocA8/AABIwR9lDz8AACAyqsWkAQAAAAAAACMAAAByZXMvY29tcG9zZXItcmVwb3NpdG9yeS1zY2hlbWEuanNvbvEPAABIwR9l8Q8AAHww4ISkAQAAAAAAABgAAAByZXMvY29tcG9zZXItc2NoZW1hLmpzb25/xQAASMEfZX/FAAC0c1CYpAEAAAAAAAATAAAAdmVuZG9yL2F1dG9sb2FkLnBocG8CAABIwR9lbwIAAHeNtxmkAQAAAAAAAB8AAAB2ZW5kb3IvY29tcG9zZXIvQ2xhc3NMb2FkZXIucGhwLxwAAEjBH2UvHAAAmNXikqQBAAAAAAAAJQAAAHZlbmRvci9jb21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHARFwAASMEfZREXAACQeBFHpAEAAAAAAAAlAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX2NsYXNzbWFwLnBocPIDAABIwR9l8gMAAOrw2dekAQAAAAAAACIAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfZmlsZXMucGhwEgQAAEjBH2USBAAAi2ViZKQBAAAAAAAAJwAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9uYW1lc3BhY2VzLnBocFoAAABIwR9lWgAAAOum4ZakAQAAAAAAACEAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfcHNyNC5waHCuCAAASMEfZa4IAAD6EllJpAEAAAAAAAAhAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX3JlYWwucGhwxgQAAEjBH2XGBAAA9fzO0qQBAAAAAAAAIwAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9zdGF0aWMucGhwMBgAAEjBH2UwGAAAodBfi6QBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9jYS1idW5kbGUvTElDRU5TRR4EAABIwR9lHgQAAEcJB1+kAQAAAAAAACgAAAB2ZW5kb3IvY29tcG9zZXIvY2EtYnVuZGxlL3Jlcy9jYWNlcnQucGVtHmEDAEjBH2UeYQMAIk031aQBAAAAAAAAKgAAAHZlbmRvci9jb21wb3Nlci9jYS1idW5kbGUvc3JjL0NhQnVuZGxlLnBocJUkAABIwR9llSQAANtu0wekAQAAAAAAACsAAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9MSUNFTlNFHgQAAEjBH2UeBAAAPfm+9aQBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYy9DbGFzc01hcC5waHDABAAASMEfZcAEAABjvsNbpAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL0NsYXNzTWFwR2VuZXJhdG9yLnBocJsZAABIwR9lmxkAALRBDE2kAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvRmlsZUxpc3QucGhwJAEAAEjBH2UkAQAAaPRTcaQBAAAAAAAAOgAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYy9QaHBGaWxlQ2xlYW5lci5waHASEAAASMEfZRIQAACaNRddpAEAAAAAAAA5AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL1BocEZpbGVQYXJzZXIucGhwUQsAAEjBH2VRCwAA8m9heaQBAAAAAAAAHQAAAHZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwjCAAAEjBH2WMIAAATf64IqQBAAAAAAAAKQAAAHZlbmRvci9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9MSUNFTlNFHgQAAEjBH2UeBAAAvaPrx6QBAAAAAAAAOgAAAHZlbmRvci9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9zcmMvTWV0YWRhdGFNaW5pZmllci5waHDQBAAASMEfZdAEAADCMCbApAEAAAAAAAAcAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvTElDRU5TRR4EAABIwR9lHgQAAL2j68ekAQAAAAAAACsAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hBbGxSZXN1bHQucGhwHQEAAEjBH2UdAQAACVw5/6QBAAAAAAAANwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdC5waHApAQAASMEfZSkBAABoSZ+FpAEAAAAAAAA2AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQucGhwKgEAAEjBH2UqAQAA+EEJ4KQBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaFJlc3VsdC5waHDvAAAASMEfZe8AAAA8BuTApAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoU3RyaWN0R3JvdXBzUmVzdWx0LnBocPsAAABIwR9l+wAAAKfLMFGkAQAAAAAAADMAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hXaXRoT2Zmc2V0c1Jlc3VsdC5waHD8AAAASMEfZfwAAAB7KixvpAEAAAAAAAAqAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BjcmVFeGNlcHRpb24ucGhwSQMAAEjBH2VJAwAAzOAKN6QBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QcmVnLnBocPshAABIwR9l+yEAAAyDgxikAQAAAAAAACIAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUmVnZXgucGhwAg0AAEjBH2UCDQAA4H0dXaQBAAAAAAAAKgAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9SZXBsYWNlUmVzdWx0LnBocBYBAABIwR9lFgEAACexyPCkAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbi5waHASAQAASMEfZRIBAACg7sDypAEAAAAAAAAeAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9MSUNFTlNFHgQAAEjBH2UeBAAAx1NSbaQBAAAAAAAAKQAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbXBhcmF0b3IucGhwEAQAAEjBH2UQBAAAXl9Fk6QBAAAAAAAALwAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbXBpbGluZ01hdGNoZXIucGhwYwYAAEjBH2VjBgAAhIAPpqQBAAAAAAAALwAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvQm91bmQucGhwdwUAAEjBH2V3BQAAVzRdV6QBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvQ29uc3RyYWludC5waHD4HQAASMEfZfgdAACSi4i9pAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9Db25zdHJhaW50SW50ZXJmYWNlLnBocKEBAABIwR9loQEAAI41tHmkAQAAAAAAADwAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L01hdGNoQWxsQ29uc3RyYWludC5waHCvAgAASMEfZa8CAACyRRf6pAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9NYXRjaE5vbmVDb25zdHJhaW50LnBocMkCAABIwR9lyQIAANav2K6kAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L011bHRpQ29uc3RyYWludC5waHCKEwAASMEfZYoTAADN1RvEpAEAAAAAAAAnAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvSW50ZXJ2YWwucGhw5gMAAEjBH2XmAwAAPVsUaaQBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0ludGVydmFscy5waHCkKwAASMEfZaQrAABAMbqrpAEAAAAAAAAlAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvU2VtdmVyLnBocPkGAABIwR9l+QYAAOETLWmkAQAAAAAAACwAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9WZXJzaW9uUGFyc2VyLnBocP8sAABIwR9l/ywAAKYzqtCkAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9MSUNFTlNFHgQAAEjBH2UeBAAAx1NSbaQBAAAAAAAANgAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3Jlcy9zcGR4LWV4Y2VwdGlvbnMuanNvbrgLAABIwR9luAsAAMI0REOkAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9yZXMvc3BkeC1saWNlbnNlcy5qc29uPMIAAEjBH2U8wgAAFz3rOKQBAAAAAAAAMgAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYy9TcGR4TGljZW5zZXMucGhwexUAAEjBH2V7FQAACGNFnaQBAAAAAAAAJgAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9MSUNFTlNFKwQAAEjBH2UrBAAA1uNAVKQBAAAAAAAAMAAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvUGhwQ29uZmlnLnBocIkDAABIwR9liQMAAGfUj3akAQAAAAAAAC4AAAB2ZW5kb3IvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjL1Byb2Nlc3MucGhw1gUAAEjBH2XWBQAAbxE3vqQBAAAAAAAALQAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvU3RhdHVzLnBocLoMAABIwR9lugwAAHhmMTekAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjL1hkZWJ1Z0hhbmRsZXIucGhwcikAAEjBH2VyKQAAONVjNqQBAAAAAAAAKAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL0xJQ0VOU0UiBAAASMEfZSIEAAAMfLuZpAEAAAAAAABOAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQmFzZUNvbnN0cmFpbnQucGhwoQkAAEjBH2WhCQAAhnfMbKQBAAAAAAAAVAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0NvbGxlY3Rpb25Db25zdHJhaW50LnBocIMKAABIwR9lgwoAAJ64PZqkAQAAAAAAAEoAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9Db25zdHJhaW50LnBocMENAABIwR9lwQ0AAJZQRkakAQAAAAAAAFMAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9Db25zdHJhaW50SW50ZXJmYWNlLnBocLwBAABIwR9lvAEAAP8gUZykAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9FbnVtQ29uc3RyYWludC5waHBcAwAASMEfZVwDAABff339pAEAAAAAAABHAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRmFjdG9yeS5waHDgDAAASMEfZeAMAADrkl+UpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRm9ybWF0Q29uc3RyYWludC5waHBzFAAASMEfZXMUAABkBQvepAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvTnVtYmVyQ29uc3RyYWludC5waHCDCQAASMEfZYMJAABlkAyopAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvT2JqZWN0Q29uc3RyYWludC5waHC3EQAASMEfZbcRAAAlbKz2pAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvU2NoZW1hQ29uc3RyYWludC5waHAmCQAASMEfZSYJAAA3OPespAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvU3RyaW5nQ29uc3RyYWludC5waHB6BAAASMEfZXoEAAD5ZsV+pAEAAAAAAABYAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVHlwZUNoZWNrL0xvb3NlVHlwZUNoZWNrLnBocGEEAABIwR9lYQQAAAsJccOkAQAAAAAAAFkAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ2hlY2svU3RyaWN0VHlwZUNoZWNrLnBocJcCAABIwR9llwIAADR+vqCkAQAAAAAAAFwAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ2hlY2svVHlwZUNoZWNrSW50ZXJmYWNlLnBocIkBAABIwR9liQEAAJO1K2qkAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ29uc3RyYWludC5waHAqDwAASMEfZSoPAAAxljROpAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVW5kZWZpbmVkQ29uc3RyYWludC5waHAsIgAASMEfZSwiAAAXAYktpAEAAAAAAABGAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRW50aXR5L0pzb25Qb2ludGVyLnBocOgGAABIwR9l6AYAAAZ7TpakAQAAAAAAAFAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vRXhjZXB0aW9uSW50ZXJmYWNlLnBocEkAAABIwR9lSQAAACV8GbCkAQAAAAAAAFYAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocJUAAABIwR9llQAAAIvgRwWkAQAAAAAAAFQAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZENvbmZpZ0V4Y2VwdGlvbi5waHBsAAAASMEfZWwAAABBIUzXpAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0ludmFsaWRTY2hlbWFFeGNlcHRpb24ucGhwbAAAAEjBH2VsAAAA6DL3/qQBAAAAAAAAXQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9JbnZhbGlkU2NoZW1hTWVkaWFUeXBlRXhjZXB0aW9uLnBocHUAAABIwR9ldQAAAD1o5wekAQAAAAAAAFcAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZFNvdXJjZVVyaUV4Y2VwdGlvbi5waHB3AAAASMEfZXcAAABOLfJbpAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0pzb25EZWNvZGluZ0V4Y2VwdGlvbi5waHDeAgAASMEfZd4CAABcuA0KpAEAAAAAAABXAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24ucGhwbwAAAEjBH2VvAAAAcO3b+aQBAAAAAAAATgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocIUAAABIwR9lhQAAAAglhZekAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24ucGhwgAAAAEjBH2WAAAAAdS0jMaQBAAAAAAAAUgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9VcmlSZXNvbHZlckV4Y2VwdGlvbi5waHBqAAAASMEfZWoAAADlGj6PpAEAAAAAAABRAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1ZhbGlkYXRpb25FeGNlcHRpb24ucGhwZgAAAEjBH2VmAAAArKSE/qQBAAAAAAAASwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0l0ZXJhdG9yL09iamVjdEl0ZXJhdG9yLnBocP4FAABIwR9l/gUAAE2PhPWkAQAAAAAAADsAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9SZmMzMzM5LnBocKACAABIwR9loAIAAGY097OkAQAAAAAAAEEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9TY2hlbWFTdG9yYWdlLnBocJMNAABIwR9lkw0AACZ6316kAQAAAAAAAEoAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9TY2hlbWFTdG9yYWdlSW50ZXJmYWNlLnBocAEBAABIwR9lAQEAAG+KK32kAQAAAAAAAFQAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvUmV0cmlldmVycy9BYnN0cmFjdFJldHJpZXZlci5waHDhAAAASMEfZeEAAABb/kGBpAEAAAAAAABHAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvQ3VybC5waHCjBAAASMEfZaMEAADHkvSmpAEAAAAAAABSAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvRmlsZUdldENvbnRlbnRzLnBocCAFAABIwR9lIAUAAKPBHxakAQAAAAAAAFIAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvUmV0cmlldmVycy9QcmVkZWZpbmVkQXJyYXkucGhwLAIAAEjBH2UsAgAAMZU1/qQBAAAAAAAAWAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL1VyaVJldHJpZXZlckludGVyZmFjZS5waHCuAAAASMEfZa4AAAD/i8HlpAEAAAAAAABDAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1VyaVJlc29sdmVyLnBocAQLAABIwR9lBAsAAOYGGlCkAQAAAAAAAEQAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvVXJpUmV0cmlldmVyLnBocEAUAABIwR9lQBQAADUbzjOkAQAAAAAAAEgAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmlSZXNvbHZlckludGVyZmFjZS5waHCDAAAASMEfZYMAAAASSoAfpAEAAAAAAABJAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpUmV0cmlldmVySW50ZXJmYWNlLnBocIUAAABIwR9lhQAAAO3mG2WkAQAAAAAAAD0AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9WYWxpZGF0b3IucGhwcwUAAEjBH2VzBQAA38GRI6QBAAAAAAAAHAAAAHZlbmRvci9wc3IvY29udGFpbmVyL0xJQ0VOU0V7BAAASMEfZXsEAADV0wBlpAEAAAAAAAA4AAAAdmVuZG9yL3Bzci9jb250YWluZXIvc3JjL0NvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZS5waHBOAAAASMEfZU4AAAD8TBiDpAEAAAAAAAAvAAAAdmVuZG9yL3Bzci9jb250YWluZXIvc3JjL0NvbnRhaW5lckludGVyZmFjZS5waHC3AAAASMEfZbcAAACK4wG8pAEAAAAAAAA3AAAAdmVuZG9yL3Bzci9jb250YWluZXIvc3JjL05vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlLnBocHEAAABIwR9lcQAAAFJ/+vWkAQAAAAAAABYAAAB2ZW5kb3IvcHNyL2xvZy9MSUNFTlNFPwQAAEjBH2U/BAAAhPkJCKQBAAAAAAAAKQAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvQWJzdHJhY3RMb2dnZXIucGhwOwQAAEjBH2U7BAAA8T4zW6QBAAAAAAAAMwAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocGAAAABIwR9lYAAAACCIWDGkAQAAAAAAACMAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0xvZ0xldmVsLnBocPsAAABIwR9l+wAAAGrw8TikAQAAAAAAAC8AAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0xvZ2dlckF3YXJlSW50ZXJmYWNlLnBocHwAAABIwR9lfAAAACQTo4ikAQAAAAAAACsAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0xvZ2dlckF3YXJlVHJhaXQucGhwpwAAAEjBH2WnAAAAVL36QqQBAAAAAAAAKgAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvTG9nZ2VySW50ZXJmYWNlLnBocMgCAABIwR9lyAIAAJofeB2kAQAAAAAAACYAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0xvZ2dlclRyYWl0LnBocGsEAABIwR9lawQAAKN9iZKkAQAAAAAAACUAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL051bGxMb2dnZXIucGhwnwAAAEjBH2WfAAAAgVjzqqQBAAAAAAAAKQAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvVGVzdC9EdW1teVRlc3QucGhwcAAAAEjBH2VwAAAAGhXOBaQBAAAAAAAAMwAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvVGVzdC9Mb2dnZXJJbnRlcmZhY2VUZXN0LnBocCANAABIwR9lIA0AAB0kL9KkAQAAAAAAACoAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL1Rlc3QvVGVzdExvZ2dlci5waHA8CAAASMEfZTwIAAD+KOVJpAEAAAAAAAAcAAAAdmVuZG9yL3JlYWN0L3Byb21pc2UvTElDRU5TRWkEAABIwR9laQQAABAzfYukAQAAAAAAACUAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvRGVmZXJyZWQucGhwTwIAAEjBH2VPAgAA7PpdT6QBAAAAAAAAOQAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9FeGNlcHRpb24vQ29tcG9zaXRlRXhjZXB0aW9uLnBocIwBAABIwR9ljAEAACGMz+KkAQAAAAAAADYAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvRXhjZXB0aW9uL0xlbmd0aEV4Y2VwdGlvbi5waHBeAAAASMEfZV4AAAAEP3EEpAEAAAAAAAA3AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0ludGVybmFsL0NhbmNlbGxhdGlvblF1ZXVlLnBocHIDAABIwR9lcgMAAIF4X7GkAQAAAAAAADYAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvSW50ZXJuYWwvRnVsZmlsbGVkUHJvbWlzZS5waHB1BQAASMEfZXUFAABvVhqZpAEAAAAAAAA1AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0ludGVybmFsL1JlamVjdGVkUHJvbWlzZS5waHDiCAAASMEfZeIIAABfHgzbpAEAAAAAAAAkAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL1Byb21pc2UucGhwAhMAAEjBH2UCEwAAPb8HSKQBAAAAAAAALQAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9Qcm9taXNlSW50ZXJmYWNlLnBocGkCAABIwR9laQIAACYdXSikAQAAAAAAACYAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvZnVuY3Rpb25zLnBocI0UAABIwR9ljRQAAGw6xLakAQAAAAAAAC4AAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvZnVuY3Rpb25zX2luY2x1ZGUucGhwXQAAAEjBH2VdAAAAUdE8oaQBAAAAAAAAHAAAAHZlbmRvci9zZWxkL2pzb25saW50L0xJQ0VOU0UkBAAASMEfZSQEAAA0Ood+pAEAAAAAAABAAAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvRHVwbGljYXRlS2V5RXhjZXB0aW9uLnBocH0BAABIwR9lfQEAANuFROqkAQAAAAAAADUAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludC9Kc29uUGFyc2VyLnBocAE1AABIwR9lATUAACgSFuakAQAAAAAAADAAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludC9MZXhlci5waHAzFAAASMEfZTMUAAAf9m5bpAEAAAAAAAA7AAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvUGFyc2luZ0V4Y2VwdGlvbi5waHAoAQAASMEfZSgBAAA+23Z9pAEAAAAAAAA0AAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvVW5kZWZpbmVkLnBocD4AAABIwR9lPgAAAP9xn5+kAQAAAAAAAB4AAAB2ZW5kb3Ivc2VsZC9waGFyLXV0aWxzL0xJQ0VOU0UkBAAASMEfZSQEAACaLE2npAEAAAAAAAAlAAAAdmVuZG9yL3NlbGQvcGhhci11dGlscy9zcmMvTGludGVyLnBocGkHAABIwR9laQcAAKAbjd6kAQAAAAAAACkAAAB2ZW5kb3Ivc2VsZC9waGFyLXV0aWxzL3NyYy9UaW1lc3RhbXBzLnBocF4NAABIwR9lXg0AAJ3lw0SkAQAAAAAAACIAAAB2ZW5kb3Ivc2VsZC9zaWduYWwtaGFuZGxlci9MSUNFTlNFJAQAAEjBH2UkBAAAmixNp6QBAAAAAAAAMAAAAHZlbmRvci9zZWxkL3NpZ25hbC1oYW5kbGVyL3NyYy9TaWduYWxIYW5kbGVyLnBocLAdAABIwR9lsB0AAIEAFgqkAQAAAAAAACYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0FwcGxpY2F0aW9uLnBocAFxAABIwR9lAXEAAPW/LdakAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0F0dHJpYnV0ZS9Bc0NvbW1hbmQucGhw1AEAAEjBH2XUAQAAvTPc/qQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ0kvR2l0aHViQWN0aW9uUmVwb3J0ZXIucGhw6QUAAEjBH2XpBQAAkgsbNaQBAAAAAAAAIAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29sb3IucGhwaA4AAEjBH2VoDgAAR2Lnl6QBAAAAAAAAKgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9Db21tYW5kLnBocEYnAABIwR9lRicAAAX7uf6kAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvQ29tcGxldGVDb21tYW5kLnBocIsWAABIwR9lixYAAL4PfRukAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvRHVtcENvbXBsZXRpb25Db21tYW5kLnBocJAPAABIwR9lkA8AADmbBjmkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvSGVscENvbW1hbmQucGhwFQkAAEjBH2UVCQAACH2XpaQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9MYXp5Q29tbWFuZC5waHCYDwAASMEfZZgPAADkFwF+pAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0xpc3RDb21tYW5kLnBocDEJAABIwR9lMQkAACREu3ykAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvTG9ja2FibGVUcmFpdC5waHAOBAAASMEfZQ4EAAAuH7pWpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL1NpZ25hbGFibGVDb21tYW5kSW50ZXJmYWNlLnBocNMAAABIwR9l0wAAALtCYL6kAQAAAAAAAD8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmRMb2FkZXIvQ29tbWFuZExvYWRlckludGVyZmFjZS5waHBRAQAASMEfZVEBAACbEJ5IpAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kTG9hZGVyL0NvbnRhaW5lckNvbW1hbmRMb2FkZXIucGhwVQMAAEjBH2VVAwAAG8tf/KQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZExvYWRlci9GYWN0b3J5Q29tbWFuZExvYWRlci5waHCvAgAASMEfZa8CAABkvCJ6pAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21wbGV0aW9uL0NvbXBsZXRpb25JbnB1dC5waHAWEwAASMEfZRYTAACUJIRrpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21wbGV0aW9uL0NvbXBsZXRpb25TdWdnZXN0aW9ucy5waHDCAwAASMEfZcIDAAASQaEfpAEAAAAAAABBAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21wbGV0aW9uL091dHB1dC9CYXNoQ29tcGxldGlvbk91dHB1dC5waHBnAgAASMEfZWcCAACH7PlXpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21wbGV0aW9uL091dHB1dC9Db21wbGV0aW9uT3V0cHV0SW50ZXJmYWNlLnBocEYBAABIwR9lRgEAANQybk2kAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbXBsZXRpb24vU3VnZ2VzdGlvbi5waHAzAQAASMEfZTMBAADMhiAdpAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db25zb2xlRXZlbnRzLnBocNUCAABIwR9l1QIAAIFnd12kAQAAAAAAACEAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0N1cnNvci5waHCPCQAASMEfZY8JAADGq6eOpAEAAAAAAABEAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXBlbmRlbmN5SW5qZWN0aW9uL0FkZENvbnNvbGVDb21tYW5kUGFzcy5waHBmEQAASMEfZWYRAAAj1CAkpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL0FwcGxpY2F0aW9uRGVzY3JpcHRpb24ucGhw2AkAAEjBH2XYCQAAPazEpaQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9EZXNjcmlwdG9yLnBocH0HAABIwR9lfQcAALHqM16kAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvRGVzY3JpcHRvckludGVyZmFjZS5waHD3AAAASMEfZfcAAAC15UDgpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL0pzb25EZXNjcmlwdG9yLnBocOsQAABIwR9l6xAAADEl6I+kAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvTWFya2Rvd25EZXNjcmlwdG9yLnBocFEUAABIwR9lURQAAHSgiHakAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvVGV4dERlc2NyaXB0b3IucGhw5yIAAEjBH2XnIgAAyLjMy6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9YbWxEZXNjcmlwdG9yLnBocAcfAABIwR9lBx8AAIcFArakAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVDb21tYW5kRXZlbnQucGhwxgEAAEjBH2XGAQAAILxPfqQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnQvQ29uc29sZUVycm9yRXZlbnQucGhw/AMAAEjBH2X8AwAAwKmWsqQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnQvQ29uc29sZUV2ZW50LnBocMYCAABIwR9lxgIAAMVv29mkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVTaWduYWxFdmVudC5waHBHAgAASMEfZUcCAACO+xsLpAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlVGVybWluYXRlRXZlbnQucGhwfgIAAEjBH2V+AgAAaHK91qQBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnRMaXN0ZW5lci9FcnJvckxpc3RlbmVyLnBocCYIAABIwR9lJggAAFj2666kAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9Db21tYW5kTm90Rm91bmRFeGNlcHRpb24ucGhw2gEAAEjBH2XaAQAAiHfq7aQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHB5AAAASMEfZXkAAADZOVsmpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocKYAAABIwR9lpgAAANbMvVqkAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9JbnZhbGlkT3B0aW9uRXhjZXB0aW9uLnBocKYAAABIwR9lpgAAABPL10ikAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9Mb2dpY0V4Y2VwdGlvbi5waHCSAAAASMEfZZIAAADNT1xlpAEAAAAAAAA6AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vTWlzc2luZ0lucHV0RXhjZXB0aW9uLnBocJwAAABIwR9lnAAAAOZTCv6kAQAAAAAAAD8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9OYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbi5waHCLAAAASMEfZYsAAACC826ppAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCWAAAASMEfZZYAAADZ7Sw2pAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvTnVsbE91dHB1dEZvcm1hdHRlci5waHCNAgAASMEfZY0CAAAhJg11pAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvTnVsbE91dHB1dEZvcm1hdHRlclN0eWxlLnBocAoCAABIwR9lCgIAANTHJWikAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXIucGhwfxUAAEjBH2V/FQAA3OalEqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlckludGVyZmFjZS5waHCjAQAASMEfZaMBAABZIKffpAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVyU3R5bGUucGhwdgcAAEjBH2V2BwAADWvTjaQBAAAAAAAAQgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlLnBocJ0BAABIwR9lnQEAAMxaBsOkAQAAAAAAAD4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXJTdHlsZVN0YWNrLnBocIMFAABIwR9lgwUAAEaXeLGkAQAAAAAAAEYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9XcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UucGhw1gAAAEjBH2XWAAAAoVoBt6QBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0RlYnVnRm9ybWF0dGVySGVscGVyLnBocLgIAABIwR9luAgAAKTwNqCkAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9EZXNjcmlwdG9ySGVscGVyLnBocMAFAABIwR9lwAUAAKZnzISkAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9EdW1wZXIucGhwEgUAAEjBH2USBQAA/tLcvaQBAAAAAAAAMQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0Zvcm1hdHRlckhlbHBlci5waHBpBQAASMEfZWkFAACktoB3pAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvSGVscGVyLnBocIsMAABIwR9liwwAADTf4WWkAQAAAAAAADEAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9IZWxwZXJJbnRlcmZhY2UucGhw5QAAAEjBH2XlAAAAH4qgGKQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0hlbHBlclNldC5waHBHBQAASMEfZUcFAACb3cuQpAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvSW5wdXRBd2FyZUhlbHBlci5waHBjAQAASMEfZWMBAAAGzPiDpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvUHJvY2Vzc0hlbHBlci5waHBXDAAASMEfZVcMAABlwtENpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvUHJvZ3Jlc3NCYXIucGhwSy8AAEjBH2VLLwAAFVbS7qQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1Byb2dyZXNzSW5kaWNhdG9yLnBocMASAABIwR9lwBIAAJE93takAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9RdWVzdGlvbkhlbHBlci5waHDBLgAASMEfZcEuAADa18OzpAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvU3ltZm9ueVF1ZXN0aW9uSGVscGVyLnBocBkJAABIwR9lGQkAAOCdZP+kAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9UYWJsZS5waHA6SgAASMEfZTpKAACW0P+2pAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVDZWxsLnBocEEEAABIwR9lQQQAAOjToH+kAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9UYWJsZUNlbGxTdHlsZS5waHDuBQAASMEfZe4FAADRjblfpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVSb3dzLnBocCkBAABIwR9lKQEAAFeKM3qkAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9UYWJsZVNlcGFyYXRvci5waHDFAAAASMEfZcUAAAC89cv8pAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVTdHlsZS5waHCIFAAASMEfZYgUAAAYDqXWpAEAAAAAAAAqAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9Bcmd2SW5wdXQucGhwKRwAAEjBH2UpHAAAwGSj76QBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvQXJyYXlJbnB1dC5waHAHDQAASMEfZQcNAACgFSSppAEAAAAAAAAmAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dC5waHCjDQAASMEfZaMNAAAI6zEEpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dEFyZ3VtZW50LnBocBYGAABIwR9lFgYAAITdJgukAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0QXdhcmVJbnRlcmZhY2UucGhwmAAAAEjBH2WYAAAArQ9PsKQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXREZWZpbml0aW9uLnBocCMaAABIwR9lIxoAAAmMITOkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0SW50ZXJmYWNlLnBocPwDAABIwR9l/AMAAEe29KikAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0T3B0aW9uLnBocOcNAABIwR9l5w0AAL75QkCkAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L1N0cmVhbWFibGVJbnB1dEludGVyZmFjZS5waHDOAAAASMEfZc4AAADW1UKbpAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9TdHJpbmdJbnB1dC5waHA/BgAASMEfZT8GAACxkhTLpAEAAAAAAAAeAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9MSUNFTlNFLgQAAEjBH2UuBAAA97oCa6QBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvTG9nZ2VyL0NvbnNvbGVMb2dnZXIucGhwBAsAAEjBH2UECwAAxwwOUaQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L0J1ZmZlcmVkT3V0cHV0LnBocGwBAABIwR9lbAEAAHk6uBCkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9Db25zb2xlT3V0cHV0LnBocI8JAABIwR9ljwkAAMLcFcKkAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9Db25zb2xlT3V0cHV0SW50ZXJmYWNlLnBocBIBAABIwR9lEgEAAInq97SkAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9Db25zb2xlU2VjdGlvbk91dHB1dC5waHCTCQAASMEfZZMJAABP1jDJpAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvTnVsbE91dHB1dC5waHBCBAAASMEfZUIEAAAlI1LGpAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvT3V0cHV0LnBocMcJAABIwR9lxwkAAKBDLLCkAQAAAAAAADEAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9PdXRwdXRJbnRlcmZhY2UucGhw7QMAAEjBH2XtAwAA8I6+BaQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L1N0cmVhbU91dHB1dC5waHCnBQAASMEfZacFAAAxWPKDpAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvVHJpbW1lZEJ1ZmZlck91dHB1dC5waHDaAwAASMEfZdoDAADFse0MpAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9RdWVzdGlvbi9DaG9pY2VRdWVzdGlvbi5waHDdCgAASMEfZd0KAAAJY+SmpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9RdWVzdGlvbi9Db25maXJtYXRpb25RdWVzdGlvbi5waHACAwAASMEfZQIDAADuecWEpAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9RdWVzdGlvbi9RdWVzdGlvbi5waHAgDQAASMEfZSANAAC1jbVUpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9SZXNvdXJjZXMvYmluL2hpZGRlbmlucHV0LmV4ZQAkAABIwR9lACQAAJWNpXakAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Jlc291cmNlcy9jb21wbGV0aW9uLmJhc2jJCgAASMEfZckKAAAIoHoopAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9TaWduYWxSZWdpc3RyeS9TaWduYWxSZWdpc3RyeS5waHAhBAAASMEfZSEEAAB+LjqvpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9TaW5nbGVDb21tYW5kQXBwbGljYXRpb24ucGhwNQQAAEjBH2U1BAAAF8LioqQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU3R5bGUvT3V0cHV0U3R5bGUucGhwdAcAAEjBH2V0BwAATxY7xqQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU3R5bGUvU3R5bGVJbnRlcmZhY2UucGhwDQQAAEjBH2UNBAAA3aGIF6QBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU3R5bGUvU3ltZm9ueVN0eWxlLnBocC0nAABIwR9lLScAAI29wL+kAQAAAAAAACMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlcm1pbmFsLnBocIQLAABIwR9lhAsAAM45rj+kAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9BcHBsaWNhdGlvblRlc3Rlci5waHCMBAAASMEfZYwEAAAeH0n7pAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXN0ZXIvQ29tbWFuZENvbXBsZXRpb25UZXN0ZXIucGhw2gMAAEjBH2XaAwAAyps7sKQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL0NvbW1hbmRUZXN0ZXIucGhw2QMAAEjBH2XZAwAARAi2B6QBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL0NvbnN0cmFpbnQvQ29tbWFuZElzU3VjY2Vzc2Z1bC5waHDWAgAASMEfZdYCAAAexoOCpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXN0ZXIvVGVzdGVyVHJhaXQucGhwrA0AAEjBH2WsDQAAMidMsqQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy9MSUNFTlNFKwQAAEjBH2UrBAAAhnb5saQBAAAAAAAAMQAAAHZlbmRvci9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy9mdW5jdGlvbi5waHA9AQAASMEfZT0BAACewbQNpAEAAAAAAAA6AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vRXhjZXB0aW9uSW50ZXJmYWNlLnBocHwAAABIwR9lfAAAAI0F6USkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9GaWxlTm90Rm91bmRFeGNlcHRpb24ucGhwzgEAAEjBH2XOAQAAJpDyl6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0lPRXhjZXB0aW9uLnBocJkBAABIwR9lmQEAAK/gXM6kAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9JT0V4Y2VwdGlvbkludGVyZmFjZS5waHCmAAAASMEfZaYAAABq2XdNpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocKkAAABIwR9lqQAAAI0hDsekAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJkAAABIwR9lmQAAAN1VVUikAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW0ucGhwUUEAAEjBH2VRQQAAuhnW2KQBAAAAAAAAIQAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vTElDRU5TRS4EAABIwR9lLgQAAPe6AmukAQAAAAAAACIAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL1BhdGgucGhwPScAAEjBH2U9JwAA9YY0TKQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9Db21wYXJhdG9yL0NvbXBhcmF0b3IucGhwMwcAAEjBH2UzBwAAEr/IaKQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9Db21wYXJhdG9yL0RhdGVDb21wYXJhdG9yLnBocAUDAABIwR9lBQMAAM8l+mWkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvQ29tcGFyYXRvci9OdW1iZXJDb21wYXJhdG9yLnBocHoDAABIwR9legMAACu8AGikAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvRXhjZXB0aW9uL0FjY2Vzc0RlbmllZEV4Y2VwdGlvbi5waHCEAAAASMEfZYQAAAC9vnOcpAEAAAAAAAA+AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0V4Y2VwdGlvbi9EaXJlY3RvcnlOb3RGb3VuZEV4Y2VwdGlvbi5waHCJAAAASMEfZYkAAABhKf8bpAEAAAAAAAAgAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0ZpbmRlci5waHDWJwAASMEfZdYnAACOBT/kpAEAAAAAAAAjAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0dpdGlnbm9yZS5waHCzBwAASMEfZbMHAAAccwk0pAEAAAAAAAAeAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0dsb2IucGhwxwYAAEjBH2XHBgAARGKHs6QBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9DdXN0b21GaWx0ZXJJdGVyYXRvci5waHBjAgAASMEfZWMCAAATN/CZpAEAAAAAAAA6AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0RhdGVSYW5nZUZpbHRlckl0ZXJhdG9yLnBocI8CAABIwR9ljwIAAFCaf3OkAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRGVwdGhSYW5nZUZpbHRlckl0ZXJhdG9yLnBocBcCAABIwR9lFwIAAKeOAxKkAQAAAAAAAEEAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRXhjbHVkZURpcmVjdG9yeUZpbHRlckl0ZXJhdG9yLnBocDAGAABIwR9lMAYAAAMud3akAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRmlsZVR5cGVGaWx0ZXJJdGVyYXRvci5waHCIAgAASMEfZYgCAABetiL7pAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0ZpbGVjb250ZW50RmlsdGVySXRlcmF0b3IucGhwVwIAAEjBH2VXAgAAwsUS2aQBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9GaWxlbmFtZUZpbHRlckl0ZXJhdG9yLnBocJQBAABIwR9llAEAAD2Z3PSkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvTGF6eUl0ZXJhdG9yLnBocFEBAABIwR9lUQEAAG5dv7ykAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvTXVsdGlwbGVQY3JlRmlsdGVySXRlcmF0b3IucGhwjQUAAEjBH2WNBQAAooDXF6QBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9QYXRoRmlsdGVySXRlcmF0b3IucGhw8gEAAEjBH2XyAQAAZxQiX6QBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9SZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvci5waHDmCAAASMEfZeYIAADaNPlEpAEAAAAAAAA6AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL1NpemVSYW5nZUZpbHRlckl0ZXJhdG9yLnBocHwCAABIwR9lfAIAAAYz2Z+kAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvU29ydGFibGVJdGVyYXRvci5waHAoCgAASMEfZSgKAADT4q4PpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL1Zjc0lnbm9yZWRGaWx0ZXJJdGVyYXRvci5waHB3CgAASMEfZXcKAADFtR0zpAEAAAAAAAAdAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0xJQ0VOU0UuBAAASMEfZS4EAAD3ugJrpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL1NwbEZpbGVJbmZvLnBocL0DAABIwR9lvQMAAAd5BRukAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS9DdHlwZS5waHCHCgAASMEfZYcKAAB+tmS4pAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvTElDRU5TRS4EAABIwR9lLgQAAKa4qVikAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS9ib290c3RyYXAucGhwMgUAAEjBH2UyBQAAyGGtOKQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWN0eXBlL2Jvb3RzdHJhcDgwLnBocGgFAABIwR9laAUAAEu/ebikAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL0dyYXBoZW1lLnBocNoYAABIwR9l2hgAAI0NmxakAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL0xJQ0VOU0UuBAAASMEfZS4EAADLHB9rpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9ib290c3RyYXAucGhwzwcAAEjBH2XPBwAA/TnAfKQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwODAucGhwWQkAAEjBH2VZCQAAqAEhoKQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9MSUNFTlNFLgQAAEjBH2UuBAAAyxwfa6QBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9Ob3JtYWxpemVyLnBocPYWAABIwR9l9hYAAOpp3WWkAQAAAAAAAEYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3N0dWJzL05vcm1hbGl6ZXIucGhwLgEAAEjBH2UuAQAAUXMkl6QBAAAAAAAAUgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvdW5pZGF0YS9jYW5vbmljYWxDb21wb3NpdGlvbi5waHCJPQAASMEfZYk9AAAq728/pAEAAAAAAABUAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy91bmlkYXRhL2Nhbm9uaWNhbERlY29tcG9zaXRpb24ucGhwYYgAAEjBH2VhiAAA51K9faQBAAAAAAAATAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvdW5pZGF0YS9jb21iaW5pbmdDbGFzcy5waHB0LgAASMEfZXQuAAALcZDcpAEAAAAAAABYAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy91bmlkYXRhL2NvbXBhdGliaWxpdHlEZWNvbXBvc2l0aW9uLnBocJnoAABIwR9lmegAAG+UZSmkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvYm9vdHN0cmFwLnBocOsBAABIwR9l6wEAAFD6o0SkAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvYm9vdHN0cmFwODAucGhw6QEAAEjBH2XpAQAAPeVytKQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL0xJQ0VOU0UuBAAASMEfZS4EAADLHB9rpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvTWJzdHJpbmcucGhwmFMAAEjBH2WYUwAAM+ogZqQBAAAAAAAAQgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL1Jlc291cmNlcy91bmlkYXRhL2Nhc2VGb2xkaW5nLnBocJUHAABIwR9llQcAAPS2s+OkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9SZXNvdXJjZXMvdW5pZGF0YS9sb3dlckNhc2UucGhw+VQAAEjBH2X5VAAAA5WxK6QBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL1Jlc291cmNlcy91bmlkYXRhL3RpdGxlQ2FzZVJlZ2V4cC5waHDjFwAASMEfZeMXAAD2eV+VpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvUmVzb3VyY2VzL3VuaWRhdGEvdXBwZXJDYXNlLnBocDhbAABIwR9lOFsAACtS2CqkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwyBsAAEjBH2XIGwAAJ3dAMKQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL2Jvb3RzdHJhcDgwLnBocNchAABIwR9l1yEAAOMNLtGkAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9MSUNFTlNFLgQAAEjBH2UuBAAApripWKQBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDczL1BocDczLnBocG4BAABIwR9lbgEAAENzpWykAQAAAAAAAD8AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9SZXNvdXJjZXMvc3R1YnMvSnNvbkV4Y2VwdGlvbi5waHBbAAAASMEfZVsAAABNGLLcpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvYm9vdHN0cmFwLnBocPkCAABIwR9l+QIAAEFZOMakAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9MSUNFTlNFLgQAAEjBH2UuBAAAB+T0iKQBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1BocDgwLnBocKEJAABIwR9loQkAAFvCawukAQAAAAAAACoAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9QaHBUb2tlbi5waHATBQAASMEfZRMFAABNowBJpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL0F0dHJpYnV0ZS5waHDHAQAASMEfZccBAADd3u37pAEAAAAAAAA6AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1BocFRva2VuLnBocI0AAABIwR9ljQAAANqUBd2kAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvU3RyaW5nYWJsZS5waHBrAAAASMEfZWsAAAAe0P0rpAEAAAAAAABFAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwXQAAAEjBH2VdAAAAumfDFqQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9WYWx1ZUVycm9yLnBocFQAAABIwR9lVAAAAJHWd5ekAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9ib290c3RyYXAucGhw+gQAAEjBH2X6BAAA1+7lAqQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL0xJQ0VOU0UuBAAASMEfZS4EAAA7Y6mnpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUGhwODEucGhwOwEAAEjBH2U7AQAAFvmrZKQBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9DVVJMU3RyaW5nRmlsZS5waHCDAwAASMEfZYMDAABoGNgIpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL1JldHVyblR5cGVXaWxsQ2hhbmdlLnBocJ8AAABIwR9lnwAAAM7AvvykAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9ib290c3RyYXAucGhw9AEAAEjBH2X0AQAAiNPQXKQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHB5AAAASMEfZXkAAABxVlhKpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocKgAAABIwR9lqAAAANDAK1+kAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9Mb2dpY0V4Y2VwdGlvbi5waHCUAAAASMEfZZQAAAAgs+PxpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbi5waHB4AwAASMEfZXgDAACozHp5pAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uLnBocBECAABIwR9lEQIAAFnXqeKkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9Qcm9jZXNzVGltZWRPdXRFeGNlcHRpb24ucGhwMQQAAEjBH2UxBAAAgidaFaQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL1J1bnRpbWVFeGNlcHRpb24ucGhwmAAAAEjBH2WYAAAAohvYOqQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhlY3V0YWJsZUZpbmRlci5waHC5BAAASMEfZbkEAACThJA9pAEAAAAAAAAmAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9JbnB1dFN0cmVhbS5waHAvBAAASMEfZS8EAACmuWWHpAEAAAAAAAAeAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9MSUNFTlNFLgQAAEjBH2UuBAAA97oCa6QBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGhwRXhlY3V0YWJsZUZpbmRlci5waHCSBQAASMEfZZIFAADAuCx4pAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9QaHBQcm9jZXNzLnBocPIEAABIwR9l8gQAAJJzEf+kAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL0Fic3RyYWN0UGlwZXMucGhwHgsAAEjBH2UeCwAAAmtTUaQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGlwZXMvUGlwZXNJbnRlcmZhY2UucGhwmQEAAEjBH2WZAQAAZlHaDKQBAAAAAAAAKgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGlwZXMvVW5peFBpcGVzLnBocIAIAABIwR9lgAgAAL6UVnakAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL1dpbmRvd3NQaXBlcy5waHAsDQAASMEfZSwNAAB4UWrDpAEAAAAAAAAiAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9Qcm9jZXNzLnBocAVmAABIwR9lBWYAADLkw3ykAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1Byb2Nlc3NVdGlscy5waHAUAwAASMEfZRQDAADTD1jspAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvQXR0cmlidXRlL1JlcXVpcmVkLnBocKgAAABIwR9lqAAAAHhq64SkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9BdHRyaWJ1dGUvU3Vic2NyaWJlZFNlcnZpY2UucGhwCgEAAEjBH2UKAQAAMUmuVKQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL0xJQ0VOU0UrBAAASMEfZSsEAABKiEWgpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvUmVzZXRJbnRlcmZhY2UucGhweQAAAEjBH2V5AAAAsLdq5aQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VMb2NhdG9yVHJhaXQucGhw4wkAAEjBH2XjCQAAIo816aQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VQcm92aWRlckludGVyZmFjZS5waHDeAAAASMEfZd4AAAD6UuhrpAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvU2VydmljZVN1YnNjcmliZXJJbnRlcmZhY2UucGhwswAAAEjBH2WzAAAAl/ZkDKQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VTdWJzY3JpYmVyVHJhaXQucGhwUwoAAEjBH2VTCgAAqus0o6QBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1Rlc3QvU2VydmljZUxvY2F0b3JUZXN0LnBocJgIAABIwR9lmAgAAFc3fEekAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvQWJzdHJhY3RTdHJpbmcucGhwrDMAAEjBH2WsMwAAmPOK1qQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9BYnN0cmFjdFVuaWNvZGVTdHJpbmcucGhwu1IAAEjBH2W7UgAAIQuS06QBAAAAAAAAJAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9CeXRlU3RyaW5nLnBocPcrAABIwR9l9ysAAEDAu5KkAQAAAAAAACkAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvQ29kZVBvaW50U3RyaW5nLnBocPEXAABIwR9l8RcAAJ87M8ukAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHBzAAAASMEfZXMAAABxSFaRpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0V4Y2VwdGlvbi9JbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ucGhwogAAAEjBH2WiAAAAHwWlQaQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCSAAAASMEfZZIAAAB1kRJnpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0luZmxlY3Rvci9FbmdsaXNoSW5mbGVjdG9yLnBocMgXAABIwR9lyBcAAFfUelCkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvSW5mbGVjdG9yL0ZyZW5jaEluZmxlY3Rvci5waHCICgAASMEfZYgKAAC3ihJIpAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0luZmxlY3Rvci9JbmZsZWN0b3JJbnRlcmZhY2UucGhw1wAAAEjBH2XXAAAAaESjF6QBAAAAAAAAHQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9MSUNFTlNFLgQAAEjBH2UuBAAAmj/0d6QBAAAAAAAAJAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9MYXp5U3RyaW5nLnBocEgMAABIwR9lSAwAANNP7xSkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvUmVzb3VyY2VzL2RhdGEvd2Nzd2lkdGhfdGFibGVfd2lkZS5waHCIFQAASMEfZYgVAAAtoqZBpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3plcm8ucGhwARkAAEjBH2UBGQAAIBsEa6QBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocAYCAABIwR9lBgIAAGPaqiKkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvU2x1Z2dlci9Bc2NpaVNsdWdnZXIucGhw6g8AAEjBH2XqDwAAFdfaM6QBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L3N0cmluZy9TbHVnZ2VyL1NsdWdnZXJJbnRlcmZhY2UucGhwBgEAAEjBH2UGAQAA968FUaQBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9Vbmljb2RlU3RyaW5nLnBocOglAABIwR9l6CUAANnzDNekAQAAAAAAAAwAAABiaW4vY29tcG9zZXI1DAAASMEfZTUMAADhP+ITpAEAAAAAAAAHAAAATElDRU5TRS4EAABIwR9lLgQAACDVCAOkAQAAAAAAADw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZUluZm87CnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgpjbGFzcyBBdWRpdG9yCnsKcHVibGljIGNvbnN0IEZPUk1BVF9UQUJMRSA9ICd0YWJsZSc7CgpwdWJsaWMgY29uc3QgRk9STUFUX1BMQUlOID0gJ3BsYWluJzsKCnB1YmxpYyBjb25zdCBGT1JNQVRfSlNPTiA9ICdqc29uJzsKCnB1YmxpYyBjb25zdCBGT1JNQVRfU1VNTUFSWSA9ICdzdW1tYXJ5JzsKCnB1YmxpYyBjb25zdCBGT1JNQVRTID0gWwpzZWxmOjpGT1JNQVRfVEFCTEUsCnNlbGY6OkZPUk1BVF9QTEFJTiwKc2VsZjo6Rk9STUFUX0pTT04sCnNlbGY6OkZPUk1BVF9TVU1NQVJZLApdOwoKcHVibGljIGNvbnN0IEFCQU5ET05FRF9JR05PUkUgPSAnaWdub3JlJzsKcHVibGljIGNvbnN0IEFCQU5ET05FRF9SRVBPUlQgPSAncmVwb3J0JzsKcHVibGljIGNvbnN0IEFCQU5ET05FRF9GQUlMID0gJ2ZhaWwnOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdWRpdChJT0ludGVyZmFjZSAkaW8sIFJlcG9zaXRvcnlTZXQgJHJlcG9TZXQsIGFycmF5ICRwYWNrYWdlcywgc3RyaW5nICRmb3JtYXQsIGJvb2wgJHdhcm5pbmdPbmx5ID0gdHJ1ZSwgYXJyYXkgJGlnbm9yZUxpc3QgPSBbXSwgc3RyaW5nICRhYmFuZG9uZWQgPSBzZWxmOjpBQkFORE9ORURfUkVQT1JUKTogaW50CnsKaWYgKCRhYmFuZG9uZWQgPT09ICdkZWZhdWx0JyAmJiAkZm9ybWF0ICE9PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSBuZXcgYXVkaXQuYWJhbmRvbmVkIHNldHRpbmcgKGN1cnJlbnRseSBkZWZhdWx0aW5nIHRvICJyZXBvcnQiIHdpbGwgZGVmYXVsdCB0byAiZmFpbCIgaW4gQ29tcG9zZXIgMi43LCBtYWtlIHN1cmUgdG8gc2V0IGl0IHRvICJyZXBvcnQiIG9yICJpZ25vcmUiIGV4cGxpY2l0bHkgYnkgdGhlbiBpZiB5b3UgZG8gbm90IHdhbnQgdGhpcy48L3dhcm5pbmc+Jyk7Cn0KCiRhbGxBZHZpc29yaWVzID0gJHJlcG9TZXQtPmdldE1hdGNoaW5nU2VjdXJpdHlBZHZpc29yaWVzKCRwYWNrYWdlcywgJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX1NVTU1BUlkpOwoKCmlmIChjb3VudCgkYWxsQWR2aXNvcmllcykgPiAwICYmICRpZ25vcmVMaXN0ICE9PSBbXSAmJiAkZm9ybWF0ID09PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSkgewokYWxsQWR2aXNvcmllcyA9ICRyZXBvU2V0LT5nZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZXMsIGZhbHNlKTsKfQpbJ2Fkdmlzb3JpZXMnID0+ICRhZHZpc29yaWVzLCAnaWdub3JlZEFkdmlzb3JpZXMnID0+ICRpZ25vcmVkQWR2aXNvcmllc10gPSAkdGhpcy0+cHJvY2Vzc0Fkdmlzb3JpZXMoJGFsbEFkdmlzb3JpZXMsICRpZ25vcmVMaXN0KTsKCiRhYmFuZG9uZWRDb3VudCA9IDA7CiRhZmZlY3RlZFBhY2thZ2VzQ291bnQgPSAwOwppZiAoJGFiYW5kb25lZCA9PT0gc2VsZjo6QUJBTkRPTkVEX0lHTk9SRSkgewokYWJhbmRvbmVkUGFja2FnZXMgPSBbXTsKfSBlbHNlIHsKJGFiYW5kb25lZFBhY2thZ2VzID0gJHRoaXMtPmZpbHRlckFiYW5kb25lZFBhY2thZ2VzKCRwYWNrYWdlcyk7CmlmICgkYWJhbmRvbmVkID09PSBzZWxmOjpBQkFORE9ORURfRkFJTCkgewokYWJhbmRvbmVkQ291bnQgPSBjb3VudCgkYWJhbmRvbmVkUGFja2FnZXMpOwp9Cn0KCmlmIChzZWxmOjpGT1JNQVRfSlNPTiA9PT0gJGZvcm1hdCkgewokanNvbiA9IFsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXNdOwppZiAoJGlnbm9yZWRBZHZpc29yaWVzICE9PSBbXSkgewokanNvblsnaWdub3JlZC1hZHZpc29yaWVzJ10gPSAkaWdub3JlZEFkdmlzb3JpZXM7Cn0KJGpzb25bJ2FiYW5kb25lZCddID0gYXJyYXlfcmVkdWNlKCRhYmFuZG9uZWRQYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uKGFycmF5ICRjYXJyeSwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkgewokY2FycnlbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV0gPSAkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7CnJldHVybiAkY2Fycnk7Cn0sIFtdKTsKCiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZSgkanNvbikpOwoKcmV0dXJuIGNvdW50KCRhZHZpc29yaWVzKSArICRhYmFuZG9uZWRDb3VudDsKfQoKJGVycm9yT3JXYXJuID0gJHdhcm5pbmdPbmx5ID8gJ3dhcm5pbmcnIDogJ2Vycm9yJzsKaWYgKGNvdW50KCRhZHZpc29yaWVzKSA+IDAgfHwgY291bnQoJGlnbm9yZWRBZHZpc29yaWVzKSA+IDApIHsKJHBhc3NlcyA9IFsKWyRpZ25vcmVkQWR2aXNvcmllcywgIjxpbmZvPkZvdW5kICVkIGlnbm9yZWQgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yJXMgYWZmZWN0aW5nICVkIHBhY2thZ2UlcyVzPC9pbmZvPiJdLAoKWyRhZHZpc29yaWVzLCAiPCRlcnJvck9yV2Fybj5Gb3VuZCAlZCBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFkdmlzb3IlcyBhZmZlY3RpbmcgJWQgcGFja2FnZSVzJXM8LyRlcnJvck9yV2Fybj4iXSwKXTsKZm9yZWFjaCAoJHBhc3NlcyBhcyBbJGFkdmlzb3JpZXNUb091dHB1dCwgJG1lc3NhZ2VdKSB7ClskYWZmZWN0ZWRQYWNrYWdlc0NvdW50LCAkdG90YWxBZHZpc29yeUNvdW50XSA9ICR0aGlzLT5jb3VudEFkdmlzb3JpZXMoJGFkdmlzb3JpZXNUb091dHB1dCk7CmlmICgkYWZmZWN0ZWRQYWNrYWdlc0NvdW50ID4gMCkgewokcGx1cmFsaXR5ID0gJHRvdGFsQWR2aXNvcnlDb3VudCA9PT0gMSA/ICd5JyA6ICdpZXMnOwokcGtnUGx1cmFsaXR5ID0gJGFmZmVjdGVkUGFja2FnZXNDb3VudCA9PT0gMSA/ICcnIDogJ3MnOwokcHVuY3R1YXRpb24gPSAkZm9ybWF0ID09PSAnc3VtbWFyeScgPyAnLicgOiAnOic7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCRtZXNzYWdlLCAkdG90YWxBZHZpc29yeUNvdW50LCAkcGx1cmFsaXR5LCAkYWZmZWN0ZWRQYWNrYWdlc0NvdW50LCAkcGtnUGx1cmFsaXR5LCAkcHVuY3R1YXRpb24pKTsKJHRoaXMtPm91dHB1dEFkdmlzb3JpZXMoJGlvLCAkYWR2aXNvcmllc1RvT3V0cHV0LCAkZm9ybWF0KTsKfQp9CgppZiAoJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX1NVTU1BUlkpIHsKJGlvLT53cml0ZUVycm9yKCdSdW4gImNvbXBvc2VyIGF1ZGl0IiBmb3IgYSBmdWxsIGxpc3Qgb2YgYWR2aXNvcmllcy4nKTsKfQp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk5vIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYWR2aXNvcmllcyBmb3VuZC48L2luZm8+Jyk7Cn0KCmlmIChjb3VudCgkYWJhbmRvbmVkUGFja2FnZXMpID4gMCAmJiAkZm9ybWF0ICE9PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSkgewokdGhpcy0+b3V0cHV0QWJhbmRvbmVkUGFja2FnZXMoJGlvLCAkYWJhbmRvbmVkUGFja2FnZXMsICRmb3JtYXQpOwp9CgpyZXR1cm4gJGFmZmVjdGVkUGFja2FnZXNDb3VudCArICRhYmFuZG9uZWRDb3VudDsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsdGVyQWJhbmRvbmVkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwa2cpIHsKcmV0dXJuICRwa2cgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHBrZy0+aXNBYmFuZG9uZWQoKTsKfSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwcm9jZXNzQWR2aXNvcmllcyhhcnJheSAkYWxsQWR2aXNvcmllcywgYXJyYXkgJGlnbm9yZUxpc3QpOiBhcnJheQp7CmlmICgkaWdub3JlTGlzdCA9PT0gW10pIHsKcmV0dXJuIFsnYWR2aXNvcmllcycgPT4gJGFsbEFkdmlzb3JpZXMsICdpZ25vcmVkQWR2aXNvcmllcycgPT4gW11dOwp9CgppZiAoXGNvdW50KCRpZ25vcmVMaXN0KSA+IDAgJiYgIVxhcnJheV9pc19saXN0KCRpZ25vcmVMaXN0KSkgewokaWdub3JlZElkcyA9IGFycmF5X2tleXMoJGlnbm9yZUxpc3QpOwp9IGVsc2UgewokaWdub3JlZElkcyA9ICRpZ25vcmVMaXN0Owp9CgokYWR2aXNvcmllcyA9IFtdOwokaWdub3JlZCA9IFtdOwokaWdub3JlUmVhc29uID0gbnVsbDsKCmZvcmVhY2ggKCRhbGxBZHZpc29yaWVzIGFzICRwYWNrYWdlID0+ICRwa2dBZHZpc29yaWVzKSB7CmZvcmVhY2ggKCRwa2dBZHZpc29yaWVzIGFzICRhZHZpc29yeSkgewokaXNBY3RpdmUgPSB0cnVlOwoKaWYgKGluX2FycmF5KCRhZHZpc29yeS0+YWR2aXNvcnlJZCwgJGlnbm9yZWRJZHMsIHRydWUpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gJGlnbm9yZUxpc3RbJGFkdmlzb3J5LT5hZHZpc29yeUlkXSA/PyBudWxsOwp9CgppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeSkgewppZiAoaW5fYXJyYXkoJGFkdmlzb3J5LT5jdmUsICRpZ25vcmVkSWRzLCB0cnVlKSkgewokaXNBY3RpdmUgPSBmYWxzZTsKJGlnbm9yZVJlYXNvbiA9ICRpZ25vcmVMaXN0WyRhZHZpc29yeS0+Y3ZlXSA/PyBudWxsOwp9Cgpmb3JlYWNoICgkYWR2aXNvcnktPnNvdXJjZXMgYXMgJHNvdXJjZSkgewppZiAoaW5fYXJyYXkoJHNvdXJjZVsncmVtb3RlSWQnXSwgJGlnbm9yZWRJZHMsIHRydWUpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gJGlnbm9yZUxpc3RbJHNvdXJjZVsncmVtb3RlSWQnXV0gPz8gbnVsbDsKYnJlYWs7Cn0KfQp9CgppZiAoJGlzQWN0aXZlKSB7CiRhZHZpc29yaWVzWyRwYWNrYWdlXVtdID0gJGFkdmlzb3J5Owpjb250aW51ZTsKfQoKCgppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeSkgewokYWR2aXNvcnkgPSAkYWR2aXNvcnktPnRvSWdub3JlZEFkdmlzb3J5KCRpZ25vcmVSZWFzb24pOwp9CgokaWdub3JlZFskcGFja2FnZV1bXSA9ICRhZHZpc29yeTsKfQp9CgpyZXR1cm4gWydhZHZpc29yaWVzJyA9PiAkYWR2aXNvcmllcywgJ2lnbm9yZWRBZHZpc29yaWVzJyA9PiAkaWdub3JlZF07Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvdW50QWR2aXNvcmllcyhhcnJheSAkYWR2aXNvcmllcyk6IGFycmF5CnsKJGNvdW50ID0gMDsKZm9yZWFjaCAoJGFkdmlzb3JpZXMgYXMgJHBhY2thZ2VBZHZpc29yaWVzKSB7CiRjb3VudCArPSBjb3VudCgkcGFja2FnZUFkdmlzb3JpZXMpOwp9CgpyZXR1cm4gW2NvdW50KCRhZHZpc29yaWVzKSwgJGNvdW50XTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0QWR2aXNvcmllcyhJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRhZHZpc29yaWVzLCBzdHJpbmcgJGZvcm1hdCk6IHZvaWQKewpzd2l0Y2ggKCRmb3JtYXQpIHsKY2FzZSBzZWxmOjpGT1JNQVRfVEFCTEU6CmlmICghKCRpbyBpbnN0YW5jZW9mIENvbnNvbGVJTykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ2Fubm90IHVzZSB0YWJsZSBmb3JtYXQgd2l0aCAnIC4gZ2V0X2NsYXNzKCRpbykpOwp9CiR0aGlzLT5vdXRwdXRBZHZpc29yaWVzVGFibGUoJGlvLCAkYWR2aXNvcmllcyk7CgpyZXR1cm47CmNhc2Ugc2VsZjo6Rk9STUFUX1BMQUlOOgokdGhpcy0+b3V0cHV0QWR2aXNvcmllc1BsYWluKCRpbywgJGFkdmlzb3JpZXMpOwoKcmV0dXJuOwpjYXNlIHNlbGY6OkZPUk1BVF9TVU1NQVJZOgoKcmV0dXJuOwpkZWZhdWx0Ogp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGZvcm1hdCAiJy4kZm9ybWF0LiciLicpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0QWR2aXNvcmllc1RhYmxlKENvbnNvbGVJTyAkaW8sIGFycmF5ICRhZHZpc29yaWVzKTogdm9pZAp7CmZvcmVhY2ggKCRhZHZpc29yaWVzIGFzICRwYWNrYWdlQWR2aXNvcmllcykgewpmb3JlYWNoICgkcGFja2FnZUFkdmlzb3JpZXMgYXMgJGFkdmlzb3J5KSB7CiRoZWFkZXJzID0gWwonUGFja2FnZScsCidDVkUnLAonVGl0bGUnLAonVVJMJywKJ0FmZmVjdGVkIHZlcnNpb25zJywKJ1JlcG9ydGVkIGF0JywKXTsKJHJvdyA9IFsKJGFkdmlzb3J5LT5wYWNrYWdlTmFtZSwKJHRoaXMtPmdldENWRSgkYWR2aXNvcnkpLAokYWR2aXNvcnktPnRpdGxlLAokdGhpcy0+Z2V0VVJMKCRhZHZpc29yeSksCiRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+Z2V0UHJldHR5U3RyaW5nKCksCiRhZHZpc29yeS0+cmVwb3J0ZWRBdC0+Zm9ybWF0KERBVEVfQVRPTSksCl07CmlmICgkYWR2aXNvcnkgaW5zdGFuY2VvZiBJZ25vcmVkU2VjdXJpdHlBZHZpc29yeSkgewokaGVhZGVyc1tdID0gJ0lnbm9yZSByZWFzb24nOwokcm93W10gPSAkYWR2aXNvcnktPmlnbm9yZVJlYXNvbiA/PyAnTm9uZSBzcGVjaWZpZWQnOwp9CiRpby0+Z2V0VGFibGUoKQotPnNldEhvcml6b250YWwoKQotPnNldEhlYWRlcnMoJGhlYWRlcnMpCi0+YWRkUm93KCRyb3cpCi0+c2V0Q29sdW1uV2lkdGgoMSwgODApCi0+c2V0Q29sdW1uTWF4V2lkdGgoMSwgODApCi0+cmVuZGVyKCk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dEFkdmlzb3JpZXNQbGFpbihJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRhZHZpc29yaWVzKTogdm9pZAp7CiRlcnJvciA9IFtdOwokZmlyc3RBZHZpc29yeSA9IHRydWU7CmZvcmVhY2ggKCRhZHZpc29yaWVzIGFzICRwYWNrYWdlQWR2aXNvcmllcykgewpmb3JlYWNoICgkcGFja2FnZUFkdmlzb3JpZXMgYXMgJGFkdmlzb3J5KSB7CmlmICghJGZpcnN0QWR2aXNvcnkpIHsKJGVycm9yW10gPSAnLS0tLS0tLS0nOwp9CiRlcnJvcltdID0gIlBhY2thZ2U6ICIuJGFkdmlzb3J5LT5wYWNrYWdlTmFtZTsKJGVycm9yW10gPSAiQ1ZFOiAiLiR0aGlzLT5nZXRDVkUoJGFkdmlzb3J5KTsKJGVycm9yW10gPSAiVGl0bGU6ICIuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGFkdmlzb3J5LT50aXRsZSk7CiRlcnJvcltdID0gIlVSTDogIi4kdGhpcy0+Z2V0VVJMKCRhZHZpc29yeSk7CiRlcnJvcltdID0gIkFmZmVjdGVkIHZlcnNpb25zOiAiLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+Z2V0UHJldHR5U3RyaW5nKCkpOwokZXJyb3JbXSA9ICJSZXBvcnRlZCBhdDogIi4kYWR2aXNvcnktPnJlcG9ydGVkQXQtPmZvcm1hdChEQVRFX0FUT00pOwppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkpIHsKJGVycm9yW10gPSAiSWdub3JlIHJlYXNvbjogIi4oJGFkdmlzb3J5LT5pZ25vcmVSZWFzb24gPz8gJ05vbmUgc3BlY2lmaWVkJyk7Cn0KJGZpcnN0QWR2aXNvcnkgPSBmYWxzZTsKfQp9CiRpby0+d3JpdGVFcnJvcigkZXJyb3IpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRBYmFuZG9uZWRQYWNrYWdlcyhJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRwYWNrYWdlcywgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5Gb3VuZCAlZCBhYmFuZG9uZWQgcGFja2FnZSVzOjwvZXJyb3I+JywgY291bnQoJHBhY2thZ2VzKSwgY291bnQoJHBhY2thZ2VzKSA+IDEgPyAncycgOiAnJykpOwoKaWYgKCRmb3JtYXQgPT09IHNlbGY6OkZPUk1BVF9QTEFJTikgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBrZykgewokcmVwbGFjZW1lbnQgPSAkcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSAhPT0gbnVsbAo/ICdVc2UgJy4kcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKS4nIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJyVzIGlzIGFiYW5kb25lZC4gJXMuJywKJHRoaXMtPmdldFBhY2thZ2VOYW1lV2l0aExpbmsoJHBrZyksCiRyZXBsYWNlbWVudAopKTsKfQoKcmV0dXJuOwp9CgppZiAoISgkaW8gaW5zdGFuY2VvZiBDb25zb2xlSU8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Nhbm5vdCB1c2UgdGFibGUgZm9ybWF0IHdpdGggJyAuIGdldF9jbGFzcygkaW8pKTsKfQoKJHRhYmxlID0gJGlvLT5nZXRUYWJsZSgpCi0+c2V0SGVhZGVycyhbJ0FiYW5kb25lZCBQYWNrYWdlJywgJ1N1Z2dlc3RlZCBSZXBsYWNlbWVudCddKQotPnNldENvbHVtbldpZHRoKDEsIDgwKQotPnNldENvbHVtbk1heFdpZHRoKDEsIDgwKTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGtnKSB7CiRyZXBsYWNlbWVudCA9ICRwa2ctPmdldFJlcGxhY2VtZW50UGFja2FnZSgpICE9PSBudWxsID8gJHBrZy0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgOiAnbm9uZSc7CiR0YWJsZS0+YWRkUm93KFskdGhpcy0+Z2V0UGFja2FnZU5hbWVXaXRoTGluaygkcGtnKSwgJHJlcGxhY2VtZW50XSk7Cn0KCiR0YWJsZS0+cmVuZGVyKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWVXaXRoTGluayhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKJHBhY2thZ2VVcmwgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwoKcmV0dXJuICRwYWNrYWdlVXJsICE9PSBudWxsID8gJzxocmVmPScgLiBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkcGFja2FnZVVybCkgLiAnPicgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpIC4gJzwvPicgOiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENWRShTZWN1cml0eUFkdmlzb3J5ICRhZHZpc29yeSk6IHN0cmluZwp7CmlmICgkYWR2aXNvcnktPmN2ZSA9PT0gbnVsbCkgewpyZXR1cm4gJ05PIENWRSc7Cn0KCnJldHVybiAnPGhyZWY9aHR0cHM6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT0nLiRhZHZpc29yeS0+Y3ZlLic+Jy4kYWR2aXNvcnktPmN2ZS4nPC8+JzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRVUkwoU2VjdXJpdHlBZHZpc29yeSAkYWR2aXNvcnkpOiBzdHJpbmcKewppZiAoJGFkdmlzb3J5LT5saW5rID09PSBudWxsKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+bGluaykuJz4nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+bGluaykuJzwvPic7Cn0KCn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBEYXRlVGltZUltbXV0YWJsZTsKCmNsYXNzIElnbm9yZWRTZWN1cml0eUFkdmlzb3J5IGV4dGVuZHMgU2VjdXJpdHlBZHZpc29yeQp7CgoKCgpwdWJsaWMgJGlnbm9yZVJlYXNvbjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJGFkdmlzb3J5SWQsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGFmZmVjdGVkVmVyc2lvbnMsIHN0cmluZyAkdGl0bGUsIGFycmF5ICRzb3VyY2VzLCBEYXRlVGltZUltbXV0YWJsZSAkcmVwb3J0ZWRBdCwgP3N0cmluZyAkY3ZlID0gbnVsbCwgP3N0cmluZyAkbGluayA9IG51bGwsID9zdHJpbmcgJGlnbm9yZVJlYXNvbiA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcGFja2FnZU5hbWUsICRhZHZpc29yeUlkLCAkYWZmZWN0ZWRWZXJzaW9ucywgJHRpdGxlLCAkc291cmNlcywgJHJlcG9ydGVkQXQsICRjdmUsICRsaW5rKTsKCiR0aGlzLT5pZ25vcmVSZWFzb24gPSAkaWdub3JlUmVhc29uOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKQp7CiRkYXRhID0gcGFyZW50Ojpqc29uU2VyaWFsaXplKCk7CmlmICgkdGhpcy0+aWdub3JlUmVhc29uID09PSBOVUxMKSB7CnVuc2V0KCRkYXRhWydpZ25vcmVSZWFzb24nXSk7Cn0KCnJldHVybiAkZGF0YTsKfQoKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQWR2aXNvcnk7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwp1c2UgSnNvblNlcmlhbGl6YWJsZTsKCmNsYXNzIFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5IGltcGxlbWVudHMgSnNvblNlcmlhbGl6YWJsZQp7CgoKCgpwdWJsaWMgJGFkdmlzb3J5SWQ7CgoKCgoKcHVibGljICRwYWNrYWdlTmFtZTsKCgoKCgpwdWJsaWMgJGFmZmVjdGVkVmVyc2lvbnM7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoc3RyaW5nICRwYWNrYWdlTmFtZSwgYXJyYXkgJGRhdGEsIFZlcnNpb25QYXJzZXIgJHBhcnNlcik6IHNlbGYKewokY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGRhdGFbJ2FmZmVjdGVkVmVyc2lvbnMnXSk7CmlmIChpc3NldCgkZGF0YVsndGl0bGUnXSwgJGRhdGFbJ3NvdXJjZXMnXSwgJGRhdGFbJ3JlcG9ydGVkQXQnXSkpIHsKcmV0dXJuIG5ldyBTZWN1cml0eUFkdmlzb3J5KCRwYWNrYWdlTmFtZSwgJGRhdGFbJ2Fkdmlzb3J5SWQnXSwgJGNvbnN0cmFpbnQsICRkYXRhWyd0aXRsZSddLCAkZGF0YVsnc291cmNlcyddLCBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRkYXRhWydyZXBvcnRlZEF0J10sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSksICRkYXRhWydjdmUnXSA/PyBudWxsLCAkZGF0YVsnbGluayddID8/IG51bGwpOwp9CgpyZXR1cm4gbmV3IHNlbGYoJHBhY2thZ2VOYW1lLCAkZGF0YVsnYWR2aXNvcnlJZCddLCAkY29uc3RyYWludCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJGFkdmlzb3J5SWQsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGFmZmVjdGVkVmVyc2lvbnMpCnsKJHRoaXMtPmFkdmlzb3J5SWQgPSAkYWR2aXNvcnlJZDsKJHRoaXMtPnBhY2thZ2VOYW1lID0gJHBhY2thZ2VOYW1lOwokdGhpcy0+YWZmZWN0ZWRWZXJzaW9ucyA9ICRhZmZlY3RlZFZlcnNpb25zOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKQp7CiRkYXRhID0gKGFycmF5KSAkdGhpczsKJGRhdGFbJ2FmZmVjdGVkVmVyc2lvbnMnXSA9ICRkYXRhWydhZmZlY3RlZFZlcnNpb25zJ10tPmdldFByZXR0eVN0cmluZygpOwoKcmV0dXJuICRkYXRhOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBEYXRlVGltZUltbXV0YWJsZTsKCmNsYXNzIFNlY3VyaXR5QWR2aXNvcnkgZXh0ZW5kcyBQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeQp7CgoKCgpwdWJsaWMgJHRpdGxlOwoKCgoKCnB1YmxpYyAkY3ZlOwoKCgoKCnB1YmxpYyAkbGluazsKCgoKCgpwdWJsaWMgJHJlcG9ydGVkQXQ7CgoKCgoKcHVibGljICRzb3VyY2VzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkYWR2aXNvcnlJZCwgQ29uc3RyYWludEludGVyZmFjZSAkYWZmZWN0ZWRWZXJzaW9ucywgc3RyaW5nICR0aXRsZSwgYXJyYXkgJHNvdXJjZXMsIERhdGVUaW1lSW1tdXRhYmxlICRyZXBvcnRlZEF0LCA/c3RyaW5nICRjdmUgPSBudWxsLCA/c3RyaW5nICRsaW5rID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYWNrYWdlTmFtZSwgJGFkdmlzb3J5SWQsICRhZmZlY3RlZFZlcnNpb25zKTsKCiR0aGlzLT50aXRsZSA9ICR0aXRsZTsKJHRoaXMtPnNvdXJjZXMgPSAkc291cmNlczsKJHRoaXMtPnJlcG9ydGVkQXQgPSAkcmVwb3J0ZWRBdDsKJHRoaXMtPmN2ZSA9ICRjdmU7CiR0aGlzLT5saW5rID0gJGxpbms7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0b0lnbm9yZWRBZHZpc29yeSg/c3RyaW5nICRpZ25vcmVSZWFzb24pOiBJZ25vcmVkU2VjdXJpdHlBZHZpc29yeQp7CnJldHVybiBuZXcgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkoCiR0aGlzLT5wYWNrYWdlTmFtZSwKJHRoaXMtPmFkdmlzb3J5SWQsCiR0aGlzLT5hZmZlY3RlZFZlcnNpb25zLAokdGhpcy0+dGl0bGUsCiR0aGlzLT5zb3VyY2VzLAokdGhpcy0+cmVwb3J0ZWRBdCwKJHRoaXMtPmN2ZSwKJHRoaXMtPmxpbmssCiRpZ25vcmVSZWFzb24KKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IHBhcmVudDo6anNvblNlcmlhbGl6ZSgpOwokZGF0YVsncmVwb3J0ZWRBdCddID0gJGRhdGFbJ3JlcG9ydGVkQXQnXS0+Zm9ybWF0KERBVEVfUkZDMzMzOSk7CgpyZXR1cm4gJGRhdGE7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7Cgp1c2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3JcQ2xhc3NNYXA7CnVzZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxDbGFzc01hcEdlbmVyYXRvcjsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XEJvdW5kOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CgoKCgoKY2xhc3MgQXV0b2xvYWRHZW5lcmF0b3IKewoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGUgPSBudWxsOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlID0gZmFsc2U7CgoKCgpwcml2YXRlICRhcGN1ID0gZmFsc2U7CgoKCgpwcml2YXRlICRhcGN1UHJlZml4OwoKCgoKcHJpdmF0ZSAkZHJ5UnVuID0gZmFsc2U7CgoKCgpwcml2YXRlICRydW5TY3JpcHRzID0gZmFsc2U7CgoKCgpwcml2YXRlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEV2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmlvID0gJGlvID8/IG5ldyBOdWxsSU8oKTsKCiR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldk1vZGUoYm9vbCAkZGV2TW9kZSA9IHRydWUpCnsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKGJvb2wgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKewokdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdShib29sICRhcGN1LCA/c3RyaW5nICRhcGN1UHJlZml4ID0gbnVsbCkKewokdGhpcy0+YXBjdSA9ICRhcGN1OwokdGhpcy0+YXBjdVByZWZpeCA9ICRhcGN1UHJlZml4Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSdW5TY3JpcHRzKGJvb2wgJHJ1blNjcmlwdHMgPSB0cnVlKQp7CiR0aGlzLT5ydW5TY3JpcHRzID0gJHJ1blNjcmlwdHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREcnlSdW4oYm9vbCAkZHJ5UnVuID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+ZHJ5UnVuID0gJGRyeVJ1bjsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzKCRpZ25vcmVQbGF0Zm9ybVJlcXMpCnsKdHJpZ2dlcl9lcnJvcignQXV0b2xvYWRHZW5lcmF0b3I6OnNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2Ugc2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiR0aGlzLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3JlUGxhdGZvcm1SZXFzKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpCnsKJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZHVtcChDb25maWcgJGNvbmZpZywgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvLCBSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIHN0cmluZyAkdGFyZ2V0RGlyLCBib29sICRzY2FuUHNyUGFja2FnZXMgPSBmYWxzZSwgP3N0cmluZyAkc3VmZml4ID0gbnVsbCwgP0xvY2tlciAkbG9ja2VyID0gbnVsbCkKewppZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkgewoKJHNjYW5Qc3JQYWNrYWdlcyA9IHRydWU7Cn0KCgppZiAobnVsbCA9PT0gJHRoaXMtPmRldk1vZGUpIHsKCiR0aGlzLT5kZXZNb2RlID0gZmFsc2U7CgokaW5zdGFsbGVkSnNvbiA9IG5ldyBKc29uRmlsZSgkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKS4nL2NvbXBvc2VyL2luc3RhbGxlZC5qc29uJyk7CmlmICgkaW5zdGFsbGVkSnNvbi0+ZXhpc3RzKCkpIHsKJGluc3RhbGxlZEpzb24gPSAkaW5zdGFsbGVkSnNvbi0+cmVhZCgpOwppZiAoaXNzZXQoJGluc3RhbGxlZEpzb25bJ2RldiddKSkgewokdGhpcy0+ZGV2TW9kZSA9ICRpbnN0YWxsZWRKc29uWydkZXYnXTsKfQp9Cn0KCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewoKaWYgKCFpc3NldCgkX1NFUlZFUlsnQ09NUE9TRVJfREVWX01PREUnXSkpIHsKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfREVWX01PREUnLCAkdGhpcy0+ZGV2TW9kZSA/ICcxJyA6ICcwJyk7Cn0KCiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UFJFX0FVVE9MT0FEX0RVTVAsICR0aGlzLT5kZXZNb2RlLCBbXSwgWwonb3B0aW1pemUnID0+ICRzY2FuUHNyUGFja2FnZXMsCl0pOwp9CgokY2xhc3NNYXBHZW5lcmF0b3IgPSBuZXcgQ2xhc3NNYXBHZW5lcmF0b3IoWydwaHAnLCAnaW5jJywgJ2hoJ10pOwokY2xhc3NNYXBHZW5lcmF0b3ItPmF2b2lkRHVwbGljYXRlU2NhbnMoKTsKCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSk7CgoKCiRiYXNlUGF0aCA9ICRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKHJlYWxwYXRoKHJlYWxwYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSkpKTsKJHZlbmRvclBhdGggPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aChyZWFscGF0aChyZWFscGF0aCgkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSkpKTsKJHVzZUdsb2JhbEluY2x1ZGVQYXRoID0gJGNvbmZpZy0+Z2V0KCd1c2UtaW5jbHVkZS1wYXRoJyk7CiRwcmVwZW5kQXV0b2xvYWRlciA9ICRjb25maWctPmdldCgncHJlcGVuZC1hdXRvbG9hZGVyJykgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJzsKJHRhcmdldERpciA9ICR2ZW5kb3JQYXRoLicvJy4kdGFyZ2V0RGlyOwokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0YXJnZXREaXIpOwoKJHZlbmRvclBhdGhDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkdmVuZG9yUGF0aCwgdHJ1ZSk7CiR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCR2ZW5kb3JQYXRoLCByZWFscGF0aCgkdGFyZ2V0RGlyKSwgdHJ1ZSk7CgokYXBwQmFzZURpckNvZGUgPSAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUoJHZlbmRvclBhdGgsICRiYXNlUGF0aCwgdHJ1ZSk7CiRhcHBCYXNlRGlyQ29kZSA9IHN0cl9yZXBsYWNlKCdfX0RJUl9fJywgJyR2ZW5kb3JEaXInLCAkYXBwQmFzZURpckNvZGUpOwoKJG5hbWVzcGFjZXNGaWxlID0gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9uYW1lc3BhY2VzLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAoKRU9GOwoKJHBzcjRGaWxlID0gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9wc3I0LnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAoKRU9GOwoKCiRkZXZQYWNrYWdlTmFtZXMgPSAkbG9jYWxSZXBvLT5nZXREZXZQYWNrYWdlTmFtZXMoKTsKJHBhY2thZ2VNYXAgPSAkdGhpcy0+YnVpbGRQYWNrYWdlTWFwKCRpbnN0YWxsYXRpb25NYW5hZ2VyLCAkcm9vdFBhY2thZ2UsICRsb2NhbFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkpOwppZiAoJHRoaXMtPmRldk1vZGUpIHsKCiRmaWx0ZXJlZERldlBhY2thZ2VzID0gZmFsc2U7Cn0gZWxzZSB7CgokZmlsdGVyZWREZXZQYWNrYWdlcyA9ICRkZXZQYWNrYWdlTmFtZXMgPzogdHJ1ZTsKfQokYXV0b2xvYWRzID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzKCRwYWNrYWdlTWFwLCAkcm9vdFBhY2thZ2UsICRmaWx0ZXJlZERldlBhY2thZ2VzKTsKCgpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItMCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGhzKSB7CiRleHBvcnRlZFBhdGhzID0gW107CmZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewokZXhwb3J0ZWRQYXRoc1tdID0gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCk7Cn0KJGV4cG9ydGVkUHJlZml4ID0gdmFyX2V4cG9ydCgkbmFtZXNwYWNlLCB0cnVlKTsKJG5hbWVzcGFjZXNGaWxlIC49ICIgICAgJGV4cG9ydGVkUHJlZml4ID0+ICI7CiRuYW1lc3BhY2VzRmlsZSAuPSAiYXJyYXkoIi5pbXBsb2RlKCcsICcsICRleHBvcnRlZFBhdGhzKS4iKSxcbiI7Cn0KJG5hbWVzcGFjZXNGaWxlIC49ICIpO1xuIjsKCgpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItNCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGhzKSB7CiRleHBvcnRlZFBhdGhzID0gW107CmZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewokZXhwb3J0ZWRQYXRoc1tdID0gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCk7Cn0KJGV4cG9ydGVkUHJlZml4ID0gdmFyX2V4cG9ydCgkbmFtZXNwYWNlLCB0cnVlKTsKJHBzcjRGaWxlIC49ICIgICAgJGV4cG9ydGVkUHJlZml4ID0+ICI7CiRwc3I0RmlsZSAuPSAiYXJyYXkoIi5pbXBsb2RlKCcsICcsICRleHBvcnRlZFBhdGhzKS4iKSxcbiI7Cn0KJHBzcjRGaWxlIC49ICIpO1xuIjsKCgokdGFyZ2V0RGlyTG9hZGVyID0gbnVsbDsKJG1haW5BdXRvbG9hZCA9ICRyb290UGFja2FnZS0+Z2V0QXV0b2xvYWQoKTsKaWYgKCRyb290UGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgJiYgIWVtcHR5KCRtYWluQXV0b2xvYWRbJ3Bzci0wJ10pKSB7CiRsZXZlbHMgPSBzdWJzdHJfY291bnQoJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHJvb3RQYWNrYWdlLT5nZXRUYXJnZXREaXIoKSksICcvJykgKyAxOwokcHJlZml4ZXMgPSBpbXBsb2RlKCcsICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwcmVmaXgpOiBzdHJpbmcgewpyZXR1cm4gdmFyX2V4cG9ydCgkcHJlZml4LCB0cnVlKTsKfSwgYXJyYXlfa2V5cygkbWFpbkF1dG9sb2FkWydwc3ItMCddKSkpOwokYmFzZURpckZyb21UYXJnZXREaXJDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCR0YXJnZXREaXIsICRiYXNlUGF0aCwgdHJ1ZSk7CgokdGFyZ2V0RGlyTG9hZGVyID0gPDw8RU9GCgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhdXRvbG9hZChcJGNsYXNzKQogICAgewogICAgICAgIFwkZGlyID0gJGJhc2VEaXJGcm9tVGFyZ2V0RGlyQ29kZSAuICcvJzsKICAgICAgICBcJHByZWZpeGVzID0gYXJyYXkoJHByZWZpeGVzKTsKICAgICAgICBmb3JlYWNoIChcJHByZWZpeGVzIGFzIFwkcHJlZml4KSB7CiAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoXCRjbGFzcywgXCRwcmVmaXgpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBcJHBhdGggPSBcJGRpciAuIGltcGxvZGUoJy8nLCBhcnJheV9zbGljZShleHBsb2RlKCdcXFxcJywgXCRjbGFzcyksICRsZXZlbHMpKS4nLnBocCc7CiAgICAgICAgICAgIGlmICghXCRwYXRoID0gc3RyZWFtX3Jlc29sdmVfaW5jbHVkZV9wYXRoKFwkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXF1aXJlIFwkcGF0aDsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCkVPRjsKfQoKJGV4Y2x1ZGVkID0gbnVsbDsKaWYgKCFlbXB0eSgkYXV0b2xvYWRzWydleGNsdWRlLWZyb20tY2xhc3NtYXAnXSkpIHsKJGV4Y2x1ZGVkID0gJGF1dG9sb2Fkc1snZXhjbHVkZS1mcm9tLWNsYXNzbWFwJ107Cn0KCmZvcmVhY2ggKCRhdXRvbG9hZHNbJ2NsYXNzbWFwJ10gYXMgJGRpcikgewokY2xhc3NNYXBHZW5lcmF0b3ItPnNjYW5QYXRocygkZGlyLCAkdGhpcy0+YnVpbGRFeGNsdXNpb25SZWdleCgkZGlyLCAkZXhjbHVkZWQpKTsKfQoKaWYgKCRzY2FuUHNyUGFja2FnZXMpIHsKJG5hbWVzcGFjZXNUb1NjYW4gPSBbXTsKCgpmb3JlYWNoIChbJ3Bzci00JywgJ3Bzci0wJ10gYXMgJHBzclR5cGUpIHsKZm9yZWFjaCAoJGF1dG9sb2Fkc1skcHNyVHlwZV0gYXMgJG5hbWVzcGFjZSA9PiAkcGF0aHMpIHsKJG5hbWVzcGFjZXNUb1NjYW5bJG5hbWVzcGFjZV1bXSA9IFsncGF0aHMnID0+ICRwYXRocywgJ3R5cGUnID0+ICRwc3JUeXBlXTsKfQp9CgprcnNvcnQoJG5hbWVzcGFjZXNUb1NjYW4pOwoKZm9yZWFjaCAoJG5hbWVzcGFjZXNUb1NjYW4gYXMgJG5hbWVzcGFjZSA9PiAkZ3JvdXBzKSB7CmZvcmVhY2ggKCRncm91cHMgYXMgJGdyb3VwKSB7CmZvcmVhY2ggKCRncm91cFsncGF0aHMnXSBhcyAkZGlyKSB7CiRkaXIgPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJGRpcikgPyAkZGlyIDogJGJhc2VQYXRoLicvJy4kZGlyKTsKaWYgKCFpc19kaXIoJGRpcikpIHsKY29udGludWU7Cn0KCiRjbGFzc01hcEdlbmVyYXRvci0+c2NhblBhdGhzKCRkaXIsICR0aGlzLT5idWlsZEV4Y2x1c2lvblJlZ2V4KCRkaXIsICRleGNsdWRlZCksICRncm91cFsndHlwZSddLCAkbmFtZXNwYWNlKTsKfQp9Cn0KfQoKJGNsYXNzTWFwID0gJGNsYXNzTWFwR2VuZXJhdG9yLT5nZXRDbGFzc01hcCgpOwpmb3JlYWNoICgkY2xhc3NNYXAtPmdldEFtYmlndW91c0NsYXNzZXMoKSBhcyAkY2xhc3NOYW1lID0+ICRhbWJpZ3VvdXNQYXRocykgewppZiAoY291bnQoJGFtYmlndW91c1BhdGhzKSA+IDEpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzc05hbWUuJyInLgonIHdhcyBmb3VuZCAnLiAoY291bnQoJGFtYmlndW91c1BhdGhzKSArIDEpIC4neDogaW4gIicuJGNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzTmFtZSkuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJGFtYmlndW91c1BhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzc05hbWUuJyInLgonIHdhcyBmb3VuZCBpbiBib3RoICInLiRjbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzc05hbWUpLiciIGFuZCAiJy4gaW1wbG9kZSgnIiwgIicsICRhbWJpZ3VvdXNQYXRocykgLiciLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLjwvd2FybmluZz4nCik7Cn0KfQpmb3JlYWNoICgkY2xhc3NNYXAtPmdldFBzclZpb2xhdGlvbnMoKSBhcyAkbXNnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+JG1zZzwvd2FybmluZz4iKTsKfQoKJGNsYXNzTWFwLT5hZGRDbGFzcygnQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnMnLCAkdmVuZG9yUGF0aCAuICcvY29tcG9zZXIvSW5zdGFsbGVkVmVyc2lvbnMucGhwJyk7CiRjbGFzc01hcC0+c29ydCgpOwoKJGNsYXNzbWFwRmlsZSA9IDw8PEVPRgo8P3BocAoKLy8gYXV0b2xvYWRfY2xhc3NtYXAucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKClwkdmVuZG9yRGlyID0gJHZlbmRvclBhdGhDb2RlOwpcJGJhc2VEaXIgPSAkYXBwQmFzZURpckNvZGU7CgpyZXR1cm4gYXJyYXkoCgpFT0Y7CmZvcmVhY2ggKCRjbGFzc01hcC0+Z2V0TWFwKCkgYXMgJGNsYXNzTmFtZSA9PiAkcGF0aCkgewokcGF0aENvZGUgPSAkdGhpcy0+Z2V0UGF0aENvZGUoJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICRwYXRoKS4iLFxuIjsKJGNsYXNzbWFwRmlsZSAuPSAnICAgICcudmFyX2V4cG9ydCgkY2xhc3NOYW1lLCB0cnVlKS4nID0+ICcuJHBhdGhDb2RlOwp9CiRjbGFzc21hcEZpbGUgLj0gIik7XG4iOwoKaWYgKCcnID09PSAkc3VmZml4KSB7CiRzdWZmaXggPSBudWxsOwp9CmlmIChudWxsID09PSAkc3VmZml4KSB7CiRzdWZmaXggPSAkY29uZmlnLT5nZXQoJ2F1dG9sb2FkZXItc3VmZml4Jyk7CgoKaWYgKG51bGwgPT09ICRzdWZmaXggJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdmVuZG9yUGF0aC4nL2F1dG9sb2FkLnBocCcpKSB7CiRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHZlbmRvclBhdGguJy9hdXRvbG9hZC5waHAnKTsKaWYgKFByZWc6OmlzTWF0Y2goJ3tDb21wb3NlckF1dG9sb2FkZXJJbml0KFteOlxzXSspOjp9JywgJGNvbnRlbnQsICRtYXRjaCkpIHsKJHN1ZmZpeCA9ICRtYXRjaFsxXTsKfQp9CgppZiAobnVsbCA9PT0gJHN1ZmZpeCkgewokc3VmZml4ID0gJGxvY2tlciAhPT0gbnVsbCAmJiAkbG9ja2VyLT5pc0xvY2tlZCgpID8gJGxvY2tlci0+Z2V0TG9ja0RhdGEoKVsnY29udGVudC1oYXNoJ10gOiBtZDUodW5pcWlkKCcnLCB0cnVlKSk7Cn0KfQoKaWYgKCR0aGlzLT5kcnlSdW4pIHsKcmV0dXJuICRjbGFzc01hcDsKfQoKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwJywgJG5hbWVzcGFjZXNGaWxlKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3BzcjQucGhwJywgJHBzcjRGaWxlKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX2NsYXNzbWFwLnBocCcsICRjbGFzc21hcEZpbGUpOwokaW5jbHVkZVBhdGhGaWxlUGF0aCA9ICR0YXJnZXREaXIuJy9pbmNsdWRlX3BhdGhzLnBocCc7CmlmICgkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMgPSAkdGhpcy0+Z2V0SW5jbHVkZVBhdGhzRmlsZSgkcGFja2FnZU1hcCwgJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICR2ZW5kb3JQYXRoQ29kZSwgJGFwcEJhc2VEaXJDb2RlKSkgewokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkaW5jbHVkZVBhdGhGaWxlUGF0aCwgJGluY2x1ZGVQYXRoRmlsZUNvbnRlbnRzKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRpbmNsdWRlUGF0aEZpbGVQYXRoKSkgewp1bmxpbmsoJGluY2x1ZGVQYXRoRmlsZVBhdGgpOwp9CiRpbmNsdWRlRmlsZXNGaWxlUGF0aCA9ICR0YXJnZXREaXIuJy9hdXRvbG9hZF9maWxlcy5waHAnOwppZiAoJGluY2x1ZGVGaWxlc0ZpbGVDb250ZW50cyA9ICR0aGlzLT5nZXRJbmNsdWRlRmlsZXNGaWxlKCRhdXRvbG9hZHNbJ2ZpbGVzJ10sICRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkdmVuZG9yUGF0aENvZGUsICRhcHBCYXNlRGlyQ29kZSkpIHsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJGluY2x1ZGVGaWxlc0ZpbGVQYXRoLCAkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRpbmNsdWRlRmlsZXNGaWxlUGF0aCkpIHsKdW5saW5rKCRpbmNsdWRlRmlsZXNGaWxlUGF0aCk7Cn0KJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3N0YXRpYy5waHAnLCAkdGhpcy0+Z2V0U3RhdGljRmlsZSgkc3VmZml4LCAkdGFyZ2V0RGlyLCAkdmVuZG9yUGF0aCwgJGJhc2VQYXRoKSk7CiRjaGVja1BsYXRmb3JtID0gJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybS1jaGVjaycpICE9PSBmYWxzZSAmJiAhKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRwbGF0Zm9ybUNoZWNrQ29udGVudCA9IG51bGw7CmlmICgkY2hlY2tQbGF0Zm9ybSkgewokcGxhdGZvcm1DaGVja0NvbnRlbnQgPSAkdGhpcy0+Z2V0UGxhdGZvcm1DaGVjaygkcGFja2FnZU1hcCwgJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybS1jaGVjaycpLCAkZGV2UGFja2FnZU5hbWVzKTsKaWYgKG51bGwgPT09ICRwbGF0Zm9ybUNoZWNrQ29udGVudCkgewokY2hlY2tQbGF0Zm9ybSA9IGZhbHNlOwp9Cn0KaWYgKCRjaGVja1BsYXRmb3JtKSB7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0YXJnZXREaXIuJy9wbGF0Zm9ybV9jaGVjay5waHAnLCAkcGxhdGZvcm1DaGVja0NvbnRlbnQpOwp9IGVsc2VpZiAoZmlsZV9leGlzdHMoJHRhcmdldERpci4nL3BsYXRmb3JtX2NoZWNrLnBocCcpKSB7CnVubGluaygkdGFyZ2V0RGlyLicvcGxhdGZvcm1fY2hlY2sucGhwJyk7Cn0KJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHZlbmRvclBhdGguJy9hdXRvbG9hZC5waHAnLCAkdGhpcy0+Z2V0QXV0b2xvYWRGaWxlKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlLCAkc3VmZml4KSk7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0YXJnZXREaXIuJy9hdXRvbG9hZF9yZWFsLnBocCcsICR0aGlzLT5nZXRBdXRvbG9hZFJlYWxGaWxlKHRydWUsIChib29sKSAkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMsICR0YXJnZXREaXJMb2FkZXIsIChib29sKSAkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzLCAkdmVuZG9yUGF0aENvZGUsICRhcHBCYXNlRGlyQ29kZSwgJHN1ZmZpeCwgJHVzZUdsb2JhbEluY2x1ZGVQYXRoLCAkcHJlcGVuZEF1dG9sb2FkZXIsICRjaGVja1BsYXRmb3JtKSk7CgokZmlsZXN5c3RlbS0+c2FmZUNvcHkoX19ESVJfXy4nL0NsYXNzTG9hZGVyLnBocCcsICR0YXJnZXREaXIuJy9DbGFzc0xvYWRlci5waHAnKTsKJGZpbGVzeXN0ZW0tPnNhZmVDb3B5KF9fRElSX18uJy8uLi8uLi8uLi9MSUNFTlNFJywgJHRhcmdldERpci4nL0xJQ0VOU0UnKTsKCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfQVVUT0xPQURfRFVNUCwgJHRoaXMtPmRldk1vZGUsIFtdLCBbCidvcHRpbWl6ZScgPT4gJHNjYW5Qc3JQYWNrYWdlcywKXSk7Cn0KCnJldHVybiAkY2xhc3NNYXA7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRXhjbHVzaW9uUmVnZXgoc3RyaW5nICRkaXIsID9hcnJheSAkZXhjbHVkZWQpOiA/c3RyaW5nCnsKaWYgKG51bGwgPT09ICRleGNsdWRlZCkgewpyZXR1cm4gbnVsbDsKfQoKCgoKaWYgKGZpbGVfZXhpc3RzKCRkaXIpKSB7CgokZGlyTWF0Y2ggPSBwcmVnX3F1b3RlKHN0cnRyKHJlYWxwYXRoKCRkaXIpLCAnXFwnLCAnLycpKTsKZm9yZWFjaCAoJGV4Y2x1ZGVkIGFzICRpbmRleCA9PiAkcGF0dGVybikgewoKJHBhdHRlcm4gPSBQcmVnOjpyZXBsYWNlKCd7XigoW14uKyo/XFteXF0kKCl7fT0hPD58OlxcXFwjLV0rfFxcXFxbLisqP1xbXlxdJCgpe309ITw+fDojLV0pKikuKn0nLCAnJDEnLCAkcGF0dGVybik7CgppZiAoMCAhPT0gc3RycG9zKCRwYXR0ZXJuLCAkZGlyTWF0Y2gpICYmIDAgIT09IHN0cnBvcygkZGlyTWF0Y2gsICRwYXR0ZXJuKSkgewp1bnNldCgkZXhjbHVkZWRbJGluZGV4XSk7Cn0KfQp9CgpyZXR1cm4gXGNvdW50KCRleGNsdWRlZCkgPiAwID8gJ3soJyAuIGltcGxvZGUoJ3wnLCAkZXhjbHVkZWQpIC4gJyl9JyA6IG51bGw7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVpbGRQYWNrYWdlTWFwKEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlLCBhcnJheSAkcGFja2FnZXMpCnsKCiRwYWNrYWdlTWFwID0gW1skcm9vdFBhY2thZ2UsICcnXV07Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CiR0aGlzLT52YWxpZGF0ZVBhY2thZ2UoJHBhY2thZ2UpOwokcGFja2FnZU1hcFtdID0gWwokcGFja2FnZSwKJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKSwKXTsKfQoKcmV0dXJuICRwYWNrYWdlTWFwOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRhdXRvbG9hZCA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwppZiAoIWVtcHR5KCRhdXRvbG9hZFsncHNyLTQnXSkgJiYgbnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUFNSLTQgYXV0b2xvYWRpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldC1kaXIgcHJvcGVydHksIHJlbW92ZSB0aGUgdGFyZ2V0LWRpciBpbiBwYWNrYWdlICckbmFtZScuIik7Cn0KaWYgKCFlbXB0eSgkYXV0b2xvYWRbJ3Bzci00J10pKSB7CmZvcmVhY2ggKCRhdXRvbG9hZFsncHNyLTQnXSBhcyAkbmFtZXNwYWNlID0+ICRkaXJzKSB7CmlmICgkbmFtZXNwYWNlICE9PSAnJyAmJiAnXFwnICE9PSBzdWJzdHIoJG5hbWVzcGFjZSwgLTEpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJwc3ItNCBuYW1lc3BhY2VzIG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLCAnJG5hbWVzcGFjZScgZG9lcyBub3QsIHVzZSAnJG5hbWVzcGFjZVxcJy4iKTsKfQp9Cn0KfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlQXV0b2xvYWRzKGFycmF5ICRwYWNrYWdlTWFwLCBQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSwgJGZpbHRlcmVkRGV2UGFja2FnZXMgPSBmYWxzZSkKewokcm9vdFBhY2thZ2VNYXAgPSBhcnJheV9zaGlmdCgkcGFja2FnZU1hcCk7CmlmIChpc19hcnJheSgkZmlsdGVyZWREZXZQYWNrYWdlcykpIHsKJHBhY2thZ2VNYXAgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VNYXAsIHN0YXRpYyBmdW5jdGlvbiAoJGl0ZW0pIHVzZSAoJGZpbHRlcmVkRGV2UGFja2FnZXMpOiBib29sIHsKcmV0dXJuICFpbl9hcnJheSgkaXRlbVswXS0+Z2V0TmFtZSgpLCAkZmlsdGVyZWREZXZQYWNrYWdlcywgdHJ1ZSk7Cn0pOwp9IGVsc2VpZiAoJGZpbHRlcmVkRGV2UGFja2FnZXMpIHsKJHBhY2thZ2VNYXAgPSAkdGhpcy0+ZmlsdGVyUGFja2FnZU1hcCgkcGFja2FnZU1hcCwgJHJvb3RQYWNrYWdlKTsKfQokc29ydGVkUGFja2FnZU1hcCA9ICR0aGlzLT5zb3J0UGFja2FnZU1hcCgkcGFja2FnZU1hcCk7CiRzb3J0ZWRQYWNrYWdlTWFwW10gPSAkcm9vdFBhY2thZ2VNYXA7CmFycmF5X3Vuc2hpZnQoJHBhY2thZ2VNYXAsICRyb290UGFja2FnZU1hcCk7CgokcHNyMCA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHBhY2thZ2VNYXAsICdwc3ItMCcsICRyb290UGFja2FnZSk7CiRwc3I0ID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZSgkcGFja2FnZU1hcCwgJ3Bzci00JywgJHJvb3RQYWNrYWdlKTsKJGNsYXNzbWFwID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZShhcnJheV9yZXZlcnNlKCRzb3J0ZWRQYWNrYWdlTWFwKSwgJ2NsYXNzbWFwJywgJHJvb3RQYWNrYWdlKTsKJGZpbGVzID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZSgkc29ydGVkUGFja2FnZU1hcCwgJ2ZpbGVzJywgJHJvb3RQYWNrYWdlKTsKJGV4Y2x1ZGUgPSAkdGhpcy0+cGFyc2VBdXRvbG9hZHNUeXBlKCRzb3J0ZWRQYWNrYWdlTWFwLCAnZXhjbHVkZS1mcm9tLWNsYXNzbWFwJywgJHJvb3RQYWNrYWdlKTsKCmtyc29ydCgkcHNyMCk7Cmtyc29ydCgkcHNyNCk7CgpyZXR1cm4gWwoncHNyLTAnID0+ICRwc3IwLAoncHNyLTQnID0+ICRwc3I0LAonY2xhc3NtYXAnID0+ICRjbGFzc21hcCwKJ2ZpbGVzJyA9PiAkZmlsZXMsCidleGNsdWRlLWZyb20tY2xhc3NtYXAnID0+ICRleGNsdWRlLApdOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlTG9hZGVyKGFycmF5ICRhdXRvbG9hZHMsID9zdHJpbmcgJHZlbmRvckRpciA9IG51bGwpCnsKJGxvYWRlciA9IG5ldyBDbGFzc0xvYWRlcigkdmVuZG9yRGlyKTsKCmlmIChpc3NldCgkYXV0b2xvYWRzWydwc3ItMCddKSkgewpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItMCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGgpIHsKJGxvYWRlci0+YWRkKCRuYW1lc3BhY2UsICRwYXRoKTsKfQp9CgppZiAoaXNzZXQoJGF1dG9sb2Fkc1sncHNyLTQnXSkpIHsKZm9yZWFjaCAoJGF1dG9sb2Fkc1sncHNyLTQnXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRoKSB7CiRsb2FkZXItPmFkZFBzcjQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9Cn0KCmlmIChpc3NldCgkYXV0b2xvYWRzWydjbGFzc21hcCddKSkgewokZXhjbHVkZWQgPSBudWxsOwppZiAoIWVtcHR5KCRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddKSkgewokZXhjbHVkZWQgPSAkYXV0b2xvYWRzWydleGNsdWRlLWZyb20tY2xhc3NtYXAnXTsKfQoKJGNsYXNzTWFwR2VuZXJhdG9yID0gbmV3IENsYXNzTWFwR2VuZXJhdG9yKFsncGhwJywgJ2luYycsICdoaCddKTsKJGNsYXNzTWFwR2VuZXJhdG9yLT5hdm9pZER1cGxpY2F0ZVNjYW5zKCk7Cgpmb3JlYWNoICgkYXV0b2xvYWRzWydjbGFzc21hcCddIGFzICRkaXIpIHsKdHJ5IHsKJGNsYXNzTWFwR2VuZXJhdG9yLT5zY2FuUGF0aHMoJGRpciwgJHRoaXMtPmJ1aWxkRXhjbHVzaW9uUmVnZXgoJGRpciwgJGV4Y2x1ZGVkKSk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kZS0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7Cn0KfQoKJGxvYWRlci0+YWRkQ2xhc3NNYXAoJGNsYXNzTWFwR2VuZXJhdG9yLT5nZXRDbGFzc01hcCgpLT5nZXRNYXAoKSk7Cn0KCnJldHVybiAkbG9hZGVyOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRoc0ZpbGUoYXJyYXkgJHBhY2thZ2VNYXAsIEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICR2ZW5kb3JQYXRoQ29kZSwgc3RyaW5nICRhcHBCYXNlRGlyQ29kZSkKewokaW5jbHVkZVBhdGhzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewpbJHBhY2thZ2UsICRpbnN0YWxsUGF0aF0gPSAkaXRlbTsKCgppZiAobnVsbCA9PT0gJGluc3RhbGxQYXRoKSB7CmNvbnRpbnVlOwp9CgppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpICYmIHN0cmxlbigkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpID4gMCkgewokaW5zdGFsbFBhdGggPSBzdWJzdHIoJGluc3RhbGxQYXRoLCAwLCAtc3RybGVuKCcvJy4kcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpKTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpIGFzICRpbmNsdWRlUGF0aCkgewokaW5jbHVkZVBhdGggPSB0cmltKCRpbmNsdWRlUGF0aCwgJy8nKTsKJGluY2x1ZGVQYXRoc1tdID0gZW1wdHkoJGluc3RhbGxQYXRoKSA/ICRpbmNsdWRlUGF0aCA6ICRpbnN0YWxsUGF0aC4nLycuJGluY2x1ZGVQYXRoOwp9Cn0KCmlmICghJGluY2x1ZGVQYXRocykgewpyZXR1cm4gbnVsbDsKfQoKJGluY2x1ZGVQYXRoc0NvZGUgPSAnJzsKZm9yZWFjaCAoJGluY2x1ZGVQYXRocyBhcyAkcGF0aCkgewokaW5jbHVkZVBhdGhzQ29kZSAuPSAiICAgICIgLiAkdGhpcy0+Z2V0UGF0aENvZGUoJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICRwYXRoKSAuICIsXG4iOwp9CgpyZXR1cm4gPDw8RU9GCjw/cGhwCgovLyBpbmNsdWRlX3BhdGhzLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAokaW5jbHVkZVBhdGhzQ29kZSk7CgpFT0Y7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5jbHVkZUZpbGVzRmlsZShhcnJheSAkZmlsZXMsIEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICR2ZW5kb3JQYXRoQ29kZSwgc3RyaW5nICRhcHBCYXNlRGlyQ29kZSkKewoKJGZpbGVzID0gYXJyYXlfbWFwKApmdW5jdGlvbiAoc3RyaW5nICRmdW5jdGlvbkZpbGUpIHVzZSAoJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgpOiBzdHJpbmcgewpyZXR1cm4gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkZnVuY3Rpb25GaWxlKTsKfSwKJGZpbGVzCik7CiR1bmlxdWVGaWxlcyA9IGFycmF5X3VuaXF1ZSgkZmlsZXMpOwppZiAoY291bnQoJHVuaXF1ZUZpbGVzKSA8IGNvdW50KCRmaWxlcykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgZm9sbG93aW5nICJmaWxlcyIgYXV0b2xvYWQgcnVsZXMgYXJlIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLCB0aGlzIG1heSBjYXVzZSBpc3N1ZXMgYW5kIHNob3VsZCBiZSByZXNvbHZlZDo8L3dhcm5pbmc+Jyk7CmZvcmVhY2ggKGFycmF5X3VuaXF1ZShhcnJheV9kaWZmX2Fzc29jKCRmaWxlcywgJHVuaXF1ZUZpbGVzKSkgYXMgJGR1cGxpY2F0ZUZpbGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4gLSAnLiRkdXBsaWNhdGVGaWxlLic8L3dhcm5pbmc+Jyk7Cn0KfQp1bnNldCgkdW5pcXVlRmlsZXMpOwoKJGZpbGVzQ29kZSA9ICcnOwoKZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlSWRlbnRpZmllciA9PiAkZnVuY3Rpb25GaWxlKSB7CiRmaWxlc0NvZGUgLj0gJyAgICAnIC4gdmFyX2V4cG9ydCgkZmlsZUlkZW50aWZpZXIsIHRydWUpIC4gJyA9PiAnIC4gJGZ1bmN0aW9uRmlsZSAuICIsXG4iOwp9CgppZiAoISRmaWxlc0NvZGUpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiA8PDxFT0YKPD9waHAKCi8vIGF1dG9sb2FkX2ZpbGVzLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAokZmlsZXNDb2RlKTsKCkVPRjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBhdGhDb2RlKEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICRwYXRoKQp7CmlmICghJGZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRwYXRoKSkgewokcGF0aCA9ICRiYXNlUGF0aCAuICcvJyAuICRwYXRoOwp9CiRwYXRoID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwoKJGJhc2VEaXIgPSAnJzsKaWYgKHN0cnBvcygkcGF0aC4nLycsICR2ZW5kb3JQYXRoLicvJykgPT09IDApIHsKJHBhdGggPSAoc3RyaW5nKSBzdWJzdHIoJHBhdGgsIHN0cmxlbigkdmVuZG9yUGF0aCkpOwokYmFzZURpciA9ICckdmVuZG9yRGlyIC4gJzsKfSBlbHNlIHsKJHBhdGggPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkYmFzZVBhdGgsICRwYXRoLCB0cnVlKSk7CmlmICghJGZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRwYXRoKSkgewokYmFzZURpciA9ICckYmFzZURpciAuICc7CiRwYXRoID0gJy8nIC4gJHBhdGg7Cn0KfQoKaWYgKHN0cnBvcygkcGF0aCwgJy5waGFyJykgIT09IGZhbHNlKSB7CiRiYXNlRGlyID0gIidwaGFyOi8vJyAuICIgLiAkYmFzZURpcjsKfQoKcmV0dXJuICRiYXNlRGlyIC4gdmFyX2V4cG9ydCgkcGF0aCwgdHJ1ZSk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbGF0Zm9ybUNoZWNrKGFycmF5ICRwYWNrYWdlTWFwLCAkY2hlY2tQbGF0Zm9ybSwgYXJyYXkgJGRldlBhY2thZ2VOYW1lcykKewokbG93ZXN0UGhwVmVyc2lvbiA9IEJvdW5kOjp6ZXJvKCk7CiRyZXF1aXJlZFBocDY0Yml0ID0gZmFsc2U7CiRyZXF1aXJlZEV4dGVuc2lvbnMgPSBbXTsKJGV4dGVuc2lvblByb3ZpZGVycyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCksICRwYWNrYWdlLT5nZXRQcm92aWRlcygpKSBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaCgne15leHQtKC4rKSR9aUQnLCAkbGluay0+Z2V0VGFyZ2V0KCksICRtYXRjaCkpIHsKJGV4dGVuc2lvblByb3ZpZGVyc1skbWF0Y2hbMV1dW10gPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwp9Cn0KfQoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKCmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkZGV2UGFja2FnZU5hbWVzLCB0cnVlKSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKaWYgKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfQoKaWYgKGluX2FycmF5KCRsaW5rLT5nZXRUYXJnZXQoKSwgWydwaHAnLCAncGhwLTY0Yml0J10sIHRydWUpKSB7CiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmNvbXBhcmVUbygkbG93ZXN0UGhwVmVyc2lvbiwgJz4nKSkgewokbG93ZXN0UGhwVmVyc2lvbiA9ICRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCk7Cn0KfQoKaWYgKCdwaHAtNjRiaXQnID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHJlcXVpcmVkUGhwNjRiaXQgPSB0cnVlOwp9CgppZiAoJGNoZWNrUGxhdGZvcm0gPT09IHRydWUgJiYgUHJlZzo6aXNNYXRjaCgne15leHQtKC4rKSR9aUQnLCAkbGluay0+Z2V0VGFyZ2V0KCksICRtYXRjaCkpIHsKCmlmIChpc3NldCgkZXh0ZW5zaW9uUHJvdmlkZXJzWyRtYXRjaFsxXV0pKSB7CmZvcmVhY2ggKCRleHRlbnNpb25Qcm92aWRlcnNbJG1hdGNoWzFdXSBhcyAkcHJvdmlkZWQpIHsKaWYgKCRwcm92aWRlZC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkgewpjb250aW51ZSAyOwp9Cn0KfQoKaWYgKCRtYXRjaFsxXSA9PT0gJ3plbmQtb3BjYWNoZScpIHsKJG1hdGNoWzFdID0gJ3plbmQgb3BjYWNoZSc7Cn0KCiRleHRlbnNpb24gPSB2YXJfZXhwb3J0KCRtYXRjaFsxXSwgdHJ1ZSk7CmlmICgkbWF0Y2hbMV0gPT09ICdwY250bCcgfHwgJG1hdGNoWzFdID09PSAncmVhZGxpbmUnKSB7CiRyZXF1aXJlZEV4dGVuc2lvbnNbJGV4dGVuc2lvbl0gPSAiUEhQX1NBUEkgIT09ICdjbGknIHx8IGV4dGVuc2lvbl9sb2FkZWQoJGV4dGVuc2lvbikgfHwgXCRtaXNzaW5nRXh0ZW5zaW9uc1tdID0gJGV4dGVuc2lvbjtcbiI7Cn0gZWxzZSB7CiRyZXF1aXJlZEV4dGVuc2lvbnNbJGV4dGVuc2lvbl0gPSAiZXh0ZW5zaW9uX2xvYWRlZCgkZXh0ZW5zaW9uKSB8fCBcJG1pc3NpbmdFeHRlbnNpb25zW10gPSAkZXh0ZW5zaW9uO1xuIjsKfQp9Cn0KfQoKa3NvcnQoJHJlcXVpcmVkRXh0ZW5zaW9ucyk7CgokZm9ybWF0VG9QaHBWZXJzaW9uSWQgPSBzdGF0aWMgZnVuY3Rpb24gKEJvdW5kICRib3VuZCk6IGludCB7CmlmICgkYm91bmQtPmlzWmVybygpKSB7CnJldHVybiAwOwp9CgppZiAoJGJvdW5kLT5pc1Bvc2l0aXZlSW5maW5pdHkoKSkgewpyZXR1cm4gOTk5OTk7Cn0KCiR2ZXJzaW9uID0gc3RyX3JlcGxhY2UoJy0nLCAnLicsICRib3VuZC0+Z2V0VmVyc2lvbigpKTsKJGNodW5rcyA9IGFycmF5X21hcCgnaW50dmFsJywgZXhwbG9kZSgnLicsICR2ZXJzaW9uKSk7CgpyZXR1cm4gJGNodW5rc1swXSAqIDEwMDAwICsgJGNodW5rc1sxXSAqIDEwMCArICRjaHVua3NbMl07Cn07CgokZm9ybWF0VG9IdW1hblJlYWRhYmxlID0gc3RhdGljIGZ1bmN0aW9uIChCb3VuZCAkYm91bmQpIHsKaWYgKCRib3VuZC0+aXNaZXJvKCkpIHsKcmV0dXJuIDA7Cn0KCmlmICgkYm91bmQtPmlzUG9zaXRpdmVJbmZpbml0eSgpKSB7CnJldHVybiA5OTk5OTsKfQoKJHZlcnNpb24gPSBzdHJfcmVwbGFjZSgnLScsICcuJywgJGJvdW5kLT5nZXRWZXJzaW9uKCkpOwokY2h1bmtzID0gZXhwbG9kZSgnLicsICR2ZXJzaW9uKTsKJGNodW5rcyA9IGFycmF5X3NsaWNlKCRjaHVua3MsIDAsIDMpOwoKcmV0dXJuIGltcGxvZGUoJy4nLCAkY2h1bmtzKTsKfTsKCiRyZXF1aXJlZFBocCA9ICcnOwokcmVxdWlyZWRQaHBFcnJvciA9ICcnOwppZiAoISRsb3dlc3RQaHBWZXJzaW9uLT5pc1plcm8oKSkgewokb3BlcmF0b3IgPSAkbG93ZXN0UGhwVmVyc2lvbi0+aXNJbmNsdXNpdmUoKSA/ICc+PScgOiAnPic7CiRyZXF1aXJlZFBocCA9ICdQSFBfVkVSU0lPTl9JRCAnLiRvcGVyYXRvci4nICcuJGZvcm1hdFRvUGhwVmVyc2lvbklkKCRsb3dlc3RQaHBWZXJzaW9uKTsKJHJlcXVpcmVkUGhwRXJyb3IgPSAnIicuJG9wZXJhdG9yLicgJy4kZm9ybWF0VG9IdW1hblJlYWRhYmxlKCRsb3dlc3RQaHBWZXJzaW9uKS4nIic7Cn0KCmlmICgkcmVxdWlyZWRQaHApIHsKJHJlcXVpcmVkUGhwID0gPDw8UEhQX0NIRUNLCgppZiAoISgkcmVxdWlyZWRQaHApKSB7CiAgICBcJGlzc3Vlc1tdID0gJ1lvdXIgQ29tcG9zZXIgZGVwZW5kZW5jaWVzIHJlcXVpcmUgYSBQSFAgdmVyc2lvbiAkcmVxdWlyZWRQaHBFcnJvci4gWW91IGFyZSBydW5uaW5nICcgLiBQSFBfVkVSU0lPTiAuICcuJzsKfQoKUEhQX0NIRUNLOwp9CgppZiAoJHJlcXVpcmVkUGhwNjRiaXQpIHsKJHJlcXVpcmVkUGhwIC49IDw8PFBIUF9DSEVDSwoKaWYgKFBIUF9JTlRfU0laRSAhPT0gOCkgewogICAgXCRpc3N1ZXNbXSA9ICdZb3VyIENvbXBvc2VyIGRlcGVuZGVuY2llcyByZXF1aXJlIGEgNjQtYml0IGJ1aWxkIG9mIFBIUC4nOwp9CgpQSFBfQ0hFQ0s7Cn0KCiRyZXF1aXJlZEV4dGVuc2lvbnMgPSBpbXBsb2RlKCcnLCAkcmVxdWlyZWRFeHRlbnNpb25zKTsKaWYgKCcnICE9PSAkcmVxdWlyZWRFeHRlbnNpb25zKSB7CiRyZXF1aXJlZEV4dGVuc2lvbnMgPSA8PDxFWFRfQ0hFQ0tTCgpcJG1pc3NpbmdFeHRlbnNpb25zID0gYXJyYXkoKTsKJHJlcXVpcmVkRXh0ZW5zaW9ucwppZiAoXCRtaXNzaW5nRXh0ZW5zaW9ucykgewogICAgXCRpc3N1ZXNbXSA9ICdZb3VyIENvbXBvc2VyIGRlcGVuZGVuY2llcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgUEhQIGV4dGVuc2lvbnMgdG8gYmUgaW5zdGFsbGVkOiAnIC4gaW1wbG9kZSgnLCAnLCBcJG1pc3NpbmdFeHRlbnNpb25zKSAuICcuJzsKfQoKRVhUX0NIRUNLUzsKfQoKaWYgKCEkcmVxdWlyZWRQaHAgJiYgISRyZXF1aXJlZEV4dGVuc2lvbnMpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiA8PDxQTEFURk9STV9DSEVDSwo8P3BocAoKLy8gcGxhdGZvcm1fY2hlY2sucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKClwkaXNzdWVzID0gYXJyYXkoKTsKeyRyZXF1aXJlZFBocH17JHJlcXVpcmVkRXh0ZW5zaW9uc30KaWYgKFwkaXNzdWVzKSB7CiAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7CiAgICB9CiAgICBpZiAoIWluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykpIHsKICAgICAgICBpZiAoUEhQX1NBUEkgPT09ICdjbGknIHx8IFBIUF9TQVBJID09PSAncGhwZGJnJykgewogICAgICAgICAgICBmd3JpdGUoU1RERVJSLCAnQ29tcG9zZXIgZGV0ZWN0ZWQgaXNzdWVzIGluIHlvdXIgcGxhdGZvcm06JyAuIFBIUF9FT0wuUEhQX0VPTCAuIGltcGxvZGUoUEhQX0VPTCwgXCRpc3N1ZXMpIC4gUEhQX0VPTC5QSFBfRU9MKTsKICAgICAgICB9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgIGVjaG8gJ0NvbXBvc2VyIGRldGVjdGVkIGlzc3VlcyBpbiB5b3VyIHBsYXRmb3JtOicgLiBQSFBfRU9MLlBIUF9FT0wgLiBzdHJfcmVwbGFjZSgnWW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJy4nLCAnJywgaW1wbG9kZShQSFBfRU9MLCBcJGlzc3VlcykpIC4gUEhQX0VPTC5QSFBfRU9MOwogICAgICAgIH0KICAgIH0KICAgIHRyaWdnZXJfZXJyb3IoCiAgICAgICAgJ0NvbXBvc2VyIGRldGVjdGVkIGlzc3VlcyBpbiB5b3VyIHBsYXRmb3JtOiAnIC4gaW1wbG9kZSgnICcsIFwkaXNzdWVzKSwKICAgICAgICBFX1VTRVJfRVJST1IKICAgICk7Cn0KClBMQVRGT1JNX0NIRUNLOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXV0b2xvYWRGaWxlKHN0cmluZyAkdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSwgc3RyaW5nICRzdWZmaXgpCnsKJGxhc3RDaGFyID0gJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGVbc3RybGVuKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlKSAtIDFdOwppZiAoIiciID09PSAkbGFzdENoYXIgfHwgJyInID09PSAkbGFzdENoYXIpIHsKJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUgPSBzdWJzdHIoJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUsIDAsIC0xKS4nL2F1dG9sb2FkX3JlYWwucGhwJy4kbGFzdENoYXI7Cn0gZWxzZSB7CiR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlIC49ICIgLiAnL2F1dG9sb2FkX3JlYWwucGhwJyI7Cn0KCnJldHVybiA8PDxBVVRPTE9BRAo8P3BocAoKLy8gYXV0b2xvYWQucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKCmlmIChQSFBfVkVSU0lPTl9JRCA8IDUwNjAwKSB7CiAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7CiAgICB9CiAgICBcJGVyciA9ICdDb21wb3NlciAyLjMuMCBkcm9wcGVkIHN1cHBvcnQgZm9yIGF1dG9sb2FkaW5nIG9uIFBIUCA8NS42IGFuZCB5b3UgYXJlIHJ1bm5pbmcgJy5QSFBfVkVSU0lPTi4nLCBwbGVhc2UgdXBncmFkZSBQSFAgb3IgdXNlIENvbXBvc2VyIDIuMiBMVFMgdmlhICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLTIuMiIuIEFib3J0aW5nLicuUEhQX0VPTDsKICAgIGlmICghaW5pX2dldCgnZGlzcGxheV9lcnJvcnMnKSkgewogICAgICAgIGlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7CiAgICAgICAgICAgIGZ3cml0ZShTVERFUlIsIFwkZXJyKTsKICAgICAgICB9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgIGVjaG8gXCRlcnI7CiAgICAgICAgfQogICAgfQogICAgdHJpZ2dlcl9lcnJvcigKICAgICAgICBcJGVyciwKICAgICAgICBFX1VTRVJfRVJST1IKICAgICk7Cn0KCnJlcXVpcmVfb25jZSAkdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZTsKCnJldHVybiBDb21wb3NlckF1dG9sb2FkZXJJbml0JHN1ZmZpeDo6Z2V0TG9hZGVyKCk7CgpBVVRPTE9BRDsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEF1dG9sb2FkUmVhbEZpbGUoYm9vbCAkdXNlQ2xhc3NNYXAsIGJvb2wgJHVzZUluY2x1ZGVQYXRoLCA/c3RyaW5nICR0YXJnZXREaXJMb2FkZXIsIGJvb2wgJHVzZUluY2x1ZGVGaWxlcywgc3RyaW5nICR2ZW5kb3JQYXRoQ29kZSwgc3RyaW5nICRhcHBCYXNlRGlyQ29kZSwgc3RyaW5nICRzdWZmaXgsIGJvb2wgJHVzZUdsb2JhbEluY2x1ZGVQYXRoLCBzdHJpbmcgJHByZXBlbmRBdXRvbG9hZGVyLCBib29sICRjaGVja1BsYXRmb3JtKQp7CiRmaWxlID0gPDw8SEVBREVSCjw/cGhwCgovLyBhdXRvbG9hZF9yZWFsLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpjbGFzcyBDb21wb3NlckF1dG9sb2FkZXJJbml0JHN1ZmZpeAp7CiAgICBwcml2YXRlIHN0YXRpYyBcJGxvYWRlcjsKCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRDbGFzc0xvYWRlcihcJGNsYXNzKQogICAgewogICAgICAgIGlmICgnQ29tcG9zZXJcXEF1dG9sb2FkXFxDbGFzc0xvYWRlcicgPT09IFwkY2xhc3MpIHsKICAgICAgICAgICAgcmVxdWlyZSBfX0RJUl9fIC4gJy9DbGFzc0xvYWRlci5waHAnOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9hZGVyKCkKICAgIHsKICAgICAgICBpZiAobnVsbCAhPT0gc2VsZjo6XCRsb2FkZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OlwkbG9hZGVyOwogICAgICAgIH0KCgpIRUFERVI7CgppZiAoJGNoZWNrUGxhdGZvcm0pIHsKJGZpbGUgLj0gPDw8J1BMQVRGT1JNX0NIRUNLJwogICAgICAgIHJlcXVpcmUgX19ESVJfXyAuICcvcGxhdGZvcm1fY2hlY2sucGhwJzsKCgpQTEFURk9STV9DSEVDSzsKfQoKJGZpbGUgLj0gPDw8Q0xBU1NMT0FERVJfSU5JVAogICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgnQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXgnLCAnbG9hZENsYXNzTG9hZGVyJyksIHRydWUsICRwcmVwZW5kQXV0b2xvYWRlcik7CiAgICAgICAgc2VsZjo6XCRsb2FkZXIgPSBcJGxvYWRlciA9IG5ldyBcXENvbXBvc2VyXFxBdXRvbG9hZFxcQ2xhc3NMb2FkZXIoXFxkaXJuYW1lKF9fRElSX18pKTsKICAgICAgICBzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcihhcnJheSgnQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXgnLCAnbG9hZENsYXNzTG9hZGVyJykpOwoKCkNMQVNTTE9BREVSX0lOSVQ7CgppZiAoJHVzZUluY2x1ZGVQYXRoKSB7CiRmaWxlIC49IDw8PCdJTkNMVURFX1BBVEgnCiAgICAgICAgJGluY2x1ZGVQYXRocyA9IHJlcXVpcmUgX19ESVJfXyAuICcvaW5jbHVkZV9wYXRocy5waHAnOwogICAgICAgICRpbmNsdWRlUGF0aHNbXSA9IGdldF9pbmNsdWRlX3BhdGgoKTsKICAgICAgICBzZXRfaW5jbHVkZV9wYXRoKGltcGxvZGUoUEFUSF9TRVBBUkFUT1IsICRpbmNsdWRlUGF0aHMpKTsKCgpJTkNMVURFX1BBVEg7Cn0KCgokZmlsZSAuPSA8PDxTVEFUSUNfSU5JVAogICAgICAgIHJlcXVpcmUgX19ESVJfXyAuICcvYXV0b2xvYWRfc3RhdGljLnBocCc7CiAgICAgICAgY2FsbF91c2VyX2Z1bmMoXENvbXBvc2VyXEF1dG9sb2FkXENvbXBvc2VyU3RhdGljSW5pdCRzdWZmaXg6OmdldEluaXRpYWxpemVyKFwkbG9hZGVyKSk7CgoKU1RBVElDX0lOSVQ7CgppZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkgewokZmlsZSAuPSA8PDwnQ0xBU1NNQVBBVVRIT1JJVEFUSVZFJwogICAgICAgICRsb2FkZXItPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSh0cnVlKTsKCkNMQVNTTUFQQVVUSE9SSVRBVElWRTsKfQoKaWYgKCR0aGlzLT5hcGN1KSB7CiRhcGN1UHJlZml4ID0gdmFyX2V4cG9ydCgoJHRoaXMtPmFwY3VQcmVmaXggIT09IG51bGwgPyAkdGhpcy0+YXBjdVByZWZpeCA6IHN1YnN0cihiYXNlNjRfZW5jb2RlKG1kNSh1bmlxaWQoJycsIHRydWUpLCB0cnVlKSksIDAsIC0zKSksIHRydWUpOwokZmlsZSAuPSA8PDxBUENVCiAgICAgICAgXCRsb2FkZXItPnNldEFwY3VQcmVmaXgoJGFwY3VQcmVmaXgpOwoKQVBDVTsKfQoKaWYgKCR1c2VHbG9iYWxJbmNsdWRlUGF0aCkgewokZmlsZSAuPSA8PDwnSU5DTFVERVBBVEgnCiAgICAgICAgJGxvYWRlci0+c2V0VXNlSW5jbHVkZVBhdGgodHJ1ZSk7CgpJTkNMVURFUEFUSDsKfQoKaWYgKCR0YXJnZXREaXJMb2FkZXIpIHsKJGZpbGUgLj0gPDw8UkVHSVNURVJfVEFSR0VUX0RJUl9BVVRPTE9BRAogICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgnQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXgnLCAnYXV0b2xvYWQnKSwgdHJ1ZSwgdHJ1ZSk7CgoKUkVHSVNURVJfVEFSR0VUX0RJUl9BVVRPTE9BRDsKfQoKJGZpbGUgLj0gPDw8UkVHSVNURVJfTE9BREVSCiAgICAgICAgXCRsb2FkZXItPnJlZ2lzdGVyKCRwcmVwZW5kQXV0b2xvYWRlcik7CgoKUkVHSVNURVJfTE9BREVSOwoKaWYgKCR1c2VJbmNsdWRlRmlsZXMpIHsKJGZpbGUgLj0gPDw8SU5DTFVERV9GSUxFUwogICAgICAgIFwkZmlsZXNUb0xvYWQgPSBcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0JHN1ZmZpeDo6XCRmaWxlczsKICAgICAgICBcJHJlcXVpcmVGaWxlID0gXENsb3N1cmU6OmJpbmQoc3RhdGljIGZ1bmN0aW9uIChcJGZpbGVJZGVudGlmaWVyLCBcJGZpbGUpIHsKICAgICAgICAgICAgaWYgKGVtcHR5KFwkR0xPQkFMU1snX19jb21wb3Nlcl9hdXRvbG9hZF9maWxlcyddW1wkZmlsZUlkZW50aWZpZXJdKSkgewogICAgICAgICAgICAgICAgXCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bXCRmaWxlSWRlbnRpZmllcl0gPSB0cnVlOwoKICAgICAgICAgICAgICAgIHJlcXVpcmUgXCRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfSwgbnVsbCwgbnVsbCk7CiAgICAgICAgZm9yZWFjaCAoXCRmaWxlc1RvTG9hZCBhcyBcJGZpbGVJZGVudGlmaWVyID0+IFwkZmlsZSkgewogICAgICAgICAgICBcJHJlcXVpcmVGaWxlKFwkZmlsZUlkZW50aWZpZXIsIFwkZmlsZSk7CiAgICAgICAgfQoKCklOQ0xVREVfRklMRVM7Cn0KCiRmaWxlIC49IDw8PE1FVEhPRF9GT09URVIKICAgICAgICByZXR1cm4gXCRsb2FkZXI7CiAgICB9CgpNRVRIT0RfRk9PVEVSOwoKJGZpbGUgLj0gJHRhcmdldERpckxvYWRlcjsKCnJldHVybiAkZmlsZSAuIDw8PEZPT1RFUgp9CgpGT09URVI7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFN0YXRpY0ZpbGUoc3RyaW5nICRzdWZmaXgsIHN0cmluZyAkdGFyZ2V0RGlyLCBzdHJpbmcgJHZlbmRvclBhdGgsIHN0cmluZyAkYmFzZVBhdGgpCnsKJGZpbGUgPSA8PDxIRUFERVIKPD9waHAKCi8vIGF1dG9sb2FkX3N0YXRpYy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKY2xhc3MgQ29tcG9zZXJTdGF0aWNJbml0JHN1ZmZpeAp7CgpIRUFERVI7CgokbG9hZGVyID0gbmV3IENsYXNzTG9hZGVyKCk7CgokbWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9uYW1lc3BhY2VzLnBocCc7CmZvcmVhY2ggKCRtYXAgYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5zZXQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9CgokbWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9wc3I0LnBocCc7CmZvcmVhY2ggKCRtYXAgYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5zZXRQc3I0KCRuYW1lc3BhY2UsICRwYXRoKTsKfQoKJGNsYXNzTWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9jbGFzc21hcC5waHAnOwppZiAoJGNsYXNzTWFwKSB7CiRsb2FkZXItPmFkZENsYXNzTWFwKCRjbGFzc01hcCk7Cn0KCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKCiR2ZW5kb3JQYXRoQ29kZSA9ICcgPT4gJyAuICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZShyZWFscGF0aCgkdGFyZ2V0RGlyKSwgJHZlbmRvclBhdGgsIHRydWUsIHRydWUpIC4gIiAuICcvIjsKJHZlbmRvclBoYXJQYXRoQ29kZSA9ICcgPT4gXCdwaGFyOi8vXCcgLiAnIC4gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkdmVuZG9yUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwokYXBwQmFzZURpckNvZGUgPSAnID0+ICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICRiYXNlUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwokYXBwQmFzZURpclBoYXJDb2RlID0gJyA9PiBcJ3BoYXI6Ly9cJyAuICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICRiYXNlUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwoKJGFic29sdXRlVmVuZG9yUGF0aENvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgkdmVuZG9yRGlyLCAnXFwvJykgLiAnLycsIHRydWUpLCAwLCAtMSk7CiRhYnNvbHV0ZVZlbmRvclBoYXJQYXRoQ29kZSA9ICcgPT4gJyAuIHN1YnN0cih2YXJfZXhwb3J0KHJ0cmltKCdwaGFyOi8vJyAuICR2ZW5kb3JEaXIsICdcXC8nKSAuICcvJywgdHJ1ZSksIDAsIC0xKTsKJGFic29sdXRlQXBwQmFzZURpckNvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgkYmFzZURpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwokYWJzb2x1dGVBcHBCYXNlRGlyUGhhckNvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgncGhhcjovLycgLiAkYmFzZURpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwoKJGluaXRpYWxpemVyID0gJyc7CiRwcmVmaXggPSAiXDBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlclwwIjsKJHByZWZpeExlbiA9IHN0cmxlbigkcHJlZml4KTsKaWYgKGZpbGVfZXhpc3RzKCR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX2ZpbGVzLnBocCcpKSB7CiRtYXBzID0gWydmaWxlcycgPT4gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9maWxlcy5waHAnXTsKfSBlbHNlIHsKJG1hcHMgPSBbXTsKfQoKZm9yZWFjaCAoKGFycmF5KSAkbG9hZGVyIGFzICRwcm9wID0+ICR2YWx1ZSkgewppZiAoIWlzX2FycmF5KCR2YWx1ZSkgfHwgXGNvdW50KCR2YWx1ZSkgPT09IDAgfHwgIXN0cl9zdGFydHNfd2l0aCgkcHJvcCwgJHByZWZpeCkpIHsKY29udGludWU7Cn0KJG1hcHNbc3Vic3RyKCRwcm9wLCAkcHJlZml4TGVuKV0gPSAkdmFsdWU7Cn0KCmZvcmVhY2ggKCRtYXBzIGFzICRwcm9wID0+ICR2YWx1ZSkgewokdmFsdWUgPSBzdHJ0cigKdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpLApbCiRhYnNvbHV0ZVZlbmRvclBhdGhDb2RlID0+ICR2ZW5kb3JQYXRoQ29kZSwKJGFic29sdXRlVmVuZG9yUGhhclBhdGhDb2RlID0+ICR2ZW5kb3JQaGFyUGF0aENvZGUsCiRhYnNvbHV0ZUFwcEJhc2VEaXJDb2RlID0+ICRhcHBCYXNlRGlyQ29kZSwKJGFic29sdXRlQXBwQmFzZURpclBoYXJDb2RlID0+ICRhcHBCYXNlRGlyUGhhckNvZGUsCl0KKTsKJHZhbHVlID0gbHRyaW0oUHJlZzo6cmVwbGFjZSgnL14gKi9tJywgJyAgICAkMCQwJywgJHZhbHVlKSk7CgokZmlsZSAuPSBzcHJpbnRmKCIgICAgcHVibGljIHN0YXRpYyAkJXMgPSAlcztcblxuIiwgJHByb3AsICR2YWx1ZSk7CmlmICgnZmlsZXMnICE9PSAkcHJvcCkgewokaW5pdGlhbGl6ZXIgLj0gIiAgICAgICAgICAgIFwkbG9hZGVyLT4kcHJvcCA9IENvbXBvc2VyU3RhdGljSW5pdCRzdWZmaXg6OlwkJHByb3A7XG4iOwp9Cn0KCnJldHVybiAkZmlsZSAuIDw8PElOSVRJQUxJWkVSCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluaXRpYWxpemVyKENsYXNzTG9hZGVyIFwkbG9hZGVyKQogICAgewogICAgICAgIHJldHVybiBcQ2xvc3VyZTo6YmluZChmdW5jdGlvbiAoKSB1c2UgKFwkbG9hZGVyKSB7CiRpbml0aWFsaXplcgogICAgICAgIH0sIG51bGwsIENsYXNzTG9hZGVyOjpjbGFzcyk7CiAgICB9Cn0KCklOSVRJQUxJWkVSOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUF1dG9sb2Fkc1R5cGUoYXJyYXkgJHBhY2thZ2VNYXAsIHN0cmluZyAkdHlwZSwgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlKQp7CiRhdXRvbG9hZHMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlTWFwIGFzICRpdGVtKSB7ClskcGFja2FnZSwgJGluc3RhbGxQYXRoXSA9ICRpdGVtOwoKCmlmIChudWxsID09PSAkaW5zdGFsbFBhdGgpIHsKY29udGludWU7Cn0KCiRhdXRvbG9hZCA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwppZiAoJHRoaXMtPmRldk1vZGUgJiYgJHBhY2thZ2UgPT09ICRyb290UGFja2FnZSkgewokYXV0b2xvYWQgPSBhcnJheV9tZXJnZV9yZWN1cnNpdmUoJGF1dG9sb2FkLCAkcGFja2FnZS0+Z2V0RGV2QXV0b2xvYWQoKSk7Cn0KCgppZiAoIWlzc2V0KCRhdXRvbG9hZFskdHlwZV0pIHx8ICFpc19hcnJheSgkYXV0b2xvYWRbJHR5cGVdKSkgewpjb250aW51ZTsKfQppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpICYmICRwYWNrYWdlICE9PSAkcm9vdFBhY2thZ2UpIHsKJGluc3RhbGxQYXRoID0gc3Vic3RyKCRpbnN0YWxsUGF0aCwgMCwgLXN0cmxlbignLycuJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSk7Cn0KCmZvcmVhY2ggKCRhdXRvbG9hZFskdHlwZV0gYXMgJG5hbWVzcGFjZSA9PiAkcGF0aHMpIHsKZm9yZWFjaCAoKGFycmF5KSAkcGF0aHMgYXMgJHBhdGgpIHsKaWYgKCgkdHlwZSA9PT0gJ2ZpbGVzJyB8fCAkdHlwZSA9PT0gJ2NsYXNzbWFwJyB8fCAkdHlwZSA9PT0gJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCcpICYmICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSAmJiAhRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkaW5zdGFsbFBhdGguJy8nLiRwYXRoKSkgewoKaWYgKCRwYWNrYWdlID09PSAkcm9vdFBhY2thZ2UpIHsKJHRhcmdldERpciA9IHN0cl9yZXBsYWNlKCdcXDxkaXJzZXBcXD4nLCAnW1xcXFwvXScsIHByZWdfcXVvdGUoc3RyX3JlcGxhY2UoWycvJywgJ1xcJ10sICc8ZGlyc2VwPicsICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSkpKTsKJHBhdGggPSBsdHJpbShQcmVnOjpyZXBsYWNlKCd7XicuJHRhcmdldERpci4nfScsICcnLCBsdHJpbSgkcGF0aCwgJ1xcLycpKSwgJ1xcLycpOwp9IGVsc2UgewoKJHBhdGggPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgLiAnLycgLiAkcGF0aDsKfQp9CgppZiAoJHR5cGUgPT09ICdleGNsdWRlLWZyb20tY2xhc3NtYXAnKSB7CgokcGF0aCA9IFByZWc6OnJlcGxhY2UoJ3svK30nLCAnLycsIHByZWdfcXVvdGUodHJpbShzdHJ0cigkcGF0aCwgJ1xcJywgJy8nKSwgJy8nKSkpOwoKCiRwYXRoID0gc3RydHIoJHBhdGgsIFsnXFwqXFwqJyA9PiAnLis/JywgJ1xcKicgPT4gJ1teL10rPyddKTsKCgokdXBkaXIgPSBudWxsOwokcGF0aCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygKJ3teKCg/Oig/OlxcXFxcXC4pezEsMn0rLykrKX0nLApzdGF0aWMgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCYkdXBkaXIpOiBzdHJpbmcgewppZiAoaXNzZXQoJG1hdGNoZXNbMV0pKSB7CgokdXBkaXIgPSBzdHJfcmVwbGFjZSgnXFwuJywgJy4nLCAkbWF0Y2hlc1sxXSk7Cn0KCnJldHVybiAnJzsKfSwKJHBhdGgKKTsKaWYgKGVtcHR5KCRpbnN0YWxsUGF0aCkpIHsKJGluc3RhbGxQYXRoID0gc3RydHIoUGxhdGZvcm06OmdldEN3ZCgpLCAnXFwnLCAnLycpOwp9CgokcmVzb2x2ZWRQYXRoID0gcmVhbHBhdGgoJGluc3RhbGxQYXRoIC4gJy8nIC4gJHVwZGlyKTsKaWYgKGZhbHNlID09PSAkcmVzb2x2ZWRQYXRoKSB7CmNvbnRpbnVlOwp9CiRhdXRvbG9hZHNbXSA9IHByZWdfcXVvdGUoc3RydHIoJHJlc29sdmVkUGF0aCwgJ1xcJywgJy8nKSkgLiAnLycgLiAkcGF0aCAuICcoJHwvKSc7CmNvbnRpbnVlOwp9CgokcmVsYXRpdmVQYXRoID0gZW1wdHkoJGluc3RhbGxQYXRoKSA/IChlbXB0eSgkcGF0aCkgPyAnLicgOiAkcGF0aCkgOiAkaW5zdGFsbFBhdGguJy8nLiRwYXRoOwoKaWYgKCR0eXBlID09PSAnZmlsZXMnKSB7CiRhdXRvbG9hZHNbJHRoaXMtPmdldEZpbGVJZGVudGlmaWVyKCRwYWNrYWdlLCAkcGF0aCldID0gJHJlbGF0aXZlUGF0aDsKY29udGludWU7Cn0KaWYgKCR0eXBlID09PSAnY2xhc3NtYXAnKSB7CiRhdXRvbG9hZHNbXSA9ICRyZWxhdGl2ZVBhdGg7CmNvbnRpbnVlOwp9CgokYXV0b2xvYWRzWyRuYW1lc3BhY2VdW10gPSAkcmVsYXRpdmVQYXRoOwp9Cn0KfQoKcmV0dXJuICRhdXRvbG9hZHM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRGaWxlSWRlbnRpZmllcihQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpCnsKcmV0dXJuIG1kNSgkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJzonIC4gJHBhdGgpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmlsdGVyUGFja2FnZU1hcChhcnJheSAkcGFja2FnZU1hcCwgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlKQp7CiRwYWNrYWdlcyA9IFtdOwokaW5jbHVkZSA9IFtdOwokcmVwbGFjZWRCeSA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokcGFja2FnZXNbJG5hbWVdID0gJHBhY2thZ2U7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CiRyZXBsYWNlZEJ5WyRyZXBsYWNlLT5nZXRUYXJnZXQoKV0gPSAkbmFtZTsKfQp9CgokYWRkID0gc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB1c2UgKCYkYWRkLCAkcGFja2FnZXMsICYkaW5jbHVkZSwgJHJlcGxhY2VkQnkpOiB2b2lkIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHRhcmdldCA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKaWYgKGlzc2V0KCRyZXBsYWNlZEJ5WyR0YXJnZXRdKSkgewokdGFyZ2V0ID0gJHJlcGxhY2VkQnlbJHRhcmdldF07Cn0KaWYgKCFpc3NldCgkaW5jbHVkZVskdGFyZ2V0XSkpIHsKJGluY2x1ZGVbJHRhcmdldF0gPSB0cnVlOwppZiAoaXNzZXQoJHBhY2thZ2VzWyR0YXJnZXRdKSkgewokYWRkKCRwYWNrYWdlc1skdGFyZ2V0XSk7Cn0KfQp9Cn07CiRhZGQoJHJvb3RQYWNrYWdlKTsKCnJldHVybiBhcnJheV9maWx0ZXIoCiRwYWNrYWdlTWFwLApzdGF0aWMgZnVuY3Rpb24gKCRpdGVtKSB1c2UgKCRpbmNsdWRlKTogYm9vbCB7CiRwYWNrYWdlID0gJGl0ZW1bMF07CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmIChpc3NldCgkaW5jbHVkZVskbmFtZV0pKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQopOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzb3J0UGFja2FnZU1hcChhcnJheSAkcGFja2FnZU1hcCkKewokcGFja2FnZXMgPSBbXTsKJHBhdGhzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewpbJHBhY2thZ2UsICRwYXRoXSA9ICRpdGVtOwokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiRwYWNrYWdlc1skbmFtZV0gPSAkcGFja2FnZTsKJHBhdGhzWyRuYW1lXSA9ICRwYXRoOwp9Cgokc29ydGVkUGFja2FnZXMgPSBQYWNrYWdlU29ydGVyOjpzb3J0UGFja2FnZXMoJHBhY2thZ2VzKTsKCiRzb3J0ZWRQYWNrYWdlTWFwID0gW107Cgpmb3JlYWNoICgkc29ydGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokc29ydGVkUGFja2FnZU1hcFtdID0gWyRwYWNrYWdlc1skbmFtZV0sICRwYXRoc1skbmFtZV1dOwp9CgpyZXR1cm4gJHNvcnRlZFBhY2thZ2VNYXA7Cn0KfQoKZnVuY3Rpb24gY29tcG9zZXJSZXF1aXJlKHN0cmluZyAkZmlsZUlkZW50aWZpZXIsIHN0cmluZyAkZmlsZSk6IHZvaWQKewppZiAoZW1wdHkoJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVskZmlsZUlkZW50aWZpZXJdKSkgewokR0xPQkFMU1snX19jb21wb3Nlcl9hdXRvbG9hZF9maWxlcyddWyRmaWxlSWRlbnRpZmllcl0gPSB0cnVlOwoKcmVxdWlyZSAkZmlsZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCnVzZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxGaWxlTGlzdDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKCgoKCgpjbGFzcyBDbGFzc01hcEdlbmVyYXRvcgp7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZHVtcChpdGVyYWJsZSAkZGlycywgc3RyaW5nICRmaWxlKTogdm9pZAp7CiRtYXBzID0gW107Cgpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CiRtYXBzID0gYXJyYXlfbWVyZ2UoJG1hcHMsIHN0YXRpYzo6Y3JlYXRlTWFwKCRkaXIpKTsKfQoKZmlsZV9wdXRfY29udGVudHMoJGZpbGUsIHNwcmludGYoJzw/cGhwIHJldHVybiAlczsnLCB2YXJfZXhwb3J0KCRtYXBzLCB0cnVlKSkpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZU1hcCgkcGF0aCwgP3N0cmluZyAkZXhjbHVkZWQgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCwgP3N0cmluZyAkYXV0b2xvYWRUeXBlID0gbnVsbCwgYXJyYXkgJiRzY2FubmVkRmlsZXMgPSBbXSk6IGFycmF5CnsKJGdlbmVyYXRvciA9IG5ldyBcQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3JcQ2xhc3NNYXBHZW5lcmF0b3IoWydwaHAnLCAnaW5jJywgJ2hoJ10pOwokZmlsZUxpc3QgPSBuZXcgRmlsZUxpc3QoKTsKJGZpbGVMaXN0LT5maWxlcyA9ICRzY2FubmVkRmlsZXM7CiRnZW5lcmF0b3ItPmF2b2lkRHVwbGljYXRlU2NhbnMoJGZpbGVMaXN0KTsKCiRnZW5lcmF0b3ItPnNjYW5QYXRocygkcGF0aCwgJGV4Y2x1ZGVkLCAkYXV0b2xvYWRUeXBlID8/ICdjbGFzc21hcCcsICRuYW1lc3BhY2UpOwoKJGNsYXNzTWFwID0gJGdlbmVyYXRvci0+Z2V0Q2xhc3NNYXAoKTsKCiRzY2FubmVkRmlsZXMgPSAkZmlsZUxpc3QtPmZpbGVzOwoKaWYgKCRpbyAhPT0gbnVsbCkgewpmb3JlYWNoICgkY2xhc3NNYXAtPmdldFBzclZpb2xhdGlvbnMoKSBhcyAkbXNnKSB7CiRpby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+JG1zZzwvd2FybmluZz4iKTsKfQoKZm9yZWFjaCAoJGNsYXNzTWFwLT5nZXRBbWJpZ3VvdXNDbGFzc2VzKCkgYXMgJGNsYXNzID0+ICRwYXRocykgewppZiAoY291bnQoJHBhdGhzKSA+IDEpIHsKJGlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzcy4nIicuCicgd2FzIGZvdW5kICcuIChjb3VudCgkcGF0aHMpICsgMSkgLid4OiBpbiAiJy4kY2xhc3NNYXAtPmdldENsYXNzUGF0aCgkY2xhc3MpLiciIGFuZCAiJy4gaW1wbG9kZSgnIiwgIicsICRwYXRocykgLiciLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLjwvd2FybmluZz4nCik7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcigKJzx3YXJuaW5nPldhcm5pbmc6IEFtYmlndW91cyBjbGFzcyByZXNvbHV0aW9uLCAiJy4kY2xhc3MuJyInLgonIHdhcyBmb3VuZCBpbiBib3RoICInLiRjbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzcykuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJHBhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfQp9Cn0KCnJldHVybiAkY2xhc3NNYXAtPmdldE1hcCgpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwoKCgoKCgpjbGFzcyBDYWNoZQp7Cgpwcml2YXRlIHN0YXRpYyAkY2FjaGVDb2xsZWN0ZWQgPSBudWxsOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRyb290OwoKcHJpdmF0ZSAkZW5hYmxlZCA9IG51bGw7Cgpwcml2YXRlICRhbGxvd2xpc3Q7Cgpwcml2YXRlICRmaWxlc3lzdGVtOwoKcHJpdmF0ZSAkcmVhZE9ubHk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJGNhY2hlRGlyLCBzdHJpbmcgJGFsbG93bGlzdCA9ICdhLXowLTkuXycsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCwgYm9vbCAkcmVhZE9ubHkgPSBmYWxzZSkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yb290ID0gcnRyaW0oJGNhY2hlRGlyLCAnL1xcJykgLiAnLyc7CiR0aGlzLT5hbGxvd2xpc3QgPSAkYWxsb3dsaXN0OwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtKCk7CiR0aGlzLT5yZWFkT25seSA9IChib29sKSAkcmVhZE9ubHk7CgppZiAoIXNlbGY6OmlzVXNhYmxlKCRjYWNoZURpcikpIHsKJHRoaXMtPmVuYWJsZWQgPSBmYWxzZTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZE9ubHkoYm9vbCAkcmVhZE9ubHkpCnsKJHRoaXMtPnJlYWRPbmx5ID0gKGJvb2wpICRyZWFkT25seTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUmVhZE9ubHkoKQp7CnJldHVybiAkdGhpcy0+cmVhZE9ubHk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNVc2FibGUoc3RyaW5nICRwYXRoKQp7CnJldHVybiAhUHJlZzo6aXNNYXRjaCgneyhefFtcXFxcL10pKFwkbnVsbHxudWx8TlVMfC9kZXYvbnVsbCkoW1xcXFwvXXwkKX0nLCAkcGF0aCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKQp7CmlmICgkdGhpcy0+ZW5hYmxlZCA9PT0gbnVsbCkgewokdGhpcy0+ZW5hYmxlZCA9IHRydWU7CgppZiAoCiEkdGhpcy0+cmVhZE9ubHkKJiYgKAooIWlzX2RpcigkdGhpcy0+cm9vdCkgJiYgIVNpbGVuY2VyOjpjYWxsKCdta2RpcicsICR0aGlzLT5yb290LCAwNzc3LCB0cnVlKSkKfHwgIWlzX3dyaXRhYmxlKCR0aGlzLT5yb290KQopCikgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNhbm5vdCBjcmVhdGUgY2FjaGUgZGlyZWN0b3J5ICcgLiAkdGhpcy0+cm9vdCAuICcsIG9yIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIFByb2NlZWRpbmcgd2l0aG91dCBjYWNoZS4gU2VlIGFsc28gY2FjaGUtcmVhZC1vbmx5IGNvbmZpZyBpZiB5b3VyIGZpbGVzeXN0ZW0gaXMgcmVhZC1vbmx5Ljwvd2FybmluZz4nKTsKJHRoaXMtPmVuYWJsZWQgPSBmYWxzZTsKfQp9CgpyZXR1cm4gJHRoaXMtPmVuYWJsZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290KCkKewpyZXR1cm4gJHRoaXMtPnJvb3Q7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZWFkKHN0cmluZyAkZmlsZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpKSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5yb290IC4gJGZpbGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVhZGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBmcm9tIGNhY2hlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybiBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShzdHJpbmcgJGZpbGUsIHN0cmluZyAkY29udGVudHMpCnsKJHdhc0VuYWJsZWQgPSAkdGhpcy0+ZW5hYmxlZCA9PT0gdHJ1ZTsKCmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kdGhpcy0+cm9vdCAuICRmaWxlLicgaW50byBjYWNoZScsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgokdGVtcEZpbGVOYW1lID0gJHRoaXMtPnJvb3QgLiAkZmlsZSAuIHVuaXFpZCgnLicsIHRydWUpIC4gJy50bXAnOwp0cnkgewpyZXR1cm4gZmlsZV9wdXRfY29udGVudHMoJHRlbXBGaWxlTmFtZSwgJGNvbnRlbnRzKSAhPT0gZmFsc2UgJiYgcmVuYW1lKCR0ZW1wRmlsZU5hbWUsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9IGNhdGNoIChcRXJyb3JFeGNlcHRpb24gJGUpIHsKCgppZiAoJHdhc0VuYWJsZWQpIHsKY2xlYXJzdGF0Y2FjaGUoKTsKJHRoaXMtPmVuYWJsZWQgPSBudWxsOwpyZXR1cm4gJHRoaXMtPndyaXRlKCRmaWxlLCAkY29udGVudHMpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkZhaWxlZCB0byB3cml0ZSBpbnRvIGNhY2hlOiAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwppZiAoUHJlZzo6aXNNYXRjaCgne15maWxlX3B1dF9jb250ZW50c1woXCk6IE9ubHkgKFswLTldKykgb2YgKFswLTldKykgYnl0ZXMgd3JpdHRlbn0nLCAkZS0+Z2V0TWVzc2FnZSgpLCAkbSkpIHsKCnVubGluaygkdGVtcEZpbGVOYW1lKTsKCiRtZXNzYWdlID0gc3ByaW50ZigKJzx3YXJuaW5nPldyaXRpbmcgJTEkcyBpbnRvIGNhY2hlIGZhaWxlZCBhZnRlciAlMiR1IG9mICUzJHUgYnl0ZXMgd3JpdHRlbiwgb25seSAlNCRzIGJ5dGVzIG9mIGZyZWUgc3BhY2UgYXZhaWxhYmxlPC93YXJuaW5nPicsCiR0ZW1wRmlsZU5hbWUsCiRtWzFdLAokbVsyXSwKZnVuY3Rpb25fZXhpc3RzKCdkaXNrX2ZyZWVfc3BhY2UnKSA/IEBkaXNrX2ZyZWVfc3BhY2UoZGlybmFtZSgkdGVtcEZpbGVOYW1lKSkgOiAndW5rbm93bicKKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbWVzc2FnZSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93ICRlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weUZyb20oc3RyaW5nICRmaWxlLCBzdHJpbmcgJHNvdXJjZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpICYmICEkdGhpcy0+cmVhZE9ubHkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKGRpcm5hbWUoJHRoaXMtPnJvb3QgLiAkZmlsZSkpOwoKaWYgKCFmaWxlX2V4aXN0cygkc291cmNlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRzb3VyY2UuJyBkb2VzIG5vdCBleGlzdCwgY2FuIG5vdCB3cml0ZSBpbnRvIGNhY2hlPC9lcnJvcj4nKTsKfSBlbHNlaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignV3JpdGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBpbnRvIGNhY2hlIGZyb20gJy4kc291cmNlKTsKfQoKcmV0dXJuIGNvcHkoJHNvdXJjZSwgJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weVRvKHN0cmluZyAkZmlsZSwgc3RyaW5nICR0YXJnZXQpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSkgewp0cnkgewp0b3VjaCgkdGhpcy0+cm9vdCAuICRmaWxlLCAoaW50KSBmaWxlbXRpbWUoJHRoaXMtPnJvb3QgLiAkZmlsZSksIHRpbWUoKSk7Cn0gY2F0Y2ggKFxFcnJvckV4Y2VwdGlvbiAkZSkgewoKClNpbGVuY2VyOjpjYWxsKCd0b3VjaCcsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1JlYWRpbmcgJy4kdGhpcy0+cm9vdCAuICRmaWxlLicgZnJvbSBjYWNoZScsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gY29weSgkdGhpcy0+cm9vdCAuICRmaWxlLCAkdGFyZ2V0KTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnY0lzTmVjZXNzYXJ5KCkKewppZiAoc2VsZjo6JGNhY2hlQ29sbGVjdGVkKSB7CnJldHVybiBmYWxzZTsKfQoKc2VsZjo6JGNhY2hlQ29sbGVjdGVkID0gdHJ1ZTsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1RFU1RfU1VJVEUnKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gIXJhbmRvbV9pbnQoMCwgNTApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKHN0cmluZyAkZmlsZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpICYmICEkdGhpcy0+cmVhZE9ubHkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW1wdHlEaXJlY3RvcnkoJHRoaXMtPnJvb3QpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBZ2Uoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkgJiYgKCRtdGltZSA9IGZpbGVtdGltZSgkdGhpcy0+cm9vdCAuICRmaWxlKSkgIT09IGZhbHNlKSB7CnJldHVybiBhYnModGltZSgpIC0gJG10aW1lKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnYyhpbnQgJHR0bCwgaW50ICRtYXhTaXplKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokZXhwaXJlID0gbmV3IFxEYXRlVGltZSgpOwokZXhwaXJlLT5tb2RpZnkoJy0nLiR0dGwuJyBzZWNvbmRzJyk7CgokZmluZGVyID0gJHRoaXMtPmdldEZpbmRlcigpLT5kYXRlKCd1bnRpbCAnLiRleHBpcmUtPmZvcm1hdCgnWS1tLWQgSDppOnMnKSk7CmZvcmVhY2ggKCRmaW5kZXIgYXMgJGZpbGUpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KCiR0b3RhbFNpemUgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+c2l6ZSgkdGhpcy0+cm9vdCk7CmlmICgkdG90YWxTaXplID4gJG1heFNpemUpIHsKJGl0ZXJhdG9yID0gJHRoaXMtPmdldEZpbmRlcigpLT5zb3J0QnlBY2Nlc3NlZFRpbWUoKS0+Z2V0SXRlcmF0b3IoKTsKd2hpbGUgKCR0b3RhbFNpemUgPiAkbWF4U2l6ZSAmJiAkaXRlcmF0b3ItPnZhbGlkKCkpIHsKJGZpbGVwYXRoID0gJGl0ZXJhdG9yLT5jdXJyZW50KCktPmdldFBhdGhuYW1lKCk7CiR0b3RhbFNpemUgLT0gJHRoaXMtPmZpbGVzeXN0ZW0tPnNpemUoJGZpbGVwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZXBhdGgpOwokaXRlcmF0b3ItPm5leHQoKTsKfQp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdjVmNzQ2FjaGUoaW50ICR0dGwpOiBib29sCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZXhwaXJlID0gbmV3IFxEYXRlVGltZSgpOwokZXhwaXJlLT5tb2RpZnkoJy0nLiR0dGwuJyBzZWNvbmRzJyk7CgokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKS0+aW4oJHRoaXMtPnJvb3QpLT5kaXJlY3RvcmllcygpLT5kZXB0aCgwKS0+ZGF0ZSgndW50aWwgJy4kZXhwaXJlLT5mb3JtYXQoJ1ktbS1kIEg6aTpzJykpOwpmb3JlYWNoICgkZmluZGVyIGFzICRmaWxlKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNoYTEoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuIHNoYTFfZmlsZSgkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaGEyNTYoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuIGhhc2hfZmlsZSgnc2hhMjU2JywgJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RmluZGVyKCkKewpyZXR1cm4gRmluZGVyOjpjcmVhdGUoKS0+aW4oJHRoaXMtPnJvb3QpLT5maWxlcygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgQWJvdXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2Fib3V0JykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgYSBzaG9ydCBpbmZvcm1hdGlvbiBhYm91dCBDb21wb3NlcicpCi0+c2V0SGVscCgKPDw8RU9UCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGFib3V0PC9pbmZvPgpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXJWZXJzaW9uID0gQ29tcG9zZXI6OmdldFZlcnNpb24oKTsKCiR0aGlzLT5nZXRJTygpLT53cml0ZSgKPDw8RU9UCjxpbmZvPkNvbXBvc2VyIC0gRGVwZW5kZW5jeSBNYW5hZ2VyIGZvciBQSFAgLSB2ZXJzaW9uICRjb21wb3NlclZlcnNpb248L2luZm8+Cjxjb21tZW50PkNvbXBvc2VyIGlzIGEgZGVwZW5kZW5jeSBtYW5hZ2VyIHRyYWNraW5nIGxvY2FsIGRlcGVuZGVuY2llcyBvZiB5b3VyIHByb2plY3RzIGFuZCBsaWJyYXJpZXMuClNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9jb21tZW50PgpFT1QKKTsKCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEFyY2hpdmVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJpdmF0ZSBjb25zdCBGT1JNQVRTID0gWyd0YXInLCAndGFyLmd6JywgJ3Rhci5iejInLCAnemlwJ107Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2FyY2hpdmUnKQotPnNldERlc2NyaXB0aW9uKCdDcmVhdGVzIGFuIGFyY2hpdmUgb2YgdGhpcyBjb21wb3NlciBwYWNrYWdlJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2UnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1RoZSBwYWNrYWdlIHRvIGFyY2hpdmUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBwcm9qZWN0JywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKCkpLApuZXcgSW5wdXRBcmd1bWVudCgndmVyc2lvbicsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnQSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gZmluZCB0aGUgcGFja2FnZSB0byBhcmNoaXZlJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIHJlc3VsdGluZyBhcmNoaXZlOiB0YXIsIHRhci5neiwgdGFyLmJ6MiBvciB6aXAgKGRlZmF1bHQgdGFyKScsIG51bGwsIHNlbGY6OkZPUk1BVFMpLApuZXcgSW5wdXRPcHRpb24oJ2RpcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1dyaXRlIHRoZSBhcmNoaXZlIHRvIHRoaXMgZGlyZWN0b3J5JyksCm5ldyBJbnB1dE9wdGlvbignZmlsZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1dyaXRlIHRoZSBhcmNoaXZlIHdpdGggdGhlIGdpdmVuIGZpbGUgbmFtZS4nCi4nIE5vdGUgdGhhdCB0aGUgZm9ybWF0IHdpbGwgYmUgYXBwZW5kZWQuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLWZpbHRlcnMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBmaWx0ZXJzIHdoZW4gc2F2aW5nIHBhY2thZ2UnKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmFyY2hpdmU8L2luZm8+IGNvbW1hbmQgY3JlYXRlcyBhbiBhcmNoaXZlIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0CmNvbnRhaW5pbmcgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBvZiB0aGUgQ29tcG9zZXIgcHJvamVjdCBvciB0aGUgc3BlY2lmaWVkCnBhY2thZ2UgaW4gdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGFuZCB3cml0ZXMgaXQgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBhcmNoaXZlIFstLWZvcm1hdD16aXBdIFstLWRpcj0vZm9vXSBbLS1maWxlPWZpbGVuYW1lXSBbcGFja2FnZSBbdmVyc2lvbl1dPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjYXJjaGl2ZQpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKJGNvbmZpZyA9IG51bGw7CgppZiAoJGNvbXBvc2VyKSB7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdhcmNoaXZlJywgJGlucHV0LCAkb3V0cHV0KTsKJGV2ZW50RGlzcGF0Y2hlciA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCk7CiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UFJFX0FSQ0hJVkVfQ01EKTsKfQoKaWYgKCEkY29uZmlnKSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKfQoKJGZvcm1hdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKSA/PyAkY29uZmlnLT5nZXQoJ2FyY2hpdmUtZm9ybWF0Jyk7CiRkaXIgPSAkaW5wdXQtPmdldE9wdGlvbignZGlyJykgPz8gJGNvbmZpZy0+Z2V0KCdhcmNoaXZlLWRpcicpOwoKJHJldHVybkNvZGUgPSAkdGhpcy0+YXJjaGl2ZSgKJHRoaXMtPmdldElPKCksCiRjb25maWcsCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKSwKJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpLAokZm9ybWF0LAokZGlyLAokaW5wdXQtPmdldE9wdGlvbignZmlsZScpLAokaW5wdXQtPmdldE9wdGlvbignaWdub3JlLWZpbHRlcnMnKSwKJGNvbXBvc2VyCik7CgppZiAoMCA9PT0gJHJldHVybkNvZGUgJiYgJGNvbXBvc2VyKSB7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9BUkNISVZFX0NNRCk7Cn0KCnJldHVybiAkcmV0dXJuQ29kZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFyY2hpdmUoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP3N0cmluZyAkcGFja2FnZU5hbWUsID9zdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkZm9ybWF0LCBzdHJpbmcgJGRlc3QsID9zdHJpbmcgJGZpbGVOYW1lLCBib29sICRpZ25vcmVGaWx0ZXJzLCA/Q29tcG9zZXIgJGNvbXBvc2VyKTogaW50CnsKaWYgKCRjb21wb3NlcikgewokYXJjaGl2ZU1hbmFnZXIgPSAkY29tcG9zZXItPmdldEFyY2hpdmVNYW5hZ2VyKCk7Cn0gZWxzZSB7CiRmYWN0b3J5ID0gbmV3IEZhY3Rvcnk7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigpOwokaHR0cERvd25sb2FkZXIgPSBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpOwokZG93bmxvYWRNYW5hZ2VyID0gJGZhY3RvcnktPmNyZWF0ZURvd25sb2FkTWFuYWdlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJHByb2Nlc3MpOwokYXJjaGl2ZU1hbmFnZXIgPSAkZmFjdG9yeS0+Y3JlYXRlQXJjaGl2ZU1hbmFnZXIoJGNvbmZpZywgJGRvd25sb2FkTWFuYWdlciwgbmV3IExvb3AoJGh0dHBEb3dubG9hZGVyLCAkcHJvY2VzcykpOwp9CgppZiAoJHBhY2thZ2VOYW1lKSB7CiRwYWNrYWdlID0gJHRoaXMtPnNlbGVjdFBhY2thZ2UoJGlvLCAkcGFja2FnZU5hbWUsICR2ZXJzaW9uKTsKCmlmICghJHBhY2thZ2UpIHsKcmV0dXJuIDE7Cn0KfSBlbHNlIHsKJHBhY2thZ2UgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldFBhY2thZ2UoKTsKfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5DcmVhdGluZyB0aGUgYXJjaGl2ZSBpbnRvICInLiRkZXN0LiciLjwvaW5mbz4nKTsKJHBhY2thZ2VQYXRoID0gJGFyY2hpdmVNYW5hZ2VyLT5hcmNoaXZlKCRwYWNrYWdlLCAkZm9ybWF0LCAkZGVzdCwgJGZpbGVOYW1lLCAkaWdub3JlRmlsdGVycyk7CiRmcyA9IG5ldyBGaWxlc3lzdGVtOwokc2hvcnRQYXRoID0gJGZzLT5maW5kU2hvcnRlc3RQYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSwgJHBhY2thZ2VQYXRoLCB0cnVlKTsKCiRpby0+d3JpdGVFcnJvcignQ3JlYXRlZDogJywgZmFsc2UpOwokaW8tPndyaXRlKHN0cmxlbigkc2hvcnRQYXRoKSA8IHN0cmxlbigkcGFja2FnZVBhdGgpID8gJHNob3J0UGF0aCA6ICRwYWNrYWdlUGF0aCk7CgpyZXR1cm4gMDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbGVjdFBhY2thZ2UoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCA/c3RyaW5nICR2ZXJzaW9uID0gbnVsbCkKewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlNlYXJjaGluZyBmb3IgdGhlIHNwZWNpZmllZCBwYWNrYWdlLjwvaW5mbz4nKTsKCmlmICgkY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKSkgewokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHJlcG8gPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZShbJGxvY2FsUmVwb10sICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkpKTsKJG1pblN0YWJpbGl0eSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7Cn0gZWxzZSB7CiRkZWZhdWx0UmVwb3MgPSBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCRpbyk7CiRpby0+d3JpdGVFcnJvcignTm8gY29tcG9zZXIuanNvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIHNlYXJjaGluZyBwYWNrYWdlcyBmcm9tICcgLiBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJGRlZmF1bHRSZXBvcykpKTsKJHJlcG8gPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkZGVmYXVsdFJlcG9zKTsKJG1pblN0YWJpbGl0eSA9ICdzdGFibGUnOwp9CgppZiAoJHZlcnNpb24gIT09IG51bGwgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne0Aoc3RhYmxlfFJDfGJldGF8YWxwaGF8ZGV2KSR9aScsICR2ZXJzaW9uLCAkbWF0Y2gpKSB7CiRtaW5TdGFiaWxpdHkgPSAkbWF0Y2hbMV07CiR2ZXJzaW9uID0gKHN0cmluZykgc3Vic3RyKCR2ZXJzaW9uLCAwLCAtc3RybGVuKCRtYXRjaFswXSkpOwp9CgokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRtaW5TdGFiaWxpdHkpOwokcmVwb1NldC0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uICE9PSBudWxsID8gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkdmVyc2lvbikgOiBudWxsOwokcGFja2FnZXMgPSAkcmVwb1NldC0+ZmluZFBhY2thZ2VzKHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKSwgJGNvbnN0cmFpbnQpOwoKaWYgKGNvdW50KCRwYWNrYWdlcykgPiAxKSB7CiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKCRyZXBvU2V0KTsKJHBhY2thZ2UgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZShzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSksICR2ZXJzaW9uLCAkbWluU3RhYmlsaXR5KTsKaWYgKCRwYWNrYWdlID09PSBmYWxzZSkgewokcGFja2FnZSA9IHJlc2V0KCRwYWNrYWdlcyk7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+Rm91bmQgbXVsdGlwbGUgbWF0Y2hlcywgc2VsZWN0ZWQgJy4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCkuJy48L2luZm8+Jyk7CiRpby0+d3JpdGVFcnJvcignQWx0ZXJuYXRpdmVzIHdlcmUgJy5pbXBsb2RlKCcsICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwKTogc3RyaW5nIHsKcmV0dXJuICRwLT5nZXRQcmV0dHlTdHJpbmcoKTsKfSwgJHBhY2thZ2VzKSkuJy4nKTsKJGlvLT53cml0ZUVycm9yKCc8Y29tbWVudD5QbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBjb25zdHJhaW50IHRvIHBpY2sgYSBkaWZmZXJlbnQgcGFja2FnZS48L2NvbW1lbnQ+Jyk7Cn0gZWxzZWlmIChjb3VudCgkcGFja2FnZXMpID09PSAxKSB7CiRwYWNrYWdlID0gcmVzZXQoJHBhY2thZ2VzKTsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5Gb3VuZCBhbiBleGFjdCBtYXRjaCAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nLjwvaW5mbz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q291bGQgbm90IGZpbmQgYSBwYWNrYWdlIG1hdGNoaW5nICcuJHBhY2thZ2VOYW1lLicuPC9lcnJvcj4nKTsKCnJldHVybiBmYWxzZTsKfQoKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSBpbnN0YW5jZSBidXQgZm91bmQgJy5nZXRfY2xhc3MoJHBhY2thZ2UpKTsKfQppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQmFzZVBhY2thZ2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSBCYXNlUGFja2FnZSBpbnN0YW5jZSBidXQgZm91bmQgJy5nZXRfY2xhc3MoJHBhY2thZ2UpKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlVdGlsczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCmNsYXNzIEF1ZGl0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdhdWRpdCcpCi0+c2V0RGVzY3JpcHRpb24oJ0NoZWNrcyBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yaWVzIGZvciBpbnN0YWxsZWQgcGFja2FnZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgYXVkaXRpbmcgb2YgcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdPdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9UQUJMRSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdWRpdCBiYXNlZCBvbiB0aGUgbG9jayBmaWxlIGluc3RlYWQgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlcy4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmF1ZGl0PC9pbmZvPiBjb21tYW5kIGNoZWNrcyBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yaWVzIGZvciBpbnN0YWxsZWQgcGFja2FnZXMuCgpJZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBkZXYgZGVwZW5kZW5jaWVzIGluIHRoZSBhdWRpdCB5b3UgY2FuIG9taXQgdGhlbSB3aXRoIC0tbm8tZGV2CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNhdWRpdApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXMoJGNvbXBvc2VyLCAkaW5wdXQpOwoKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ05vIHBhY2thZ2VzIC0gc2tpcHBpbmcgYXVkaXQuJyk7CgpyZXR1cm4gMDsKfQoKJGF1ZGl0b3IgPSBuZXcgQXVkaXRvcigpOwokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9CgokYXVkaXRDb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2F1ZGl0Jyk7CgpyZXR1cm4gbWluKDI1NSwgJGF1ZGl0b3ItPmF1ZGl0KCR0aGlzLT5nZXRJTygpLCAkcmVwb1NldCwgJHBhY2thZ2VzLCAkdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0LCAnZm9ybWF0JyksIGZhbHNlLCAkYXVkaXRDb25maWdbJ2lnbm9yZSddID8/IFtdLCAkYXVkaXRDb25maWdbJ2FiYW5kb25lZCddID8/IEF1ZGl0b3I6OkFCQU5ET05FRF9SRVBPUlQpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlcyhDb21wb3NlciAkY29tcG9zZXIsIElucHV0SW50ZXJmYWNlICRpbnB1dCk6IGFycmF5CnsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1ZhbGlkIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2sgZmlsZXMgYXJlIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwoKcmV0dXJuICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSktPmdldFBhY2thZ2VzKCk7Cn0KCiRyb290UGtnID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCldKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKcmV0dXJuIFJlcG9zaXRvcnlVdGlsczo6ZmlsdGVyUmVxdWlyZWRQYWNrYWdlcygkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKSwgJHJvb3RQa2cpOwp9CgpyZXR1cm4gJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFByZUNvbW1hbmRSdW5FdmVudDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlU2VwYXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEJhc2VDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CgoKCnByaXZhdGUgJGNvbXBvc2VyOwoKCgoKcHJpdmF0ZSAkaW87CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb24oKTogQXBwbGljYXRpb24KewokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICghJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb21wb3NlciBjb21tYW5kcyBjYW4gb25seSB3b3JrIHdpdGggYW4gJy5BcHBsaWNhdGlvbjo6Y2xhc3MuJyBpbnN0YW5jZSBzZXQnKTsKfQoKcmV0dXJuICRhcHBsaWNhdGlvbjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoYm9vbCAkcmVxdWlyZWQgPSB0cnVlLCA/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKQp7CmlmICgkcmVxdWlyZWQpIHsKcmV0dXJuICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgpyZXR1cm4gJHRoaXMtPnRyeUNvbXBvc2VyKCRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcXVpcmVDb21wb3Nlcig/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogQ29tcG9zZXIKewppZiAobnVsbCA9PT0gJHRoaXMtPmNvbXBvc2VyKSB7CiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CiR0aGlzLT5jb21wb3NlciA9ICRhcHBsaWNhdGlvbi0+Z2V0Q29tcG9zZXIodHJ1ZSwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidDb3VsZCBub3QgY3JlYXRlIGEgQ29tcG9zZXJcQ29tcG9zZXIgaW5zdGFuY2UsIHlvdSBtdXN0IGluamVjdCAnLgonb25lIGlmIHRoaXMgY29tbWFuZCBpcyBub3QgdXNlZCB3aXRoIGEgQ29tcG9zZXJcQ29uc29sZVxBcHBsaWNhdGlvbiBpbnN0YW5jZScKKTsKfQp9CgpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0cnlDb21wb3Nlcig/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogP0NvbXBvc2VyCnsKaWYgKG51bGwgPT09ICR0aGlzLT5jb21wb3NlcikgewokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgewokdGhpcy0+Y29tcG9zZXIgPSAkYXBwbGljYXRpb24tPmdldENvbXBvc2VyKGZhbHNlLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KfQoKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbXBvc2VyKENvbXBvc2VyICRjb21wb3NlcikKewokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0Q29tcG9zZXIoKQp7CiR0aGlzLT5jb21wb3NlciA9IG51bGw7CiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5yZXNldENvbXBvc2VyKCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQcm94eUNvbW1hbmQoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElPKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmlvKSB7CiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CiR0aGlzLT5pbyA9ICRhcHBsaWNhdGlvbi0+Z2V0SU8oKTsKfSBlbHNlIHsKJHRoaXMtPmlvID0gbmV3IE51bGxJTygpOwp9Cn0KCnJldHVybiAkdGhpcy0+aW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJTyhJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJGRlZmluaXRpb24gPSAkdGhpcy0+Z2V0RGVmaW5pdGlvbigpOwokbmFtZSA9IChzdHJpbmcpICRpbnB1dC0+Z2V0Q29tcGxldGlvbk5hbWUoKTsKaWYgKENvbXBsZXRpb25JbnB1dDo6VFlQRV9PUFRJT05fVkFMVUUgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKQomJiAkZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKQomJiAoJG9wdGlvbiA9ICRkZWZpbml0aW9uLT5nZXRPcHRpb24oJG5hbWUpKSBpbnN0YW5jZW9mIElucHV0T3B0aW9uCikgewokb3B0aW9uLT5jb21wbGV0ZSgkaW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0gZWxzZWlmIChDb21wbGV0aW9uSW5wdXQ6OlRZUEVfQVJHVU1FTlRfVkFMVUUgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKQomJiAkZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpCiYmICgkYXJndW1lbnQgPSAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJG5hbWUpKSBpbnN0YW5jZW9mIElucHV0QXJndW1lbnQKKSB7CiRhcmd1bWVudC0+Y29tcGxldGUoJGlucHV0LCAkc3VnZ2VzdGlvbnMpOwp9IGVsc2UgewpwYXJlbnQ6OmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKCiRkaXNhYmxlUGx1Z2lucyA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXBsdWdpbnMnKTsKJGRpc2FibGVTY3JpcHRzID0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tc2NyaXB0cycpOwppZiAoJHRoaXMgaW5zdGFuY2VvZiBTZWxmVXBkYXRlQ29tbWFuZCkgewokZGlzYWJsZVBsdWdpbnMgPSB0cnVlOwokZGlzYWJsZVNjcmlwdHMgPSB0cnVlOwp9CgokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmIChudWxsID09PSAkY29tcG9zZXIpIHsKJGNvbXBvc2VyID0gRmFjdG9yeTo6Y3JlYXRlR2xvYmFsKCR0aGlzLT5nZXRJTygpLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KaWYgKCRjb21wb3NlcikgewokcHJlQ29tbWFuZFJ1bkV2ZW50ID0gbmV3IFByZUNvbW1hbmRSdW5FdmVudChQbHVnaW5FdmVudHM6OlBSRV9DT01NQU5EX1JVTiwgJGlucHV0LCAkdGhpcy0+Z2V0TmFtZSgpKTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJHByZUNvbW1hbmRSdW5FdmVudC0+Z2V0TmFtZSgpLCAkcHJlQ29tbWFuZFJ1bkV2ZW50KTsKfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1uby1hbnNpJ10pICYmICRpbnB1dC0+aGFzT3B0aW9uKCduby1wcm9ncmVzcycpKSB7CiRpbnB1dC0+c2V0T3B0aW9uKCduby1wcm9ncmVzcycsIHRydWUpOwp9CgokZW52T3B0aW9ucyA9IFsKJ0NPTVBPU0VSX05PX0FVRElUJyA9PiBbJ25vLWF1ZGl0J10sCidDT01QT1NFUl9OT19ERVYnID0+IFsnbm8tZGV2JywgJ3VwZGF0ZS1uby1kZXYnXSwKJ0NPTVBPU0VSX1BSRUZFUl9TVEFCTEUnID0+IFsncHJlZmVyLXN0YWJsZSddLAonQ09NUE9TRVJfUFJFRkVSX0xPV0VTVCcgPT4gWydwcmVmZXItbG93ZXN0J10sCl07CmZvcmVhY2ggKCRlbnZPcHRpb25zIGFzICRlbnZOYW1lID0+ICRvcHRpb25OYW1lcykgewpmb3JlYWNoICgkb3B0aW9uTmFtZXMgYXMgJG9wdGlvbk5hbWUpIHsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzT3B0aW9uKCRvcHRpb25OYW1lKSkgewppZiAoZmFsc2UgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCRvcHRpb25OYW1lKSAmJiAoYm9vbCkgUGxhdGZvcm06OmdldEVudigkZW52TmFtZSkpIHsKJGlucHV0LT5zZXRPcHRpb24oJG9wdGlvbk5hbWUsIHRydWUpOwp9Cn0KfQp9CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpIHsKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSAmJiAoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSUdOT1JFX1BMQVRGT1JNX1JFUVMnKSkgewokaW5wdXQtPnNldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCB0cnVlKTsKCiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q09NUE9TRVJfSUdOT1JFX1BMQVRGT1JNX1JFUVMgaXMgc2V0LiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBlcnJvcnMuPC93YXJuaW5nPicpOwp9Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpICYmICghJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykgfHwgISRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpKSkgewokaWdub3JlUGxhdGZvcm1SZXFFbnYgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRJyk7CmlmICgwID09PSBjb3VudCgkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpKSAmJiBpc19zdHJpbmcoJGlnbm9yZVBsYXRmb3JtUmVxRW52KSAmJiAnJyAhPT0gJGlnbm9yZVBsYXRmb3JtUmVxRW52KSB7CiRpbnB1dC0+c2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgZXhwbG9kZSgnLCcsICRpZ25vcmVQbGF0Zm9ybVJlcUVudikpOwoKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRIGlzIHNldCB0byBpZ25vcmUgJy4kaWdub3JlUGxhdGZvcm1SZXFFbnYuJy4gWW91IG1heSBleHBlcmllbmNlIHVuZXhwZWN0ZWQgZXJyb3JzLjwvd2FybmluZz4nKTsKfQp9CgpwYXJlbnQ6OmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoQ29uZmlnICRjb25maWcsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgYm9vbCAka2VlcFZjc1JlcXVpcmVzUHJlZmVyU291cmNlID0gZmFsc2UpCnsKJHByZWZlclNvdXJjZSA9IGZhbHNlOwokcHJlZmVyRGlzdCA9IGZhbHNlOwoKc3dpdGNoICgkY29uZmlnLT5nZXQoJ3ByZWZlcnJlZC1pbnN0YWxsJykpIHsKY2FzZSAnc291cmNlJzoKJHByZWZlclNvdXJjZSA9IHRydWU7CmJyZWFrOwpjYXNlICdkaXN0JzoKJHByZWZlckRpc3QgPSB0cnVlOwpicmVhazsKY2FzZSAnYXV0byc6CmRlZmF1bHQ6CgpicmVhazsKfQoKaWYgKCEkaW5wdXQtPmhhc09wdGlvbigncHJlZmVyLWRpc3QnKSB8fCAhJGlucHV0LT5oYXNPcHRpb24oJ3ByZWZlci1zb3VyY2UnKSkgewpyZXR1cm4gWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XTsKfQoKaWYgKCRpbnB1dC0+aGFzT3B0aW9uKCdwcmVmZXItaW5zdGFsbCcpICYmIGlzX3N0cmluZygkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWluc3RhbGwnKSkpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc291cmNlJykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tcHJlZmVyLXNvdXJjZSBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAtLXByZWZlci1pbnN0YWxsJyk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItZGlzdCcpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLXByZWZlci1kaXN0IGNhbiBub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIC0tcHJlZmVyLWluc3RhbGwnKTsKfQpzd2l0Y2ggKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcpKSB7CmNhc2UgJ2Rpc3QnOgokaW5wdXQtPnNldE9wdGlvbigncHJlZmVyLWRpc3QnLCB0cnVlKTsKYnJlYWs7CmNhc2UgJ3NvdXJjZSc6CiRpbnB1dC0+c2V0T3B0aW9uKCdwcmVmZXItc291cmNlJywgdHJ1ZSk7CmJyZWFrOwpjYXNlICdhdXRvJzoKJHByZWZlckRpc3QgPSBmYWxzZTsKJHByZWZlclNvdXJjZSA9IGZhbHNlOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJy0tcHJlZmVyLWluc3RhbGwgYWNjZXB0cyBvbmUgb2YgImRpc3QiLCAic291cmNlIiBvciAiYXV0byIsIGdvdCAnLiRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcpKTsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnKSB8fCAkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWRpc3QnKSB8fCAoJGtlZXBWY3NSZXF1aXJlc1ByZWZlclNvdXJjZSAmJiAkaW5wdXQtPmhhc09wdGlvbigna2VlcC12Y3MnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigna2VlcC12Y3MnKSkpIHsKJHByZWZlclNvdXJjZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc291cmNlJykgfHwgKCRrZWVwVmNzUmVxdWlyZXNQcmVmZXJTb3VyY2UgJiYgJGlucHV0LT5oYXNPcHRpb24oJ2tlZXAtdmNzJykgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2tlZXAtdmNzJykpOwokcHJlZmVyRGlzdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItZGlzdCcpOwp9CgpyZXR1cm4gWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CmlmICghJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykgfHwgISRpbnB1dC0+aGFzT3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJykpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2FsbGluZyBnZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGZyb20gYSBjb21tYW5kIHdoaWNoIGRvZXMgbm90IGRlZmluZSB0aGUgLS1pZ25vcmUtcGxhdGZvcm0tcmVxW3NdIGZsYWdzIGlzIG5vdCBwZXJtaXR0ZWQuJyk7Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSkgewpyZXR1cm4gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZUFsbCgpOwp9CgokaWdub3JlcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJyk7CmlmIChjb3VudCgkaWdub3JlcykgPiAwKSB7CnJldHVybiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6ZnJvbUJvb2xPckxpc3QoJGlnbm9yZXMpOwp9CgpyZXR1cm4gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0UmVxdWlyZW1lbnRzKGFycmF5ICRyZXF1aXJlbWVudHMpCnsKJHJlcXVpcmVzID0gW107CiRyZXF1aXJlbWVudHMgPSAkdGhpcy0+bm9ybWFsaXplUmVxdWlyZW1lbnRzKCRyZXF1aXJlbWVudHMpOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzIGFzICRyZXF1aXJlbWVudCkgewppZiAoIWlzc2V0KCRyZXF1aXJlbWVudFsndmVyc2lvbiddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignT3B0aW9uICcuJHJlcXVpcmVtZW50WyduYW1lJ10gLicgaXMgbWlzc2luZyBhIHZlcnNpb24gY29uc3RyYWludCwgdXNlIGUuZy4gJy4kcmVxdWlyZW1lbnRbJ25hbWUnXS4nOl4xLjAnKTsKfQokcmVxdWlyZXNbJHJlcXVpcmVtZW50WyduYW1lJ11dID0gJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ107Cn0KCnJldHVybiAkcmVxdWlyZXM7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIG5vcm1hbGl6ZVJlcXVpcmVtZW50cyhhcnJheSAkcmVxdWlyZW1lbnRzKQp7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwoKcmV0dXJuICRwYXJzZXItPnBhcnNlTmFtZVZlcnNpb25QYWlycygkcmVxdWlyZW1lbnRzKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVuZGVyVGFibGUoYXJyYXkgJHRhYmxlLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokcmVuZGVyZXIgPSBuZXcgVGFibGUoJG91dHB1dCk7CiRyZW5kZXJlci0+c2V0U3R5bGUoJ2NvbXBhY3QnKTsKJHJlbmRlcmVyLT5zZXRSb3dzKCR0YWJsZSktPnJlbmRlcigpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VGVybWluYWxXaWR0aCgpCnsKJHRlcm1pbmFsID0gbmV3IFRlcm1pbmFsKCk7CiR3aWR0aCA9ICR0ZXJtaW5hbC0+Z2V0V2lkdGgoKTsKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHdpZHRoLS07Cn0gZWxzZSB7CiR3aWR0aCA9IG1heCg4MCwgJHdpZHRoKTsKfQoKcmV0dXJuICR3aWR0aDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXVkaXRGb3JtYXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBzdHJpbmcgJG9wdE5hbWUgPSAnYXVkaXQtZm9ybWF0Jyk6IHN0cmluZwp7CmlmICghJGlucHV0LT5oYXNPcHRpb24oJG9wdE5hbWUpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYSBDb21tYW5kIHdoaWNoIGhhcyBubyAnLiRvcHROYW1lLicgb3B0aW9uIGRlZmluZWQuJyk7Cn0KCiR2YWwgPSAkaW5wdXQtPmdldE9wdGlvbigkb3B0TmFtZSk7CmlmICghaW5fYXJyYXkoJHZhbCwgQXVkaXRvcjo6Rk9STUFUUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tJy4kb3B0TmFtZS4nIG11c3QgYmUgb25lIG9mICcuaW1wbG9kZSgnLCAnLCBBdWRpdG9yOjpGT1JNQVRTKS4nLicpOwp9CgpyZXR1cm4gJHZhbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQmFzZURlcGVuZGVuY3lDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgY29uc3QgQVJHVU1FTlRfUEFDS0FHRSA9ICdwYWNrYWdlJzsKcHJvdGVjdGVkIGNvbnN0IEFSR1VNRU5UX0NPTlNUUkFJTlQgPSAndmVyc2lvbic7CnByb3RlY3RlZCBjb25zdCBPUFRJT05fUkVDVVJTSVZFID0gJ3JlY3Vyc2l2ZSc7CnByb3RlY3RlZCBjb25zdCBPUFRJT05fVFJFRSA9ICd0cmVlJzsKCgpwcm90ZWN0ZWQgJGNvbG9yczsKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0V4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYm9vbCAkaW52ZXJ0ZWQgPSBmYWxzZSk6IGludAp7CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJHRoaXMtPmdldE5hbWUoKSwgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRyZXBvcyA9IFtdOwoKJHJlcG9zW10gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CgppZiAoISRsb2NrZXItPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0EgdmFsaWQgY29tcG9zZXIubG9jayBmaWxlIGlzIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CgokcmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7CiRyZXBvc1tdID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGxvY2tlci0+Z2V0UGxhdGZvcm1PdmVycmlkZXMoKSk7Cn0gZWxzZSB7CiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcm9vdFBrZyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwoKaWYgKGNvdW50KCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkpID09PSAwICYmIChjb3VudCgkcm9vdFBrZy0+Z2V0UmVxdWlyZXMoKSkgPiAwIHx8IGNvdW50KCRyb290UGtnLT5nZXREZXZSZXF1aXJlcygpKSA+IDApKSB7CiRvdXRwdXQtPndyaXRlbG4oJzx3YXJuaW5nPk5vIGRlcGVuZGVuY2llcyBpbnN0YWxsZWQuIFRyeSBydW5uaW5nIGNvbXBvc2VyIGluc3RhbGwgb3IgdXBkYXRlLCBvciB1c2UgLS1sb2NrZWQuPC93YXJuaW5nPicpOwoKcmV0dXJuIDE7Cn0KCiRyZXBvc1tdID0gJGxvY2FsUmVwbzsKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKSA/OiBbXTsKJHJlcG9zW10gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpOwp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KCRyZXBvcyk7CgoKJG5lZWRsZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfUEFDS0FHRSk7CiR0ZXh0Q29uc3RyYWludCA9ICRpbnB1dC0+aGFzQXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfQ09OU1RSQUlOVCkgPyAkaW5wdXQtPmdldEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQpIDogJyonOwoKCiRwYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZXNXaXRoUmVwbGFjZXJzQW5kUHJvdmlkZXJzKCRuZWVkbGUpOwppZiAoZW1wdHkoJHBhY2thZ2VzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDb3VsZCBub3QgZmluZCBwYWNrYWdlICIlcyIgaW4geW91ciBwcm9qZWN0JywgJG5lZWRsZSkpOwp9CgoKCmlmICghJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlKCRuZWVkbGUsICR0ZXh0Q29uc3RyYWludCkpIHsKJGRlZmF1bHRSZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3MoJHRoaXMtPmdldElPKCksICRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKSkpOwppZiAoJG1hdGNoID0gJGRlZmF1bHRSZXBvcy0+ZmluZFBhY2thZ2UoJG5lZWRsZSwgJHRleHRDb25zdHJhaW50KSkgewokaW5zdGFsbGVkUmVwby0+YWRkUmVwb3NpdG9yeShuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KFtjbG9uZSAkbWF0Y2hdKSk7Cn0gZWxzZSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8ZXJyb3I+UGFja2FnZSAiJy4kbmVlZGxlLiciIGNvdWxkIG5vdCBiZSBmb3VuZCB3aXRoIGNvbnN0cmFpbnQgIicuJHRleHRDb25zdHJhaW50LiciLCByZXN1bHRzIGJlbG93IHdpbGwgbW9zdCBsaWtlbHkgYmUgaW5jb21wbGV0ZS48L2Vycm9yPicpOwp9Cn0KCgokbmVlZGxlcyA9IFskbmVlZGxlXTsKaWYgKCRpbnZlcnRlZCkgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJG5lZWRsZXMgPSBhcnJheV9tZXJnZSgkbmVlZGxlcywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoTGluayAkbGluayk6IHN0cmluZyB7CnJldHVybiAkbGluay0+Z2V0VGFyZ2V0KCk7Cn0sICRwYWNrYWdlLT5nZXRSZXBsYWNlcygpKSk7Cn0KfQoKCmlmICgnKicgIT09ICR0ZXh0Q29uc3RyYWludCkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHRleHRDb25zdHJhaW50KTsKfSBlbHNlIHsKJGNvbnN0cmFpbnQgPSBudWxsOwp9CgoKJHJlbmRlclRyZWUgPSAkaW5wdXQtPmdldE9wdGlvbihzZWxmOjpPUFRJT05fVFJFRSk7CiRyZWN1cnNpdmUgPSAkcmVuZGVyVHJlZSB8fCAkaW5wdXQtPmdldE9wdGlvbihzZWxmOjpPUFRJT05fUkVDVVJTSVZFKTsKCgokcmVzdWx0cyA9ICRpbnN0YWxsZWRSZXBvLT5nZXREZXBlbmRlbnRzKCRuZWVkbGVzLCAkY29uc3RyYWludCwgJGludmVydGVkLCAkcmVjdXJzaXZlKTsKaWYgKGVtcHR5KCRyZXN1bHRzKSkgewokZXh0cmEgPSAobnVsbCAhPT0gJGNvbnN0cmFpbnQpID8gc3ByaW50ZignIGluIHZlcnNpb25zICVzbWF0Y2hpbmcgJXMnLCAkaW52ZXJ0ZWQgPyAnbm90ICcgOiAnJywgJHRleHRDb25zdHJhaW50KSA6ICcnOwokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcihzcHJpbnRmKAonPGluZm8+VGhlcmUgaXMgbm8gaW5zdGFsbGVkIHBhY2thZ2UgZGVwZW5kaW5nIG9uICIlcyIlczwvaW5mbz4nLAokbmVlZGxlLAokZXh0cmEKKSk7Cn0gZWxzZWlmICgkcmVuZGVyVHJlZSkgewokdGhpcy0+aW5pdFN0eWxlcygkb3V0cHV0KTsKJHJvb3QgPSAkcGFja2FnZXNbMF07CiR0aGlzLT5nZXRJTygpLT53cml0ZShzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4gJXMgJXMnLCAkcm9vdC0+Z2V0UHJldHR5TmFtZSgpLCAkcm9vdC0+Z2V0UHJldHR5VmVyc2lvbigpLCAkcm9vdCBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRyb290LT5nZXREZXNjcmlwdGlvbigpIDogJycpKTsKJHRoaXMtPnByaW50VHJlZSgkcmVzdWx0cyk7Cn0gZWxzZSB7CiR0aGlzLT5wcmludFRhYmxlKCRvdXRwdXQsICRyZXN1bHRzKTsKfQoKaWYgKCRpbnZlcnRlZCAmJiAkaW5wdXQtPmhhc0FyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdOb3QgZmluZGluZyB3aGF0IHlvdSB3ZXJlIGxvb2tpbmcgZm9yPyBUcnkgY2FsbGluZyBgY29tcG9zZXIgdXBkYXRlICInLiRpbnB1dC0+Z2V0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfUEFDS0FHRSkuJzonLiRpbnB1dC0+Z2V0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfQ09OU1RSQUlOVCkuJyIgLS1kcnktcnVuYCB0byBnZXQgYW5vdGhlciB2aWV3IG9uIHRoZSBwcm9ibGVtLicpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRUYWJsZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgJHJlc3VsdHMpOiB2b2lkCnsKJHRhYmxlID0gW107CiRkb3VibGVzID0gW107CmRvIHsKJHF1ZXVlID0gW107CiRyb3dzID0gW107CmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKCgoKClskcGFja2FnZSwgJGxpbmssICRjaGlsZHJlbl0gPSAkcmVzdWx0OwokdW5pcXVlID0gKHN0cmluZykgJGxpbms7CmlmIChpc3NldCgkZG91Ymxlc1skdW5pcXVlXSkpIHsKY29udGludWU7Cn0KJGRvdWJsZXNbJHVuaXF1ZV0gPSB0cnVlOwokdmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFJvb3RQYWNrYWdlOjpERUZBVUxUX1BSRVRUWV9WRVJTSU9OID8gJy0nIDogJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKJHBhY2thZ2VVcmwgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwokbmFtZVdpdGhMaW5rID0gJHBhY2thZ2VVcmwgIT09IG51bGwgPyAnPGhyZWY9JyAuIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRwYWNrYWdlVXJsKSAuICc+JyAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkgLiAnPC8+JyA6ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiRyb3dzW10gPSBbJG5hbWVXaXRoTGluaywgJHZlcnNpb24sICRsaW5rLT5nZXREZXNjcmlwdGlvbigpLCBzcHJpbnRmKCclcyAoJXMpJywgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKV07CmlmICgkY2hpbGRyZW4pIHsKJHF1ZXVlID0gYXJyYXlfbWVyZ2UoJHF1ZXVlLCAkY2hpbGRyZW4pOwp9Cn0KJHJlc3VsdHMgPSAkcXVldWU7CiR0YWJsZSA9IGFycmF5X21lcmdlKCRyb3dzLCAkdGFibGUpOwp9IHdoaWxlICghZW1wdHkoJHJlc3VsdHMpKTsKCiR0aGlzLT5yZW5kZXJUYWJsZSgkdGFibGUsICRvdXRwdXQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFN0eWxlcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdGhpcy0+Y29sb3JzID0gWwonZ3JlZW4nLAoneWVsbG93JywKJ2N5YW4nLAonbWFnZW50YScsCidibHVlJywKXTsKCmZvcmVhY2ggKCR0aGlzLT5jb2xvcnMgYXMgJGNvbG9yKSB7CiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgkY29sb3IpOwokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJGNvbG9yLCAkc3R5bGUpOwp9Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRUcmVlKGFycmF5ICRyZXN1bHRzLCBzdHJpbmcgJHByZWZpeCA9ICcnLCBpbnQgJGxldmVsID0gMSk6IHZvaWQKewokY291bnQgPSBjb3VudCgkcmVzdWx0cyk7CiRpZHggPSAwOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7ClskcGFja2FnZSwgJGxpbmssICRjaGlsZHJlbl0gPSAkcmVzdWx0OwoKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skbGV2ZWwgJSBjb3VudCgkdGhpcy0+Y29sb3JzKV07CiRwcmV2Q29sb3IgPSAkdGhpcy0+Y29sb3JzWygkbGV2ZWwgLSAxKSAlIGNvdW50KCR0aGlzLT5jb2xvcnMpXTsKJGlzTGFzdCA9ICgrKyRpZHggPT09ICRjb3VudCk7CiR2ZXJzaW9uVGV4dCA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFJvb3RQYWNrYWdlOjpERUZBVUxUX1BSRVRUWV9WRVJTSU9OID8gJycgOiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokcGFja2FnZVVybCA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlT3JIb21lcGFnZVVybCgkcGFja2FnZSk7CiRuYW1lV2l0aExpbmsgPSAkcGFja2FnZVVybCAhPT0gbnVsbCA/ICc8aHJlZj0nIC4gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHBhY2thZ2VVcmwpIC4gJz4nIC4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSAuICc8Lz4nIDogJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHBhY2thZ2VUZXh0ID0gcnRyaW0oc3ByaW50ZignPCVzPiVzPC8lMSRzPiAlcycsICRjb2xvciwgJG5hbWVXaXRoTGluaywgJHZlcnNpb25UZXh0KSk7CiRsaW5rVGV4dCA9IHNwcmludGYoJyVzIDwlcz4lczwvJTIkcz4gJXMnLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgJHByZXZDb2xvciwgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKTsKJGNpcmN1bGFyV2FybiA9ICRjaGlsZHJlbiA9PT0gZmFsc2UgPyAnKGNpcmN1bGFyIGRlcGVuZGVuY3kgYWJvcnRlZCBoZXJlKScgOiAnJzsKJHRoaXMtPndyaXRlVHJlZUxpbmUocnRyaW0oc3ByaW50ZigiJXMlcyVzICglcykgJXMiLCAkcHJlZml4LCAkaXNMYXN0ID8gJ+KUlOKUgOKUgCcgOiAn4pSc4pSA4pSAJywgJHBhY2thZ2VUZXh0LCAkbGlua1RleHQsICRjaXJjdWxhcldhcm4pKSk7CmlmICgkY2hpbGRyZW4pIHsKJHRoaXMtPnByaW50VHJlZSgkY2hpbGRyZW4sICRwcmVmaXggLiAoJGlzTGFzdCA/ICcgICAnIDogJ+KUgiAgJyksICRsZXZlbCArIDEpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRyZWVMaW5lKHN0cmluZyAkbGluZSk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxpbmUgPSBzdHJfcmVwbGFjZShbJ+KUlCcsICfilJwnLCAn4pSA4pSAJywgJ+KUgiddLCBbJ2AtJywgJ3wtJywgJy0nLCAnfCddLCAkbGluZSk7Cn0KCiRpby0+d3JpdGUoJGxpbmUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkJ1bXBlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCmZpbmFsIGNsYXNzIEJ1bXBDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcml2YXRlIGNvbnN0IEVSUk9SX0dFTkVSSUMgPSAxOwpwcml2YXRlIGNvbnN0IEVSUk9SX0xPQ0tfT1VUREFURUQgPSAyOwoKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYnVtcCcpCi0+c2V0RGVzY3JpcHRpb24oJ0luY3JlYXNlcyB0aGUgbG93ZXIgbGltaXQgb2YgeW91ciBjb21wb3Nlci5qc29uIHJlcXVpcmVtZW50cyB0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9ucycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdPcHRpb25hbCBwYWNrYWdlIG5hbWUocykgdG8gcmVzdHJpY3Qgd2hpY2ggcGFja2FnZXMgYXJlIGJ1bXBlZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJvb3RSZXF1aXJlbWVudCgpKSwKbmV3IElucHV0T3B0aW9uKCdkZXYtb25seScsICdEJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IGJ1bXAgcmVxdWlyZW1lbnRzIGluICJyZXF1aXJlLWRldiIuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2LW9ubHknLCAnUicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBidW1wIHJlcXVpcmVtZW50cyBpbiAicmVxdWlyZSIuJyksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgcGFja2FnZXMgdG8gYnVtcCwgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5idW1wPC9pbmZvPiBjb21tYW5kIGluY3JlYXNlcyB0aGUgbG93ZXIgbGltaXQgb2YgeW91ciBjb21wb3Nlci5qc29uIHJlcXVpcmVtZW50cwp0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9ucy4gVGhpcyBoZWxwcyB0byBlbnN1cmUgeW91ciBkZXBlbmRlbmNpZXMgZG8gbm90CmFjY2lkZW50YWxseSBnZXQgZG93bmdyYWRlZCBkdWUgdG8gc29tZSBvdGhlciBjb25mbGljdCwgYW5kIGNhbiBzbGlnaHRseSBpbXByb3ZlCmRlcGVuZGVuY3kgcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBhcyBpdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBwYWNrYWdlIHZlcnNpb25zCkNvbXBvc2VyIGhhcyB0byBsb29rIGF0LgoKUnVubmluZyB0aGlzIGJsaW5kbHkgb24gbGlicmFyaWVzIGlzICoqTk9UKiogcmVjb21tZW5kZWQgYXMgaXQgd2lsbCBuYXJyb3cgZG93bgp5b3VyIGFsbG93ZWQgZGVwZW5kZW5jaWVzLCB3aGljaCBtYXkgY2F1c2UgZGVwZW5kZW5jeSBoZWxsIGZvciB5b3VyIHVzZXJzLgpSdW5uaW5nIGl0IHdpdGggPGluZm8+LS1kZXYtb25seTwvaW5mbz4gb24gbGlicmFyaWVzIG1heSBiZSBmaW5lIGhvd2V2ZXIgYXMgZGV2IHJlcXVpcmVtZW50cwphcmUgbG9jYWwgdG8gdGhlIGxpYnJhcnkgYW5kIGRvIG5vdCBhZmZlY3QgY29uc3VtZXJzIG9mIHRoZSBwYWNrYWdlLgoKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CgokY29tcG9zZXJKc29uUGF0aCA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkY29tcG9zZXJKc29uUGF0aCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kY29tcG9zZXJKc29uUGF0aC4nIGlzIG5vdCByZWFkYWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KCiRjb21wb3Nlckpzb24gPSBuZXcgSnNvbkZpbGUoJGNvbXBvc2VySnNvblBhdGgpOwokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJKc29uLT5nZXRQYXRoKCkpOwppZiAoZmFsc2UgPT09ICRjb250ZW50cykgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRjb21wb3Nlckpzb25QYXRoLicgaXMgbm90IHJlYWRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfR0VORVJJQzsKfQoKCgppZiAoIWlzX3dyaXRhYmxlKCRjb21wb3Nlckpzb25QYXRoKSAmJiBmYWxzZSA9PT0gU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJGNvbXBvc2VySnNvblBhdGgsICRjb250ZW50cykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kY29tcG9zZXJKc29uUGF0aC4nIGlzIG5vdCB3cml0YWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KdW5zZXQoJGNvbnRlbnRzKTsKCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKaWYgKCRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0ZyZXNoKCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGxvY2sgZmlsZSBpcyBub3QgdXAgdG8gZGF0ZSB3aXRoIHRoZSBsYXRlc3QgY2hhbmdlcyBpbiBjb21wb3Nlci5qc29uLiBSdW4gdGhlIGFwcHJvcHJpYXRlIGB1cGRhdGVgIHRvIGZpeCB0aGF0IGJlZm9yZSB5b3UgdXNlIHRoZSBgYnVtcGAgY29tbWFuZC48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0xPQ0tfT1VUREFURUQ7Cn0KCiRyZXBvID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKfSBlbHNlIHsKJHJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CgppZiAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFR5cGUoKSAhPT0gJ3Byb2plY3QnICYmICEkaW5wdXQtPmdldE9wdGlvbignZGV2LW9ubHknKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPldhcm5pbmc6IEJ1bXBpbmcgZGVwZW5kZW5jeSBjb25zdHJhaW50cyBpcyBub3QgcmVjb21tZW5kZWQgZm9yIGxpYnJhcmllcyBhcyBpdCB3aWxsIG5hcnJvdyBkb3duIHlvdXIgZGVwZW5kZW5jaWVzIGFuZCBtYXkgY2F1c2UgcHJvYmxlbXMgZm9yIHlvdXIgdXNlcnMuPC93YXJuaW5nPicpOwoKJGNvbnRlbnRzID0gJGNvbXBvc2VySnNvbi0+cmVhZCgpOwppZiAoIWlzc2V0KCRjb250ZW50c1sndHlwZSddKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPklmIHlvdXIgcGFja2FnZSBpcyBub3QgYSBsaWJyYXJ5LCB5b3UgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgInR5cGUiIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgdHlwZSBwcm9qZWN0Ii48L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSAtLWRldi1vbmx5IHRvIG9ubHkgYnVtcCBkZXBlbmRlbmNpZXMgd2l0aGluICJyZXF1aXJlLWRldiIuPC93YXJuaW5nPicpOwp9CnVuc2V0KCRjb250ZW50cyk7Cn0KCiRidW1wZXIgPSBuZXcgVmVyc2lvbkJ1bXBlcigpOwokdGFza3MgPSBbXTsKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignZGV2LW9ubHknKSkgewokdGFza3NbJ3JlcXVpcmUnXSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpOwp9CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldi1vbmx5JykpIHsKJHRhc2tzWydyZXF1aXJlLWRldiddID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCk7Cn0KCiRwYWNrYWdlc0ZpbHRlciA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CmlmIChjb3VudCgkcGFja2FnZXNGaWx0ZXIpID4gMCkgewokcGF0dGVybiA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cChhcnJheV91bmlxdWUoYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBhY2thZ2VzRmlsdGVyKSkpOwpmb3JlYWNoICgkdGFza3MgYXMgJGtleSA9PiAkcmVxcykgewpmb3JlYWNoICgkcmVxcyBhcyAkcGtnTmFtZSA9PiAkbGluaykgewppZiAoIVByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwa2dOYW1lKSkgewp1bnNldCgkdGFza3NbJGtleV1bJHBrZ05hbWVdKTsKfQp9Cn0KfQoKJHVwZGF0ZXMgPSBbXTsKZm9yZWFjaCAoJHRhc2tzIGFzICRrZXkgPT4gJHJlcXMpIHsKZm9yZWFjaCAoJHJlcXMgYXMgJHBrZ05hbWUgPT4gJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBrZ05hbWUpKSB7CmNvbnRpbnVlOwp9CiRjdXJyZW50Q29uc3RyYWludCA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CgokcGFja2FnZSA9ICRyZXBvLT5maW5kUGFja2FnZSgkcGtnTmFtZSwgJyonKTsKCmlmIChudWxsID09PSAkcGFja2FnZSkgewpjb250aW51ZTsKfQp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgokYnVtcGVkID0gJGJ1bXBlci0+YnVtcFJlcXVpcmVtZW50KCRsaW5rLT5nZXRDb25zdHJhaW50KCksICRwYWNrYWdlKTsKCmlmICgkYnVtcGVkID09PSAkY3VycmVudENvbnN0cmFpbnQpIHsKY29udGludWU7Cn0KCiR1cGRhdGVzWyRrZXldWyRwa2dOYW1lXSA9ICRidW1wZWQ7Cn0KfQoKJGRyeVJ1biA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJyk7CgppZiAoISRkcnlSdW4gJiYgISR0aGlzLT51cGRhdGVGaWxlQ2xlYW5seSgkY29tcG9zZXJKc29uLCAkdXBkYXRlcykpIHsKJGNvbXBvc2VyRGVmaW5pdGlvbiA9ICRjb21wb3Nlckpzb24tPnJlYWQoKTsKZm9yZWFjaCAoJHVwZGF0ZXMgYXMgJGtleSA9PiAkcGFja2FnZXMpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CiRjb21wb3NlckRlZmluaXRpb25bJGtleV1bJHBhY2thZ2VdID0gJHZlcnNpb247Cn0KfQokY29tcG9zZXJKc29uLT53cml0ZSgkY29tcG9zZXJEZWZpbml0aW9uKTsKfQoKJGNoYW5nZUNvdW50ID0gYXJyYXlfc3VtKGFycmF5X21hcCgnY291bnQnLCAkdXBkYXRlcykpOwppZiAoJGNoYW5nZUNvdW50ID4gMCkgewppZiAoJGRyeVJ1bikgewokaW8tPndyaXRlKCc8aW5mbz4nIC4gJGNvbXBvc2VySnNvblBhdGggLiAnIHdvdWxkIGJlIHVwZGF0ZWQgd2l0aDo8L2luZm8+Jyk7CmZvcmVhY2ggKCR1cGRhdGVzIGFzICRyZXF1aXJlVHlwZSA9PiAkcGFja2FnZXMpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CiRpby0+d3JpdGUoc3ByaW50ZignPGluZm8+IC0gJXMuJXM6ICVzPC9pbmZvPicsICRyZXF1aXJlVHlwZSwgJHBhY2thZ2UsICR2ZXJzaW9uKSk7Cn0KfQp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz4nIC4gJGNvbXBvc2VySnNvblBhdGggLiAnIGhhcyBiZWVuIHVwZGF0ZWQgKCcgLiAkY2hhbmdlQ291bnQgLiAnIGNoYW5nZXMpLjwvaW5mbz4nKTsKfQp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz5ObyByZXF1aXJlbWVudHMgdG8gdXBkYXRlIGluICcuJGNvbXBvc2VySnNvblBhdGguJy48L2luZm8+Jyk7Cn0KCmlmICghJGRyeVJ1biAmJiAkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpICYmICRjaGFuZ2VDb3VudCA+IDApIHsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGNvbXBvc2VySnNvbi0+Z2V0UGF0aCgpKTsKaWYgKGZhbHNlID09PSAkY29udGVudHMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gcmVhZCAnLiRjb21wb3Nlckpzb24tPmdldFBhdGgoKS4nIGNvbnRlbnRzIHRvIHVwZGF0ZSB0aGUgbG9jayBmaWxlIGhhc2guJyk7Cn0KJGxvY2sgPSBuZXcgSnNvbkZpbGUoRmFjdG9yeTo6Z2V0TG9ja0ZpbGUoJGNvbXBvc2VySnNvblBhdGgpKTsKJGxvY2tEYXRhID0gJGxvY2stPnJlYWQoKTsKJGxvY2tEYXRhWydjb250ZW50LWhhc2gnXSA9IExvY2tlcjo6Z2V0Q29udGVudEhhc2goJGNvbnRlbnRzKTsKJGxvY2stPndyaXRlKCRsb2NrRGF0YSk7Cn0KCmlmICgkZHJ5UnVuICYmICRjaGFuZ2VDb3VudCA+IDApIHsKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KCnJldHVybiAwOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUZpbGVDbGVhbmx5KEpzb25GaWxlICRqc29uLCBhcnJheSAkdXBkYXRlcyk6IGJvb2wKewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpKTsKaWYgKGZhbHNlID09PSAkY29udGVudHMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gcmVhZCAnLiRqc29uLT5nZXRQYXRoKCkuJyBjb250ZW50cy4nKTsKfQoKJG1hbmlwdWxhdG9yID0gbmV3IEpzb25NYW5pcHVsYXRvcigkY29udGVudHMpOwoKZm9yZWFjaCAoJHVwZGF0ZXMgYXMgJGtleSA9PiAkcGFja2FnZXMpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CmlmICghJG1hbmlwdWxhdG9yLT5hZGRMaW5rKCRrZXksICRwYWNrYWdlLCAkdmVyc2lvbikpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KfQoKaWYgKGZhbHNlID09PSBmaWxlX3B1dF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpLCAkbWFuaXB1bGF0b3ItPmdldENvbnRlbnRzKCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHdyaXRlIG5ldyAnLiRqc29uLT5nZXRQYXRoKCkuJyBjb250ZW50cy4nKTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKCmNsYXNzIENoZWNrUGxhdGZvcm1SZXFzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMtPnNldE5hbWUoJ2NoZWNrLXBsYXRmb3JtLXJlcXMnKQotPnNldERlc2NyaXB0aW9uKCdDaGVjayB0aGF0IHBsYXRmb3JtIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGNoZWNraW5nIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIHJlcXVpcmVtZW50cy4nKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdDaGVja3MgcmVxdWlyZW1lbnRzIG9ubHkgZnJvbSB0aGUgbG9jayBmaWxlLCBub3QgZnJvbSBpbnN0YWxsZWQgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ2pzb24nLCAndGV4dCddKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKQ2hlY2tzIHRoYXQgeW91ciBQSFAgYW5kIGV4dGVuc2lvbnMgdmVyc2lvbnMgbWF0Y2ggdGhlIHBsYXRmb3JtIHJlcXVpcmVtZW50cyBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLgoKVW5saWtlIHVwZGF0ZS9pbnN0YWxsLCB0aGlzIGNvbW1hbmQgd2lsbCBpZ25vcmUgY29uZmlnLnBsYXRmb3JtIHNldHRpbmdzIGFuZCBjaGVjayB0aGUgcmVhbCBwbGF0Zm9ybSBwYWNrYWdlcyBzbyB5b3UgY2FuIGJlIGNlcnRhaW4geW91IGhhdmUgdGhlIHJlcXVpcmVkIHBsYXRmb3JtIGRlcGVuZGVuY2llcy4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGNoZWNrLXBsYXRmb3JtLXJlcXM8L2luZm8+CgpFT1QKKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRyZXF1aXJlcyA9IFtdOwokcmVtb3ZlUGFja2FnZXMgPSBbXTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPkNoZWNraW5nICcuKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSA/ICdub24tZGV2ICcgOiAnJykuJ3BsYXRmb3JtIHJlcXVpcmVtZW50cyB1c2luZyB0aGUgbG9jayBmaWxlPC9pbmZvPicpOwokaW5zdGFsbGVkUmVwbyA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKCmlmICghJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIHZlbmRvciBkaXIgcHJlc2VudCwgY2hlY2tpbmcgJy4oJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpID8gJ25vbi1kZXYgJyA6ICcnKS4ncGxhdGZvcm0gcmVxdWlyZW1lbnRzIGZyb20gdGhlIGxvY2sgZmlsZTwvd2FybmluZz4nKTsKJGluc3RhbGxlZFJlcG8gPSAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpOwp9IGVsc2UgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRyZW1vdmVQYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5nZXREZXZQYWNrYWdlTmFtZXMoKTsKfQoKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPkNoZWNraW5nICcuKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSA/ICdub24tZGV2ICcgOiAnJykuJ3BsYXRmb3JtIHJlcXVpcmVtZW50cyBmb3IgcGFja2FnZXMgaW4gdGhlIHZlbmRvciBkaXI8L2luZm8+Jyk7Cn0KfQppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewpmb3JlYWNoICgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKSBhcyAkcmVxdWlyZSA9PiAkbGluaykgewokcmVxdWlyZXNbJHJlcXVpcmVdID0gWyRsaW5rXTsKfQp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskaW5zdGFsbGVkUmVwbywgbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSldKTsKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRyZW1vdmVQYWNrYWdlcywgdHJ1ZSkpIHsKY29udGludWU7Cn0KZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJHJlcXVpcmUgPT4gJGxpbmspIHsKJHJlcXVpcmVzWyRyZXF1aXJlXVtdID0gJGxpbms7Cn0KfQoKa3NvcnQoJHJlcXVpcmVzKTsKCiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sIFtdKSk7CgokcmVzdWx0cyA9IFtdOwokZXhpdENvZGUgPSAwOwoKCgoKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlID0+ICRsaW5rcykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxdWlyZSkpIHsKJGNhbmRpZGF0ZXMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkcmVxdWlyZSk7CmlmICgkY2FuZGlkYXRlcykgewokcmVxUmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CiRjYW5kaWRhdGVDb25zdHJhaW50ID0gbnVsbDsKaWYgKCRjYW5kaWRhdGUtPmdldE5hbWUoKSA9PT0gJHJlcXVpcmUpIHsKJGNhbmRpZGF0ZUNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSk7CiRjYW5kaWRhdGVDb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJGNhbmRpZGF0ZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfSBlbHNlIHsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0UmVwbGFjZXMoKSkgYXMgJGxpbmspIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHJlcXVpcmUpIHsKJGNhbmRpZGF0ZUNvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwpicmVhazsKfQp9Cn0KCgppZiAoISRjYW5kaWRhdGVDb25zdHJhaW50KSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKaWYgKCEkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCRjYW5kaWRhdGVDb25zdHJhaW50KSkgewokcmVxUmVzdWx0c1tdID0gWwokY2FuZGlkYXRlLT5nZXROYW1lKCkgPT09ICRyZXF1aXJlID8gJGNhbmRpZGF0ZS0+Z2V0UHJldHR5TmFtZSgpIDogJHJlcXVpcmUsCiRjYW5kaWRhdGVDb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSwKJGxpbmssCic8ZXJyb3I+ZmFpbGVkPC9lcnJvcj4nLAokY2FuZGlkYXRlLT5nZXROYW1lKCkgPT09ICRyZXF1aXJlID8gJycgOiAnPGNvbW1lbnQ+cHJvdmlkZWQgYnkgJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkuJzwvY29tbWVudD4nLApdOwoKCmNvbnRpbnVlIDI7Cn0KfQoKJHJlc3VsdHNbXSA9IFsKJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpID09PSAkcmVxdWlyZSA/ICRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKSA6ICRyZXF1aXJlLAokY2FuZGlkYXRlQ29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCksCm51bGwsCic8aW5mbz5zdWNjZXNzPC9pbmZvPicsCiRjYW5kaWRhdGUtPmdldE5hbWUoKSA9PT0gJHJlcXVpcmUgPyAnJyA6ICc8Y29tbWVudD5wcm92aWRlZCBieSAnLiRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKS4nPC9jb21tZW50PicsCl07CgoKY29udGludWUgMjsKfQoKCiRyZXN1bHRzID0gYXJyYXlfbWVyZ2UoJHJlc3VsdHMsICRyZXFSZXN1bHRzKTsKJGV4aXRDb2RlID0gbWF4KCRleGl0Q29kZSwgMSk7Cgpjb250aW51ZTsKfQoKJHJlc3VsdHNbXSA9IFsKJHJlcXVpcmUsCiduL2EnLAokbGlua3NbMF0sCic8ZXJyb3I+bWlzc2luZzwvZXJyb3I+JywKJycsCl07CgokZXhpdENvZGUgPSBtYXgoJGV4aXRDb2RlLCAyKTsKfQp9CgokdGhpcy0+cHJpbnRUYWJsZSgkb3V0cHV0LCAkcmVzdWx0cywgJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpKTsKCnJldHVybiAkZXhpdENvZGU7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludFRhYmxlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBhcnJheSAkcmVzdWx0cywgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKJHJvd3MgPSBbXTsKZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewoKCgpbJHBsYXRmb3JtUGFja2FnZSwgJHZlcnNpb24sICRsaW5rLCAkc3RhdHVzLCAkcHJvdmlkZXJdID0gJHJlc3VsdDsKCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJHJvd3NbXSA9IFsKIm5hbWUiID0+ICRwbGF0Zm9ybVBhY2thZ2UsCiJ2ZXJzaW9uIiA9PiAkdmVyc2lvbiwKInN0YXR1cyIgPT4gc3RyaXBfdGFncygkc3RhdHVzKSwKImZhaWxlZF9yZXF1aXJlbWVudCIgPT4gJGxpbmsgaW5zdGFuY2VvZiBMaW5rID8gWwonc291cmNlJyA9PiAkbGluay0+Z2V0U291cmNlKCksCid0eXBlJyA9PiAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwKJ3RhcmdldCcgPT4gJGxpbmstPmdldFRhcmdldCgpLAonY29uc3RyYWludCcgPT4gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSwKXSA6IG51bGwsCiJwcm92aWRlciIgPT4gJHByb3ZpZGVyID09PSAnJyA/IG51bGwgOiBzdHJpcF90YWdzKCRwcm92aWRlciksCl07Cn0gZWxzZSB7CiRyb3dzW10gPSBbCiRwbGF0Zm9ybVBhY2thZ2UsCiR2ZXJzaW9uLAokbGluaywKJGxpbmsgPyBzcHJpbnRmKCclcyAlcyAlcyAoJXMpJywgJGxpbmstPmdldFNvdXJjZSgpLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKSA6ICcnLApydHJpbSgkc3RhdHVzLicgJy4kcHJvdmlkZXIpLApdOwp9Cn0KCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJHJvd3MpKTsKfSBlbHNlIHsKJHRoaXMtPnJlbmRlclRhYmxlKCRyb3dzLCAkb3V0cHV0KTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBDbGVhckNhY2hlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdjbGVhci1jYWNoZScpCi0+c2V0QWxpYXNlcyhbJ2NsZWFyY2FjaGUnLCAnY2MnXSkKLT5zZXREZXNjcmlwdGlvbignQ2xlYXJzIGNvbXBvc2VyXCdzIGludGVybmFsIHBhY2thZ2UgY2FjaGUnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2djJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IHJ1biBnYXJiYWdlIGNvbGxlY3Rpb24sIG5vdCBhIGZ1bGwgY2FjaGUgY2xlYXInKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmNsZWFyLWNhY2hlPC9pbmZvPiBkZWxldGVzIGFsbCBjYWNoZWQgcGFja2FnZXMgZnJvbSBjb21wb3NlcidzCmNhY2hlIGRpcmVjdG9yeS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2NsZWFyLWNhY2hlLWNsZWFyY2FjaGUtY2MKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRjYWNoZVBhdGhzID0gWwonY2FjaGUtdmNzLWRpcicgPT4gJGNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJyksCidjYWNoZS1yZXBvLWRpcicgPT4gJGNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLAonY2FjaGUtZmlsZXMtZGlyJyA9PiAkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLWRpcicpLAonY2FjaGUtZGlyJyA9PiAkY29uZmlnLT5nZXQoJ2NhY2hlLWRpcicpLApdOwoKZm9yZWFjaCAoJGNhY2hlUGF0aHMgYXMgJGtleSA9PiAkY2FjaGVQYXRoKSB7CgppZiAoJGtleSA9PT0gJ2NhY2hlLWRpcicgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2djJykpIHsKY29udGludWU7Cn0KCiRjYWNoZVBhdGggPSByZWFscGF0aCgkY2FjaGVQYXRoKTsKaWYgKCEkY2FjaGVQYXRoKSB7CiRpby0+d3JpdGVFcnJvcigiPGluZm8+Q2FjaGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0ICgka2V5KTogJGNhY2hlUGF0aDwvaW5mbz4iKTsKCmNvbnRpbnVlOwp9CiRjYWNoZSA9IG5ldyBDYWNoZSgkaW8sICRjYWNoZVBhdGgpOwokY2FjaGUtPnNldFJlYWRPbmx5KCRjb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwppZiAoISRjYWNoZS0+aXNFbmFibGVkKCkpIHsKJGlvLT53cml0ZUVycm9yKCI8aW5mbz5DYWNoZSBpcyBub3QgZW5hYmxlZCAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7Cgpjb250aW51ZTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnYycpKSB7CiRpby0+d3JpdGVFcnJvcigiPGluZm8+R2FyYmFnZS1jb2xsZWN0aW5nIGNhY2hlICgka2V5KTogJGNhY2hlUGF0aDwvaW5mbz4iKTsKaWYgKCRrZXkgPT09ICdjYWNoZS1maWxlcy1kaXInKSB7CiRjYWNoZS0+Z2MoJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy10dGwnKSwgJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy1tYXhzaXplJykpOwp9IGVsc2VpZiAoJGtleSA9PT0gJ2NhY2hlLXJlcG8tZGlyJykgewokY2FjaGUtPmdjKCRjb25maWctPmdldCgnY2FjaGUtdHRsJyksIDEwMjQgKiAxMDI0ICogMTAyNCApOwp9IGVsc2VpZiAoJGtleSA9PT0gJ2NhY2hlLXZjcy1kaXInKSB7CiRjYWNoZS0+Z2NWY3NDYWNoZSgkY29uZmlnLT5nZXQoJ2NhY2hlLXR0bCcpKTsKfQp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoIjxpbmZvPkNsZWFyaW5nIGNhY2hlICgka2V5KTogJGNhY2hlUGF0aDwvaW5mbz4iKTsKJGNhY2hlLT5jbGVhcigpOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2MnKSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkFsbCBjYWNoZXMgZ2FyYmFnZS1jb2xsZWN0ZWQuPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkFsbCBjYWNoZXMgY2xlYXJlZC48L2luZm8+Jyk7Cn0KCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CgoKCgoKCnRyYWl0IENvbXBsZXRpb25UcmFpdAp7CgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZXF1aXJlQ29tcG9zZXIoP2Jvb2wgJGRpc2FibGVQbHVnaW5zID0gbnVsbCwgP2Jvb2wgJGRpc2FibGVTY3JpcHRzID0gbnVsbCk6IENvbXBvc2VyOwoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RQcmVmZXJJbnN0YWxsKCk6IGFycmF5CnsKcmV0dXJuIFsnZGlzdCcsICdzb3VyY2UnLCAnYXV0byddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RSb290UmVxdWlyZW1lbnQoKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCnJldHVybiBhcnJheV9tZXJnZShhcnJheV9rZXlzKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpKSwgYXJyYXlfa2V5cygkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKSkpOwp9Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKGJvb2wgJGluY2x1ZGVSb290UGFja2FnZSA9IHRydWUsIGJvb2wgJGluY2x1ZGVQbGF0Zm9ybVBhY2thZ2VzID0gZmFsc2UpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCkgdXNlICgkaW5jbHVkZVJvb3RQYWNrYWdlLCAkaW5jbHVkZVBsYXRmb3JtUGFja2FnZXMpOiBhcnJheSB7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGluc3RhbGxlZFJlcG9zID0gW107CgppZiAoJGluY2x1ZGVSb290UGFja2FnZSkgewokaW5zdGFsbGVkUmVwb3NbXSA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpOwp9CgokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKaWYgKCRsb2NrZXItPmlzTG9ja2VkKCkpIHsKJGluc3RhbGxlZFJlcG9zW10gPSAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwp9IGVsc2UgewokaW5zdGFsbGVkUmVwb3NbXSA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7Cn0KCiRwbGF0Zm9ybUhpbnQgPSBbXTsKaWYgKCRpbmNsdWRlUGxhdGZvcm1QYWNrYWdlcykgewppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGxvY2tlci0+Z2V0UGxhdGZvcm1PdmVycmlkZXMoKSk7Cn0gZWxzZSB7CiRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3BsYXRmb3JtJykpOwp9CmlmICgkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpID09PSAnJykgewoKJGhpbnRzVG9GaW5kID0gWydleHQtJyA9PiAwLCAnbGliLScgPT4gMCwgJ3BocCcgPT4gOTksICdjb21wb3NlcicgPT4gOTldOwpmb3JlYWNoICgkcGxhdGZvcm1SZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwa2cpIHsKZm9yZWFjaCAoJGhpbnRzVG9GaW5kIGFzICRoaW50UHJlZml4ID0+ICRoaW50Q291bnQpIHsKaWYgKHN0cl9zdGFydHNfd2l0aCgkcGtnLT5nZXROYW1lKCksICRoaW50UHJlZml4KSkgewppZiAoJGhpbnRDb3VudCA9PT0gMCB8fCAkaGludENvdW50ID49IDk5KSB7CiRwbGF0Zm9ybUhpbnRbXSA9ICRwa2ctPmdldE5hbWUoKTsKJGhpbnRzVG9GaW5kWyRoaW50UHJlZml4XSsrOwp9IGVsc2VpZiAoJGhpbnRDb3VudCA9PT0gMSkgewp1bnNldCgkaGludHNUb0ZpbmRbJGhpbnRQcmVmaXhdKTsKJHBsYXRmb3JtSGludFtdID0gc3Vic3RyKCRwa2ctPmdldE5hbWUoKSwgMCwgbWF4KHN0cmxlbigkcGtnLT5nZXROYW1lKCkpIC0gMywgc3RybGVuKCRoaW50UHJlZml4KSArIDEpKS4nLi4uJzsKfQpjb250aW51ZSAyOwp9Cn0KfQp9IGVsc2UgewokaW5zdGFsbGVkUmVwb3NbXSA9ICRwbGF0Zm9ybVJlcG87Cn0KfQoKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeSgkaW5zdGFsbGVkUmVwb3MpOwoKcmV0dXJuIGFycmF5X21lcmdlKAphcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9LCAkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKSksCiRwbGF0Zm9ybUhpbnQKKTsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0QXZhaWxhYmxlUGFja2FnZShpbnQgJG1heCA9IDk5KTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJG1heCk6IGFycmF5IHsKaWYgKCRtYXggPCAxKSB7CnJldHVybiBbXTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKTsKCiRyZXN1bHRzID0gW107CiRzaG93VmVuZG9ycyA9IGZhbHNlOwppZiAoIXN0cl9jb250YWlucygkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpLCAnLycpKSB7CiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJ14nIC4gcHJlZ19xdW90ZSgkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpKSwgUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX1ZFTkRPUik7CiRzaG93VmVuZG9ycyA9IHRydWU7Cn0KCgppZiAoXGNvdW50KCRyZXN1bHRzKSA8PSAxKSB7CiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJ14nLnByZWdfcXVvdGUoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSksIFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9OQU1FKTsKJHNob3dWZW5kb3JzID0gZmFsc2U7Cn0KCiRyZXN1bHRzID0gYXJyYXlfY29sdW1uKCRyZXN1bHRzLCAnbmFtZScpOwoKaWYgKCRzaG93VmVuZG9ycykgewokcmVzdWx0cyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSk6IHN0cmluZyB7CnJldHVybiAkbmFtZS4nLyc7Cn0sICRyZXN1bHRzKTsKCgp1c29ydCgkcmVzdWx0cywgc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGEsIHN0cmluZyAkYikgewokbGVuQSA9IFxzdHJsZW4oJGEpOwokbGVuQiA9IFxzdHJsZW4oJGIpOwppZiAoJGxlbkEgPT09ICRsZW5CKSB7CnJldHVybiAkYSA8PT4gJGI7Cn0KCnJldHVybiAkbGVuQSAtICRsZW5COwp9KTsKCiRwaW5uZWQgPSBbXTsKCgokY29tcGxldGlvbklucHV0ID0gJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKS4nLyc7CmlmIChmYWxzZSAhPT0gKCRleGFjdEluZGV4ID0gYXJyYXlfc2VhcmNoKCRjb21wbGV0aW9uSW5wdXQsICRyZXN1bHRzLCB0cnVlKSkpIHsKJHBpbm5lZFtdID0gJGNvbXBsZXRpb25JbnB1dDsKYXJyYXlfc3BsaWNlKCRyZXN1bHRzLCAkZXhhY3RJbmRleCwgMSk7Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkcGlubmVkLCBhcnJheV9zbGljZSgkcmVzdWx0cywgMCwgJG1heCAtIFxjb3VudCgkcGlubmVkKSkpOwp9CgpyZXR1cm4gYXJyYXlfc2xpY2UoJHJlc3VsdHMsIDAsICRtYXgpOwp9Owp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKGV4dHxsaWJ8cGhwKSgtfCQpfF5jb219JywgJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSkpIHsKJG1hdGNoZXMgPSAkdGhpcy0+c3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpKCRpbnB1dCk7Cn0gZWxzZSB7CiRtYXRjaGVzID0gW107Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkbWF0Y2hlcywgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKDk5IC0gXGNvdW50KCRtYXRjaGVzKSkoJGlucHV0KSk7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKJHJlcG9zID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKCiRwYXR0ZXJuID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKS4nKicpOwoKcmV0dXJuIGFycmF5X2ZpbHRlcihhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9LCAkcmVwb3MtPmdldFBhY2thZ2VzKCkpLCBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSkgdXNlICgkcGF0dGVybik6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJG5hbWUpOwp9KTsKfTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbmZpZ1xKc29uQ29uZmlnU291cmNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgpjbGFzcyBDb25maWdDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgoKCnByb3RlY3RlZCBjb25zdCBDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTID0gWwonbmFtZScsCid0eXBlJywKJ2Rlc2NyaXB0aW9uJywKJ2hvbWVwYWdlJywKJ3ZlcnNpb24nLAonbWluaW11bS1zdGFiaWxpdHknLAoncHJlZmVyLXN0YWJsZScsCidrZXl3b3JkcycsCidsaWNlbnNlJywKJ3JlcG9zaXRvcmllcycsCidzdWdnZXN0JywKJ2V4dHJhJywKXTsKCgoKCnByb3RlY3RlZCAkY29uZmlnOwoKCgoKcHJvdGVjdGVkICRjb25maWdGaWxlOwoKCgoKcHJvdGVjdGVkICRjb25maWdTb3VyY2U7CgoKCgpwcm90ZWN0ZWQgJGF1dGhDb25maWdGaWxlOwoKCgoKcHJvdGVjdGVkICRhdXRoQ29uZmlnU291cmNlOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdjb25maWcnKQotPnNldERlc2NyaXB0aW9uKCdTZXRzIGNvbmZpZyBvcHRpb25zJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdnbG9iYWwnLCAnZycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXBwbHkgY29tbWFuZCB0byB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlJyksCm5ldyBJbnB1dE9wdGlvbignZWRpdG9yJywgJ2UnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wZW4gZWRpdG9yJyksCm5ldyBJbnB1dE9wdGlvbignYXV0aCcsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBZmZlY3QgYXV0aCBjb25maWcgZmlsZSAob25seSB1c2VkIGZvciAtLWVkaXRvciknKSwKbmV3IElucHV0T3B0aW9uKCd1bnNldCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVW5zZXQgdGhlIGdpdmVuIHNldHRpbmcta2V5JyksCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsICdsJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MnKSwKbmV3IElucHV0T3B0aW9uKCdmaWxlJywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdJZiB5b3Ugd2FudCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgY29tcG9zZXIuanNvbiBvciBjb25maWcuanNvbicpLApuZXcgSW5wdXRPcHRpb24oJ2Fic29sdXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm5zIGFic29sdXRlIHBhdGhzIHdoZW4gZmV0Y2hpbmcgKi1kaXIgY29uZmlnIHZhbHVlcyBpbnN0ZWFkIG9mIHJlbGF0aXZlJyksCm5ldyBJbnB1dE9wdGlvbignanNvbicsICdqJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdKU09OIGRlY29kZSB0aGUgc2V0dGluZyB2YWx1ZSwgdG8gYmUgdXNlZCB3aXRoIGV4dHJhLioga2V5cycpLApuZXcgSW5wdXRPcHRpb24oJ21lcmdlJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ01lcmdlIHRoZSBzZXR0aW5nIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUsIHRvIGJlIHVzZWQgd2l0aCBleHRyYS4qIGtleXMgaW4gY29tYmluYXRpb24gd2l0aCAtLWpzb24nKSwKbmV3IElucHV0T3B0aW9uKCdhcHBlbmQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZW4gYWRkaW5nIGEgcmVwb3NpdG9yeSwgYXBwZW5kIGl0IChsb3dlc3QgcHJpb3JpdHkpIHRvIHRoZSBleGlzdGluZyBvbmVzIGluc3RlYWQgb2YgcHJlcGVuZGluZyBpdCAoaGlnaGVzdCBwcmlvcml0eSknKSwKbmV3IElucHV0T3B0aW9uKCdzb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgd2hlcmUgdGhlIGNvbmZpZyB2YWx1ZSBpcyBsb2FkZWQgZnJvbScpLApuZXcgSW5wdXRBcmd1bWVudCgnc2V0dGluZy1rZXknLCBudWxsLCAnU2V0dGluZyBrZXknLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFNldHRpbmdLZXlzKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnU2V0dGluZyB2YWx1ZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGlzIGNvbW1hbmQgYWxsb3dzIHlvdSB0byBlZGl0IGNvbXBvc2VyIGNvbmZpZyBzZXR0aW5ncyBhbmQgcmVwb3NpdG9yaWVzCmluIGVpdGhlciB0aGUgbG9jYWwgY29tcG9zZXIuanNvbiBmaWxlIG9yIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4KCkFkZGl0aW9uYWxseSBpdCBsZXRzIHlvdSBlZGl0IG1vc3QgcHJvcGVydGllcyBpbiB0aGUgbG9jYWwgY29tcG9zZXIuanNvbi4KClRvIHNldCBhIGNvbmZpZyBzZXR0aW5nOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgYmluLWRpciBiaW4vPC9jb21tZW50PgoKVG8gcmVhZCBhIGNvbmZpZyBzZXR0aW5nOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgYmluLWRpcjwvY29tbWVudD4KICAgIE91dHB1dHM6IDxpbmZvPmJpbjwvaW5mbz4KClRvIGVkaXQgdGhlIGdsb2JhbCBjb25maWcuanNvbiBmaWxlOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1nbG9iYWw8L2NvbW1lbnQ+CgpUbyBhZGQgYSByZXBvc2l0b3J5OgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgcmVwb3NpdG9yaWVzLmZvbyB2Y3MgaHR0cHM6Ly9iYXIuY29tPC9jb21tZW50PgoKVG8gcmVtb3ZlIGEgcmVwb3NpdG9yeSAocmVwbyBpcyBhIHNob3J0IGFsaWFzIGZvciByZXBvc2l0b3JpZXMpOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS11bnNldCByZXBvLmZvbzwvY29tbWVudD4KClRvIGRpc2FibGUgcGFja2FnaXN0OgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgcmVwby5wYWNrYWdpc3QgZmFsc2U8L2NvbW1lbnQ+CgpZb3UgY2FuIGFsdGVyIHJlcG9zaXRvcmllcyBpbiB0aGUgZ2xvYmFsIGNvbmZpZy5qc29uIGZpbGUgYnkgcGFzc2luZyBpbiB0aGUKPGluZm8+LS1nbG9iYWw8L2luZm8+IG9wdGlvbi4KClRvIGFkZCBvciBlZGl0IHN1Z2dlc3RlZCBwYWNrYWdlcyB5b3UgY2FuIHVzZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIHN1Z2dlc3QucGFja2FnZSByZWFzb24gZm9yIHRoZSBzdWdnZXN0aW9uPC9jb21tZW50PgoKVG8gYWRkIG9yIGVkaXQgZXh0cmEgcHJvcGVydGllcyB5b3UgY2FuIHVzZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIGV4dHJhLnByb3BlcnR5IHZhbHVlPC9jb21tZW50PgoKT3IgdG8gYWRkIGEgY29tcGxleCB2YWx1ZSB5b3UgY2FuIHVzZSBqc29uIHdpdGg6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSBleHRyYS5wcm9wZXJ0eSAtLWpzb24gJ3siZm9vIjp0cnVlLCAiYmFyIjogW119JzwvY29tbWVudD4KClRvIGVkaXQgdGhlIGZpbGUgaW4gYW4gZXh0ZXJuYWwgZWRpdG9yOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1lZGl0b3I8L2NvbW1lbnQ+CgpUbyBjaG9vc2UgeW91ciBlZGl0b3IgeW91IGNhbiBzZXQgdGhlICJFRElUT1IiIGVudiB2YXJpYWJsZS4KClRvIGdldCBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB2YWx1ZXMgaW4gdGhlIGZpbGU6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWxpc3Q8L2NvbW1lbnQ+CgpZb3UgY2FuIGFsd2F5cyBwYXNzIG1vcmUgdGhhbiBvbmUgb3B0aW9uLiBBcyBhbiBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZQpnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4KCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIC0tZWRpdG9yIC0tZ2xvYmFsPC9jb21tZW50PgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjY29uZmlnCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgbnVsbCAhPT0gJGlucHV0LT5nZXRPcHRpb24oJ2ZpbGUnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJy0tZmlsZSBhbmQgLS1nbG9iYWwgY2FuIG5vdCBiZSBjb21iaW5lZCcpOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHRoaXMtPmNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwoKJGNvbmZpZ0ZpbGUgPSAkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJHRoaXMtPmNvbmZpZyk7CgoKaWYgKAooJGNvbmZpZ0ZpbGUgPT09ICdjb21wb3Nlci5qc29uJyB8fCAkY29uZmlnRmlsZSA9PT0gJy4vY29tcG9zZXIuanNvbicpCiYmICFmaWxlX2V4aXN0cygkY29uZmlnRmlsZSkKJiYgcmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKSA9PT0gcmVhbHBhdGgoJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykpCikgewpmaWxlX3B1dF9jb250ZW50cygkY29uZmlnRmlsZSwgIntcbn1cbiIpOwp9CgokdGhpcy0+Y29uZmlnRmlsZSA9IG5ldyBKc29uRmlsZSgkY29uZmlnRmlsZSwgbnVsbCwgJGlvKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZSA9IG5ldyBKc29uQ29uZmlnU291cmNlKCR0aGlzLT5jb25maWdGaWxlKTsKCiRhdXRoQ29uZmlnRmlsZSA9ICR0aGlzLT5nZXRBdXRoQ29uZmlnRmlsZSgkaW5wdXQsICR0aGlzLT5jb25maWcpOwoKJHRoaXMtPmF1dGhDb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCRhdXRoQ29uZmlnRmlsZSwgbnVsbCwgJGlvKTsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZSgkdGhpcy0+YXV0aENvbmZpZ0ZpbGUsIHRydWUpOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgISR0aGlzLT5jb25maWdGaWxlLT5leGlzdHMoKSkgewp0b3VjaCgkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmNvbmZpZ0ZpbGUtPndyaXRlKFsnY29uZmlnJyA9PiBuZXcgXEFycmF5T2JqZWN0XSk7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCksIDA2MDApOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgISR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKdG91Y2goJHRoaXMtPmF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkpOwokdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPndyaXRlKFsnYml0YnVja2V0LW9hdXRoJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZ2l0aHViLW9hdXRoJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZ2l0bGFiLW9hdXRoJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZ2l0bGFiLXRva2VuJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnaHR0cC1iYXNpYycgPT4gbmV3IFxBcnJheU9iamVjdCwgJ2JlYXJlcicgPT4gbmV3IFxBcnJheU9iamVjdF0pOwpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKSwgMDYwMCk7Cn0KCmlmICghJHRoaXMtPmNvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdGaWxlICIlcyIgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeScsICRjb25maWdGaWxlKSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJ2VkaXRvcicpKSB7CiRlZGl0b3IgPSBQbGF0Zm9ybTo6Z2V0RW52KCdFRElUT1InKTsKaWYgKGZhbHNlID09PSAkZWRpdG9yIHx8ICcnID09PSAkZWRpdG9yKSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGVkaXRvciA9ICdub3RlcGFkJzsKfSBlbHNlIHsKZm9yZWFjaCAoWydlZGl0b3InLCAndmltJywgJ3ZpJywgJ25hbm8nLCAncGljbycsICdlZCddIGFzICRjYW5kaWRhdGUpIHsKaWYgKGV4ZWMoJ3doaWNoICcuJGNhbmRpZGF0ZSkpIHsKJGVkaXRvciA9ICRjYW5kaWRhdGU7CmJyZWFrOwp9Cn0KfQp9IGVsc2UgewokZWRpdG9yID0gZXNjYXBlc2hlbGxjbWQoJGVkaXRvcik7Cn0KCiRmaWxlID0gJGlucHV0LT5nZXRPcHRpb24oJ2F1dGgnKSA/ICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpIDogJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKTsKc3lzdGVtKCRlZGl0b3IgLiAnICcgLiAkZmlsZSAuIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgPyAnJyA6ICcgPiBgdHR5YCcpKTsKCnJldHVybiAwOwp9CgppZiAoZmFsc2UgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSkgewokdGhpcy0+Y29uZmlnLT5tZXJnZSgkdGhpcy0+Y29uZmlnRmlsZS0+cmVhZCgpLCAkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+ZXhpc3RzKCkgPyAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPnJlYWQoKSA6IFtdXSwgJHRoaXMtPmF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkpOwp9CgokdGhpcy0+Z2V0SU8oKS0+bG9hZENvbmZpZ3VyYXRpb24oJHRoaXMtPmNvbmZpZyk7CgoKaWYgKHRydWUgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKJHRoaXMtPmxpc3RDb25maWd1cmF0aW9uKCR0aGlzLT5jb25maWctPmFsbCgpLCAkdGhpcy0+Y29uZmlnLT5yYXcoKSwgJG91dHB1dCwgbnVsbCwgJGlucHV0LT5nZXRPcHRpb24oJ3NvdXJjZScpKTsKCnJldHVybiAwOwp9Cgokc2V0dGluZ0tleSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NldHRpbmcta2V5Jyk7CmlmICghaXNfc3RyaW5nKCRzZXR0aW5nS2V5KSkgewpyZXR1cm4gMDsKfQoKCmlmIChbXSAhPT0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IGNhbiBub3QgY29tYmluZSBhIHNldHRpbmcgdmFsdWUgd2l0aCAtLXVuc2V0Jyk7Cn0KCgppZiAoW10gPT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NldHRpbmctdmFsdWUnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHByb3BlcnRpZXMgPSBzZWxmOjpDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTOwokcHJvcGVydGllc0RlZmF1bHRzID0gWwondHlwZScgPT4gJ2xpYnJhcnknLAonZGVzY3JpcHRpb24nID0+ICcnLAonaG9tZXBhZ2UnID0+ICcnLAonbWluaW11bS1zdGFiaWxpdHknID0+ICdzdGFibGUnLAoncHJlZmVyLXN0YWJsZScgPT4gZmFsc2UsCidrZXl3b3JkcycgPT4gW10sCidsaWNlbnNlJyA9PiBbXSwKJ3N1Z2dlc3QnID0+IFtdLAonZXh0cmEnID0+IFtdLApdOwokcmF3RGF0YSA9ICR0aGlzLT5jb25maWdGaWxlLT5yZWFkKCk7CiRkYXRhID0gJHRoaXMtPmNvbmZpZy0+YWxsKCk7CiRzb3VyY2UgPSAkdGhpcy0+Y29uZmlnLT5nZXRTb3VyY2VPZlZhbHVlKCRzZXR0aW5nS2V5KTsKCmlmIChQcmVnOjppc01hdGNoKCcvXnJlcG9zPyg/Oml0b3JpZXMpPyg/OlwuKC4rKSk/LycsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCFpc3NldCgkbWF0Y2hlc1sxXSkgfHwgJG1hdGNoZXNbMV0gPT09ICcnKSB7CiR2YWx1ZSA9ICRkYXRhWydyZXBvc2l0b3JpZXMnXSA/PyBbXTsKfSBlbHNlIHsKaWYgKCFpc3NldCgkZGF0YVsncmVwb3NpdG9yaWVzJ11bJG1hdGNoZXNbMV1dKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlcmUgaXMgbm8gJy4kbWF0Y2hlc1sxXS4nIHJlcG9zaXRvcnkgZGVmaW5lZCcpOwp9CgokdmFsdWUgPSAkZGF0YVsncmVwb3NpdG9yaWVzJ11bJG1hdGNoZXNbMV1dOwp9Cn0gZWxzZWlmIChzdHJwb3MoJHNldHRpbmdLZXksICcuJykpIHsKJGJpdHMgPSBleHBsb2RlKCcuJywgJHNldHRpbmdLZXkpOwppZiAoJGJpdHNbMF0gPT09ICdleHRyYScgfHwgJGJpdHNbMF0gPT09ICdzdWdnZXN0JykgewokZGF0YSA9ICRyYXdEYXRhOwp9IGVsc2UgewokZGF0YSA9ICRkYXRhWydjb25maWcnXTsKfQokbWF0Y2ggPSBmYWxzZTsKZm9yZWFjaCAoJGJpdHMgYXMgJGJpdCkgewoka2V5ID0gaXNzZXQoJGtleSkgPyAka2V5LicuJy4kYml0IDogJGJpdDsKJG1hdGNoID0gZmFsc2U7CmlmIChpc3NldCgkZGF0YVska2V5XSkpIHsKJG1hdGNoID0gdHJ1ZTsKJGRhdGEgPSAkZGF0YVska2V5XTsKdW5zZXQoJGtleSk7Cn0KfQoKaWYgKCEkbWF0Y2gpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRzZXR0aW5nS2V5LicgaXMgbm90IGRlZmluZWQuJyk7Cn0KCiR2YWx1ZSA9ICRkYXRhOwp9IGVsc2VpZiAoaXNzZXQoJGRhdGFbJ2NvbmZpZyddWyRzZXR0aW5nS2V5XSkpIHsKJHZhbHVlID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCRzZXR0aW5nS2V5LCAkaW5wdXQtPmdldE9wdGlvbignYWJzb2x1dGUnKSA/IDAgOiBDb25maWc6OlJFTEFUSVZFX1BBVEhTKTsKCmlmICgkdmFsdWUgPT09IFtdKSB7CiRzY2hlbWEgPSBKc29uRmlsZTo6cGFyc2VKc29uKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKEpzb25GaWxlOjpDT01QT1NFUl9TQ0hFTUFfUEFUSCkpOwppZiAoCmlzc2V0KCRzY2hlbWFbJ3Byb3BlcnRpZXMnXVsnY29uZmlnJ11bJ3Byb3BlcnRpZXMnXVskc2V0dGluZ0tleV1bJ3R5cGUnXSkKJiYgaW5fYXJyYXkoJ29iamVjdCcsIChhcnJheSkgJHNjaGVtYVsncHJvcGVydGllcyddWydjb25maWcnXVsncHJvcGVydGllcyddWyRzZXR0aW5nS2V5XVsndHlwZSddLCB0cnVlKQopIHsKJHZhbHVlID0gbmV3IFxzdGRDbGFzczsKfQp9Cn0gZWxzZWlmIChpc3NldCgkcmF3RGF0YVskc2V0dGluZ0tleV0pICYmIGluX2FycmF5KCRzZXR0aW5nS2V5LCAkcHJvcGVydGllcywgdHJ1ZSkpIHsKJHZhbHVlID0gJHJhd0RhdGFbJHNldHRpbmdLZXldOwokc291cmNlID0gJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKTsKfSBlbHNlaWYgKGlzc2V0KCRwcm9wZXJ0aWVzRGVmYXVsdHNbJHNldHRpbmdLZXldKSkgewokdmFsdWUgPSAkcHJvcGVydGllc0RlZmF1bHRzWyRzZXR0aW5nS2V5XTsKJHNvdXJjZSA9ICdkZWZhdWx0cyc7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkc2V0dGluZ0tleS4nIGlzIG5vdCBkZWZpbmVkJyk7Cn0KCmlmIChpc19hcnJheSgkdmFsdWUpIHx8IGlzX29iamVjdCgkdmFsdWUpIHx8IGlzX2Jvb2woJHZhbHVlKSkgewokdmFsdWUgPSBKc29uRmlsZTo6ZW5jb2RlKCR2YWx1ZSwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwp9Cgokc291cmNlT2ZDb25maWdWYWx1ZSA9ICcnOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3NvdXJjZScpKSB7CiRzb3VyY2VPZkNvbmZpZ1ZhbHVlID0gJyAoJyAuICRzb3VyY2UgLiAnKSc7Cn0KCiR0aGlzLT5nZXRJTygpLT53cml0ZSgkdmFsdWUgLiAkc291cmNlT2ZDb25maWdWYWx1ZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnJldHVybiAwOwp9CgokdmFsdWVzID0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScpOyAKCiRib29sZWFuVmFsaWRhdG9yID0gc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpOwp9OwokYm9vbGVhbk5vcm1hbGl6ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn07CgoKJHVuaXF1ZUNvbmZpZ1ZhbHVlcyA9IFsKJ3Byb2Nlc3MtdGltZW91dCcgPT4gWydpc19udW1lcmljJywgJ2ludHZhbCddLAondXNlLWluY2x1ZGUtcGF0aCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAondXNlLWdpdGh1Yi1hcGknID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3ByZWZlcnJlZC1pbnN0YWxsJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydhdXRvJywgJ3NvdXJjZScsICdkaXN0J10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidnaXRsYWItcHJvdG9jb2wnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ2dpdCcsICdodHRwJywgJ2h0dHBzJ10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidzdG9yZS1hdXRocycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsndHJ1ZScsICdmYWxzZScsICdwcm9tcHQnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3Byb21wdCcgPT09ICR2YWwpIHsKcmV0dXJuICdwcm9tcHQnOwp9CgpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfSwKXSwKJ25vdGlmeS1vbi1pbnN0YWxsJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCid2ZW5kb3ItZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidiaW4tZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidhcmNoaXZlLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonYXJjaGl2ZS1mb3JtYXQnID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2RhdGEtZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidjYWNoZS1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLWZpbGVzLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonY2FjaGUtcmVwby1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLXZjcy1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLXR0bCcgPT4gWydpc19udW1lcmljJywgJ2ludHZhbCddLAonY2FjaGUtZmlsZXMtdHRsJyA9PiBbJ2lzX251bWVyaWMnLCAnaW50dmFsJ10sCidjYWNoZS1maWxlcy1tYXhzaXplJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgnL15ccyooWzAtOS5dKylccyooPzooW2ttZ10pKD86aT9iKT8pP1xzKiQvaScsICR2YWwpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidiaW4tY29tcGF0JyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydhdXRvJywgJ2Z1bGwnLCAncHJveHknLCAnc3ltbGluayddKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLAonZGlzY2FyZC1jaGFuZ2VzJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydzdGFzaCcsICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CmlmICgnc3Rhc2gnID09PSAkdmFsKSB7CnJldHVybiAnc3Rhc2gnOwp9CgpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfSwKXSwKJ2F1dG9sb2FkZXItc3VmZml4JyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbCA9PT0gJ251bGwnID8gbnVsbCA6ICR2YWw7Cn1dLAonc29ydC1wYWNrYWdlcycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonb3B0aW1pemUtYXV0b2xvYWRlcicgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonYXBjdS1hdXRvbG9hZGVyJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidwcmVwZW5kLWF1dG9sb2FkZXInID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ2Rpc2FibGUtdGxzJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidzZWN1cmUtaHR0cCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonY2FmaWxlJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gZmlsZV9leGlzdHMoJHZhbCkgJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdmFsKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsID09PSAnbnVsbCcgPyBudWxsIDogJHZhbDsKfSwKXSwKJ2NhcGF0aCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGlzX2RpcigkdmFsKSAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR2YWwpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWwgPT09ICdudWxsJyA/IG51bGwgOiAkdmFsOwp9LApdLAonZ2l0aHViLWV4cG9zZS1ob3N0bmFtZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonaHRhY2Nlc3MtcHJvdGVjdCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonbG9jaycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonYWxsb3ctcGx1Z2lucycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAoncGxhdGZvcm0tY2hlY2snID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3BocC1vbmx5JywgJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKCdwaHAtb25seScgPT09ICR2YWwpIHsKcmV0dXJuICdwaHAtb25seSc7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwp9LApdLAondXNlLXBhcmVudC1kaXInID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3RydWUnLCAnZmFsc2UnLCAncHJvbXB0J10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKCdwcm9tcHQnID09PSAkdmFsKSB7CnJldHVybiAncHJvbXB0JzsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCidhdWRpdC5hYmFuZG9uZWQnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbQXVkaXRvcjo6QUJBTkRPTkVEX0lHTk9SRSwgQXVkaXRvcjo6QUJBTkRPTkVEX1JFUE9SVCwgQXVkaXRvcjo6QUJBTkRPTkVEX0ZBSUxdLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLApdOwokbXVsdGlDb25maWdWYWx1ZXMgPSBbCidnaXRodWItcHJvdG9jb2xzJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCmZvcmVhY2ggKCR2YWxzIGFzICR2YWwpIHsKaWYgKCFpbl9hcnJheSgkdmFsLCBbJ2dpdCcsICdodHRwcycsICdzc2gnXSkpIHsKcmV0dXJuICd2YWxpZCBwcm90b2NvbHMgaW5jbHVkZTogZ2l0LCBodHRwcywgc3NoJzsKfQp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCidnaXRodWItZG9tYWlucycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCidnaXRsYWItZG9tYWlucycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCidhdWRpdC5pZ25vcmUnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLApdOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSAmJiAkc2V0dGluZ0tleSA9PT0gJ2F1ZGl0JykgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykgJiYgKGlzc2V0KCR1bmlxdWVDb25maWdWYWx1ZXNbJHNldHRpbmdLZXldKSB8fCBpc3NldCgkbXVsdGlDb25maWdWYWx1ZXNbJHNldHRpbmdLZXldKSkpIHsKaWYgKCRzZXR0aW5nS2V5ID09PSAnZGlzYWJsZS10bHMnICYmICR0aGlzLT5jb25maWctPmdldCgnZGlzYWJsZS10bHMnKSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+WW91IGFyZSBub3cgcnVubmluZyBDb21wb3NlciB3aXRoIFNTTC9UTFMgcHJvdGVjdGlvbiBlbmFibGVkLjwvaW5mbz4nKTsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJHVuaXF1ZUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0pKSB7CiR0aGlzLT5oYW5kbGVTaW5nbGVWYWx1ZSgkc2V0dGluZ0tleSwgJHVuaXF1ZUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0sICR2YWx1ZXMsICdhZGRDb25maWdTZXR0aW5nJyk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJG11bHRpQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSkpIHsKJHRoaXMtPmhhbmRsZU11bHRpVmFsdWUoJHNldHRpbmdLZXksICRtdWx0aUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0sICR2YWx1ZXMsICdhZGRDb25maWdTZXR0aW5nJyk7CgpyZXR1cm4gMDsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJy9ecHJlZmVycmVkLWluc3RhbGxcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKWyR2YWxpZGF0b3JdID0gJHVuaXF1ZUNvbmZpZ1ZhbHVlc1sncHJlZmVycmVkLWluc3RhbGwnXTsKaWYgKCEkdmFsaWRhdG9yKCR2YWx1ZXNbMF0pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCB2YWx1ZSBmb3IgJy4kc2V0dGluZ0tleS4nLiBTaG91bGQgYmUgb25lIG9mOiBhdXRvLCBzb3VyY2UsIG9yIGRpc3QnKTsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSwgJHZhbHVlc1swXSk7CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoKCd7XmFsbG93LXBsdWdpbnNcLihbYS16QS1aMC05LyotXSspfScsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCmlmICh0cnVlICE9PSAkYm9vbGVhblZhbGlkYXRvcigkdmFsdWVzWzBdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigKJyIlcyIgaXMgYW4gaW52YWxpZCB2YWx1ZScsCiR2YWx1ZXNbMF0KKSk7Cn0KCiRub3JtYWxpemVkVmFsdWUgPSAkYm9vbGVhbk5vcm1hbGl6ZXIoJHZhbHVlc1swXSk7CgokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5LCAkbm9ybWFsaXplZFZhbHVlKTsKCnJldHVybiAwOwp9CgoKJHVuaXF1ZVByb3BzID0gWwonbmFtZScgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAondHlwZScgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonZGVzY3JpcHRpb24nID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2hvbWVwYWdlJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCid2ZXJzaW9uJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidtaW5pbXVtLXN0YWJpbGl0eScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGlzc2V0KEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXNbVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCR2YWwpXSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IHN0cmluZyB7CnJldHVybiBWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJHZhbCk7Cn0sCl0sCidwcmVmZXItc3RhYmxlJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCl07CiRtdWx0aVByb3BzID0gWwona2V5d29yZHMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLAonbGljZW5zZScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCl07CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpICYmIChpc3NldCgkdW5pcXVlUHJvcHNbJHNldHRpbmdLZXldKSB8fCBpc3NldCgkbXVsdGlQcm9wc1skc2V0dGluZ0tleV0pIHx8IHN0cnBvcygkc2V0dGluZ0tleSwgJ2V4dHJhLicpID09PSAwKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlICcgLiAkc2V0dGluZ0tleSAuICcgcHJvcGVydHkgY2FuIG5vdCBiZSBzZXQgaW4gdGhlIGdsb2JhbCBjb25maWcuanNvbiBmaWxlLiBVc2UgYGNvbXBvc2VyIGdsb2JhbCBjb25maWdgIHRvIGFwcGx5IGNoYW5nZXMgdG8gdGhlIGdsb2JhbCBjb21wb3Nlci5qc29uJyk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpICYmIChpc3NldCgkdW5pcXVlUHJvcHNbJHNldHRpbmdLZXldKSB8fCBpc3NldCgkbXVsdGlQcm9wc1skc2V0dGluZ0tleV0pKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSkpIHsKJHRoaXMtPmhhbmRsZVNpbmdsZVZhbHVlKCRzZXR0aW5nS2V5LCAkdW5pcXVlUHJvcHNbJHNldHRpbmdLZXldLCAkdmFsdWVzLCAnYWRkUHJvcGVydHknKTsKCnJldHVybiAwOwp9CmlmIChpc3NldCgkbXVsdGlQcm9wc1skc2V0dGluZ0tleV0pKSB7CiR0aGlzLT5oYW5kbGVNdWx0aVZhbHVlKCRzZXR0aW5nS2V5LCAkbXVsdGlQcm9wc1skc2V0dGluZ0tleV0sICR2YWx1ZXMsICdhZGRQcm9wZXJ0eScpOwoKcmV0dXJuIDA7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15yZXBvcz8oPzppdG9yaWVzKT9cLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUmVwb3NpdG9yeSgkbWF0Y2hlc1sxXSk7CgpyZXR1cm4gMDsKfQoKaWYgKDIgPT09IGNvdW50KCR2YWx1ZXMpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJG1hdGNoZXNbMV0sIFsKJ3R5cGUnID0+ICR2YWx1ZXNbMF0sCid1cmwnID0+ICR2YWx1ZXNbMV0sCl0sICRpbnB1dC0+Z2V0T3B0aW9uKCdhcHBlbmQnKSk7CgpyZXR1cm4gMDsKfQoKaWYgKDEgPT09IGNvdW50KCR2YWx1ZXMpKSB7CiR2YWx1ZSA9IHN0cnRvbG93ZXIoJHZhbHVlc1swXSk7CmlmICh0cnVlID09PSAkYm9vbGVhblZhbGlkYXRvcigkdmFsdWUpKSB7CmlmIChmYWxzZSA9PT0gJGJvb2xlYW5Ob3JtYWxpemVyKCR2YWx1ZSkpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbWF0Y2hlc1sxXSwgZmFsc2UsICRpbnB1dC0+Z2V0T3B0aW9uKCdhcHBlbmQnKSk7CgpyZXR1cm4gMDsKfQp9IGVsc2UgewokdmFsdWUgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR2YWx1ZXNbMF0pOwokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRSZXBvc2l0b3J5KCRtYXRjaGVzWzFdLCAkdmFsdWUsICRpbnB1dC0+Z2V0T3B0aW9uKCdhcHBlbmQnKSk7CgpyZXR1cm4gMDsKfQp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBtdXN0IHBhc3MgdGhlIHR5cGUgYW5kIGEgdXJsLiBFeGFtcGxlOiBwaHAgY29tcG9zZXIucGhhciBjb25maWcgcmVwb3NpdG9yaWVzLmZvbyB2Y3MgaHR0cHM6Ly9iYXIuY29tJyk7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaCgnL15leHRyYVwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHZhbHVlID0gJHZhbHVlc1swXTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdqc29uJykpIHsKJHZhbHVlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdmFsdWUpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ21lcmdlJykpIHsKJGN1cnJlbnRWYWx1ZSA9ICR0aGlzLT5jb25maWdGaWxlLT5yZWFkKCk7CiRiaXRzID0gZXhwbG9kZSgnLicsICRzZXR0aW5nS2V5KTsKZm9yZWFjaCAoJGJpdHMgYXMgJGJpdCkgewokY3VycmVudFZhbHVlID0gJGN1cnJlbnRWYWx1ZVskYml0XSA/PyBudWxsOwp9CmlmIChpc19hcnJheSgkY3VycmVudFZhbHVlKSkgewokdmFsdWUgPSBhcnJheV9tZXJnZSgkY3VycmVudFZhbHVlLCAkdmFsdWUpOwp9Cn0KfQokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRQcm9wZXJ0eSgkc2V0dGluZ0tleSwgJHZhbHVlKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ec3VnZ2VzdFwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksIGltcGxvZGUoJyAnLCAkdmFsdWVzKSk7CgpyZXR1cm4gMDsKfQoKCmlmIChpbl9hcnJheSgkc2V0dGluZ0tleSwgWydzdWdnZXN0JywgJ2V4dHJhJ10sIHRydWUpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ecGxhdGZvcm1cLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSwgJHZhbHVlc1swXSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogJHZhbHVlc1swXSk7CgpyZXR1cm4gMDsKfQoKCmlmICgkc2V0dGluZ0tleSA9PT0gJ3BsYXRmb3JtJyAmJiAkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eKGJpdGJ1Y2tldC1vYXV0aHxnaXRodWItb2F1dGh8Z2l0bGFiLW9hdXRofGdpdGxhYi10b2tlbnxodHRwLWJhc2ljfGJlYXJlcilcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwoKcmV0dXJuIDA7Cn0KCmlmICgkbWF0Y2hlc1sxXSA9PT0gJ2JpdGJ1Y2tldC1vYXV0aCcpIHsKaWYgKDIgIT09IGNvdW50KCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cyAoY29uc3VtZXIta2V5LCBjb25zdW1lci1zZWNyZXQpLCBnb3QgJy5jb3VudCgkdmFsdWVzKSk7Cn0KJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsnY29uc3VtZXIta2V5JyA9PiAkdmFsdWVzWzBdLCAnY29uc3VtZXItc2VjcmV0JyA9PiAkdmFsdWVzWzFdXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2dpdGxhYi10b2tlbicgJiYgMiA9PT0gY291bnQoJHZhbHVlcykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsndXNlcm5hbWUnID0+ICR2YWx1ZXNbMF0sICd0b2tlbicgPT4gJHZhbHVlc1sxXV0pOwp9IGVsc2VpZiAoaW5fYXJyYXkoJG1hdGNoZXNbMV0sIFsnZ2l0aHViLW9hdXRoJywgJ2dpdGxhYi1vYXV0aCcsICdnaXRsYWItdG9rZW4nLCAnYmVhcmVyJ10sIHRydWUpKSB7CmlmICgxICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RvbyBtYW55IGFyZ3VtZW50cywgZXhwZWN0ZWQgb25seSBvbmUgdG9rZW4nKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgJHZhbHVlc1swXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2h0dHAtYmFzaWMnKSB7CmlmICgyICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0V4cGVjdGVkIHR3byBhcmd1bWVudHMgKHVzZXJuYW1lLCBwYXNzd29yZCksIGdvdCAnLmNvdW50KCR2YWx1ZXMpKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgWyd1c2VybmFtZScgPT4gJHZhbHVlc1swXSwgJ3Bhc3N3b3JkJyA9PiAkdmFsdWVzWzFdXSk7Cn0KCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ec2NyaXB0c1wuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksIGNvdW50KCR2YWx1ZXMpID4gMSA/ICR2YWx1ZXMgOiAkdmFsdWVzWzBdKTsKCnJldHVybiAwOwp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU2V0dGluZyAnLiRzZXR0aW5nS2V5LicgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbW1hbmQnKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYW5kbGVTaW5nbGVWYWx1ZShzdHJpbmcgJGtleSwgYXJyYXkgJGNhbGxiYWNrcywgYXJyYXkgJHZhbHVlcywgc3RyaW5nICRtZXRob2QpOiB2b2lkCnsKWyR2YWxpZGF0b3IsICRub3JtYWxpemVyXSA9ICRjYWxsYmFja3M7CmlmICgxICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBjYW4gb25seSBwYXNzIG9uZSB2YWx1ZS4gRXhhbXBsZTogcGhwIGNvbXBvc2VyLnBoYXIgY29uZmlnIHByb2Nlc3MtdGltZW91dCAzMDAnKTsKfQoKaWYgKHRydWUgIT09ICR2YWxpZGF0aW9uID0gJHZhbGlkYXRvcigkdmFsdWVzWzBdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigKJyIlcyIgaXMgYW4gaW52YWxpZCB2YWx1ZScuKCR2YWxpZGF0aW9uID8gJyAoJy4kdmFsaWRhdGlvbi4nKScgOiAnJyksCiR2YWx1ZXNbMF0KKSk7Cn0KCiRub3JtYWxpemVkVmFsdWUgPSAkbm9ybWFsaXplcigkdmFsdWVzWzBdKTsKCmlmICgka2V5ID09PSAnZGlzYWJsZS10bHMnKSB7CmlmICghJG5vcm1hbGl6ZWRWYWx1ZSAmJiAkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPllvdSBhcmUgbm93IHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZW5hYmxlZC48L2luZm8+Jyk7Cn0gZWxzZWlmICgkbm9ybWFsaXplZFZhbHVlICYmICEkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgbm93IHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZGlzYWJsZWQuPC93YXJuaW5nPicpOwp9Cn0KCmNhbGxfdXNlcl9mdW5jKFskdGhpcy0+Y29uZmlnU291cmNlLCAkbWV0aG9kXSwgJGtleSwgJG5vcm1hbGl6ZWRWYWx1ZSk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFuZGxlTXVsdGlWYWx1ZShzdHJpbmcgJGtleSwgYXJyYXkgJGNhbGxiYWNrcywgYXJyYXkgJHZhbHVlcywgc3RyaW5nICRtZXRob2QpOiB2b2lkCnsKWyR2YWxpZGF0b3IsICRub3JtYWxpemVyXSA9ICRjYWxsYmFja3M7CmlmICh0cnVlICE9PSAkdmFsaWRhdGlvbiA9ICR2YWxpZGF0b3IoJHZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCiclcyBpcyBhbiBpbnZhbGlkIHZhbHVlJy4oJHZhbGlkYXRpb24gPyAnICgnLiR2YWxpZGF0aW9uLicpJyA6ICcnKSwKanNvbl9lbmNvZGUoJHZhbHVlcykKKSk7Cn0KCmNhbGxfdXNlcl9mdW5jKFskdGhpcy0+Y29uZmlnU291cmNlLCAkbWV0aG9kXSwgJGtleSwgJG5vcm1hbGl6ZXIoJHZhbHVlcykpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGlzdENvbmZpZ3VyYXRpb24oYXJyYXkgJGNvbnRlbnRzLCBhcnJheSAkcmF3Q29udGVudHMsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCA/c3RyaW5nICRrID0gbnVsbCwgYm9vbCAkc2hvd1NvdXJjZSA9IGZhbHNlKTogdm9pZAp7CiRvcmlnSyA9ICRrOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKZm9yZWFjaCAoJGNvbnRlbnRzIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICgkayA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJGtleSwgWydjb25maWcnLCAncmVwb3NpdG9yaWVzJ10pKSB7CmNvbnRpbnVlOwp9CgokcmF3VmFsID0gJHJhd0NvbnRlbnRzWyRrZXldID8/IG51bGw7CgppZiAoaXNfYXJyYXkoJHZhbHVlKSAmJiAoIWlzX251bWVyaWMoa2V5KCR2YWx1ZSkpIHx8ICgka2V5ID09PSAncmVwb3NpdG9yaWVzJyAmJiBudWxsID09PSAkaykpKSB7CiRrIC49IFByZWc6OnJlcGxhY2UoJ3teY29uZmlnXC59JywgJycsICRrZXkgLiAnLicpOwokdGhpcy0+bGlzdENvbmZpZ3VyYXRpb24oJHZhbHVlLCAkcmF3VmFsLCAkb3V0cHV0LCAkaywgJHNob3dTb3VyY2UpOwokayA9ICRvcmlnSzsKCmNvbnRpbnVlOwp9CgppZiAoaXNfYXJyYXkoJHZhbHVlKSkgewokdmFsdWUgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiBpc19hcnJheSgkdmFsKSA/IGpzb25fZW5jb2RlKCR2YWwpIDogJHZhbDsKfSwgJHZhbHVlKTsKCiR2YWx1ZSA9ICdbJy5pbXBsb2RlKCcsICcsICR2YWx1ZSkuJ10nOwp9CgppZiAoaXNfYm9vbCgkdmFsdWUpKSB7CiR2YWx1ZSA9IHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKTsKfQoKJHNvdXJjZSA9ICcnOwppZiAoJHNob3dTb3VyY2UpIHsKJHNvdXJjZSA9ICcgKCcgLiAkdGhpcy0+Y29uZmlnLT5nZXRTb3VyY2VPZlZhbHVlKCRrIC4gJGtleSkgLiAnKSc7Cn0KCmlmIChudWxsICE9PSAkayAmJiAwID09PSBzdHJwb3MoJGssICdyZXBvc2l0b3JpZXMnKSkgewokbGluayA9ICdodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDUtcmVwb3NpdG9yaWVzLm1kJzsKfSBlbHNlIHsKJGlkID0gUHJlZzo6cmVwbGFjZSgne1wuLiokfScsICcnLCAkayA9PT0gJycgfHwgJGsgPT09IG51bGwgPyAoc3RyaW5nKSAka2V5IDogJGspOwokaWQgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTldfWknLCAnLScsIHN0cnRvbG93ZXIodHJpbSgkaWQpKSk7CiRpZCA9IFByZWc6OnJlcGxhY2UoJ3stK30nLCAnLScsICRpZCk7CiRsaW5rID0gJ2h0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNi1jb25maWcubWQjJyAuICRpZDsKfQppZiAoaXNfc3RyaW5nKCRyYXdWYWwpICYmICRyYXdWYWwgIT09ICR2YWx1ZSkgewokaW8tPndyaXRlKCdbPGZnPXllbGxvdztocmVmPScgLiAkbGluayAuJz4nIC4gJGsgLiAka2V5IC4gJzwvPl0gPGluZm8+JyAuICRyYXdWYWwgLiAnICgnIC4gJHZhbHVlIC4gJyk8L2luZm8+JyAuICRzb3VyY2UsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJ1s8Zmc9eWVsbG93O2hyZWY9JyAuICRsaW5rIC4nPicgLiAkayAuICRrZXkgLiAnPC8+XSA8aW5mbz4nIC4gJHZhbHVlIC4gJzwvaW5mbz4nIC4gJHNvdXJjZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcG9zZXJDb25maWdGaWxlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpCj8gKCRjb25maWctPmdldCgnaG9tZScpIC4gJy9jb25maWcuanNvbicpCjogKCRpbnB1dC0+Z2V0T3B0aW9uKCdmaWxlJykgPzogRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpCjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QXV0aENvbmZpZ0ZpbGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBDb25maWcgJGNvbmZpZyk6IHN0cmluZwp7CnJldHVybiAkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykKPyAoJGNvbmZpZy0+Z2V0KCdob21lJykgLiAnL2F1dGguanNvbicpCjogZGlybmFtZSgkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJGNvbmZpZykpIC4gJy9hdXRoLmpzb24nCjsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0U2V0dGluZ0tleXMoKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdlZGl0b3InKSB8fCAkaW5wdXQtPmdldE9wdGlvbignYXV0aCcpKSB7CnJldHVybiBbXTsKfQoKCiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKCgokY29uZmlnRmlsZSA9IG5ldyBKc29uRmlsZSgkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJGNvbmZpZykpOwppZiAoJGNvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CiRjb25maWctPm1lcmdlKCRjb25maWdGaWxlLT5yZWFkKCksICRjb25maWdGaWxlLT5nZXRQYXRoKCkpOwp9CgoKJGF1dGhDb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCR0aGlzLT5nZXRBdXRoQ29uZmlnRmlsZSgkaW5wdXQsICRjb25maWcpKTsKaWYgKCRhdXRoQ29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICRhdXRoQ29uZmlnRmlsZS0+cmVhZCgpXSwgJGF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkpOwp9CgoKJHJhd0NvbmZpZyA9ICRjb25maWctPnJhdygpOwoka2V5cyA9IGFycmF5X21lcmdlKAokdGhpcy0+ZmxhdHRlblNldHRpbmdLZXlzKCRyYXdDb25maWdbJ2NvbmZpZyddKSwKJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkcmF3Q29uZmlnWydyZXBvc2l0b3JpZXMnXSwgJ3JlcG9zaXRvcmllcy4nKQopOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewoKJHNvdXJjZXMgPSBbJGNvbmZpZ0ZpbGUtPmdldFBhdGgoKSwgJGF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCldOwoka2V5cyA9IGFycmF5X2ZpbHRlcigKJGtleXMsCnN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRrZXkpIHVzZSAoJGNvbmZpZywgJHNvdXJjZXMpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCRjb25maWctPmdldFNvdXJjZU9mVmFsdWUoJGtleSksICRzb3VyY2VzLCB0cnVlKTsKfQopOwoKCn0gZWxzZSB7Cgoka2V5cyA9IGFycmF5X21lcmdlKCRrZXlzLCBzZWxmOjpDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTKTsKCgoKCgp9CgoKaWYgKCRjb25maWdGaWxlLT5leGlzdHMoKSkgewokcHJvcGVydGllcyA9IGFycmF5X2ZpbHRlcigKJGNvbmZpZ0ZpbGUtPnJlYWQoKSwKc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGtleSk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJGtleSwgc2VsZjo6Q09ORklHVVJBQkxFX1BBQ0tBR0VfUFJPUEVSVElFUywgdHJ1ZSk7Cn0sCkFSUkFZX0ZJTFRFUl9VU0VfS0VZCik7Cgoka2V5cyA9IGFycmF5X21lcmdlKAoka2V5cywKJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkcHJvcGVydGllcykKKTsKfQoKCiRjb21wbGV0aW9uVmFsdWUgPSAkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpOwoKaWYgKCRjb21wbGV0aW9uVmFsdWUgIT09ICcnKSB7CiRrZXlzID0gYXJyYXlfZmlsdGVyKAoka2V5cywKc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGtleSkgdXNlICgkY29tcGxldGlvblZhbHVlKTogYm9vbCB7CnJldHVybiBzdHJfc3RhcnRzX3dpdGgoJGtleSwgJGNvbXBsZXRpb25WYWx1ZSk7Cn0KKTsKfQoKc29ydCgka2V5cyk7CgpyZXR1cm4gYXJyYXlfdW5pcXVlKCRrZXlzKTsKfTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmbGF0dGVuU2V0dGluZ0tleXMoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRwcmVmaXggPSAnJyk6IGFycmF5CnsKJGtleXMgPSBbXTsKZm9yZWFjaCAoJGNvbmZpZyBhcyAka2V5ID0+ICR2YWx1ZSkgewoka2V5c1tdID0gWyRwcmVmaXggLiAka2V5XTsKCgppZiAoaXNfYXJyYXkoJHZhbHVlKSAmJiAhYXJyYXlfaXNfbGlzdCgkdmFsdWUpICYmICRwcmVmaXggIT09ICdyZXBvc2l0b3JpZXMuJykgewoka2V5c1tdID0gJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkdmFsdWUsICRwcmVmaXggLiAka2V5IC4gJy4nKTsKfQp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoLi4uJGtleXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcUHJvamVjdEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkJsb2NrZWRFeGNlcHRpb247CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU2VsZFxTaWduYWxcU2lnbmFsSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKCgoKCgoKCgoKY2xhc3MgQ3JlYXRlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2NyZWF0ZS1wcm9qZWN0JykKLT5zZXREZXNjcmlwdGlvbignQ3JlYXRlcyBuZXcgcHJvamVjdCBmcm9tIGEgcGFja2FnZSBpbnRvIGdpdmVuIGRpcmVjdG9yeScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIG5hbWUgdG8gYmUgaW5zdGFsbGVkJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnZGlyZWN0b3J5JywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdEaXJlY3Rvcnkgd2hlcmUgdGhlIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkJyksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdWZXJzaW9uLCB3aWxsIGRlZmF1bHQgdG8gbGF0ZXN0JyksCm5ldyBJbnB1dE9wdGlvbignc3RhYmlsaXR5JywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdNaW5pbXVtLXN0YWJpbGl0eSBhbGxvd2VkICh1bmxlc3MgYSB2ZXJzaW9uIGlzIHNwZWNpZmllZCkuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCdyZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnQWRkIGN1c3RvbSByZXBvc2l0b3JpZXMgdG8gbG9vayB0aGUgcGFja2FnZSB1cCwgZWl0aGVyIGJ5IFVSTCBvciB1c2luZyBKU09OIGFycmF5cycpLApuZXcgSW5wdXRPcHRpb24oJ3JlcG9zaXRvcnktdXJsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnREVQUkVDQVRFRDogVXNlIC0tcmVwb3NpdG9yeSBpbnN0ZWFkLicpLApuZXcgSW5wdXRPcHRpb24oJ2FkZC1yZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBZGQgdGhlIGN1c3RvbSByZXBvc2l0b3J5IGluIHRoZSBjb21wb3Nlci5qc29uLiBJZiBhIGxvY2sgZmlsZSBpcyBwcmVzZW50IGl0IHdpbGwgYmUgZGVsZXRlZCBhbmQgYW4gdXBkYXRlIHdpbGwgYmUgcnVuIGluc3RlYWQgb2YgaW5zdGFsbC4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0VuYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIChlbmFibGVkIGJ5IGRlZmF1bHQsIG9ubHkgcHJlc2VudCBmb3IgQkMpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWN1c3RvbS1pbnN0YWxsZXJzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBVc2Ugbm8tcGx1Z2lucyBpbnN0ZWFkLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNjcmlwdHMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gcHJldmVudCBleGVjdXRpb24gb2YgYWxsIGRlZmluZWQgc2NyaXB0cyBpbiB0aGUgcm9vdCBwYWNrYWdlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNlY3VyZS1odHRwJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlIHRoZSBzZWN1cmUtaHR0cCBjb25maWcgb3B0aW9uIHRlbXBvcmFyaWx5IHdoaWxlIGluc3RhbGxpbmcgdGhlIHJvb3QgcGFja2FnZS4gVXNlIGF0IHlvdXIgb3duIHJpc2suIFVzaW5nIHRoaXMgZmxhZyBpcyBhIGJhZCBpZGVhLicpLApuZXcgSW5wdXRPcHRpb24oJ2tlZXAtdmNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHByZXZlbnQgZGVsZXRpbmcgdGhlIHZjcyBmb2xkZXIuJyksCm5ldyBJbnB1dE9wdGlvbigncmVtb3ZlLXZjcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBmb3JjZSBkZWxldGlvbiBvZiB0aGUgdmNzIGZvbGRlciB3aXRob3V0IHByb21wdGluZy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHNraXAgaW5zdGFsbGF0aW9uIG9mIHRoZSBwYWNrYWdlIGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBza2lwIGF1ZGl0aW5nIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZSBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignYXNrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIGFzayBmb3IgcHJvamVjdCBkaXJlY3RvcnkuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5jcmVhdGUtcHJvamVjdDwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGEgbmV3IHByb2plY3QgZnJvbSBhIGdpdmVuCnBhY2thZ2UgaW50byBhIG5ldyBkaXJlY3RvcnkuIElmIGV4ZWN1dGVkIHdpdGhvdXQgcGFyYW1zIGFuZCBpbiBhIGRpcmVjdG9yeQp3aXRoIGEgY29tcG9zZXIuanNvbiBmaWxlIGl0IGluc3RhbGxzIHRoZSBwYWNrYWdlcyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4KCllvdSBjYW4gdXNlIHRoaXMgY29tbWFuZCB0byBib290c3RyYXAgbmV3IHByb2plY3RzIG9yIHNldHVwIGEgY2xlYW4KdmVyc2lvbi1jb250cm9sbGVkIGluc3RhbGxhdGlvbiBmb3IgZGV2ZWxvcGVycyBvZiB5b3VyIHByb2plY3QuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBjcmVhdGUtcHJvamVjdCB2ZW5kb3IvcHJvamVjdCB0YXJnZXQtZGlyZWN0b3J5IFt2ZXJzaW9uXTwvaW5mbz4KCllvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB2ZXJzaW9uIHdpdGggdGhlIHBhY2thZ2UgbmFtZSB1c2luZyA9IG9yIDogYXMgc2VwYXJhdG9yLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgY3JlYXRlLXByb2plY3QgdmVuZG9yL3Byb2plY3Q6dmVyc2lvbiB0YXJnZXQtZGlyZWN0b3J5PC9pbmZvPgoKVG8gaW5zdGFsbCB1bnN0YWJsZSBwYWNrYWdlcywgZWl0aGVyIHNwZWNpZnkgdGhlIHZlcnNpb24geW91IHdhbnQsIG9yIHVzZSB0aGUKLS1zdGFiaWxpdHk9ZGV2ICh3aGVyZSBkZXYgY2FuIGJlIG9uZSBvZiBSQywgYmV0YSwgYWxwaGEgb3IgZGV2KS4KClRvIHNldHVwIGEgZGV2ZWxvcGVyIHdvcmthYmxlIHZlcnNpb24geW91IHNob3VsZCBjcmVhdGUgdGhlIHByb2plY3QgdXNpbmcgdGhlIHNvdXJjZQpjb250cm9sbGVkIGNvZGUgYnkgYXBwZW5kaW5nIHRoZSA8aW5mbz4nLS1wcmVmZXItc291cmNlJzwvaW5mbz4gZmxhZy4KClRvIGluc3RhbGwgYSBwYWNrYWdlIGZyb20gYW5vdGhlciByZXBvc2l0b3J5IHRoYW4gdGhlIGRlZmF1bHQgb25lIHlvdQpjYW4gcGFzcyB0aGUgPGluZm8+Jy0tcmVwb3NpdG9yeT1odHRwczovL215cmVwb3NpdG9yeS5vcmcnPC9pbmZvPiBmbGFnLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjY3JlYXRlLXByb2plY3QKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0LCB0cnVlKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiZGV2Ii4gRGV2IHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCBub3cuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tY3VzdG9tLWluc3RhbGxlcnMnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJuby1jdXN0b20taW5zdGFsbGVycyIuIFVzZSAibm8tcGx1Z2lucyIgaW5zdGVhZC48L3dhcm5pbmc+Jyk7CiRpbnB1dC0+c2V0T3B0aW9uKCduby1wbHVnaW5zJywgdHJ1ZSk7Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiAkaW5wdXQtPmdldE9wdGlvbignYXNrJykpIHsKJHBhY2thZ2UgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyk7CmlmIChudWxsID09PSAkcGFja2FnZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vdCBlbm91Z2ggYXJndW1lbnRzIChtaXNzaW5nOiAicGFja2FnZSIpLicpOwp9CiRwYXJ0cyA9IGV4cGxvZGUoIi8iLCBzdHJ0b2xvd2VyKCRwYWNrYWdlKSwgMik7CiRpbnB1dC0+c2V0QXJndW1lbnQoJ2RpcmVjdG9yeScsICRpby0+YXNrKCdOZXcgcHJvamVjdCBkaXJlY3RvcnkgWzxjb21tZW50PicuYXJyYXlfcG9wKCRwYXJ0cykuJzwvY29tbWVudD5dOiAnKSk7Cn0KCnJldHVybiAkdGhpcy0+aW5zdGFsbFByb2plY3QoCiRpbywKJGNvbmZpZywKJGlucHV0LAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyksCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ2RpcmVjdG9yeScpLAokaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdzdGFiaWxpdHknKSwKJHByZWZlclNvdXJjZSwKJHByZWZlckRpc3QsCiEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JyksClxjb3VudCgkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpKSA+IDAgPyAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpIDogJGlucHV0LT5nZXRPcHRpb24oJ3JlcG9zaXRvcnktdXJsJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1zY3JpcHRzJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpLAokaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpLAokdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpLAohJGlucHV0LT5nZXRPcHRpb24oJ25vLXNlY3VyZS1odHRwJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdhZGQtcmVwb3NpdG9yeScpCik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGxQcm9qZWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgP3N0cmluZyAkcGFja2FnZU5hbWUgPSBudWxsLCA/c3RyaW5nICRkaXJlY3RvcnkgPSBudWxsLCA/c3RyaW5nICRwYWNrYWdlVmVyc2lvbiA9IG51bGwsID9zdHJpbmcgJHN0YWJpbGl0eSA9ICdzdGFibGUnLCBib29sICRwcmVmZXJTb3VyY2UgPSBmYWxzZSwgYm9vbCAkcHJlZmVyRGlzdCA9IGZhbHNlLCBib29sICRpbnN0YWxsRGV2UGFja2FnZXMgPSBmYWxzZSwgJHJlcG9zaXRvcmllcyA9IG51bGwsIGJvb2wgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UsIGJvb2wgJG5vUHJvZ3Jlc3MgPSBmYWxzZSwgYm9vbCAkbm9JbnN0YWxsID0gZmFsc2UsID9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gbnVsbCwgYm9vbCAkc2VjdXJlSHR0cCA9IHRydWUsIGJvb2wgJGFkZFJlcG9zaXRvcnkgPSBmYWxzZSk6IGludAp7CiRvbGRDd2QgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAhaXNfYXJyYXkoJHJlcG9zaXRvcmllcykpIHsKJHJlcG9zaXRvcmllcyA9IChhcnJheSkgJHJlcG9zaXRvcmllczsKfQoKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA/PyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwoKCiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CgokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCRpbyk7CgppZiAoJHBhY2thZ2VOYW1lICE9PSBudWxsKSB7CiRpbnN0YWxsZWRGcm9tVmNzID0gJHRoaXMtPmluc3RhbGxSb290UGFja2FnZSgkaW8sICRjb25maWcsICRwYWNrYWdlTmFtZSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsICRkaXJlY3RvcnksICRwYWNrYWdlVmVyc2lvbiwgJHN0YWJpbGl0eSwgJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3QsICRpbnN0YWxsRGV2UGFja2FnZXMsICRyZXBvc2l0b3JpZXMsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzLCAkbm9Qcm9ncmVzcywgJHNlY3VyZUh0dHApOwp9IGVsc2UgewokaW5zdGFsbGVkRnJvbVZjcyA9IGZhbHNlOwp9CgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAkYWRkUmVwb3NpdG9yeSAmJiBpc19maWxlKCdjb21wb3Nlci5sb2NrJykpIHsKdW5saW5rKCdjb21wb3Nlci5sb2NrJyk7Cn0KCiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZSgkaW8sIG51bGwsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKCgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAkYWRkUmVwb3NpdG9yeSkgewpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRpbmRleCA9PiAkcmVwbykgewokcmVwb0NvbmZpZyA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJHJlcG8sIHRydWUpOwokY29tcG9zZXJKc29uUmVwb3NpdG9yaWVzQ29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0UmVwb3NpdG9yaWVzKCk7CiRuYW1lID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmdlbmVyYXRlUmVwb3NpdG9yeU5hbWUoJGluZGV4LCAkcmVwb0NvbmZpZywgJGNvbXBvc2VySnNvblJlcG9zaXRvcmllc0NvbmZpZyk7CiRjb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUoJ2NvbXBvc2VyLmpzb24nKSk7CgppZiAoCihpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0J10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdCcgPT4gZmFsc2VdKQp8fCAoaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdC5vcmcnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdKQopIHsKJGNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgncGFja2FnaXN0Lm9yZycsIGZhbHNlKTsKfSBlbHNlIHsKJGNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbmFtZSwgJHJlcG9Db25maWcsIGZhbHNlKTsKfQoKJGNvbXBvc2VyID0gRmFjdG9yeTo6Y3JlYXRlKCRpbywgbnVsbCwgJGRpc2FibGVQbHVnaW5zKTsKfQp9CgokcHJvY2VzcyA9ICRjb21wb3Nlci0+Z2V0TG9vcCgpLT5nZXRQcm9jZXNzRXhlY3V0b3IoKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oJHByb2Nlc3MpOwoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9ST09UX1BBQ0tBR0VfSU5TVEFMTCwgJGluc3RhbGxEZXZQYWNrYWdlcyk7CgoKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7ClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0KTsKCgppZiAoJG5vSW5zdGFsbCA9PT0gZmFsc2UpIHsKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkbm9Qcm9ncmVzcyk7CgokaW5zdGFsbGVyID0gSW5zdGFsbGVyOjpjcmVhdGUoJGlvLCAkY29tcG9zZXIpOwokaW5zdGFsbGVyLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSkKLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KQotPnNldERldk1vZGUoJGluc3RhbGxEZXZQYWNrYWdlcykKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKQotPnNldFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIoJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIpCi0+c2V0T3B0aW1pemVBdXRvbG9hZGVyKCRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpKQotPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkY29uZmlnLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSkKLT5zZXRBcGN1QXV0b2xvYWRlcigkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpKQotPnNldEF1ZGl0KCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXVkaXQnKSkKLT5zZXRBdWRpdEZvcm1hdCgkdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0KSk7CgppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKJGluc3RhbGxlci0+c2V0VXBkYXRlKHRydWUpOwp9CgppZiAoJGRpc2FibGVQbHVnaW5zKSB7CiRpbnN0YWxsZXItPmRpc2FibGVQbHVnaW5zKCk7Cn0KCnRyeSB7CiRzdGF0dXMgPSAkaW5zdGFsbGVyLT5ydW4oKTsKaWYgKDAgIT09ICRzdGF0dXMpIHsKcmV0dXJuICRzdGF0dXM7Cn0KfSBjYXRjaCAoUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbiAkZSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5IaW50OiBUbyBhbGxvdyBydW5uaW5nIHRoZSBjb25maWcgY29tbWFuZCByZWNvbW1lbmRlZCBiZWxvdyBiZWZvcmUgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQsIHJ1biBjcmVhdGUtcHJvamVjdCB3aXRoIC0tbm8taW5zdGFsbC48L2Vycm9yPicpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Zb3UgY2FuIHRoZW4gY2QgaW50byAnLmdldGN3ZCgpLicsIGNvbmZpZ3VyZSBhbGxvdy1wbHVnaW5zLCBhbmQgZmluYWxseSBydW4gYSBjb21wb3NlciBpbnN0YWxsIHRvIGNvbXBsZXRlIHRoZSBwcm9jZXNzLjwvZXJyb3I+Jyk7CnRocm93ICRlOwp9Cn0KCiRoYXNWY3MgPSAkaW5zdGFsbGVkRnJvbVZjczsKaWYgKAohJGlucHV0LT5nZXRPcHRpb24oJ2tlZXAtdmNzJykKJiYgJGluc3RhbGxlZEZyb21WY3MKJiYgKAokaW5wdXQtPmdldE9wdGlvbigncmVtb3ZlLXZjcycpCnx8ICEkaW8tPmlzSW50ZXJhY3RpdmUoKQp8fCAkaW8tPmFza0NvbmZpcm1hdGlvbignPGluZm8+RG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBleGlzdGluZyBWQ1MgKC5naXQsIC5zdm4uLikgaGlzdG9yeT88L2luZm8+IFs8Y29tbWVudD5ZLG48L2NvbW1lbnQ+XT8gJykKKQopIHsKJGZpbmRlciA9IG5ldyBGaW5kZXIoKTsKJGZpbmRlci0+ZGVwdGgoMCktPmRpcmVjdG9yaWVzKCktPmluKFBsYXRmb3JtOjpnZXRDd2QoKSktPmlnbm9yZVZDUyhmYWxzZSktPmlnbm9yZURvdEZpbGVzKGZhbHNlKTsKZm9yZWFjaCAoWycuc3ZuJywgJ19zdm4nLCAnQ1ZTJywgJ19kYXJjcycsICcuYXJjaC1wYXJhbXMnLCAnLm1vbm90b25lJywgJy5ienInLCAnLmdpdCcsICcuaGcnLCAnLmZzbGNrb3V0JywgJ19GT1NTSUxfJ10gYXMgJHZjc05hbWUpIHsKJGZpbmRlci0+bmFtZSgkdmNzTmFtZSk7Cn0KCnRyeSB7CiRkaXJzID0gaXRlcmF0b3JfdG9fYXJyYXkoJGZpbmRlcik7CnVuc2V0KCRmaW5kZXIpOwpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmICghJGZzLT5yZW1vdmVEaXJlY3RvcnkoKHN0cmluZykgJGRpcikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVtb3ZlICcuJGRpcik7Cn0KfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIHRoZSBWQ1MgbWV0YWRhdGE6ICcuJGUtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nKTsKfQoKJGhhc1ZjcyA9IGZhbHNlOwp9CgoKaWYgKCEkaGFzVmNzKSB7CiRwYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRjb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUoJ2NvbXBvc2VyLmpzb24nKSk7CmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRtZXRhKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT57J2dldCcuJG1ldGFbJ21ldGhvZCddfSgpIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJykgewokY29uZmlnU291cmNlLT5hZGRMaW5rKCR0eXBlLCAkbGluay0+Z2V0VGFyZ2V0KCksICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwp9Cn0KfQp9CgoKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX0NSRUFURV9QUk9KRUNUX0NNRCwgJGluc3RhbGxEZXZQYWNrYWdlcyk7CgpjaGRpcigkb2xkQ3dkKTsKJHZlbmRvckNvbXBvc2VyRGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykuJy9jb21wb3Nlcic7CmlmIChpc19kaXIoJHZlbmRvckNvbXBvc2VyRGlyKSAmJiAkZnMtPmlzRGlyRW1wdHkoJHZlbmRvckNvbXBvc2VyRGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgncm1kaXInLCAkdmVuZG9yQ29tcG9zZXJEaXIpOwokdmVuZG9yRGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyk7CmlmIChpc19kaXIoJHZlbmRvckRpcikgJiYgJGZzLT5pc0RpckVtcHR5KCR2ZW5kb3JEaXIpKSB7ClNpbGVuY2VyOjpjYWxsKCdybWRpcicsICR2ZW5kb3JEaXIpOwp9Cn0KCnJldHVybiAwOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbnN0YWxsUm9vdFBhY2thZ2UoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICRwYWNrYWdlTmFtZSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgP3N0cmluZyAkZGlyZWN0b3J5ID0gbnVsbCwgP3N0cmluZyAkcGFja2FnZVZlcnNpb24gPSBudWxsLCA/c3RyaW5nICRzdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkcHJlZmVyU291cmNlID0gZmFsc2UsIGJvb2wgJHByZWZlckRpc3QgPSBmYWxzZSwgYm9vbCAkaW5zdGFsbERldlBhY2thZ2VzID0gZmFsc2UsID9hcnJheSAkcmVwb3NpdG9yaWVzID0gbnVsbCwgYm9vbCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgYm9vbCAkZGlzYWJsZVNjcmlwdHMgPSBmYWxzZSwgYm9vbCAkbm9Qcm9ncmVzcyA9IGZhbHNlLCBib29sICRzZWN1cmVIdHRwID0gdHJ1ZSk6IGJvb2wKewppZiAoISRzZWN1cmVIdHRwKSB7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiBbJ3NlY3VyZS1odHRwJyA9PiBmYWxzZV1dLCBDb25maWc6OlNPVVJDRV9DT01NQU5EKTsKfQoKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRyZXF1aXJlbWVudHMgPSAkcGFyc2VyLT5wYXJzZU5hbWVWZXJzaW9uUGFpcnMoWyRwYWNrYWdlTmFtZV0pOwokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcXVpcmVtZW50c1swXVsnbmFtZSddKTsKaWYgKCEkcGFja2FnZVZlcnNpb24gJiYgaXNzZXQoJHJlcXVpcmVtZW50c1swXVsndmVyc2lvbiddKSkgewokcGFja2FnZVZlcnNpb24gPSAkcmVxdWlyZW1lbnRzWzBdWyd2ZXJzaW9uJ107Cn0KCgppZiAobnVsbCA9PT0gJGRpcmVjdG9yeSkgewokcGFydHMgPSBleHBsb2RlKCIvIiwgJG5hbWUsIDIpOwokZGlyZWN0b3J5ID0gUGxhdGZvcm06OmdldEN3ZCgpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGFycmF5X3BvcCgkcGFydHMpOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oJHByb2Nlc3MpOwppZiAoISRmcy0+aXNBYnNvbHV0ZVBhdGgoJGRpcmVjdG9yeSkpIHsKJGRpcmVjdG9yeSA9IFBsYXRmb3JtOjpnZXRDd2QoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZGlyZWN0b3J5Owp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0aW5nIGEgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBwcm9qZWN0IGF0ICInIC4gJGZzLT5maW5kU2hvcnRlc3RQYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSwgJGRpcmVjdG9yeSwgdHJ1ZSkgLiAnIjwvaW5mbz4nKTsKCmlmIChmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSkgewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSBwcm9qZWN0IGRpcmVjdG9yeSBhdCAiJy4kZGlyZWN0b3J5LiciLCBpdCBleGlzdHMgYXMgYSBmaWxlLicpOwp9CmlmICghJGZzLT5pc0RpckVtcHR5KCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQcm9qZWN0IGRpcmVjdG9yeSAiJy4kZGlyZWN0b3J5LiciIGlzIG5vdCBlbXB0eS4nKTsKfQp9CgppZiAobnVsbCA9PT0gJHN0YWJpbGl0eSkgewppZiAobnVsbCA9PT0gJHBhY2thZ2VWZXJzaW9uKSB7CiRzdGFiaWxpdHkgPSAnc3RhYmxlJzsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teW14sXHNdKj9AKCcuaW1wbG9kZSgnfCcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllcykpLicpJH1pJywgJHBhY2thZ2VWZXJzaW9uLCAkbWF0Y2gpKSB7CiRzdGFiaWxpdHkgPSAkbWF0Y2hbMV07Cn0gZWxzZSB7CiRzdGFiaWxpdHkgPSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkcGFja2FnZVZlcnNpb24pOwp9Cn0KCiRzdGFiaWxpdHkgPSBWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJHN0YWJpbGl0eSk7CgppZiAoIWlzc2V0KEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXNbJHN0YWJpbGl0eV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHN0YWJpbGl0eSBwcm92aWRlZCAoJy4kc3RhYmlsaXR5LicpLCBtdXN0IGJlIG9uZSBvZjogJy5pbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllcykpKTsKfQoKJGNvbXBvc2VyID0gRmFjdG9yeTo6Y3JlYXRlKCRpbywgJGNvbmZpZy0+YWxsKCksICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CiRybSA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKTsKCiRyZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJHN0YWJpbGl0eSk7CmlmIChudWxsID09PSAkcmVwb3NpdG9yaWVzKSB7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3MoJGlvLCAkY29uZmlnLCAkcm0pKSk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRyZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKJHJlcG9Db25maWcgPSBSZXBvc2l0b3J5RmFjdG9yeTo6Y29uZmlnRnJvbVN0cmluZygkaW8sICRjb25maWcsICRyZXBvLCB0cnVlKTsKaWYgKAooaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdCddKSAmJiAkcmVwb0NvbmZpZyA9PT0gWydwYWNrYWdpc3QnID0+IGZhbHNlXSkKfHwgKGlzc2V0KCRyZXBvQ29uZmlnWydwYWNrYWdpc3Qub3JnJ10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdC5vcmcnID0+IGZhbHNlXSkKKSB7CmNvbnRpbnVlOwp9CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlGYWN0b3J5OjpjcmVhdGVSZXBvKCRpbywgJGNvbmZpZywgJHJlcG9Db25maWcsICRybSkpOwp9Cn0KCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb25maWctPmdldCgncGxhdGZvcm0nKTsKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyk7CgoKJHZlcnNpb25TZWxlY3RvciA9IG5ldyBWZXJzaW9uU2VsZWN0b3IoJHJlcG9zaXRvcnlTZXQsICRwbGF0Zm9ybVJlcG8pOwokcGFja2FnZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCAkcGFja2FnZVZlcnNpb24sICRzdGFiaWxpdHksICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLCAwLCAkaW8pOwoKaWYgKCEkcGFja2FnZSkgewokZXJyb3JNZXNzYWdlID0gIkNvdWxkIG5vdCBmaW5kIHBhY2thZ2UgJG5hbWUgd2l0aCAiIC4gKCRwYWNrYWdlVmVyc2lvbiA/ICJ2ZXJzaW9uICRwYWNrYWdlVmVyc2lvbiIgOiAic3RhYmlsaXR5ICRzdGFiaWxpdHkiKTsKaWYgKCEoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSAmJiAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgJHBhY2thZ2VWZXJzaW9uLCAkc3RhYmlsaXR5LCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlQWxsKCkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRlcnJvck1lc3NhZ2UgLicgaW4gYSB2ZXJzaW9uIGluc3RhbGxhYmxlIHVzaW5nIHlvdXIgUEhQIHZlcnNpb24sIFBIUCBleHRlbnNpb25zIGFuZCBDb21wb3NlciB2ZXJzaW9uLicpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkZXJyb3JNZXNzYWdlIC4nLicpOwp9CgoKQG1rZGlyKCRkaXJlY3RvcnksIDA3NzcsIHRydWUpOwppZiAoZmFsc2UgIT09ICgkcmVhbERpciA9IHJlYWxwYXRoKCRkaXJlY3RvcnkpKSkgewokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZShbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLCBmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwsIFNpZ25hbEhhbmRsZXIgJGhhbmRsZXIpIHVzZSAoJHJlYWxEaXIpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ1JlY2VpdmVkICcuJHNpZ25hbC4nLCBhYm9ydGluZycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmcy0+cmVtb3ZlRGlyZWN0b3J5KCRyZWFsRGlyKTsKJGhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9KTsKfQoKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+SW5zdGFsbGluZyAnIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICcgKCcgLiAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oZmFsc2UpIC4gJyk8L2luZm8+Jyk7CgppZiAoJGRpc2FibGVQbHVnaW5zKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+UGx1Z2lucyBoYXZlIGJlZW4gZGlzYWJsZWQuPC9pbmZvPicpOwp9CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgokZG0gPSAkY29tcG9zZXItPmdldERvd25sb2FkTWFuYWdlcigpOwokZG0tPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpOwoKJHByb2plY3RJbnN0YWxsZXIgPSBuZXcgUHJvamVjdEluc3RhbGxlcigkZGlyZWN0b3J5LCAkZG0sICRmcyk7CiRpbSA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpOwokaW0tPnNldE91dHB1dFByb2dyZXNzKCEkbm9Qcm9ncmVzcyk7CiRpbS0+YWRkSW5zdGFsbGVyKCRwcm9qZWN0SW5zdGFsbGVyKTsKJGltLT5leGVjdXRlKG5ldyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkoKSwgW25ldyBJbnN0YWxsT3BlcmF0aW9uKCRwYWNrYWdlKV0pOwokaW0tPm5vdGlmeUluc3RhbGxzKCRpbyk7CgoKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJHBhY2thZ2UpOwoKJGluc3RhbGxlZEZyb21WY3MgPSAnc291cmNlJyA9PT0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpOwoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5DcmVhdGVkIHByb2plY3QgaW4gJyAuICRkaXJlY3RvcnkgLiAnPC9pbmZvPicpOwpjaGRpcigkZGlyZWN0b3J5KTsKCgoKCmlmIChmaWxlX2V4aXN0cygkZGlyZWN0b3J5LicvY29tcG9zZXIuanNvbicpICYmIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSJykgIT09IGZhbHNlKSB7ClBsYXRmb3JtOjpjbGVhckVudignQ09NUE9TRVInKTsKfQoKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJywgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSk7CgoKaWYgKGlzc2V0KCRzaWduYWxIYW5kbGVyKSkgewokc2lnbmFsSGFuZGxlci0+dW5yZWdpc3RlcigpOwp9CgpyZXR1cm4gJGluc3RhbGxlZEZyb21WY3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCmNsYXNzIERlcGVuZHNDb21tYW5kIGV4dGVuZHMgQmFzZURlcGVuZGVuY3lDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnZGVwZW5kcycpCi0+c2V0QWxpYXNlcyhbJ3doeSddKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyB3aGljaCBwYWNrYWdlcyBjYXVzZSB0aGUgZ2l2ZW4gcGFja2FnZSB0byBiZSBpbnN0YWxsZWQnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudChzZWxmOjpBUkdVTUVOVF9QQUNLQUdFLCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJ1BhY2thZ2UgdG8gaW5zcGVjdCcsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZSh0cnVlLCB0cnVlKSksCm5ldyBJbnB1dE9wdGlvbihzZWxmOjpPUFRJT05fUkVDVVJTSVZFLCAncicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVjdXJzaXZlbHkgcmVzb2x2ZXMgdXAgdG8gdGhlIHJvb3QgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oc2VsZjo6T1BUSU9OX1RSRUUsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmludHMgdGhlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgdHJlZScpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVhZCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZyb20gY29tcG9zZXIubG9jaycpLApdKQotPnNldEhlbHAoCjw8PEVPVApEaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSBhIHBhY2thZ2UgaXMgcmVmZXJlbmNlZC4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGRlcGVuZHMgY29tcG9zZXIvY29tcG9zZXI8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNkZXBlbmRzLXdoeQpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewpyZXR1cm4gcGFyZW50Ojpkb0V4ZWN1dGUoJGlucHV0LCAkb3V0cHV0KTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcQ29uZmlnVmFsaWRhdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQ7CnVzZSBDb21wb3NlclxVdGlsXEluaUhlbHBlcjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcU3RyZWFtQ29udGV4dEZhY3Rvcnk7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcU2VsZlVwZGF0ZVxLZXlzOwp1c2UgQ29tcG9zZXJcU2VsZlVwZGF0ZVxWZXJzaW9uczsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlclxYZGVidWdIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhlY3V0YWJsZUZpbmRlcjsKCgoKCmNsYXNzIERpYWdub3NlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7CgoKcHJvdGVjdGVkICRwcm9jZXNzOwoKCnByb3RlY3RlZCAkZXhpdENvZGUgPSAwOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdkaWFnbm9zZScpCi0+c2V0RGVzY3JpcHRpb24oJ0RpYWdub3NlcyB0aGUgc3lzdGVtIHRvIGlkZW50aWZ5IGNvbW1vbiBlcnJvcnMnKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+ZGlhZ25vc2U8L2luZm8+IGNvbW1hbmQgY2hlY2tzIGNvbW1vbiBlcnJvcnMgdG8gaGVscCBkZWJ1Z2dpbmcgcHJvYmxlbXMuCgpUaGUgcHJvY2VzcyBleGl0IGNvZGUgd2lsbCBiZSAxIGluIGNhc2Ugb2Ygd2FybmluZ3MgYW5kIDIgZm9yIGVycm9ycy4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2RpYWdub3NlCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGNvbXBvc2VyKSB7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2RpYWdub3NlJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIGNvbXBvc2VyLmpzb246ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tDb21wb3NlclNjaGVtYSgpKTsKJHRoaXMtPnByb2Nlc3MgPSAkY29tcG9zZXItPmdldExvb3AoKS0+Z2V0UHJvY2Vzc0V4ZWN1dG9yKCkgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9IGVsc2UgewokdGhpcy0+cHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfQoKaWYgKCRjb21wb3NlcikgewokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKfSBlbHNlIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwp9CgokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydzZWN1cmUtaHR0cCcgPT4gZmFsc2VdXSwgQ29uZmlnOjpTT1VSQ0VfQ09NTUFORCk7CiRjb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJ2h0dHA6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnLCBuZXcgTnVsbElPKTsKCiR0aGlzLT5odHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7CgokaW8tPndyaXRlKCdDaGVja2luZyBwbGF0Zm9ybSBzZXR0aW5nczogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja1BsYXRmb3JtKCkpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgZ2l0IHNldHRpbmdzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrR2l0KCkpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgaHR0cCBjb25uZWN0aXZpdHkgdG8gcGFja2FnaXN0OiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrSHR0cCgnaHR0cCcsICRjb25maWcpKTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIGh0dHBzIGNvbm5lY3Rpdml0eSB0byBwYWNrYWdpc3Q6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tIdHRwKCdodHRwcycsICRjb25maWcpKTsKCiRvcHRzID0gc3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnMoU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldENvbnRleHQoJ2h0dHA6Ly9leGFtcGxlLm9yZycpKTsKaWYgKCFlbXB0eSgkb3B0c1snaHR0cCddWydwcm94eSddKSkgewokaW8tPndyaXRlKCdDaGVja2luZyBIVFRQIHByb3h5OiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrSHR0cFByb3h5KCkpOwp9CgppZiAoY291bnQoJG9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRodWItb2F1dGgnKSkgPiAwKSB7CmZvcmVhY2ggKCRvYXV0aCBhcyAkZG9tYWluID0+ICR0b2tlbikgewokaW8tPndyaXRlKCdDaGVja2luZyAnLiRkb21haW4uJyBvYXV0aCBhY2Nlc3M6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tHaXRodWJPYXV0aCgkZG9tYWluLCAkdG9rZW4pKTsKfQp9IGVsc2UgewokaW8tPndyaXRlKCdDaGVja2luZyBnaXRodWIuY29tIHJhdGUgbGltaXQ6ICcsIGZhbHNlKTsKdHJ5IHsKJHJhdGUgPSAkdGhpcy0+Z2V0R2l0aHViUmF0ZUxpbWl0KCdnaXRodWIuY29tJyk7CmlmICghaXNfYXJyYXkoJHJhdGUpKSB7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHJhdGUpOwp9IGVsc2VpZiAoMTAgPiAkcmF0ZVsncmVtYWluaW5nJ10pIHsKJGlvLT53cml0ZSgnPHdhcm5pbmc+V0FSTklORzwvd2FybmluZz4nKTsKJGlvLT53cml0ZShzcHJpbnRmKAonPGNvbW1lbnQ+R2l0aHViIGhhcyBhIHJhdGUgbGltaXQgb24gdGhlaXIgQVBJLiAnCi4gJ1lvdSBjdXJyZW50bHkgaGF2ZSA8b3B0aW9ucz1ib2xkPiV1PC9vcHRpb25zPWJvbGQ+ICcKLiAnb3V0IG9mIDxvcHRpb25zPWJvbGQ+JXU8L29wdGlvbnM9Ym9sZD4gcmVxdWVzdHMgbGVmdC4nIC4gUEhQX0VPTAouICdTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My8jcmF0ZS1saW1pdGluZyBhbmQgYWxzbycgLiBQSFBfRU9MCi4gJyAgICBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2FwaS1yYXRlLWxpbWl0LWFuZC1vYXV0aC10b2tlbnM8L2NvbW1lbnQ+JywKJHJhdGVbJ3JlbWFpbmluZyddLAokcmF0ZVsnbGltaXQnXQopKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dFJlc3VsdCh0cnVlKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0Q29kZSgpID09PSA0MDEpIHsKJHRoaXMtPm91dHB1dFJlc3VsdCgnPGNvbW1lbnQ+VGhlIG9hdXRoIHRva2VuIGZvciBnaXRodWIuY29tIHNlZW1zIGludmFsaWQsIHJ1biAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20iIHRvIHJlbW92ZSBpdDwvY29tbWVudD4nKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dFJlc3VsdCgkZSk7Cn0KfQp9CgokaW8tPndyaXRlKCdDaGVja2luZyBkaXNrIGZyZWUgc3BhY2U6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tEaXNrU3BhY2UoJGNvbmZpZykpOwoKaWYgKHN0cnBvcyhfX0ZJTEVfXywgJ3BoYXI6JykgPT09IDApIHsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgcHVia2V5czogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja1B1YktleXMoJGNvbmZpZykpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgY29tcG9zZXIgdmVyc2lvbjogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja1ZlcnNpb24oJGNvbmZpZykpOwp9CgokaW8tPndyaXRlKHNwcmludGYoJ0NvbXBvc2VyIHZlcnNpb246IDxjb21tZW50PiVzPC9jb21tZW50PicsIENvbXBvc2VyOjpnZXRWZXJzaW9uKCkpKTsKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb25maWctPmdldCgncGxhdGZvcm0nKSA/OiBbXTsKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyk7CiRwaHBQa2cgPSAkcGxhdGZvcm1SZXBvLT5maW5kUGFja2FnZSgncGhwJywgJyonKTsKJHBocFZlcnNpb24gPSAkcGhwUGtnLT5nZXRQcmV0dHlWZXJzaW9uKCk7CmlmICgkcGhwUGtnIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmIHN0cl9jb250YWlucygoc3RyaW5nKSAkcGhwUGtnLT5nZXREZXNjcmlwdGlvbigpLCAnb3ZlcnJpZGRlbicpKSB7CiRwaHBWZXJzaW9uIC49ICcgLSAnIC4gJHBocFBrZy0+Z2V0RGVzY3JpcHRpb24oKTsKfQoKJGlvLT53cml0ZShzcHJpbnRmKCdQSFAgdmVyc2lvbjogPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgJHBocFZlcnNpb24pKTsKCmlmIChkZWZpbmVkKCdQSFBfQklOQVJZJykpIHsKJGlvLT53cml0ZShzcHJpbnRmKCdQSFAgYmluYXJ5IHBhdGg6IDxjb21tZW50PiVzPC9jb21tZW50PicsIFBIUF9CSU5BUlkpKTsKfQoKJGlvLT53cml0ZSgnT3BlblNTTCB2ZXJzaW9uOiAnIC4gKGRlZmluZWQoJ09QRU5TU0xfVkVSU0lPTl9URVhUJykgPyAnPGNvbW1lbnQ+Jy5PUEVOU1NMX1ZFUlNJT05fVEVYVC4nPC9jb21tZW50PicgOiAnPGVycm9yPm1pc3Npbmc8L2Vycm9yPicpKTsKJGlvLT53cml0ZSgnY1VSTCB2ZXJzaW9uOiAnIC4gJHRoaXMtPmdldEN1cmxWZXJzaW9uKCkpOwoKJGZpbmRlciA9IG5ldyBFeGVjdXRhYmxlRmluZGVyOwokaGFzU3lzdGVtVW56aXAgPSAoYm9vbCkgJGZpbmRlci0+ZmluZCgndW56aXAnKTsKJGJpbjd6aXAgPSAnJzsKaWYgKCRoYXNTeXN0ZW03emlwID0gKGJvb2wpICRmaW5kZXItPmZpbmQoJzd6JywgbnVsbCwgWydDOlxQcm9ncmFtIEZpbGVzXDctWmlwJ10pKSB7CiRiaW43emlwID0gJzd6JzsKfQppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAhJGhhc1N5c3RlbTd6aXAgJiYgJGhhc1N5c3RlbTd6aXAgPSAoYm9vbCkgJGZpbmRlci0+ZmluZCgnN3p6JykpIHsKJGJpbjd6aXAgPSAnN3p6JzsKfQoKJGlvLT53cml0ZSgKJ3ppcDogJyAuIChleHRlbnNpb25fbG9hZGVkKCd6aXAnKSA/ICc8Y29tbWVudD5leHRlbnNpb24gcHJlc2VudDwvY29tbWVudD4nIDogJzxjb21tZW50PmV4dGVuc2lvbiBub3QgbG9hZGVkPC9jb21tZW50PicpCi4gJywgJyAuICgkaGFzU3lzdGVtVW56aXAgPyAnPGNvbW1lbnQ+dW56aXAgcHJlc2VudDwvY29tbWVudD4nIDogJzxjb21tZW50PnVuemlwIG5vdCBhdmFpbGFibGU8L2NvbW1lbnQ+JykKLiAnLCAnIC4gKCRoYXNTeXN0ZW03emlwID8gJzxjb21tZW50PjctWmlwIHByZXNlbnQgKCcuJGJpbjd6aXAuJyk8L2NvbW1lbnQ+JyA6ICc8Y29tbWVudD43LVppcCBub3QgYXZhaWxhYmxlPC9jb21tZW50PicpCi4gKCgkaGFzU3lzdGVtN3ppcCB8fCAkaGFzU3lzdGVtVW56aXApICYmICFmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpID8gJywgPHdhcm5pbmc+cHJvY19vcGVuIGlzIGRpc2FibGVkIG9yIG5vdCBwcmVzZW50LCB1bnppcC83LXogd2lsbCBub3QgYmUgdXNhYmxlPC93YXJuaW5nPicgOiAnJykKKTsKCnJldHVybiAkdGhpcy0+ZXhpdENvZGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb21wb3NlclNjaGVtYSgpCnsKJHZhbGlkYXRvciA9IG5ldyBDb25maWdWYWxpZGF0b3IoJHRoaXMtPmdldElPKCkpOwpbJGVycm9ycywgLCAkd2FybmluZ3NdID0gJHZhbGlkYXRvci0+dmFsaWRhdGUoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpOwoKaWYgKCRlcnJvcnMgfHwgJHdhcm5pbmdzKSB7CiRtZXNzYWdlcyA9IFsKJ2Vycm9yJyA9PiAkZXJyb3JzLAond2FybmluZycgPT4gJHdhcm5pbmdzLApdOwoKJG91dHB1dCA9ICcnOwpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJHN0eWxlID0+ICRtc2dzKSB7CmZvcmVhY2ggKCRtc2dzIGFzICRtc2cpIHsKJG91dHB1dCAuPSAnPCcgLiAkc3R5bGUgLiAnPicgLiAkbXNnIC4gJzwvJyAuICRzdHlsZSAuICc+JyAuIFBIUF9FT0w7Cn0KfQoKcmV0dXJuIHJ0cmltKCRvdXRwdXQpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0dpdCgpOiBzdHJpbmcKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuICc8Y29tbWVudD5wcm9jX29wZW4gaXMgbm90IGF2YWlsYWJsZSwgZ2l0IGNhbm5vdCBiZSB1c2VkPC9jb21tZW50Pic7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgY29uZmlnIGNvbG9yLnVpJywgJG91dHB1dCk7CmlmIChzdHJ0b2xvd2VyKHRyaW0oJG91dHB1dCkpID09PSAnYWx3YXlzJykgewpyZXR1cm4gJzxjb21tZW50PllvdXIgZ2l0IGNvbG9yLnVpIHNldHRpbmcgaXMgc2V0IHRvIGFsd2F5cywgdGhpcyBpcyBrbm93biB0byBjcmVhdGUgaXNzdWVzLiBVc2UgImdpdCBjb25maWcgLS1nbG9iYWwgY29sb3IudWkgdHJ1ZSIgdG8gc2V0IGl0IGNvcnJlY3RseS48L2NvbW1lbnQ+JzsKfQoKJGdpdFZlcnNpb24gPSBHaXQ6OmdldFZlcnNpb24oJHRoaXMtPnByb2Nlc3MpOwppZiAobnVsbCA9PT0gJGdpdFZlcnNpb24pIHsKcmV0dXJuICc8Y29tbWVudD5ObyBnaXQgcHJvY2VzcyBmb3VuZDwvPic7Cn0KCmlmICh2ZXJzaW9uX2NvbXBhcmUoJzIuMjQuMCcsICRnaXRWZXJzaW9uLCAnPicpKSB7CnJldHVybiAnPHdhcm5pbmc+WW91ciBnaXQgdmVyc2lvbiAoJy4kZ2l0VmVyc2lvbi4nKSBpcyB0b28gb2xkIGFuZCBwb3NzaWJseSB3aWxsIGNhdXNlIGlzc3Vlcy4gUGxlYXNlIHVwZ3JhZGUgdG8gZ2l0IDIuMjQgb3IgYWJvdmU8Lz4nOwp9CgpyZXR1cm4gJzxpbmZvPk9LPC8+IDxjb21tZW50PmdpdCB2ZXJzaW9uICcuJGdpdFZlcnNpb24uJzwvPic7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tIdHRwKHN0cmluZyAkcHJvdG8sIENvbmZpZyAkY29uZmlnKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHJlc3VsdCA9IFtdOwppZiAoJHByb3RvID09PSAnaHR0cHMnICYmICRjb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewokdGxzV2FybmluZyA9ICc8d2FybmluZz5Db21wb3NlciBpcyBjb25maWd1cmVkIHRvIGRpc2FibGUgU1NML1RMUyBwcm90ZWN0aW9uLiBUaGlzIHdpbGwgbGVhdmUgcmVtb3RlIEhUVFBTIHJlcXVlc3RzIHZ1bG5lcmFibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy48L3dhcm5pbmc+JzsKfQoKdHJ5IHsKJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvIC4gJzovL3JlcG8ucGFja2FnaXN0Lm9yZy9wYWNrYWdlcy5qc29uJyk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokaGludHMgPSBIdHRwRG93bmxvYWRlcjo6Z2V0RXhjZXB0aW9uSGludHMoJGUpOwppZiAobnVsbCAhPT0gJGhpbnRzICYmIGNvdW50KCRoaW50cykgPiAwKSB7CmZvcmVhY2ggKCRoaW50cyBhcyAkaGludCkgewokcmVzdWx0W10gPSAkaGludDsKfQp9CgokcmVzdWx0W10gPSAnPGVycm9yPlsnIC4gZ2V0X2NsYXNzKCRlKSAuICddICcgLiAkZS0+Z2V0TWVzc2FnZSgpIC4gJzwvZXJyb3I+JzsKfQoKaWYgKGlzc2V0KCR0bHNXYXJuaW5nKSkgewokcmVzdWx0W10gPSAkdGxzV2FybmluZzsKfQoKaWYgKGNvdW50KCRyZXN1bHQpID4gMCkgewpyZXR1cm4gJHJlc3VsdDsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tIdHRwUHJveHkoKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHByb3RvY29sID0gZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpID8gJ2h0dHBzJyA6ICdodHRwJzsKdHJ5IHsKJGpzb24gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkcHJvdG9jb2wgLiAnOi8vcmVwby5wYWNrYWdpc3Qub3JnL3BhY2thZ2VzLmpzb24nKS0+ZGVjb2RlSnNvbigpOwokaGFzaCA9IHJlc2V0KCRqc29uWydwcm92aWRlci1pbmNsdWRlcyddKTsKJGhhc2ggPSAkaGFzaFsnc2hhMjU2J107CiRwYXRoID0gc3RyX3JlcGxhY2UoJyVoYXNoJScsICRoYXNoLCBrZXkoJGpzb25bJ3Byb3ZpZGVyLWluY2x1ZGVzJ10pKTsKJHByb3ZpZGVyID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvY29sIC4gJzovL3JlcG8ucGFja2FnaXN0Lm9yZy8nLiRwYXRoKS0+Z2V0Qm9keSgpOwoKaWYgKGhhc2goJ3NoYTI1NicsICRwcm92aWRlcikgIT09ICRoYXNoKSB7CnJldHVybiAnSXQgc2VlbXMgdGhhdCB5b3VyIHByb3h5IGlzIG1vZGlmeWluZyBodHRwIHRyYWZmaWMgb24gdGhlIGZseSc7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGU7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrR2l0aHViT2F1dGgoc3RyaW5nICRkb21haW4sIHN0cmluZyAkdG9rZW4pCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokdGhpcy0+Z2V0SU8oKS0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp0cnkgewokdXJsID0gJGRvbWFpbiA9PT0gJ2dpdGh1Yi5jb20nID8gJ2h0dHBzOi8vYXBpLicuJGRvbWFpbi4nLycgOiAnaHR0cHM6Ly8nLiRkb21haW4uJy9hcGkvdjMvJzsKCiR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRDb2RlKCkgPT09IDQwMSkgewpyZXR1cm4gJzxjb21tZW50PlRoZSBvYXV0aCB0b2tlbiBmb3IgJy4kZG9tYWluLicgc2VlbXMgaW52YWxpZCwgcnVuICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS11bnNldCBnaXRodWItb2F1dGguJy4kZG9tYWluLiciIHRvIHJlbW92ZSBpdDwvY29tbWVudD4nOwp9CgpyZXR1cm4gJGU7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEdpdGh1YlJhdGVMaW1pdChzdHJpbmcgJGRvbWFpbiwgP3N0cmluZyAkdG9rZW4gPSBudWxsKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKCR0b2tlbikgewokdGhpcy0+Z2V0SU8oKS0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp9CgokdXJsID0gJGRvbWFpbiA9PT0gJ2dpdGh1Yi5jb20nID8gJ2h0dHBzOi8vYXBpLicuJGRvbWFpbi4nL3JhdGVfbGltaXQnIDogJ2h0dHBzOi8vJy4kZG9tYWluLicvYXBpL3JhdGVfbGltaXQnOwokZGF0YSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsIFsncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZV0pLT5kZWNvZGVKc29uKCk7CgpyZXR1cm4gJGRhdGFbJ3Jlc291cmNlcyddWydjb3JlJ107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tEaXNrU3BhY2UoQ29uZmlnICRjb25maWcpCnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Rpc2tfZnJlZV9zcGFjZScpKSB7CnJldHVybiB0cnVlOwp9CgokbWluU3BhY2VGcmVlID0gMTAyNCAqIDEwMjQ7CmlmICgoKCRkZiA9IEBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgnaG9tZScpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCnx8ICgoJGRmID0gQGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKKSB7CnJldHVybiAnPGVycm9yPlRoZSBkaXNrIGhvc3RpbmcgJy4kZGlyLicgaXMgZnVsbDwvZXJyb3I+JzsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tQdWJLZXlzKENvbmZpZyAkY29uZmlnKQp7CiRob21lID0gJGNvbmZpZy0+Z2V0KCdob21lJyk7CiRlcnJvcnMgPSBbXTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoZmlsZV9leGlzdHMoJGhvbWUuJy9rZXlzLnRhZ3MucHViJykgJiYgZmlsZV9leGlzdHMoJGhvbWUuJy9rZXlzLmRldi5wdWInKSkgewokaW8tPndyaXRlKCcnKTsKfQoKaWYgKGZpbGVfZXhpc3RzKCRob21lLicva2V5cy50YWdzLnB1YicpKSB7CiRpby0+d3JpdGUoJ1RhZ3MgUHVibGljIEtleSBGaW5nZXJwcmludDogJyAuIEtleXM6OmZpbmdlcnByaW50KCRob21lLicva2V5cy50YWdzLnB1YicpKTsKfSBlbHNlIHsKJGVycm9yc1tdID0gJzxlcnJvcj5NaXNzaW5nIHB1YmtleSBmb3IgdGFncyB2ZXJpZmljYXRpb248L2Vycm9yPic7Cn0KCmlmIChmaWxlX2V4aXN0cygkaG9tZS4nL2tleXMuZGV2LnB1YicpKSB7CiRpby0+d3JpdGUoJ0RldiBQdWJsaWMgS2V5IEZpbmdlcnByaW50OiAnIC4gS2V5czo6ZmluZ2VycHJpbnQoJGhvbWUuJy9rZXlzLmRldi5wdWInKSk7Cn0gZWxzZSB7CiRlcnJvcnNbXSA9ICc8ZXJyb3I+TWlzc2luZyBwdWJrZXkgZm9yIGRldiB2ZXJpZmljYXRpb248L2Vycm9yPic7Cn0KCmlmICgkZXJyb3JzKSB7CiRlcnJvcnNbXSA9ICc8ZXJyb3I+UnVuIGNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tdXBkYXRlLWtleXMgdG8gc2V0IHRoZW0gdXA8L2Vycm9yPic7Cn0KCnJldHVybiAkZXJyb3JzID86IHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tWZXJzaW9uKENvbmZpZyAkY29uZmlnKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHZlcnNpb25zVXRpbCA9IG5ldyBWZXJzaW9ucygkY29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIpOwp0cnkgewokbGF0ZXN0ID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKcmV0dXJuICRlOwp9CgppZiAoQ29tcG9zZXI6OlZFUlNJT04gIT09ICRsYXRlc3RbJ3ZlcnNpb24nXSAmJiBDb21wb3Nlcjo6VkVSU0lPTiAhPT0gJ0BwYWNrYWdlX3ZlcnNpb25AJykgewpyZXR1cm4gJzxjb21tZW50PllvdSBhcmUgbm90IHJ1bm5pbmcgdGhlIGxhdGVzdCAnLiR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKS4nIHZlcnNpb24sIHJ1biBgY29tcG9zZXIgc2VsZi11cGRhdGVgIHRvIHVwZGF0ZSAoJy5Db21wb3Nlcjo6VkVSU0lPTi4nID0+ICcuJGxhdGVzdFsndmVyc2lvbiddLicpPC9jb21tZW50Pic7Cn0KCnJldHVybiB0cnVlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEN1cmxWZXJzaW9uKCk6IHN0cmluZwp7CmlmIChleHRlbnNpb25fbG9hZGVkKCdjdXJsJykpIHsKaWYgKCFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CnJldHVybiAnPGVycm9yPmRpc2FibGVkIHZpYSBkaXNhYmxlX2Z1bmN0aW9ucywgdXNpbmcgcGhwIHN0cmVhbXMgZmFsbGJhY2ssIHdoaWNoIHJlZHVjZXMgcGVyZm9ybWFuY2U8L2Vycm9yPic7Cn0KCiR2ZXJzaW9uID0gY3VybF92ZXJzaW9uKCk7CgpyZXR1cm4gJzxjb21tZW50PicuJHZlcnNpb25bJ3ZlcnNpb24nXS4nPC9jb21tZW50PiAnLgonbGlieiA8Y29tbWVudD4nLighZW1wdHkoJHZlcnNpb25bJ2xpYnpfdmVyc2lvbiddKSA/ICR2ZXJzaW9uWydsaWJ6X3ZlcnNpb24nXSA6ICdtaXNzaW5nJykuJzwvY29tbWVudD4gJy4KJ3NzbCA8Y29tbWVudD4nLigkdmVyc2lvblsnc3NsX3ZlcnNpb24nXSA/PyAnbWlzc2luZycpLic8L2NvbW1lbnQ+JzsKfQoKcmV0dXJuICc8ZXJyb3I+bWlzc2luZywgdXNpbmcgcGhwIHN0cmVhbXMgZmFsbGJhY2ssIHdoaWNoIHJlZHVjZXMgcGVyZm9ybWFuY2U8L2Vycm9yPic7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0UmVzdWx0KCRyZXN1bHQpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICh0cnVlID09PSAkcmVzdWx0KSB7CiRpby0+d3JpdGUoJzxpbmZvPk9LPC9pbmZvPicpOwoKcmV0dXJuOwp9CgokaGFkRXJyb3IgPSBmYWxzZTsKJGhhZFdhcm5pbmcgPSBmYWxzZTsKaWYgKCRyZXN1bHQgaW5zdGFuY2VvZiBcRXhjZXB0aW9uKSB7CiRyZXN1bHQgPSAnPGVycm9yPlsnLmdldF9jbGFzcygkcmVzdWx0KS4nXSAnLiRyZXN1bHQtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nOwp9CgppZiAoISRyZXN1bHQpIHsKCiRoYWRFcnJvciA9IHRydWU7Cn0gZWxzZSB7CmlmICghaXNfYXJyYXkoJHJlc3VsdCkpIHsKJHJlc3VsdCA9IFskcmVzdWx0XTsKfQpmb3JlYWNoICgkcmVzdWx0IGFzICRtZXNzYWdlKSB7CmlmIChmYWxzZSAhPT0gc3RycG9zKCRtZXNzYWdlLCAnPGVycm9yPicpKSB7CiRoYWRFcnJvciA9IHRydWU7Cn0gZWxzZWlmIChmYWxzZSAhPT0gc3RycG9zKCRtZXNzYWdlLCAnPHdhcm5pbmc+JykpIHsKJGhhZFdhcm5pbmcgPSB0cnVlOwp9Cn0KfQoKaWYgKCRoYWRFcnJvcikgewokaW8tPndyaXRlKCc8ZXJyb3I+RkFJTDwvZXJyb3I+Jyk7CiR0aGlzLT5leGl0Q29kZSA9IG1heCgkdGhpcy0+ZXhpdENvZGUsIDIpOwp9IGVsc2VpZiAoJGhhZFdhcm5pbmcpIHsKJGlvLT53cml0ZSgnPHdhcm5pbmc+V0FSTklORzwvd2FybmluZz4nKTsKJHRoaXMtPmV4aXRDb2RlID0gbWF4KCR0aGlzLT5leGl0Q29kZSwgMSk7Cn0KCmlmICgkcmVzdWx0KSB7CmZvcmVhY2ggKCRyZXN1bHQgYXMgJG1lc3NhZ2UpIHsKJGlvLT53cml0ZSgkbWVzc2FnZSk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrUGxhdGZvcm0oKQp7CiRvdXRwdXQgPSAnJzsKJG91dCA9IHN0YXRpYyBmdW5jdGlvbiAoJG1zZywgJHN0eWxlKSB1c2UgKCYkb3V0cHV0KTogdm9pZCB7CiRvdXRwdXQgLj0gJzwnLiRzdHlsZS4nPicuJG1zZy4nPC8nLiRzdHlsZS4nPicuUEhQX0VPTDsKfTsKCgokZXJyb3JzID0gW107CiR3YXJuaW5ncyA9IFtdOwokZGlzcGxheUluaU1lc3NhZ2UgPSBmYWxzZTsKCiRpbmlNZXNzYWdlID0gUEhQX0VPTC5QSFBfRU9MLkluaUhlbHBlcjo6Z2V0TWVzc2FnZSgpOwokaW5pTWVzc2FnZSAuPSBQSFBfRU9MLidJZiB5b3UgY2FuIG5vdCBtb2RpZnkgdGhlIGluaSBmaWxlLCB5b3UgY2FuIGFsc28gcnVuIGBwaHAgLWQgb3B0aW9uPXZhbHVlYCB0byBtb2RpZnkgaW5pIHZhbHVlcyBvbiB0aGUgZmx5LiBZb3UgY2FuIHVzZSAtZCBtdWx0aXBsZSB0aW1lcy4nOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZGVjb2RlJykpIHsKJGVycm9yc1snanNvbiddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdQaGFyJykpIHsKJGVycm9yc1sncGhhciddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdmaWx0ZXInKSkgewokZXJyb3JzWydmaWx0ZXInXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnaGFzaCcpKSB7CiRlcnJvcnNbJ2hhc2gnXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnaWNvbnYnKSAmJiAhZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewokZXJyb3JzWydpY29udl9tYnN0cmluZyddID0gdHJ1ZTsKfQoKaWYgKCFmaWx0ZXJfdmFyKGluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJGVycm9yc1snYWxsb3dfdXJsX2ZvcGVuJ10gPSB0cnVlOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnaW9uQ3ViZSBMb2FkZXInKSAmJiBpb25jdWJlX2xvYWRlcl9pdmVyc2lvbigpIDwgNDAwMDkpIHsKJGVycm9yc1snaW9uY3ViZSddID0gaW9uY3ViZV9sb2FkZXJfdmVyc2lvbigpOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDIwNSkgewokZXJyb3JzWydwaHAnXSA9IFBIUF9WRVJTSU9OOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewokZXJyb3JzWydvcGVuc3NsJ10gPSB0cnVlOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMDAxMDBmKSB7CiR3YXJuaW5nc1snb3BlbnNzbF92ZXJzaW9uJ10gPSB0cnVlOwp9CgppZiAoIWRlZmluZWQoJ0hIVk1fVkVSU0lPTicpICYmICFleHRlbnNpb25fbG9hZGVkKCdhcGN1JykgJiYgZmlsdGVyX3ZhcihpbmlfZ2V0KCdhcGMuZW5hYmxlX2NsaScpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJHdhcm5pbmdzWydhcGNfY2xpJ10gPSB0cnVlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewokd2FybmluZ3NbJ3psaWInXSA9IHRydWU7Cn0KCm9iX3N0YXJ0KCk7CnBocGluZm8oSU5GT19HRU5FUkFMKTsKJHBocGluZm8gPSBvYl9nZXRfY2xlYW4oKTsKaWYgKGlzX3N0cmluZygkcGhwaW5mbykgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne0NvbmZpZ3VyZSBDb21tYW5kKD86ICo8L3RkPjx0ZCBjbGFzcz0idiI+fCAqPT4gKikoLio/KSg/OjwvdGQ+fCQpfW0nLCAkcGhwaW5mbywgJG1hdGNoKSkgewokY29uZmlndXJlID0gJG1hdGNoWzFdOwoKaWYgKHN0cl9jb250YWlucygkY29uZmlndXJlLCAnLS1lbmFibGUtc2lnY2hpbGQnKSkgewokd2FybmluZ3NbJ3NpZ2NoaWxkJ10gPSB0cnVlOwp9CgppZiAoc3RyX2NvbnRhaW5zKCRjb25maWd1cmUsICctLXdpdGgtY3VybHdyYXBwZXJzJykpIHsKJHdhcm5pbmdzWydjdXJsd3JhcHBlcnMnXSA9IHRydWU7Cn0KfQoKaWYgKGZpbHRlcl92YXIoaW5pX2dldCgneGRlYnVnLnByb2ZpbGVyX2VuYWJsZWQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiR3YXJuaW5nc1sneGRlYnVnX3Byb2ZpbGUnXSA9IHRydWU7Cn0gZWxzZWlmIChYZGVidWdIYW5kbGVyOjppc1hkZWJ1Z0FjdGl2ZSgpKSB7CiR3YXJuaW5nc1sneGRlYnVnX2xvYWRlZCddID0gdHJ1ZTsKfQoKaWYgKGRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKQomJiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4yLjIzJywgJzwnKQp8fCAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4zLjAnLCAnPj0nKQomJiB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjMuMTAnLCAnPCcpKSkpIHsKJHdhcm5pbmdzWydvbmVkcml2ZSddID0gUEhQX1ZFUlNJT047Cn0KCmlmICghZW1wdHkoJGVycm9ycykpIHsKZm9yZWFjaCAoJGVycm9ycyBhcyAkZXJyb3IgPT4gJGN1cnJlbnQpIHsKc3dpdGNoICgkZXJyb3IpIHsKY2FzZSAnanNvbic6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGpzb24gZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWpzb24iOwpicmVhazsKCmNhc2UgJ3BoYXInOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBwaGFyIGV4dGVuc2lvbiBpcyBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgaXQgb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1waGFyIjsKYnJlYWs7CgpjYXNlICdmaWx0ZXInOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBmaWx0ZXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWZpbHRlciI7CmJyZWFrOwoKY2FzZSAnaGFzaCc6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGhhc2ggZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWhhc2giOwpicmVhazsKCmNhc2UgJ2ljb252X21ic3RyaW5nJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgaWNvbnYgT1IgbWJzdHJpbmcgZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIGFuZCBib3RoIGFyZSBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgZWl0aGVyIG9mIHRoZW0gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1pY29udiI7CmJyZWFrOwoKY2FzZSAncGhwJzoKJHRleHQgPSBQSFBfRU9MLiJZb3VyIFBIUCAoeyRjdXJyZW50fSkgaXMgdG9vIG9sZCwgeW91IG11c3QgdXBncmFkZSB0byBQSFAgNy4yLjUgb3IgaGlnaGVyLiI7CmJyZWFrOwoKY2FzZSAnYWxsb3dfdXJsX2ZvcGVuJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgYWxsb3dfdXJsX2ZvcGVuIHNldHRpbmcgaXMgaW5jb3JyZWN0LiIuUEhQX0VPTDsKJHRleHQgLj0gIkFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgeW91ciBgcGhwLmluaWA6Ii5QSFBfRU9MOwokdGV4dCAuPSAiICAgIGFsbG93X3VybF9mb3BlbiA9IE9uIjsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICdpb25jdWJlJzoKJHRleHQgPSBQSFBfRU9MLiJZb3VyIGlvbkN1YmUgTG9hZGVyIGV4dGVuc2lvbiAoJGN1cnJlbnQpIGlzIGluY29tcGF0aWJsZSB3aXRoIFBoYXIgZmlsZXMuIi5QSFBfRU9MOwokdGV4dCAuPSAiVXBncmFkZSB0byBpb25DdWJlIDQuMC45IG9yIGhpZ2hlciBvciByZW1vdmUgdGhpcyBsaW5lIChwYXRoIG1heSBiZSBkaWZmZXJlbnQpIGZyb20geW91ciBgcGhwLmluaWAgdG8gZGlzYWJsZSBpdDoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgICAgemVuZF9leHRlbnNpb24gPSAvdXNyL2xpYi9waHA1LzIwMDkwNjI2K2xmcy9pb25jdWJlX2xvYWRlcl9saW5fNS4zLnNvIjsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICdvcGVuc3NsJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgb3BlbnNzbCBleHRlbnNpb24gaXMgbWlzc2luZywgd2hpY2ggbWVhbnMgdGhhdCBzZWN1cmUgSFRUUFMgdHJhbnNmZXJzIGFyZSBpbXBvc3NpYmxlLiIuUEhQX0VPTDsKJHRleHQgLj0gIklmIHBvc3NpYmxlIHlvdSBzaG91bGQgZW5hYmxlIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aCAtLXdpdGgtb3BlbnNzbCI7CmJyZWFrOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigiRGlhZ25vc2VDb21tYW5kOiBVbmtub3duIGVycm9yIHR5cGUgXCIlc1wiLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIsICRlcnJvcikpOwp9CiRvdXQoJHRleHQsICdlcnJvcicpOwp9Cgokb3V0cHV0IC49IFBIUF9FT0w7Cn0KCmlmICghZW1wdHkoJHdhcm5pbmdzKSkgewpmb3JlYWNoICgkd2FybmluZ3MgYXMgJHdhcm5pbmcgPT4gJGN1cnJlbnQpIHsKc3dpdGNoICgkd2FybmluZykgewpjYXNlICdhcGNfY2xpJzoKJHRleHQgPSAiVGhlIGFwYy5lbmFibGVfY2xpIHNldHRpbmcgaXMgaW5jb3JyZWN0LiIuUEhQX0VPTDsKJHRleHQgLj0gIkFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgeW91ciBgcGhwLmluaWA6Ii5QSFBfRU9MOwokdGV4dCAuPSAiICBhcGMuZW5hYmxlX2NsaSA9IE9mZiI7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnemxpYic6CiR0ZXh0ID0gJ1RoZSB6bGliIGV4dGVuc2lvbiBpcyBub3QgbG9hZGVkLCB0aGlzIGNhbiBzbG93IGRvd24gQ29tcG9zZXIgYSBsb3QuJy5QSFBfRU9MOwokdGV4dCAuPSAnSWYgcG9zc2libGUsIGVuYWJsZSBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGggLS13aXRoLXpsaWInLlBIUF9FT0w7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnc2lnY2hpbGQnOgokdGV4dCA9ICJQSFAgd2FzIGNvbXBpbGVkIHdpdGggLS1lbmFibGUtc2lnY2hpbGQgd2hpY2ggY2FuIGNhdXNlIGlzc3VlcyBvbiBzb21lIHBsYXRmb3Jtcy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJSZWNvbXBpbGUgaXQgd2l0aG91dCB0aGlzIGZsYWcgaWYgcG9zc2libGUsIHNlZSBhbHNvOiIuUEhQX0VPTDsKJHRleHQgLj0gIiAgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD0yMjk5OSI7CmJyZWFrOwoKY2FzZSAnY3VybHdyYXBwZXJzJzoKJHRleHQgPSAiUEhQIHdhcyBjb21waWxlZCB3aXRoIC0td2l0aC1jdXJsd3JhcHBlcnMgd2hpY2ggd2lsbCBjYXVzZSBpc3N1ZXMgd2l0aCBIVFRQIGF1dGhlbnRpY2F0aW9uIGFuZCBHaXRIdWIuIi5QSFBfRU9MOwokdGV4dCAuPSAiIFJlY29tcGlsZSBpdCB3aXRob3V0IHRoaXMgZmxhZyBpZiBwb3NzaWJsZSI7CmJyZWFrOwoKY2FzZSAnb3BlbnNzbF92ZXJzaW9uJzoKCiRvcGVuc3NsVmVyc2lvbiA9IHN0cnN0cih0cmltKHN0cnN0cihPUEVOU1NMX1ZFUlNJT05fVEVYVCwgJyAnKSksICcgJywgdHJ1ZSk7CiRvcGVuc3NsVmVyc2lvbiA9ICRvcGVuc3NsVmVyc2lvbiA/OiBPUEVOU1NMX1ZFUlNJT05fVEVYVDsKCiR0ZXh0ID0gIlRoZSBPcGVuU1NMIGxpYnJhcnkgKHskb3BlbnNzbFZlcnNpb259KSB1c2VkIGJ5IFBIUCBkb2VzIG5vdCBzdXBwb3J0IFRMU3YxLjIgb3IgVExTdjEuMS4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJZiBwb3NzaWJsZSB5b3Ugc2hvdWxkIHVwZ3JhZGUgT3BlblNTTCB0byB2ZXJzaW9uIDEuMC4xIG9yIGFib3ZlLiI7CmJyZWFrOwoKY2FzZSAneGRlYnVnX2xvYWRlZCc6CiR0ZXh0ID0gIlRoZSB4ZGVidWcgZXh0ZW5zaW9uIGlzIGxvYWRlZCwgdGhpcyBjYW4gc2xvdyBkb3duIENvbXBvc2VyIGEgbGl0dGxlLiIuUEhQX0VPTDsKJHRleHQgLj0gIiBEaXNhYmxpbmcgaXQgd2hlbiB1c2luZyBDb21wb3NlciBpcyByZWNvbW1lbmRlZC4iOwpicmVhazsKCmNhc2UgJ3hkZWJ1Z19wcm9maWxlJzoKJHRleHQgPSAiVGhlIHhkZWJ1Zy5wcm9maWxlcl9lbmFibGVkIHNldHRpbmcgaXMgZW5hYmxlZCwgdGhpcyBjYW4gc2xvdyBkb3duIENvbXBvc2VyIGEgbG90LiIuUEhQX0VPTDsKJHRleHQgLj0gIkFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgeW91ciBgcGhwLmluaWAgdG8gZGlzYWJsZSBpdDoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgIHhkZWJ1Zy5wcm9maWxlcl9lbmFibGVkID0gMCI7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnb25lZHJpdmUnOgokdGV4dCA9ICJUaGUgV2luZG93cyBPbmVEcml2ZSBmb2xkZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQSFAgdmVyc2lvbnMgYmVsb3cgNy4yLjIzIGFuZCA3LjMuMTAuIi5QSFBfRU9MOwokdGV4dCAuPSAiVXBncmFkZSB5b3VyIFBIUCAoeyRjdXJyZW50fSkgdG8gdXNlIHRoaXMgbG9jYXRpb24gd2l0aCBDb21wb3Nlci4iLlBIUF9FT0w7CmJyZWFrOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigiRGlhZ25vc2VDb21tYW5kOiBVbmtub3duIHdhcm5pbmcgdHlwZSBcIiVzXCIuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIiwgJHdhcm5pbmcpKTsKfQokb3V0KCR0ZXh0LCAnY29tbWVudCcpOwp9Cn0KCmlmICgkZGlzcGxheUluaU1lc3NhZ2UpIHsKJG91dCgkaW5pTWVzc2FnZSwgJ2NvbW1lbnQnKTsKfQoKcmV0dXJuIGNvdW50KCR3YXJuaW5ncykgPT09IDAgJiYgY291bnQoJGVycm9ycykgPT09IDAgPyB0cnVlIDogJG91dHB1dDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29ubmVjdGl2aXR5KCkKewppZiAoIWluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpKSB7CnJldHVybiAnPGluZm8+U0tJUDwvPiA8Y29tbWVudD5CZWNhdXNlIGFsbG93X3VybF9mb3BlbiBpcyBtaXNzaW5nLjwvPic7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHkoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCkKewppZiAoKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpKSB7CnJldHVybiAnPGluZm8+U0tJUDwvPiA8Y29tbWVudD5OZXR3b3JrIGlzIGRpc2FibGVkIGJ5IENPTVBPU0VSX0RJU0FCTEVfTkVUV09SSy48Lz4nOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBEdW1wQXV0b2xvYWRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2R1bXAtYXV0b2xvYWQnKQotPnNldEFsaWFzZXMoWydkdW1wYXV0b2xvYWQnXSkKLT5zZXREZXNjcmlwdGlvbignRHVtcHMgdGhlIGF1dG9sb2FkZXInKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplcyBQU1IwIGFuZCBQU1I0IHBhY2thZ2VzIHRvIGJlIGxvYWRlZCB3aXRoIGNsYXNzbWFwcyB0b28sIGdvb2QgZm9yIHByb2R1Y3Rpb24uJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZWAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1JyksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgb3BlcmF0aW9ucyBidXQgd2lsbCBub3QgZXhlY3V0ZSBhbnl0aGluZy4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0VuYWJsZXMgYXV0b2xvYWQtZGV2IHJ1bGVzLiBDb21wb3NlciB3aWxsIGJ5IGRlZmF1bHQgaW5mZXIgdGhpcyBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0byB0aGUgbGFzdCBpbnN0YWxsIG9yIHVwZGF0ZSAtLW5vLWRldiBzdGF0ZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGF1dG9sb2FkLWRldiBydWxlcy4gQ29tcG9zZXIgd2lsbCBieSBkZWZhdWx0IGluZmVyIHRoaXMgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8gdGhlIGxhc3QgaW5zdGFsbCBvciB1cGRhdGUgLS1uby1kZXYgc3RhdGUuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdC1wc3InLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldHVybiBhIGZhaWxlZCBzdGF0dXMgY29kZSAoMSkgaWYgUFNSLTQgb3IgUFNSLTAgbWFwcGluZyBlcnJvcnMgYXJlIHByZXNlbnQuIFJlcXVpcmVzIC0tb3B0aW1pemUgdG8gd29yay4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgZHVtcC1hdXRvbG9hZDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2R1bXAtYXV0b2xvYWQtZHVtcGF1dG9sb2FkCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdkdW1wLWF1dG9sb2FkJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRpbnN0YWxsYXRpb25NYW5hZ2VyID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCk7CiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKCiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZScpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UnKSB8fCAkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtcHNyJykgJiYgISRvcHRpbWl6ZSAmJiAhJGF1dGhvcml0YXRpdmUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tc3RyaWN0LXBzciBtb2RlIG9ubHkgd29ya3Mgd2l0aCBvcHRpbWl6ZWQgYXV0b2xvYWRlciwgdXNlIC0tb3B0aW1pemUgb3IgLS1jbGFzc21hcC1hdXRob3JpdGF0aXZlIGlmIHlvdSB3YW50IGEgc3RyaWN0IHJldHVybiB2YWx1ZS4nKTsKfQoKaWYgKCRhdXRob3JpdGF0aXZlKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGluZyBvcHRpbWl6ZWQgYXV0b2xvYWQgZmlsZXMgKGF1dGhvcml0YXRpdmUpPC9pbmZvPicpOwp9IGVsc2VpZiAoJG9wdGltaXplKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGluZyBvcHRpbWl6ZWQgYXV0b2xvYWQgZmlsZXM8L2luZm8+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGluZyBhdXRvbG9hZCBmaWxlczwvaW5mbz4nKTsKfQoKJGdlbmVyYXRvciA9ICRjb21wb3Nlci0+Z2V0QXV0b2xvYWRHZW5lcmF0b3IoKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpIHsKJGdlbmVyYXRvci0+c2V0RHJ5UnVuKHRydWUpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKJGdlbmVyYXRvci0+c2V0RGV2TW9kZShmYWxzZSk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdZb3UgY2FuIG5vdCB1c2UgYm90aCAtLW5vLWRldiBhbmQgLS1kZXYgYXMgdGhleSBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIuJyk7Cn0KJGdlbmVyYXRvci0+c2V0RGV2TW9kZSh0cnVlKTsKfQokZ2VuZXJhdG9yLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGF1dGhvcml0YXRpdmUpOwokZ2VuZXJhdG9yLT5zZXRSdW5TY3JpcHRzKHRydWUpOwokZ2VuZXJhdG9yLT5zZXRBcGN1KCRhcGN1LCAkYXBjdVByZWZpeCk7CiRnZW5lcmF0b3ItPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSk7CiRjbGFzc01hcCA9ICRnZW5lcmF0b3ItPmR1bXAoCiRjb25maWcsCiRsb2NhbFJlcG8sCiRwYWNrYWdlLAokaW5zdGFsbGF0aW9uTWFuYWdlciwKJ2NvbXBvc2VyJywKJG9wdGltaXplLApudWxsLAokY29tcG9zZXItPmdldExvY2tlcigpCik7CiRudW1iZXJPZkNsYXNzZXMgPSBjb3VudCgkY2xhc3NNYXApOwoKaWYgKCRhdXRob3JpdGF0aXZlKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGVkIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlcyAoYXV0aG9yaXRhdGl2ZSkgY29udGFpbmluZyAnLiAkbnVtYmVyT2ZDbGFzc2VzIC4nIGNsYXNzZXM8L2luZm8+Jyk7Cn0gZWxzZWlmICgkb3B0aW1pemUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0ZWQgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzIGNvbnRhaW5pbmcgJy4gJG51bWJlck9mQ2xhc3NlcyAuJyBjbGFzc2VzPC9pbmZvPicpOwp9IGVsc2UgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRlZCBhdXRvbG9hZCBmaWxlczwvaW5mbz4nKTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtcHNyJykgJiYgY291bnQoJGNsYXNzTWFwLT5nZXRQc3JWaW9sYXRpb25zKCkpID4gMCkgewpyZXR1cm4gMTsKfQoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKCgoKCmNsYXNzIEV4ZWNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2V4ZWMnKQotPnNldERlc2NyaXB0aW9uKCdFeGVjdXRlcyBhIHZlbmRvcmVkIGJpbmFyeS9zY3JpcHQnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2xpc3QnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FKSwKbmV3IElucHV0QXJndW1lbnQoJ2JpbmFyeScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIGJpbmFyeSB0byBydW4sIGUuZy4gcGhwdW5pdCcsIG51bGwsIGZ1bmN0aW9uICgpIHsKcmV0dXJuICR0aGlzLT5nZXRCaW5hcmllcyhmYWxzZSk7Cn0pLApuZXcgSW5wdXRBcmd1bWVudCgKJ2FyZ3MnLApJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLAonQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGJpbmFyeS4gVXNlIDxpbmZvPi0tPC9pbmZvPiB0byBzZXBhcmF0ZSBmcm9tIGNvbXBvc2VyIGFyZ3VtZW50cycKKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKRXhlY3V0ZXMgYSB2ZW5kb3JlZCBiaW5hcnkvc2NyaXB0LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZXhlYwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcyhmYWxzZSk7CmlmIChjb3VudCgkYmluYXJpZXMpID09PSAwKSB7CnJldHVybjsKfQoKaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ2JpbmFyeScpICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKcmV0dXJuOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRiaW5hcnkgPSAkaW8tPnNlbGVjdCgKJ0JpbmFyeSB0byBydW46ICcsCiRiaW5hcmllcywKJycsCjEsCidJbnZhbGlkIGJpbmFyeSBuYW1lICIlcyInCik7CgokaW5wdXQtPnNldEFyZ3VtZW50KCdiaW5hcnknLCAkYmluYXJpZXNbJGJpbmFyeV0pOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykgfHwgbnVsbCA9PT0gJGlucHV0LT5nZXRBcmd1bWVudCgnYmluYXJ5JykpIHsKJGJpbnMgPSAkdGhpcy0+Z2V0QmluYXJpZXModHJ1ZSk7CmlmIChbXSA9PT0gJGJpbnMpIHsKJGJpbkRpciA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWRpcicpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJObyBiaW5hcmllcyBmb3VuZCBpbiBjb21wb3Nlci5qc29uIG9yIGluIGJpbi1kaXIgKCRiaW5EaXIpIik7Cn0KCiR0aGlzLT5nZXRJTygpLT53cml0ZSgKPDw8RU9UCjxjb21tZW50PkF2YWlsYWJsZSBiaW5hcmllczo8L2NvbW1lbnQ+CkVPVAopOwoKZm9yZWFjaCAoJGJpbnMgYXMgJGJpbikgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoCjw8PEVPVAo8aW5mbz4tICRiaW48L2luZm8+CkVPVAopOwp9CgpyZXR1cm4gMDsKfQoKJGJpbmFyeSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2JpbmFyeScpOwoKJGRpc3BhdGNoZXIgPSAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpOwokZGlzcGF0Y2hlci0+YWRkTGlzdGVuZXIoJ19fZXhlY19jb21tYW5kJywgJGJpbmFyeSk7CgoKCgppZiAoZ2V0Y3dkKCkgIT09ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRJbml0aWFsV29ya2luZ0RpcmVjdG9yeSgpICYmICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRJbml0aWFsV29ya2luZ0RpcmVjdG9yeSgpICE9PSBmYWxzZSkgewp0cnkgewpjaGRpcigkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0SW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkoKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3Qgc3dpdGNoIGJhY2sgdG8gd29ya2luZyBkaXJlY3RvcnkgIicuJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkuJyInLCAwLCAkZSk7Cn0KfQoKcmV0dXJuICRkaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdCgnX19leGVjX2NvbW1hbmQnLCB0cnVlLCAkaW5wdXQtPmdldEFyZ3VtZW50KCdhcmdzJykpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEJpbmFyaWVzKGJvb2wgJGZvckRpc3BsYXkpOiBhcnJheQp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGJpbkRpciA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWRpcicpOwokYmlucyA9IGdsb2IoJGJpbkRpciAuICcvKicpOwokbG9jYWxCaW5zID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldEJpbmFyaWVzKCk7CmlmICgkZm9yRGlzcGxheSkgewokbG9jYWxCaW5zID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGUpIHsKcmV0dXJuICIkZSAobG9jYWwpIjsKfSwgJGxvY2FsQmlucyk7Cn0KCiRiaW5hcmllcyA9IFtdOwpmb3JlYWNoIChhcnJheV9tZXJnZSgkYmlucywgJGxvY2FsQmlucykgYXMgJGJpbikgewoKaWYgKGlzc2V0KCRwcmV2aW91c0JpbikgJiYgJGJpbiA9PT0gJHByZXZpb3VzQmluLicuYmF0Jykgewpjb250aW51ZTsKfQoKJHByZXZpb3VzQmluID0gJGJpbjsKJGJpbmFyaWVzW10gPSBiYXNlbmFtZSgkYmluKTsKfQoKcmV0dXJuICRiaW5hcmllczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCmNsYXNzIEZ1bmRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcy0+c2V0TmFtZSgnZnVuZCcpCi0+c2V0RGVzY3JpcHRpb24oJ0Rpc2NvdmVyIGhvdyB0byBoZWxwIGZ1bmQgdGhlIG1haW50ZW5hbmNlIG9mIHlvdXIgZGVwZW5kZW5jaWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0IG9yIGpzb24nLCAndGV4dCcsIFsndGV4dCcsICdqc29uJ10pLApdKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokcmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRyZW1vdGVSZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkpOwokZnVuZGluZ3MgPSBbXTsKCiRwYWNrYWdlc1RvTG9hZCA9IFtdOwpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KJHBhY2thZ2VzVG9Mb2FkWyRwYWNrYWdlLT5nZXROYW1lKCldID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgoKJHJlc3VsdCA9ICRyZW1vdGVSZXBvcy0+bG9hZFBhY2thZ2VzKCRwYWNrYWdlc1RvTG9hZCwgWydkZXYnID0+IEJhc2VQYWNrYWdlOjpTVEFCSUxJVFlfREVWXSwgW10pOwoKCmZvcmVhY2ggKCRyZXN1bHRbJ3BhY2thZ2VzJ10gYXMgJHBhY2thZ2UpIHsKaWYgKAohJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UKJiYgJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKJiYgJHBhY2thZ2UtPmlzRGVmYXVsdEJyYW5jaCgpCiYmICRwYWNrYWdlLT5nZXRGdW5kaW5nKCkKJiYgaXNzZXQoJHBhY2thZ2VzVG9Mb2FkWyRwYWNrYWdlLT5nZXROYW1lKCldKQopIHsKJGZ1bmRpbmdzID0gJHRoaXMtPmluc2VydEZ1bmRpbmdEYXRhKCRmdW5kaW5ncywgJHBhY2thZ2UpOwp1bnNldCgkcGFja2FnZXNUb0xvYWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp9Cn0KCgpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgfHwgIWlzc2V0KCRwYWNrYWdlc1RvTG9hZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKY29udGludWU7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkcGFja2FnZS0+Z2V0RnVuZGluZygpKSB7CiRmdW5kaW5ncyA9ICR0aGlzLT5pbnNlcnRGdW5kaW5nRGF0YSgkZnVuZGluZ3MsICRwYWNrYWdlKTsKfQp9Cgprc29ydCgkZnVuZGluZ3MpOwoKJGlvID0gJHRoaXMtPmdldElPKCk7CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpOwppZiAoIWluX2FycmF5KCRmb3JtYXQsIFsndGV4dCcsICdqc29uJ10pKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4gU2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLicsICRmb3JtYXQpKTsKCnJldHVybiAxOwp9CgppZiAoJGZ1bmRpbmdzICYmICRmb3JtYXQgPT09ICd0ZXh0JykgewokcHJldiA9IG51bGw7CgokaW8tPndyaXRlKCdUaGUgZm9sbG93aW5nIHBhY2thZ2VzIHdlcmUgZm91bmQgaW4geW91ciBkZXBlbmRlbmNpZXMgd2hpY2ggcHVibGlzaCBmdW5kaW5nIGluZm9ybWF0aW9uOicpOwoKZm9yZWFjaCAoJGZ1bmRpbmdzIGFzICR2ZW5kb3IgPT4gJGxpbmtzKSB7CiRpby0+d3JpdGUoJycpOwokaW8tPndyaXRlKHNwcmludGYoIjxjb21tZW50PiVzPC9jb21tZW50PiIsICR2ZW5kb3IpKTsKZm9yZWFjaCAoJGxpbmtzIGFzICR1cmwgPT4gJHBhY2thZ2VzKSB7CiRsaW5lID0gc3ByaW50ZignICA8aW5mbz4lczwvaW5mbz4nLCBpbXBsb2RlKCcsICcsICRwYWNrYWdlcykpOwoKaWYgKCRwcmV2ICE9PSAkbGluZSkgewokaW8tPndyaXRlKCRsaW5lKTsKJHByZXYgPSAkbGluZTsKfQoKJGlvLT53cml0ZShzcHJpbnRmKCcgICAgPGhyZWY9JXM+JXM8Lz4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkdXJsKSwgJHVybCkpOwp9Cn0KCiRpby0+d3JpdGUoIiIpOwokaW8tPndyaXRlKCJQbGVhc2UgY29uc2lkZXIgZm9sbG93aW5nIHRoZXNlIGxpbmtzIGFuZCBzcG9uc29yaW5nIHRoZSB3b3JrIG9mIHBhY2thZ2UgYXV0aG9ycyEiKTsKJGlvLT53cml0ZSgiVGhhbmsgeW91ISIpOwp9IGVsc2VpZiAoJGZvcm1hdCA9PT0gJ2pzb24nKSB7CiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZSgkZnVuZGluZ3MpKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgiTm8gZnVuZGluZyBsaW5rcyB3ZXJlIGZvdW5kIGluIHlvdXIgcGFja2FnZSBkZXBlbmRlbmNpZXMuIFRoaXMgZG9lc24ndCBtZWFuIHRoZXkgZG9uJ3QgbmVlZCB5b3VyIHN1cHBvcnQhIik7Cn0KCnJldHVybiAwOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbnNlcnRGdW5kaW5nRGF0YShhcnJheSAkZnVuZGluZ3MsIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldEZ1bmRpbmcoKSBhcyAkZnVuZGluZ09wdGlvbikgewpbJHZlbmRvciwgJHBhY2thZ2VOYW1lXSA9IGV4cGxvZGUoJy8nLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpKTsKCmlmIChlbXB0eSgkZnVuZGluZ09wdGlvblsndXJsJ10pKSB7CmNvbnRpbnVlOwp9CiR1cmwgPSAkZnVuZGluZ09wdGlvblsndXJsJ107CmlmICghZW1wdHkoJGZ1bmRpbmdPcHRpb25bJ3R5cGUnXSkgJiYgJGZ1bmRpbmdPcHRpb25bJ3R5cGUnXSA9PT0gJ2dpdGh1YicgJiYgUHJlZzo6aXNNYXRjaCgne15odHRwczovL2dpdGh1Yi5jb20vKFteL10rKSR9JywgJHVybCwgJG1hdGNoKSkgewokdXJsID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy8nLiRtYXRjaFsxXTsKfQokZnVuZGluZ3NbJHZlbmRvcl1bJHVybF1bXSA9ICRwYWNrYWdlTmFtZTsKfQoKcmV0dXJuICRmdW5kaW5nczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XFN0cmluZ0lucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgR2xvYmFsQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJGFwcGxpY2F0aW9uID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCk7CmlmICgkaW5wdXQtPm11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3IoJ2NvbW1hbmQtbmFtZScpKSB7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKENvbW1hbmQgJGNvbW1hbmQpIHsKcmV0dXJuICRjb21tYW5kLT5pc0hpZGRlbigpID8gbnVsbCA6ICRjb21tYW5kLT5nZXROYW1lKCk7Cn0sICRhcHBsaWNhdGlvbi0+YWxsKCkpKSkpOwoKcmV0dXJuOwp9CgppZiAoJGFwcGxpY2F0aW9uLT5oYXMoJGNvbW1hbmROYW1lID0gJGlucHV0LT5nZXRBcmd1bWVudCgnY29tbWFuZC1uYW1lJykpKSB7CiRpbnB1dCA9ICR0aGlzLT5wcmVwYXJlU3ViY29tbWFuZElucHV0KCRpbnB1dCwgdHJ1ZSk7CiRpbnB1dCA9IENvbXBsZXRpb25JbnB1dDo6ZnJvbVN0cmluZygkaW5wdXQtPl9fdG9TdHJpbmcoKSwgMik7CiRjb21tYW5kID0gJGFwcGxpY2F0aW9uLT5maW5kKCRjb21tYW5kTmFtZSk7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbigpOwoKJGlucHV0LT5iaW5kKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwokY29tbWFuZC0+Y29tcGxldGUoJGlucHV0LCAkc3VnZ2VzdGlvbnMpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnZ2xvYmFsJykKLT5zZXREZXNjcmlwdGlvbignQWxsb3dzIHJ1bm5pbmcgY29tbWFuZHMgaW4gdGhlIGdsb2JhbCBjb21wb3NlciBkaXIgKCRDT01QT1NFUl9IT01FKScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdjb21tYW5kLW5hbWUnLCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJycpLApuZXcgSW5wdXRBcmd1bWVudCgnYXJncycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICcnKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVXNlIHRoaXMgY29tbWFuZCBhcyBhIHdyYXBwZXIgdG8gcnVuIG90aGVyIENvbXBvc2VyIGNvbW1hbmRzCndpdGhpbiB0aGUgZ2xvYmFsIGNvbnRleHQgb2YgQ09NUE9TRVJfSE9NRS4KCllvdSBjYW4gdXNlIHRoaXMgdG8gaW5zdGFsbCBDTEkgdXRpbGl0aWVzIGdsb2JhbGx5LCBhbGwgeW91IG5lZWQKaXMgdG8gYWRkIHRoZSBDT01QT1NFUl9IT01FL3ZlbmRvci9iaW4gZGlyIHRvIHlvdXIgUEFUSCBlbnYgdmFyLgoKQ09NUE9TRVJfSE9NRSBpcyBjOlxVc2Vyc1w8dXNlcj5cQXBwRGF0YVxSb2FtaW5nXENvbXBvc2VyIG9uIFdpbmRvd3MKYW5kIC9ob21lLzx1c2VyPi8uY29tcG9zZXIgb24gdW5peCBzeXN0ZW1zLgoKSWYgeW91ciBzeXN0ZW0gdXNlcyBmcmVlZGVza3RvcC5vcmcgc3RhbmRhcmRzLCB0aGVuIGl0IHdpbGwgZmlyc3QgY2hlY2sKWERHX0NPTkZJR19IT01FIG9yIGRlZmF1bHQgdG8gL2hvbWUvPHVzZXI+Ly5jb25maWcvY29tcG9zZXIKCk5vdGU6IFRoaXMgcGF0aCBtYXkgdmFyeSBkZXBlbmRpbmcgb24gY3VzdG9taXphdGlvbnMgdG8gYmluLWRpciBpbgpjb21wb3Nlci5qc29uIG9yIHRoZSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIENPTVBPU0VSX0JJTl9ESVIuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNnbG9iYWwKRU9UCikKOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewoKaWYgKCFtZXRob2RfZXhpc3RzKCRpbnB1dCwgJ19fdG9TdHJpbmcnKSkgeyAKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYW4gSW5wdXQgaW5zdGFuY2UgdGhhdCBpcyBzdHJpbmdhYmxlLCBnb3QgJy5nZXRfY2xhc3MoJGlucHV0KSk7Cn0KCgokdG9rZW5zID0gUHJlZzo6c3BsaXQoJ3tccyt9JywgJGlucHV0LT5fX3RvU3RyaW5nKCkpOwokYXJncyA9IFtdOwpmb3JlYWNoICgkdG9rZW5zIGFzICR0b2tlbikgewppZiAoJHRva2VuICYmICR0b2tlblswXSAhPT0gJy0nKSB7CiRhcmdzW10gPSAkdG9rZW47CmlmIChjb3VudCgkYXJncykgPj0gMikgewpicmVhazsKfQp9Cn0KCgppZiAoY291bnQoJGFyZ3MpIDwgMikgewpyZXR1cm4gcGFyZW50OjpydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKJGlucHV0ID0gJHRoaXMtPnByZXBhcmVTdWJjb21tYW5kSW5wdXQoJGlucHV0KTsKCnJldHVybiAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZVN1YmNvbW1hbmRJbnB1dChJbnB1dEludGVyZmFjZSAkaW5wdXQsIGJvb2wgJHF1aWV0ID0gZmFsc2UpOiBTdHJpbmdJbnB1dAp7CgppZiAoIW1ldGhvZF9leGlzdHMoJGlucHV0LCAnX190b1N0cmluZycpKSB7IAp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhbiBJbnB1dCBpbnN0YW5jZSB0aGF0IGlzIHN0cmluZ2FibGUsIGdvdCAnLmdldF9jbGFzcygkaW5wdXQpKTsKfQoKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUicpKSB7ClBsYXRmb3JtOjpjbGVhckVudignQ09NUE9TRVInKTsKfQoKCiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKJGhvbWUgPSAkY29uZmlnLT5nZXQoJ2hvbWUnKTsKCmlmICghaXNfZGlyKCRob21lKSkgewokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokZnMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkaG9tZSk7CmlmICghaXNfZGlyKCRob21lKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBjcmVhdGUgaG9tZSBkaXJlY3RvcnknKTsKfQp9Cgp0cnkgewpjaGRpcigkaG9tZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3Qgc3dpdGNoIHRvIGhvbWUgZGlyZWN0b3J5ICInLiRob21lLiciJywgMCwgJGUpOwp9CmlmICghJHF1aWV0KSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5DaGFuZ2VkIGN1cnJlbnQgZGlyZWN0b3J5IHRvICcuJGhvbWUuJzwvaW5mbz4nKTsKfQoKCiRpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dChQcmVnOjpyZXBsYWNlKCd7XGJnKD86bCg/Om8oPzpiKD86YSg/OmwpPyk/KT8pPyk/XGJ9JywgJycsICRpbnB1dC0+X190b1N0cmluZygpLCAxKSk7CiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5yZXNldENvbXBvc2VyKCk7CgpyZXR1cm4gJGlucHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQcm94eUNvbW1hbmQoKTogYm9vbAp7CnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIEhvbWVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdicm93c2UnKQotPnNldEFsaWFzZXMoWydob21lJ10pCi0+c2V0RGVzY3JpcHRpb24oJ09wZW5zIHRoZSBwYWNrYWdlXCdzIHJlcG9zaXRvcnkgVVJMIG9yIGhvbWVwYWdlIGluIHlvdXIgYnJvd3NlcicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnUGFja2FnZShzKSB0byBicm93c2UgdG8uJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKCkpLApuZXcgSW5wdXRPcHRpb24oJ2hvbWVwYWdlJywgJ0gnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wZW4gdGhlIGhvbWVwYWdlIGluc3RlYWQgb2YgdGhlIHJlcG9zaXRvcnkgVVJMLicpLApuZXcgSW5wdXRPcHRpb24oJ3Nob3cnLCAncycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBzaG93IHRoZSBob21lcGFnZSBvciByZXBvc2l0b3J5IFVSTC4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIGhvbWUgY29tbWFuZCBvcGVucyBvciBzaG93cyBhIHBhY2thZ2UncyByZXBvc2l0b3J5IFVSTCBvcgpob21lcGFnZSBpbiB5b3VyIGRlZmF1bHQgYnJvd3Nlci4KClRvIG9wZW4gdGhlIGhvbWVwYWdlIGJ5IGRlZmF1bHQsIHVzZSAtSCBvciAtLWhvbWVwYWdlLgpUbyBzaG93IGluc3RlYWQgb2Ygb3BlbiB0aGUgcmVwb3NpdG9yeSBvciBob21lcGFnZSBVUkwsIHVzZSAtcyBvciAtLXNob3cuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNicm93c2UtaG9tZQpFT1QKKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRyZXBvcyA9ICR0aGlzLT5pbml0aWFsaXplUmVwb3MoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CiRyZXR1cm4gPSAwOwoKJHBhY2thZ2VzID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKTsKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJGlvLT53cml0ZUVycm9yKCdObyBwYWNrYWdlIHNwZWNpZmllZCwgb3BlbmluZyBob21lcGFnZSBmb3IgdGhlIHJvb3QgcGFja2FnZScpOwokcGFja2FnZXMgPSBbJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKV07Cn0KCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZU5hbWUpIHsKJGhhbmRsZWQgPSBmYWxzZTsKJHBhY2thZ2VFeGlzdHMgPSBmYWxzZTsKZm9yZWFjaCAoJHJlcG9zIGFzICRyZXBvKSB7CmZvcmVhY2ggKCRyZXBvLT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lKSBhcyAkcGFja2FnZSkgewokcGFja2FnZUV4aXN0cyA9IHRydWU7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkdGhpcy0+aGFuZGxlUGFja2FnZSgkcGFja2FnZSwgJGlucHV0LT5nZXRPcHRpb24oJ2hvbWVwYWdlJyksICRpbnB1dC0+Z2V0T3B0aW9uKCdzaG93JykpKSB7CiRoYW5kbGVkID0gdHJ1ZTsKYnJlYWsgMjsKfQp9Cn0KCmlmICghJHBhY2thZ2VFeGlzdHMpIHsKJHJldHVybiA9IDE7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGFja2FnZSAnLiRwYWNrYWdlTmFtZS4nIG5vdCBmb3VuZDwvd2FybmluZz4nKTsKfQoKaWYgKCEkaGFuZGxlZCkgewokcmV0dXJuID0gMTsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLigkaW5wdXQtPmdldE9wdGlvbignaG9tZXBhZ2UnKSA/ICdJbnZhbGlkIG9yIG1pc3NpbmcgaG9tZXBhZ2UnIDogJ0ludmFsaWQgb3IgbWlzc2luZyByZXBvc2l0b3J5IFVSTCcpLicgZm9yICcuJHBhY2thZ2VOYW1lLic8L3dhcm5pbmc+Jyk7Cn0KfQoKcmV0dXJuICRyZXR1cm47Cn0KCnByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUGFja2FnZShDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJHNob3dIb21lcGFnZSwgYm9vbCAkc2hvd09ubHkpOiBib29sCnsKJHN1cHBvcnQgPSAkcGFja2FnZS0+Z2V0U3VwcG9ydCgpOwokdXJsID0gJHN1cHBvcnRbJ3NvdXJjZSddID8/ICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKTsKaWYgKCEkdXJsIHx8ICRzaG93SG9tZXBhZ2UpIHsKJHVybCA9ICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpOwp9CgppZiAoISR1cmwgfHwgIWZpbHRlcl92YXIoJHVybCwgRklMVEVSX1ZBTElEQVRFX1VSTCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHNob3dPbmx5KSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZShzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4nLCAkdXJsKSk7Cn0gZWxzZSB7CiR0aGlzLT5vcGVuQnJvd3NlcigkdXJsKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3BlbkJyb3dzZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHVybCA9IFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR1cmwpOwoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCR0aGlzLT5nZXRJTygpKTsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokcHJvY2Vzcy0+ZXhlY3V0ZSgnc3RhcnQgIndlYiIgZXhwbG9yZXIgJyAuICR1cmwsICRvdXRwdXQpOwoKcmV0dXJuOwp9CgokbGludXggPSAkcHJvY2Vzcy0+ZXhlY3V0ZSgnd2hpY2ggeGRnLW9wZW4nLCAkb3V0cHV0KTsKJG9zeCA9ICRwcm9jZXNzLT5leGVjdXRlKCd3aGljaCBvcGVuJywgJG91dHB1dCk7CgppZiAoMCA9PT0gJGxpbnV4KSB7CiRwcm9jZXNzLT5leGVjdXRlKCd4ZGctb3BlbiAnIC4gJHVybCwgJG91dHB1dCk7Cn0gZWxzZWlmICgwID09PSAkb3N4KSB7CiRwcm9jZXNzLT5leGVjdXRlKCdvcGVuICcgLiAkdXJsLCAkb3V0cHV0KTsKfSBlbHNlIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ05vIHN1aXRhYmxlIGJyb3dzZXIgb3BlbmluZyBjb21tYW5kIGZvdW5kLCBvcGVuIHlvdXJzZWxmOiAnIC4gJHVybCk7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdGlhbGl6ZVJlcG9zKCk6IGFycmF5CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CgppZiAoJGNvbXBvc2VyKSB7CnJldHVybiBhcnJheV9tZXJnZSgKW25ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpXSwgClskY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpXSwgCiRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkgCik7Cn0KCnJldHVybiBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCR0aGlzLT5nZXRJTygpKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcnJheUlucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxGb3JtYXR0ZXJIZWxwZXI7CgoKCgoKY2xhc3MgSW5pdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CnVzZSBQYWNrYWdlRGlzY292ZXJ5VHJhaXQ7CgoKcHJpdmF0ZSAkZ2l0Q29uZmlnOwoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2luaXQnKQotPnNldERlc2NyaXB0aW9uKCdDcmVhdGVzIGEgYmFzaWMgY29tcG9zZXIuanNvbiBmaWxlIGluIGN1cnJlbnQgZGlyZWN0b3J5JykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduYW1lJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnTmFtZSBvZiB0aGUgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ2Rlc2NyaXB0aW9uJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRGVzY3JpcHRpb24gb2YgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ2F1dGhvcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0F1dGhvciBuYW1lIG9mIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCd0eXBlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX09QVElPTkFMLCAnVHlwZSBvZiBwYWNrYWdlIChlLmcuIGxpYnJhcnksIHByb2plY3QsIG1ldGFwYWNrYWdlLCBjb21wb3Nlci1wbHVnaW4pJyksCm5ldyBJbnB1dE9wdGlvbignaG9tZXBhZ2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdIb21lcGFnZSBvZiBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbigncmVxdWlyZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSB8IElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1BhY2thZ2UgdG8gcmVxdWlyZSB3aXRoIGEgdmVyc2lvbiBjb25zdHJhaW50LCBlLmcuIGZvby9iYXI6MS4wLjAgb3IgZm9vL2Jhcj0xLjAuMCBvciAiZm9vL2JhciAxLjAuMCInLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2VJbmNsUGxhdGZvcm0oKSksCm5ldyBJbnB1dE9wdGlvbigncmVxdWlyZS1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVkgfCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdQYWNrYWdlIHRvIHJlcXVpcmUgZm9yIGRldmVsb3BtZW50IHdpdGggYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gZm9vL2JhcjoxLjAuMCBvciBmb28vYmFyPTEuMC4wIG9yICJmb28vYmFyIDEuMC4wIicsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpKSwKbmV3IElucHV0T3B0aW9uKCdzdGFiaWxpdHknLCAncycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ01pbmltdW0gc3RhYmlsaXR5IChlbXB0eSBvciBvbmUgb2Y6ICcuaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXMpKS4nKScpLApuZXcgSW5wdXRPcHRpb24oJ2xpY2Vuc2UnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0xpY2Vuc2Ugb2YgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3JlcG9zaXRvcnknLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdBZGQgY3VzdG9tIHJlcG9zaXRvcmllcywgZWl0aGVyIGJ5IFVSTCBvciB1c2luZyBKU09OIGFycmF5cycpLApuZXcgSW5wdXRPcHRpb24oJ2F1dG9sb2FkJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBZGQgUFNSLTQgYXV0b2xvYWQgbWFwcGluZy4gTWFwcyB5b3VyIHBhY2thZ2VcJ3MgbmFtZXNwYWNlIHRvIHRoZSBwcm92aWRlZCBkaXJlY3RvcnkuIChFeHBlY3RzIGEgcmVsYXRpdmUgcGF0aCwgZS5nLiBzcmMvKScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+aW5pdDwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGEgYmFzaWMgY29tcG9zZXIuanNvbiBmaWxlCmluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGluaXQ8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNpbml0CkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRhbGxvd2xpc3QgPSBbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnYXV0aG9yJywgJ3R5cGUnLCAnaG9tZXBhZ2UnLCAncmVxdWlyZScsICdyZXF1aXJlLWRldicsICdzdGFiaWxpdHknLCAnbGljZW5zZScsICdhdXRvbG9hZCddOwokb3B0aW9ucyA9IGFycmF5X2ZpbHRlcihhcnJheV9pbnRlcnNlY3Rfa2V5KCRpbnB1dC0+Z2V0T3B0aW9ucygpLCBhcnJheV9mbGlwKCRhbGxvd2xpc3QpKSk7CgppZiAoaXNzZXQoJG9wdGlvbnNbJ25hbWUnXSkgJiYgIVByZWc6OmlzTWF0Y2goJ3teW2EtejAtOV8uLV0rL1thLXowLTlfLi1dKyR9RCcsICRvcHRpb25zWyduYW1lJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonVGhlIHBhY2thZ2UgbmFtZSAnLiRvcHRpb25zWyduYW1lJ10uJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgYmUgbG93ZXJjYXNlIGFuZCBoYXZlIGEgdmVuZG9yIG5hbWUsIGEgZm9yd2FyZCBzbGFzaCwgYW5kIGEgcGFja2FnZSBuYW1lLCBtYXRjaGluZzogW2EtejAtOV8uLV0rL1thLXowLTlfLi1dKycKKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydhdXRob3InXSkpIHsKJG9wdGlvbnNbJ2F1dGhvcnMnXSA9ICR0aGlzLT5mb3JtYXRBdXRob3JzKCRvcHRpb25zWydhdXRob3InXSk7CnVuc2V0KCRvcHRpb25zWydhdXRob3InXSk7Cn0KCiRyZXBvc2l0b3JpZXMgPSAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpOwppZiAoY291bnQoJHJlcG9zaXRvcmllcykgPiAwKSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJGlvKTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokb3B0aW9uc1sncmVwb3NpdG9yaWVzJ11bXSA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG8sIHRydWUpOwp9Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snc3RhYmlsaXR5J10pKSB7CiRvcHRpb25zWydtaW5pbXVtLXN0YWJpbGl0eSddID0gJG9wdGlvbnNbJ3N0YWJpbGl0eSddOwp1bnNldCgkb3B0aW9uc1snc3RhYmlsaXR5J10pOwp9Cgokb3B0aW9uc1sncmVxdWlyZSddID0gaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUnXSkgPyAkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRvcHRpb25zWydyZXF1aXJlJ10pIDogbmV3IFxzdGRDbGFzczsKaWYgKFtdID09PSAkb3B0aW9uc1sncmVxdWlyZSddKSB7CiRvcHRpb25zWydyZXF1aXJlJ10gPSBuZXcgXHN0ZENsYXNzOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pKSB7CiRvcHRpb25zWydyZXF1aXJlLWRldiddID0gJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSk7CmlmIChbXSA9PT0gJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pIHsKJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KCgokYXV0b2xvYWRQYXRoID0gbnVsbDsKaWYgKGlzc2V0KCRvcHRpb25zWydhdXRvbG9hZCddKSkgewokYXV0b2xvYWRQYXRoID0gJG9wdGlvbnNbJ2F1dG9sb2FkJ107CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwokb3B0aW9uc1snYXV0b2xvYWQnXSA9IChvYmplY3QpIFsKJ3Bzci00JyA9PiBbCiRuYW1lc3BhY2UgLiAnXFwnID0+ICRhdXRvbG9hZFBhdGgsCl0sCl07Cn0KCiRmaWxlID0gbmV3IEpzb25GaWxlKEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpKTsKJGpzb24gPSBKc29uRmlsZTo6ZW5jb2RlKCRvcHRpb25zKTsKCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoWycnLCAkanNvbiwgJyddKTsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbignRG8geW91IGNvbmZpcm0gZ2VuZXJhdGlvbiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNvbW1hbmQgYWJvcnRlZDwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQp9IGVsc2UgewppZiAoanNvbl9lbmNvZGUoJG9wdGlvbnMpID09PSAneyJyZXF1aXJlIjp7fX0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IGhhdmUgdG8gcnVuIHRoaXMgY29tbWFuZCBpbiBpbnRlcmFjdGl2ZSBtb2RlLCBvciBzcGVjaWZ5IGF0IGxlYXN0IHNvbWUgZGF0YSB1c2luZyAtLW5hbWUsIC0tcmVxdWlyZSwgZXRjLicpOwp9CgokaW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kZmlsZS0+Z2V0UGF0aCgpKTsKfQoKJGZpbGUtPndyaXRlKCRvcHRpb25zKTsKdHJ5IHsKJGZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2NoZW1hIHZhbGlkYXRpb24gZXJyb3IsIGFib3J0aW5nPC9lcnJvcj4nKTsKJGVycm9ycyA9ICcgLSAnIC4gaW1wbG9kZShQSFBfRU9MIC4gJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CiRpby0+d3JpdGVFcnJvcigkZS0+Z2V0TWVzc2FnZSgpIC4gJzonIC4gUEhQX0VPTCAuICRlcnJvcnMpOwpTaWxlbmNlcjo6Y2FsbCgndW5saW5rJywgJGZpbGUtPmdldFBhdGgoKSk7CgpyZXR1cm4gMTsKfQoKCmlmICgkYXV0b2xvYWRQYXRoKSB7CiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkYXV0b2xvYWRQYXRoKTsKCgppZiAoISR0aGlzLT5oYXNEZXBlbmRlbmNpZXMoJG9wdGlvbnMpKSB7CiR0aGlzLT5ydW5EdW1wQXV0b2xvYWRDb21tYW5kKCRvdXRwdXQpOwp9Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiBpc19kaXIoJy5naXQnKSkgewokaWdub3JlRmlsZSA9IHJlYWxwYXRoKCcuZ2l0aWdub3JlJyk7CgppZiAoZmFsc2UgPT09ICRpZ25vcmVGaWxlKSB7CiRpZ25vcmVGaWxlID0gcmVhbHBhdGgoJy4nKSAuICcvLmdpdGlnbm9yZSc7Cn0KCmlmICghJHRoaXMtPmhhc1ZlbmRvcklnbm9yZSgkaWdub3JlRmlsZSkpIHsKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRoZSA8aW5mbz52ZW5kb3I8L2luZm8+IGRpcmVjdG9yeSBhZGRlZCB0byB5b3VyIDxpbmZvPi5naXRpZ25vcmU8L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKCmlmICgkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiR0aGlzLT5hZGRWZW5kb3JJZ25vcmUoJGlnbm9yZUZpbGUpOwp9Cn0KfQoKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzIG5vdyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiAkdGhpcy0+aGFzRGVwZW5kZW5jaWVzKCRvcHRpb25zKSAmJiAkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiR0aGlzLT51cGRhdGVEZXBlbmRlbmNpZXMoJG91dHB1dCk7Cn0KCgppZiAoJGF1dG9sb2FkUGF0aCkgewokbmFtZXNwYWNlID0gJHRoaXMtPm5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSgoc3RyaW5nKSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpKTsKCiRpby0+d3JpdGVFcnJvcignUFNSLTQgYXV0b2xvYWRpbmcgY29uZmlndXJlZC4gVXNlICI8Y29tbWVudD5uYW1lc3BhY2UgJy4kbmFtZXNwYWNlLic7PC9jb21tZW50PiIgaW4gJy4kYXV0b2xvYWRQYXRoKTsKJGlvLT53cml0ZUVycm9yKCdJbmNsdWRlIHRoZSBDb21wb3NlciBhdXRvbG9hZGVyIHdpdGg6IDxjb21tZW50PnJlcXVpcmUgXCd2ZW5kb3IvYXV0b2xvYWQucGhwXCc7PC9jb21tZW50PicpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJhY3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokZ2l0ID0gJHRoaXMtPmdldEdpdENvbmZpZygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRmb3JtYXR0ZXIgPSAkdGhpcy0+Z2V0SGVscGVyU2V0KCktPmdldCgnZm9ybWF0dGVyJyk7CgoKJHJlcG9zaXRvcmllcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdyZXBvc2l0b3J5Jyk7CmlmIChjb3VudCgkcmVwb3NpdG9yaWVzKSA+IDApIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwokaW8tPmxvYWRDb25maWd1cmF0aW9uKCRjb25maWcpOwokcmVwb01hbmFnZXIgPSBSZXBvc2l0b3J5RmFjdG9yeTo6bWFuYWdlcigkaW8sICRjb25maWcpOwoKJHJlcG9zID0gW25ldyBQbGF0Zm9ybVJlcG9zaXRvcnldOwokY3JlYXRlRGVmYXVsdFBhY2thZ2lzdFJlcG8gPSB0cnVlOwpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CiRyZXBvQ29uZmlnID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNvbmZpZ0Zyb21TdHJpbmcoJGlvLCAkY29uZmlnLCAkcmVwbywgdHJ1ZSk7CmlmICgKKGlzc2V0KCRyZXBvQ29uZmlnWydwYWNrYWdpc3QnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0JyA9PiBmYWxzZV0pCnx8IChpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0Lm9yZyddKSAmJiAkcmVwb0NvbmZpZyA9PT0gWydwYWNrYWdpc3Qub3JnJyA9PiBmYWxzZV0pCikgewokY3JlYXRlRGVmYXVsdFBhY2thZ2lzdFJlcG8gPSBmYWxzZTsKY29udGludWU7Cn0KJHJlcG9zW10gPSBSZXBvc2l0b3J5RmFjdG9yeTo6Y3JlYXRlUmVwbygkaW8sICRjb25maWcsICRyZXBvQ29uZmlnLCAkcmVwb01hbmFnZXIpOwp9CgppZiAoJGNyZWF0ZURlZmF1bHRQYWNrYWdpc3RSZXBvKSB7CiRyZXBvc1tdID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCBbCid0eXBlJyA9PiAnY29tcG9zZXInLAondXJsJyA9PiAnaHR0cHM6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnLApdLCAkcmVwb01hbmFnZXIpOwp9CgokdGhpcy0+cmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkcmVwb3MpOwp1bnNldCgkcmVwb3MsICRjb25maWcsICRyZXBvc2l0b3JpZXMpOwp9CgokaW8tPndyaXRlRXJyb3IoWwonJywKJGZvcm1hdHRlci0+Zm9ybWF0QmxvY2soJ1dlbGNvbWUgdG8gdGhlIENvbXBvc2VyIGNvbmZpZyBnZW5lcmF0b3InLCAnYmc9Ymx1ZTtmZz13aGl0ZScsIHRydWUpLAonJywKXSk7CgoKJGlvLT53cml0ZUVycm9yKFsKJycsCidUaGlzIGNvbW1hbmQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCBjcmVhdGluZyB5b3VyIGNvbXBvc2VyLmpzb24gY29uZmlnLicsCicnLApdKTsKCiRjd2QgPSByZWFscGF0aCgiLiIpOwoKJG5hbWUgPSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpOwppZiAobnVsbCA9PT0gJG5hbWUpIHsKJG5hbWUgPSBiYXNlbmFtZSgkY3dkKTsKJG5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7KD86KFthLXpdKShbQS1aXSl8KFtBLVpdKShbQS1aXVthLXpdKSl9JywgJ1xcMVxcMy1cXDJcXDQnLCAkbmFtZSk7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CmlmICghZW1wdHkoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfVkVORE9SJ10pKSB7CiRuYW1lID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfVkVORE9SJ10gLiAnLycgLiAkbmFtZTsKfSBlbHNlaWYgKGlzc2V0KCRnaXRbJ2dpdGh1Yi51c2VyJ10pKSB7CiRuYW1lID0gJGdpdFsnZ2l0aHViLnVzZXInXSAuICcvJyAuICRuYW1lOwp9IGVsc2VpZiAoIWVtcHR5KCRfU0VSVkVSWydVU0VSTkFNRSddKSkgewokbmFtZSA9ICRfU0VSVkVSWydVU0VSTkFNRSddIC4gJy8nIC4gJG5hbWU7Cn0gZWxzZWlmICghZW1wdHkoJF9TRVJWRVJbJ1VTRVInXSkpIHsKJG5hbWUgPSAkX1NFUlZFUlsnVVNFUiddIC4gJy8nIC4gJG5hbWU7Cn0gZWxzZWlmIChnZXRfY3VycmVudF91c2VyKCkpIHsKJG5hbWUgPSBnZXRfY3VycmVudF91c2VyKCkgLiAnLycgLiAkbmFtZTsKfSBlbHNlIHsKCiRuYW1lIC49ICcvJyAuICRuYW1lOwp9CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7Cn0KCiRuYW1lID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ1BhY2thZ2UgbmFtZSAoPHZlbmRvcj4vPG5hbWU+KSBbPGNvbW1lbnQ+Jy4kbmFtZS4nPC9jb21tZW50Pl06ICcsCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRuYW1lKSB7CmlmIChudWxsID09PSAkdmFsdWUpIHsKcmV0dXJuICRuYW1lOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teW2EtejAtOV8uLV0rL1thLXowLTlfLi1dKyR9RCcsICR2YWx1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCidUaGUgcGFja2FnZSBuYW1lICcuJHZhbHVlLicgaXMgaW52YWxpZCwgaXQgc2hvdWxkIGJlIGxvd2VyY2FzZSBhbmQgaGF2ZSBhIHZlbmRvciBuYW1lLCBhIGZvcndhcmQgc2xhc2gsIGFuZCBhIHBhY2thZ2UgbmFtZSwgbWF0Y2hpbmc6IFthLXowLTlfLi1dKy9bYS16MC05Xy4tXSsnCik7Cn0KCnJldHVybiAkdmFsdWU7Cn0sCm51bGwsCiRuYW1lCik7CiRpbnB1dC0+c2V0T3B0aW9uKCduYW1lJywgJG5hbWUpOwoKJGRlc2NyaXB0aW9uID0gJGlucHV0LT5nZXRPcHRpb24oJ2Rlc2NyaXB0aW9uJykgPzogbnVsbDsKJGRlc2NyaXB0aW9uID0gJGlvLT5hc2soCidEZXNjcmlwdGlvbiBbPGNvbW1lbnQ+Jy4kZGVzY3JpcHRpb24uJzwvY29tbWVudD5dOiAnLAokZGVzY3JpcHRpb24KKTsKJGlucHV0LT5zZXRPcHRpb24oJ2Rlc2NyaXB0aW9uJywgJGRlc2NyaXB0aW9uKTsKCmlmIChudWxsID09PSAkYXV0aG9yID0gJGlucHV0LT5nZXRPcHRpb24oJ2F1dGhvcicpKSB7CmlmICghZW1wdHkoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfQVVUSE9SJ10pKSB7CiRhdXRob3JfbmFtZSA9ICRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0FVVEhPUiddOwp9IGVsc2VpZiAoaXNzZXQoJGdpdFsndXNlci5uYW1lJ10pKSB7CiRhdXRob3JfbmFtZSA9ICRnaXRbJ3VzZXIubmFtZSddOwp9CgppZiAoIWVtcHR5KCRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0VNQUlMJ10pKSB7CiRhdXRob3JfZW1haWwgPSAkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9FTUFJTCddOwp9IGVsc2VpZiAoaXNzZXQoJGdpdFsndXNlci5lbWFpbCddKSkgewokYXV0aG9yX2VtYWlsID0gJGdpdFsndXNlci5lbWFpbCddOwp9CgppZiAoaXNzZXQoJGF1dGhvcl9uYW1lLCAkYXV0aG9yX2VtYWlsKSkgewokYXV0aG9yID0gc3ByaW50ZignJXMgPCVzPicsICRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCk7Cn0KfQoKJGF1dGhvciA9ICRpby0+YXNrQW5kVmFsaWRhdGUoCidBdXRob3IgWycuKGlzX3N0cmluZygkYXV0aG9yKSA/ICc8Y29tbWVudD4nLiRhdXRob3IuJzwvY29tbWVudD4sICcgOiAnJykgLiAnbiB0byBza2lwXTogJywKZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkYXV0aG9yKSB7CmlmICgkdmFsdWUgPT09ICduJyB8fCAkdmFsdWUgPT09ICdubycpIHsKcmV0dXJuOwp9CiR2YWx1ZSA9ICR2YWx1ZSA/OiAkYXV0aG9yOwokYXV0aG9yID0gJHRoaXMtPnBhcnNlQXV0aG9yU3RyaW5nKCR2YWx1ZSA/PyAnJyk7CgppZiAoJGF1dGhvclsnZW1haWwnXSA9PT0gbnVsbCkgewpyZXR1cm4gJGF1dGhvclsnbmFtZSddOwp9CgpyZXR1cm4gc3ByaW50ZignJXMgPCVzPicsICRhdXRob3JbJ25hbWUnXSwgJGF1dGhvclsnZW1haWwnXSk7Cn0sCm51bGwsCiRhdXRob3IKKTsKJGlucHV0LT5zZXRPcHRpb24oJ2F1dGhvcicsICRhdXRob3IpOwoKJG1pbmltdW1TdGFiaWxpdHkgPSAkaW5wdXQtPmdldE9wdGlvbignc3RhYmlsaXR5JykgPzogbnVsbDsKJG1pbmltdW1TdGFiaWxpdHkgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonTWluaW11bSBTdGFiaWxpdHkgWzxjb21tZW50PicuJG1pbmltdW1TdGFiaWxpdHkuJzwvY29tbWVudD5dOiAnLApzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkbWluaW11bVN0YWJpbGl0eSkgewppZiAobnVsbCA9PT0gJHZhbHVlKSB7CnJldHVybiAkbWluaW11bVN0YWJpbGl0eTsKfQoKaWYgKCFpc3NldChCYXNlUGFja2FnZTo6JHN0YWJpbGl0aWVzWyR2YWx1ZV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonSW52YWxpZCBtaW5pbXVtIHN0YWJpbGl0eSAiJy4kdmFsdWUuJyIuIE11c3QgYmUgZW1wdHkgb3Igb25lIG9mOiAnLgppbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllcykpCik7Cn0KCnJldHVybiAkdmFsdWU7Cn0sCm51bGwsCiRtaW5pbXVtU3RhYmlsaXR5Cik7CiRpbnB1dC0+c2V0T3B0aW9uKCdzdGFiaWxpdHknLCAkbWluaW11bVN0YWJpbGl0eSk7CgokdHlwZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCd0eXBlJykgPzogZmFsc2U7CiR0eXBlID0gJGlvLT5hc2soCidQYWNrYWdlIFR5cGUgKGUuZy4gbGlicmFyeSwgcHJvamVjdCwgbWV0YXBhY2thZ2UsIGNvbXBvc2VyLXBsdWdpbikgWzxjb21tZW50PicuJHR5cGUuJzwvY29tbWVudD5dOiAnLAokdHlwZQopOwokaW5wdXQtPnNldE9wdGlvbigndHlwZScsICR0eXBlKTsKCmlmIChudWxsID09PSAkbGljZW5zZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaWNlbnNlJykpIHsKaWYgKCFlbXB0eSgkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9MSUNFTlNFJ10pKSB7CiRsaWNlbnNlID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfTElDRU5TRSddOwp9Cn0KCiRsaWNlbnNlID0gJGlvLT5hc2soCidMaWNlbnNlIFs8Y29tbWVudD4nLiRsaWNlbnNlLic8L2NvbW1lbnQ+XTogJywKJGxpY2Vuc2UKKTsKJGlucHV0LT5zZXRPcHRpb24oJ2xpY2Vuc2UnLCAkbGljZW5zZSk7CgokaW8tPndyaXRlRXJyb3IoWycnLCAnRGVmaW5lIHlvdXIgZGVwZW5kZW5jaWVzLicsICcnXSk7CgoKJHJlcG9zID0gJHRoaXMtPmdldFJlcG9zKCk7CiRwcmVmZXJyZWRTdGFiaWxpdHkgPSAkbWluaW11bVN0YWJpbGl0eSA/OiAnc3RhYmxlJzsKJHBsYXRmb3JtUmVwbyA9IG51bGw7CmlmICgkcmVwb3MgaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvcy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJGNhbmRpZGF0ZVJlcG8pIHsKaWYgKCRjYW5kaWRhdGVSZXBvIGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5KSB7CiRwbGF0Zm9ybVJlcG8gPSAkY2FuZGlkYXRlUmVwbzsKYnJlYWs7Cn0KfQp9CgokcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gZGVmaW5lIHlvdXIgZGVwZW5kZW5jaWVzIChyZXF1aXJlKSBpbnRlcmFjdGl2ZWx5IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKJHJlcXVpcmUgPSAkaW5wdXQtPmdldE9wdGlvbigncmVxdWlyZScpOwokcmVxdWlyZW1lbnRzID0gW107CmlmIChjb3VudCgkcmVxdWlyZSkgPiAwIHx8ICRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbikpIHsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5kZXRlcm1pbmVSZXF1aXJlbWVudHMoJGlucHV0LCAkb3V0cHV0LCAkcmVxdWlyZSwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSk7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ3JlcXVpcmUnLCAkcmVxdWlyZW1lbnRzKTsKCiRxdWVzdGlvbiA9ICdXb3VsZCB5b3UgbGlrZSB0byBkZWZpbmUgeW91ciBkZXYgZGVwZW5kZW5jaWVzIChyZXF1aXJlLWRldikgaW50ZXJhY3RpdmVseSBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CiRyZXF1aXJlRGV2ID0gJGlucHV0LT5nZXRPcHRpb24oJ3JlcXVpcmUtZGV2Jyk7CiRkZXZSZXF1aXJlbWVudHMgPSBbXTsKaWYgKGNvdW50KCRyZXF1aXJlRGV2KSA+IDAgfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uKSkgewokZGV2UmVxdWlyZW1lbnRzID0gJHRoaXMtPmRldGVybWluZVJlcXVpcmVtZW50cygkaW5wdXQsICRvdXRwdXQsICRyZXF1aXJlRGV2LCAkcGxhdGZvcm1SZXBvLCAkcHJlZmVycmVkU3RhYmlsaXR5KTsKfQokaW5wdXQtPnNldE9wdGlvbigncmVxdWlyZS1kZXYnLCAkZGV2UmVxdWlyZW1lbnRzKTsKCgokYXV0b2xvYWQgPSAkaW5wdXQtPmdldE9wdGlvbignYXV0b2xvYWQnKSA/OiAnc3JjLyc7CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwokYXV0b2xvYWQgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonQWRkIFBTUi00IGF1dG9sb2FkIG1hcHBpbmc/IE1hcHMgbmFtZXNwYWNlICInLiRuYW1lc3BhY2UuJyIgdG8gdGhlIGVudGVyZWQgcmVsYXRpdmUgcGF0aC4gWzxjb21tZW50PicuJGF1dG9sb2FkLic8L2NvbW1lbnQ+LCBuIHRvIHNraXBdOiAnLApzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkYXV0b2xvYWQpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSkgewpyZXR1cm4gJGF1dG9sb2FkOwp9CgppZiAoJHZhbHVlID09PSAnbicgfHwgJHZhbHVlID09PSAnbm8nKSB7CnJldHVybjsKfQoKJHZhbHVlID0gJHZhbHVlID86ICRhdXRvbG9hZDsKCmlmICghUHJlZzo6aXNNYXRjaCgne15bXi9dW0EtWmEtejAtOVwtXy9dKy8kfScsICR2YWx1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ1RoZSBzcmMgZm9sZGVyIG5hbWUgIiVzIiBpcyBpbnZhbGlkLiBQbGVhc2UgYWRkIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRhaWxpbmcgZm9yd2FyZCBzbGFzaC4gW0EtWmEtejAtOV8tL10rLycsCiR2YWx1ZQopKTsKfQoKcmV0dXJuICR2YWx1ZTsKfSwKbnVsbCwKJGF1dG9sb2FkCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdhdXRvbG9hZCcsICRhdXRvbG9hZCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VBdXRob3JTdHJpbmcoc3RyaW5nICRhdXRob3IpOiBhcnJheQp7CmlmIChQcmVnOjppc01hdGNoKCcvXig/UDxuYW1lPlstIC4sXHB7TH1ccHtOfVxwe01ufVwn4oCZIigpXSspKD86XHMrPCg/UDxlbWFpbD4uKz8pPik/JC91JywgJGF1dGhvciwgJG1hdGNoKSkgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnbmFtZSddKSk7CgppZiAobnVsbCAhPT0gJG1hdGNoWydlbWFpbCddICYmICEkdGhpcy0+aXNWYWxpZEVtYWlsKCRtYXRjaFsnZW1haWwnXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgZW1haWwgIicuJG1hdGNoWydlbWFpbCddLiciJyk7Cn0KCnJldHVybiBbCiduYW1lJyA9PiB0cmltKCRtYXRjaFsnbmFtZSddKSwKJ2VtYWlsJyA9PiAkbWF0Y2hbJ2VtYWlsJ10sCl07Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonSW52YWxpZCBhdXRob3Igc3RyaW5nLiAgTXVzdCBiZSBpbiB0aGUgZm9ybWF0czogJy4KJ0phbmUgRG9lIG9yIEpvaG4gU21pdGggPGpvaG5AZXhhbXBsZS5jb20+JwopOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0QXV0aG9ycyhzdHJpbmcgJGF1dGhvcik6IGFycmF5CnsKJGF1dGhvciA9ICR0aGlzLT5wYXJzZUF1dGhvclN0cmluZygkYXV0aG9yKTsKaWYgKG51bGwgPT09ICRhdXRob3JbJ2VtYWlsJ10pIHsKdW5zZXQoJGF1dGhvclsnZW1haWwnXSk7Cn0KCnJldHVybiBbJGF1dGhvcl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShzdHJpbmcgJHBhY2thZ2VOYW1lKTogP3N0cmluZwp7CmlmICghJHBhY2thZ2VOYW1lIHx8IHN0cnBvcygkcGFja2FnZU5hbWUsICcvJykgPT09IGZhbHNlKSB7CnJldHVybiBudWxsOwp9CgokbmFtZXNwYWNlID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYXJ0KTogc3RyaW5nIHsKJHBhcnQgPSBQcmVnOjpyZXBsYWNlKCcvW15hLXowLTldL2knLCAnICcsICRwYXJ0KTsKJHBhcnQgPSB1Y3dvcmRzKCRwYXJ0KTsKCnJldHVybiBzdHJfcmVwbGFjZSgnICcsICcnLCAkcGFydCk7Cn0sCmV4cGxvZGUoJy8nLCAkcGFja2FnZU5hbWUpCik7CgpyZXR1cm4gaW1wbG9kZSgnXFwnLCAkbmFtZXNwYWNlKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEdpdENvbmZpZygpOiBhcnJheQp7CmlmIChudWxsICE9PSAkdGhpcy0+Z2l0Q29uZmlnKSB7CnJldHVybiAkdGhpcy0+Z2l0Q29uZmlnOwp9CgokZmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKJGdpdEJpbiA9ICRmaW5kZXItPmZpbmQoJ2dpdCcpOwoKJGNtZCA9IG5ldyBQcm9jZXNzKFskZ2l0QmluLCAnY29uZmlnJywgJy1sJ10pOwokY21kLT5ydW4oKTsKCmlmICgkY21kLT5pc1N1Y2Nlc3NmdWwoKSkgewokdGhpcy0+Z2l0Q29uZmlnID0gW107ClByZWc6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XihbXj1dKyk9KC4qKSR9bScsICRjbWQtPmdldE91dHB1dCgpLCAkbWF0Y2hlcyk7CmZvcmVhY2ggKCRtYXRjaGVzWzFdIGFzICRrZXkgPT4gJG1hdGNoKSB7CiR0aGlzLT5naXRDb25maWdbJG1hdGNoXSA9ICRtYXRjaGVzWzJdWyRrZXldOwp9CgpyZXR1cm4gJHRoaXMtPmdpdENvbmZpZzsKfQoKcmV0dXJuICR0aGlzLT5naXRDb25maWcgPSBbXTsKfQoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzVmVuZG9ySWdub3JlKHN0cmluZyAkaWdub3JlRmlsZSwgc3RyaW5nICR2ZW5kb3IgPSAndmVuZG9yJyk6IGJvb2wKewppZiAoIWZpbGVfZXhpc3RzKCRpZ25vcmVGaWxlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwYXR0ZXJuID0gc3ByaW50Zigne14vPyVzKC9cKj8pPyR9JywgcHJlZ19xdW90ZSgkdmVuZG9yKSk7CgokbGluZXMgPSBmaWxlKCRpZ25vcmVGaWxlLCBGSUxFX0lHTk9SRV9ORVdfTElORVMpOwpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRsaW5lKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRWZW5kb3JJZ25vcmUoc3RyaW5nICRpZ25vcmVGaWxlLCBzdHJpbmcgJHZlbmRvciA9ICcvdmVuZG9yLycpOiB2b2lkCnsKJGNvbnRlbnRzID0gIiI7CmlmIChmaWxlX2V4aXN0cygkaWdub3JlRmlsZSkpIHsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGlnbm9yZUZpbGUpOwoKaWYgKHN0cnBvcygkY29udGVudHMsICJcbiIpICE9PSAwKSB7CiRjb250ZW50cyAuPSAiXG4iOwp9Cn0KCmZpbGVfcHV0X2NvbnRlbnRzKCRpZ25vcmVGaWxlLCAkY29udGVudHMgLiAkdmVuZG9yLiAiXG4iKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzVmFsaWRFbWFpbChzdHJpbmcgJGVtYWlsKTogYm9vbAp7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZmlsdGVyX3ZhcicpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2UgIT09IGZpbHRlcl92YXIoJGVtYWlsLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZURlcGVuZGVuY2llcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewp0cnkgewokdXBkYXRlQ29tbWFuZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCd1cGRhdGUnKTsKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJlc2V0Q29tcG9zZXIoKTsKJHVwZGF0ZUNvbW1hbmQtPnJ1bihuZXcgQXJyYXlJbnB1dChbXSksICRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdDb3VsZCBub3QgdXBkYXRlIGRlcGVuZGVuY2llcy4gUnVuIGBjb21wb3NlciB1cGRhdGVgIHRvIHNlZSBtb3JlIGluZm9ybWF0aW9uLicpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gcnVuRHVtcEF1dG9sb2FkQ29tbWFuZChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewp0cnkgewokY29tbWFuZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCdkdW1wLWF1dG9sb2FkJyk7CiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5yZXNldENvbXBvc2VyKCk7CiRjb21tYW5kLT5ydW4obmV3IEFycmF5SW5wdXQoW10pLCAkb3V0cHV0KTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignQ291bGQgbm90IHJ1biBkdW1wLWF1dG9sb2FkLicpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaGFzRGVwZW5kZW5jaWVzKGFycmF5ICRvcHRpb25zKTogYm9vbAp7CiRyZXF1aXJlcyA9IChhcnJheSkgJG9wdGlvbnNbJ3JlcXVpcmUnXTsKJGRldlJlcXVpcmVzID0gaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pID8gKGFycmF5KSAkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSA6IFtdOwoKcmV0dXJuICFlbXB0eSgkcmVxdWlyZXMpIHx8ICFlbXB0eSgkZGV2UmVxdWlyZXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgoKY2xhc3MgSW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2luc3RhbGwnKQotPnNldEFsaWFzZXMoWydpJ10pCi0+c2V0RGVzY3JpcHRpb24oJ0luc3RhbGxzIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2llcyBmcm9tIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgaWYgcHJlc2VudCwgb3IgZmFsbHMgYmFjayBvbiB0aGUgY29tcG9zZXIuanNvbicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nIChpbXBsaWNpdGx5IGVuYWJsZXMgLS12ZXJib3NlKS4nKSwKbmV3IElucHV0T3B0aW9uKCdkb3dubG9hZC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEb3dubG9hZCBvbmx5LCBkbyBub3QgaW5zdGFsbCBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IEVuYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIChlbmFibGVkIGJ5IGRlZmF1bHQsIG9ubHkgcHJlc2VudCBmb3IgQkMpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXN1Z2dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IFRoaXMgZmxhZyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXBzIGF1dG9sb2FkZXIgZ2VuZXJhdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCB1c2UsIG9ubHkgZGVmaW5lZCBoZXJlIHRvIGNhdGNoIG1pc3VzZSBvZiB0aGUgaW5zdGFsbCBjb21tYW5kLicpLApuZXcgSW5wdXRPcHRpb24oJ2F1ZGl0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSdW4gYW4gYXVkaXQgYWZ0ZXIgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlLicpLApuZXcgSW5wdXRPcHRpb24oJ2F1ZGl0LWZvcm1hdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0F1ZGl0IG91dHB1dCBmb3JtYXQuIE11c3QgYmUgInRhYmxlIiwgInBsYWluIiwgImpzb24iLCBvciAic3VtbWFyeSIuJywgQXVkaXRvcjo6Rk9STUFUX1NVTU1BUlksIEF1ZGl0b3I6OkZPUk1BVFMpLApuZXcgSW5wdXRPcHRpb24oJ3ZlcmJvc2UnLCAndnx2dnx2dnYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3dzIG1vcmUgZGV0YWlscyBpbmNsdWRpbmcgbmV3IGNvbW1pdHMgcHVsbGVkIGluIHdoZW4gdXBkYXRpbmcgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZSBhdXRvbG9hZGVyIGR1cmluZyBhdXRvbG9hZGVyIGR1bXAnKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1Nob3VsZCBub3QgYmUgcHJvdmlkZWQsIHVzZSBjb21wb3NlciByZXF1aXJlIGluc3RlYWQgdG8gYWRkIGEgZ2l2ZW4gcGFja2FnZSB0byBjb21wb3Nlci5qc29uLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+aW5zdGFsbDwvaW5mbz4gY29tbWFuZCByZWFkcyB0aGUgY29tcG9zZXIubG9jayBmaWxlIGZyb20KdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBwcm9jZXNzZXMgaXQsIGFuZCBkb3dubG9hZHMgYW5kIGluc3RhbGxzIGFsbCB0aGUKbGlicmFyaWVzIGFuZCBkZXBlbmRlbmNpZXMgb3V0bGluZWQgaW4gdGhhdCBmaWxlLiBJZiB0aGUgZmlsZSBkb2VzIG5vdApleGlzdCBpdCB3aWxsIGxvb2sgZm9yIGNvbXBvc2VyLmpzb24gYW5kIGRvIHRoZSBzYW1lLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgaW5zdGFsbDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2luc3RhbGwtaQpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1kZXYiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tc3VnZ2VzdCcpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tbm8tc3VnZ2VzdCIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KCiRhcmdzID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKTsKaWYgKGNvdW50KCRhcmdzKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBhcmd1bWVudCAnLmltcGxvZGUoJyAnLCAkYXJncykuJy4gVXNlICJjb21wb3NlciByZXF1aXJlICcuaW1wbG9kZSgnICcsICRhcmdzKS4nIiBpbnN0ZWFkIHRvIGFkZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24uPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWluc3RhbGwnKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JbnZhbGlkIG9wdGlvbiAiLS1uby1pbnN0YWxsIi4gVXNlICJjb21wb3NlciB1cGRhdGUgLS1uby1pbnN0YWxsIiBpbnN0ZWFkIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29tcG9zZXIubG9jayBmaWxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpICYmICFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgaXMgb3BlcmF0aW5nIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2UgeW91IGRvIG5vdCBoYXZlIHRoZSBQSFAgY3VybCBleHRlbnNpb24gZW5hYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2luc3RhbGwnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XSA9ICR0aGlzLT5nZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucygkY29uZmlnLCAkaW5wdXQpOwoKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb25maWctPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CgokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0RG93bmxvYWRPbmx5KCRpbnB1dC0+Z2V0T3B0aW9uKCdkb3dubG9hZC1vbmx5JykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKQotPnNldER1bXBBdXRvbG9hZGVyKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0QXVkaXQoJGlucHV0LT5nZXRPcHRpb24oJ2F1ZGl0JykpCi0+c2V0RXJyb3JPbkF1ZGl0KCRpbnB1dC0+Z2V0T3B0aW9uKCdhdWRpdCcpKQotPnNldEF1ZGl0Rm9ybWF0KCR0aGlzLT5nZXRBdWRpdEZvcm1hdCgkaW5wdXQpKQo7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokaW5zdGFsbC0+ZGlzYWJsZVBsdWdpbnMoKTsKfQoKcmV0dXJuICRpbnN0YWxsLT5ydW4oKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZVNvcnRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGVcU3ltZm9ueVN0eWxlOwoKCgoKY2xhc3MgTGljZW5zZXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2xpY2Vuc2VzJykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgbGljZW5zZXMgb2YgZGVwZW5kZW5jaWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0LCBqc29uIG9yIHN1bW1hcnknLCAndGV4dCcsIFsndGV4dCcsICdqc29uJywgJ3N1bW1hcnknXSksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBzZWFyY2ggaW4gcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBsaWNlbnNlIGNvbW1hbmQgZGlzcGxheXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpY2Vuc2VzIG9mCnRoZSBpbnN0YWxsZWQgZGVwZW5kZW5jaWVzLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjbGljZW5zZXMKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnbGljZW5zZXMnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJHJvb3QgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKJHJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcGFja2FnZXMgPSBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJHJlcG8tPmdldFBhY2thZ2VzKCksICRyb290KTsKfSBlbHNlIHsKJHBhY2thZ2VzID0gJHJlcG8tPmdldFBhY2thZ2VzKCk7Cn0KCiRwYWNrYWdlcyA9IFBhY2thZ2VTb3J0ZXI6OnNvcnRQYWNrYWdlc0FscGhhYmV0aWNhbGx5KCRwYWNrYWdlcyk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKc3dpdGNoICgkZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpKSB7CmNhc2UgJ3RleHQnOgokaW8tPndyaXRlKCdOYW1lOiA8Y29tbWVudD4nLiRyb290LT5nZXRQcmV0dHlOYW1lKCkuJzwvY29tbWVudD4nKTsKJGlvLT53cml0ZSgnVmVyc2lvbjogPGNvbW1lbnQ+Jy4kcm9vdC0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PicpOwokaW8tPndyaXRlKCdMaWNlbnNlczogPGNvbW1lbnQ+Jy4oaW1wbG9kZSgnLCAnLCAkcm9vdC0+Z2V0TGljZW5zZSgpKSA/OiAnbm9uZScpLic8L2NvbW1lbnQ+Jyk7CiRpby0+d3JpdGUoJ0RlcGVuZGVuY2llczonKTsKJGlvLT53cml0ZSgnJyk7CgokdGFibGUgPSBuZXcgVGFibGUoJG91dHB1dCk7CiR0YWJsZS0+c2V0U3R5bGUoJ2NvbXBhY3QnKTsKJHRhYmxlLT5zZXRIZWFkZXJzKFsnTmFtZScsICdWZXJzaW9uJywgJ0xpY2Vuc2VzJ10pOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpbmsgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwppZiAoJGxpbmsgIT09IG51bGwpIHsKJG5hbWUgPSAnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbGluaykuJz4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvPic7Cn0gZWxzZSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKfQoKJHRhYmxlLT5hZGRSb3coWwokbmFtZSwKJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCksCmltcGxvZGUoJywgJywgJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0TGljZW5zZSgpIDogW10pID86ICdub25lJywKXSk7Cn0KJHRhYmxlLT5yZW5kZXIoKTsKYnJlYWs7CgpjYXNlICdqc29uJzoKJGRlcGVuZGVuY2llcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGRlcGVuZGVuY2llc1skcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXSA9IFsKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLAonbGljZW5zZScgPT4gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0TGljZW5zZSgpIDogW10sCl07Cn0KCiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZShbCiduYW1lJyA9PiAkcm9vdC0+Z2V0UHJldHR5TmFtZSgpLAondmVyc2lvbicgPT4gJHJvb3QtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCksCidsaWNlbnNlJyA9PiAkcm9vdC0+Z2V0TGljZW5zZSgpLAonZGVwZW5kZW5jaWVzJyA9PiAkZGVwZW5kZW5jaWVzLApdKSk7CmJyZWFrOwoKY2FzZSAnc3VtbWFyeSc6CiR1c2VkTGljZW5zZXMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaWNlbnNlcyA9ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldExpY2Vuc2UoKSA6IFtdOwppZiAoY291bnQoJGxpY2Vuc2VzKSA9PT0gMCkgewokbGljZW5zZXNbXSA9ICdub25lJzsKfQpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2VOYW1lKSB7CmlmICghaXNzZXQoJHVzZWRMaWNlbnNlc1skbGljZW5zZU5hbWVdKSkgewokdXNlZExpY2Vuc2VzWyRsaWNlbnNlTmFtZV0gPSAwOwp9CiR1c2VkTGljZW5zZXNbJGxpY2Vuc2VOYW1lXSsrOwp9Cn0KCgphcnNvcnQoJHVzZWRMaWNlbnNlcywgU09SVF9OVU1FUklDKTsKCiRyb3dzID0gW107CmZvcmVhY2ggKCR1c2VkTGljZW5zZXMgYXMgJHVzZWRMaWNlbnNlID0+ICRudW1iZXJPZkRlcGVuZGVuY2llcykgewokcm93c1tdID0gWyR1c2VkTGljZW5zZSwgJG51bWJlck9mRGVwZW5kZW5jaWVzXTsKfQoKJHN5bWZvbnlJbyA9IG5ldyBTeW1mb255U3R5bGUoJGlucHV0LCAkb3V0cHV0KTsKJHN5bWZvbnlJby0+dGFibGUoClsnTGljZW5zZScsICdOdW1iZXIgb2YgZGVwZW5kZW5jaWVzJ10sCiRyb3dzCik7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVW5zdXBwb3J0ZWQgZm9ybWF0ICIlcyIuICBTZWUgaGVscCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuJywgJGZvcm1hdCkpOwp9CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgT3V0ZGF0ZWRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdvdXRkYXRlZCcpCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIGEgbGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMgdGhhdCBoYXZlIHVwZGF0ZXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGhlaXIgbGF0ZXN0IHZlcnNpb24nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnUGFja2FnZSB0byBpbnNwZWN0LiBPciBhIG5hbWUgaW5jbHVkaW5nIGEgd2lsZGNhcmQgKCopIHRvIGZpbHRlciBsaXN0cyBvZiBwYWNrYWdlcyBpbnN0ZWFkLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ291dGRhdGVkJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGFyZSBvdXRkYXRlZCAodGhpcyBpcyB0aGUgZGVmYXVsdCwgYnV0IHByZXNlbnQgaGVyZSBmb3IgY29tcGF0IHdpdGggYHNob3dgJyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgYWxsIGluc3RhbGxlZCBwYWNrYWdlcyB3aXRoIHRoZWlyIGxhdGVzdCB2ZXJzaW9ucycpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3MgdXBkYXRlcyBmb3IgcGFja2FnZXMgZnJvbSB0aGUgbG9jayBmaWxlLCByZWdhcmRsZXNzIG9mIHdoYXQgaXMgY3VycmVudGx5IGluIHZlbmRvciBkaXInKSwKbmV3IElucHV0T3B0aW9uKCdkaXJlY3QnLCAnRCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3Mgb25seSBwYWNrYWdlcyB0aGF0IGFyZSBkaXJlY3RseSByZXF1aXJlZCBieSB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hlbiB0aGVyZSBhcmUgb3V0ZGF0ZWQgcGFja2FnZXMnKSwKbmV3IElucHV0T3B0aW9uKCdtYWpvci1vbmx5JywgJ00nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgbWFqb3IgU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdtaW5vci1vbmx5JywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgbWlub3IgU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdwYXRjaC1vbmx5JywgJ3AnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgcGF0Y2ggU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0IG9yIGpzb24nLCAndGV4dCcsIFsnanNvbicsICd0ZXh0J10pLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBzcGVjaWZpZWQgcGFja2FnZShzKS4gVXNlIGl0IGlmIHlvdSBkb25cJ3Qgd2FudCB0byBiZSBpbmZvcm1lZCBhYm91dCBuZXcgdmVyc2lvbnMgb2Ygc29tZSBwYWNrYWdlcy4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHNlYXJjaCBpbiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIG91dGRhdGVkIGNvbW1hbmQgaXMganVzdCBhIHByb3h5IGZvciBgY29tcG9zZXIgc2hvdyAtbGAKClRoZSBjb2xvciBjb2RpbmcgKG9yIHNpZ25hZ2UgaWYgeW91IGhhdmUgQU5TSSBjb2xvcnMgZGlzYWJsZWQpIGZvciBkZXBlbmRlbmN5IHZlcnNpb25zIGlzIGFzIHN1Y2g6CgotIDxpbmZvPmdyZWVuPC9pbmZvPiAoPSk6IERlcGVuZGVuY3kgaXMgaW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBpcyB1cCB0byBkYXRlLgotIDxjb21tZW50PnllbGxvdzwvY29tbWVudD4gKH4pOiBEZXBlbmRlbmN5IGhhcyBhIG5ldyB2ZXJzaW9uIGF2YWlsYWJsZSB0aGF0IGluY2x1ZGVzIGJhY2t3YXJkcwogIGNvbXBhdGliaWxpdHkgYnJlYWtzIGFjY29yZGluZyB0byBzZW12ZXIsIHNvIHVwZ3JhZGUgd2hlbiB5b3UgY2FuIGJ1dCBpdAogIG1heSBpbnZvbHZlIHdvcmsuCi0gPGhpZ2hsaWdodD5yZWQ8L2hpZ2hsaWdodD4gKCEpOiBEZXBlbmRlbmN5IGhhcyBhIG5ldyB2ZXJzaW9uIHRoYXQgaXMgc2VtdmVyLWNvbXBhdGlibGUgYW5kIHlvdSBzaG91bGQgdXBncmFkZSBpdC4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI291dGRhdGVkCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRhcmdzID0gWwonY29tbWFuZCcgPT4gJ3Nob3cnLAonLS1sYXRlc3QnID0+IHRydWUsCl07CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CiRhcmdzWyctLW91dGRhdGVkJ10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykpIHsKJGFyZ3NbJy0tZGlyZWN0J10gPSB0cnVlOwp9CmlmIChudWxsICE9PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJykpIHsKJGFyZ3NbJ3BhY2thZ2UnXSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpKSB7CiRhcmdzWyctLXN0cmljdCddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKSkgewokYXJnc1snLS1tYWpvci1vbmx5J10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbWlub3Itb25seScpKSB7CiRhcmdzWyctLW1pbm9yLW9ubHknXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRjaC1vbmx5JykpIHsKJGFyZ3NbJy0tcGF0Y2gtb25seSddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRhcmdzWyctLWxvY2tlZCddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRhcmdzWyctLW5vLWRldiddID0gdHJ1ZTsKfQokYXJnc1snLS1pZ25vcmUtcGxhdGZvcm0tcmVxJ10gPSAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpIHsKJGFyZ3NbJy0taWdub3JlLXBsYXRmb3JtLXJlcXMnXSA9IHRydWU7Cn0KJGFyZ3NbJy0tZm9ybWF0J10gPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0Jyk7CiRhcmdzWyctLWlnbm9yZSddID0gJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpOwoKJGlucHV0ID0gbmV3IEFycmF5SW5wdXQoJGFyZ3MpOwoKcmV0dXJuICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJveHlDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgp0cmFpdCBQYWNrYWdlRGlzY292ZXJ5VHJhaXQKewoKcHJpdmF0ZSAkcmVwb3M7Cgpwcml2YXRlICRyZXBvc2l0b3J5U2V0czsKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZXBvcygpOiBDb21wb3NpdGVSZXBvc2l0b3J5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5yZXBvcykgewokdGhpcy0+cmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZSgKW25ldyBQbGF0Zm9ybVJlcG9zaXRvcnldLApSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCR0aGlzLT5nZXRJTygpKQopKTsKfQoKcmV0dXJuICR0aGlzLT5yZXBvczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5U2V0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgP3N0cmluZyAkbWluaW11bVN0YWJpbGl0eSA9IG51bGwpOiBSZXBvc2l0b3J5U2V0CnsKJGtleSA9ICRtaW5pbXVtU3RhYmlsaXR5ID8/ICdkZWZhdWx0JzsKCmlmICghaXNzZXQoJHRoaXMtPnJlcG9zaXRvcnlTZXRzWyRrZXldKSkgewokdGhpcy0+cmVwb3NpdG9yeVNldHNbJGtleV0gPSAkcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRtaW5pbXVtU3RhYmlsaXR5ID8/ICR0aGlzLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCRpbnB1dCkpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkdGhpcy0+Z2V0UmVwb3MoKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeVNldHNbJGtleV07Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eShJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBzdHJpbmcKewppZiAoJGlucHV0LT5oYXNPcHRpb24oJ3N0YWJpbGl0eScpKSB7IApyZXR1cm4gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCRpbnB1dC0+Z2V0T3B0aW9uKCdzdGFiaWxpdHknKSA/PyAnc3RhYmxlJyk7Cn0KCgokZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwppZiAoaXNfZmlsZSgkZmlsZSkgJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkZmlsZSkgJiYgaXNfYXJyYXkoJGNvbXBvc2VyID0ganNvbl9kZWNvZGUoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCB0cnVlKSkpIHsKaWYgKGlzc2V0KCRjb21wb3NlclsnbWluaW11bS1zdGFiaWxpdHknXSkpIHsKcmV0dXJuIFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkY29tcG9zZXJbJ21pbmltdW0tc3RhYmlsaXR5J10pOwp9Cn0KCnJldHVybiAnc3RhYmxlJzsKfQoKCgoKCgoKZmluYWwgcHJvdGVjdGVkIGZ1bmN0aW9uIGRldGVybWluZVJlcXVpcmVtZW50cyhJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBhcnJheSAkcmVxdWlyZXMgPSBbXSwgP1BsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvID0gbnVsbCwgc3RyaW5nICRwcmVmZXJyZWRTdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkdXNlQmVzdFZlcnNpb25Db25zdHJhaW50ID0gdHJ1ZSwgYm9vbCAkZml4ZWQgPSBmYWxzZSk6IGFycmF5CnsKaWYgKGNvdW50KCRyZXF1aXJlcykgPiAwKSB7CiRyZXF1aXJlcyA9ICR0aGlzLT5ub3JtYWxpemVSZXF1aXJlbWVudHMoJHJlcXVpcmVzKTsKJHJlc3VsdCA9IFtdOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZW1lbnQpIHsKaWYgKGlzc2V0KCRyZXF1aXJlbWVudFsndmVyc2lvbiddKSAmJiBQcmVnOjppc01hdGNoKCd7XlxkKyhcLlxkKyk/JH0nLCAkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicuJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10uJyIgY29uc3RyYWludCBmb3IgIicuJHJlcXVpcmVtZW50WyduYW1lJ10uJyIgYXBwZWFycyB0b28gc3RyaWN0IGFuZCB3aWxsIGxpa2VseSBub3QgbWF0Y2ggd2hhdCB5b3Ugd2FudC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2NvbnN0cmFpbnRzJyk7Cn0KCmlmICghaXNzZXQoJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10pKSB7CgpbJG5hbWUsICR2ZXJzaW9uXSA9ICR0aGlzLT5maW5kQmVzdFZlcnNpb25BbmROYW1lRm9yUGFja2FnZSgkdGhpcy0+Z2V0SU8oKSwgJGlucHV0LCAkcmVxdWlyZW1lbnRbJ25hbWUnXSwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSwgJGZpeGVkKTsKCgokcmVxdWlyZW1lbnRbJ25hbWUnXSA9ICRuYW1lOwoKaWYgKCR1c2VCZXN0VmVyc2lvbkNvbnN0cmFpbnQpIHsKJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10gPSAkdmVyc2lvbjsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoCidVc2luZyB2ZXJzaW9uIDxpbmZvPiVzPC9pbmZvPiBmb3IgPGluZm8+JXM8L2luZm8+JywKJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10sCiRyZXF1aXJlbWVudFsnbmFtZSddCikpOwp9IGVsc2UgewokcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSA9ICdndWVzcyc7Cn0KfQoKJHJlc3VsdFtdID0gJHJlcXVpcmVtZW50WyduYW1lJ10gLiAnICcgLiAkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKCgokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKJGluc3RhbGxlZFJlcG8gPSBudWxsOwppZiAobnVsbCAhPT0gJGNvbXBvc2VyKSB7CiRpbnN0YWxsZWRSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKfQokZXhpc3RpbmdQYWNrYWdlcyA9IFtdOwppZiAobnVsbCAhPT0gJGluc3RhbGxlZFJlcG8pIHsKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGV4aXN0aW5nUGFja2FnZXNbXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQp1bnNldCgkY29tcG9zZXIsICRpbnN0YWxsZWRSZXBvKTsKCiRpbyA9ICR0aGlzLT5nZXRJTygpOwp3aGlsZSAobnVsbCAhPT0gJHBhY2thZ2UgPSAkaW8tPmFzaygnU2VhcmNoIGZvciBhIHBhY2thZ2U6ICcpKSB7CiRtYXRjaGVzID0gJHRoaXMtPmdldFJlcG9zKCktPnNlYXJjaCgkcGFja2FnZSk7CgppZiAoY291bnQoJG1hdGNoZXMpID4gMCkgewoKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJHBvc2l0aW9uID0+ICRmb3VuZFBhY2thZ2UpIHsKaWYgKGluX2FycmF5KCRmb3VuZFBhY2thZ2VbJ25hbWUnXSwgJGV4aXN0aW5nUGFja2FnZXMsIHRydWUpKSB7CnVuc2V0KCRtYXRjaGVzWyRwb3NpdGlvbl0pOwp9Cn0KJG1hdGNoZXMgPSBhcnJheV92YWx1ZXMoJG1hdGNoZXMpOwoKJGV4YWN0TWF0Y2ggPSBmYWxzZTsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG1hdGNoKSB7CmlmICgkbWF0Y2hbJ25hbWUnXSA9PT0gJHBhY2thZ2UpIHsKJGV4YWN0TWF0Y2ggPSB0cnVlOwpicmVhazsKfQp9CgoKaWYgKCEkZXhhY3RNYXRjaCkgewokcHJvdmlkZXJzID0gJHRoaXMtPmdldFJlcG9zKCktPmdldFByb3ZpZGVycygkcGFja2FnZSk7CmlmIChjb3VudCgkcHJvdmlkZXJzKSA+IDApIHsKYXJyYXlfdW5zaGlmdCgkbWF0Y2hlcywgWyduYW1lJyA9PiAkcGFja2FnZSwgJ2Rlc2NyaXB0aW9uJyA9PiAnJ10pOwp9CgokY2hvaWNlcyA9IFtdOwpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkcG9zaXRpb24gPT4gJGZvdW5kUGFja2FnZSkgewokYWJhbmRvbmVkID0gJyc7CmlmIChpc3NldCgkZm91bmRQYWNrYWdlWydhYmFuZG9uZWQnXSkpIHsKaWYgKGlzX3N0cmluZygkZm91bmRQYWNrYWdlWydhYmFuZG9uZWQnXSkpIHsKJHJlcGxhY2VtZW50ID0gc3ByaW50ZignVXNlICVzIGluc3RlYWQnLCAkZm91bmRQYWNrYWdlWydhYmFuZG9uZWQnXSk7Cn0gZWxzZSB7CiRyZXBsYWNlbWVudCA9ICdObyByZXBsYWNlbWVudCB3YXMgc3VnZ2VzdGVkJzsKfQokYWJhbmRvbmVkID0gc3ByaW50ZignPHdhcm5pbmc+QWJhbmRvbmVkLiAlcy48L3dhcm5pbmc+JywgJHJlcGxhY2VtZW50KTsKfQoKJGNob2ljZXNbXSA9IHNwcmludGYoJyA8aW5mbz4lNXM8L2luZm8+ICVzICVzJywgIlskcG9zaXRpb25dIiwgJGZvdW5kUGFja2FnZVsnbmFtZSddLCAkYWJhbmRvbmVkKTsKfQoKJGlvLT53cml0ZUVycm9yKFsKJycsCnNwcmludGYoJ0ZvdW5kIDxpbmZvPiVzPC9pbmZvPiBwYWNrYWdlcyBtYXRjaGluZyA8aW5mbz4lczwvaW5mbz4nLCBjb3VudCgkbWF0Y2hlcyksICRwYWNrYWdlKSwKJycsCl0pOwoKJGlvLT53cml0ZUVycm9yKCRjaG9pY2VzKTsKJGlvLT53cml0ZUVycm9yKCcnKTsKCiR2YWxpZGF0b3IgPSBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkc2VsZWN0aW9uKSB1c2UgKCRtYXRjaGVzLCAkdmVyc2lvblBhcnNlcikgewppZiAoJycgPT09ICRzZWxlY3Rpb24pIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNfbnVtZXJpYygkc2VsZWN0aW9uKSAmJiBpc3NldCgkbWF0Y2hlc1soaW50KSAkc2VsZWN0aW9uXSkpIHsKJHBhY2thZ2UgPSAkbWF0Y2hlc1soaW50KSAkc2VsZWN0aW9uXTsKCnJldHVybiAkcGFja2FnZVsnbmFtZSddOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15ccyooP1A8bmFtZT5bXFMvXSspKD86XHMrKD9QPHZlcnNpb24+XFMrKSk/XHMqJH0nLCAkc2VsZWN0aW9uLCAkcGFja2FnZU1hdGNoZXMpKSB7CmlmIChpc3NldCgkcGFja2FnZU1hdGNoZXNbJ3ZlcnNpb24nXSkpIHsKCgoKJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHBhY2thZ2VNYXRjaGVzWyd2ZXJzaW9uJ10pOwoKcmV0dXJuICRwYWNrYWdlTWF0Y2hlc1snbmFtZSddLicgJy4kcGFja2FnZU1hdGNoZXNbJ3ZlcnNpb24nXTsKfQoKCnJldHVybiAkcGFja2FnZU1hdGNoZXNbJ25hbWUnXTsKfQoKdGhyb3cgbmV3IFxFeGNlcHRpb24oJ05vdCBhIHZhbGlkIHNlbGVjdGlvbicpOwp9OwoKJHBhY2thZ2UgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonRW50ZXIgcGFja2FnZSAjIHRvIGFkZCwgb3IgdGhlIGNvbXBsZXRlIHBhY2thZ2UgbmFtZSBpZiBpdCBpcyBub3QgbGlzdGVkOiAnLAokdmFsaWRhdG9yLAozLAonJwopOwp9CgoKaWYgKGZhbHNlICE9PSAkcGFja2FnZSAmJiBmYWxzZSA9PT0gc3RycG9zKCRwYWNrYWdlLCAnICcpKSB7CiR2YWxpZGF0b3IgPSBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkaW5wdXQpIHsKJGlucHV0ID0gdHJpbSgkaW5wdXQpOwoKcmV0dXJuIHN0cmxlbigkaW5wdXQpID4gMCA/ICRpbnB1dCA6IGZhbHNlOwp9OwoKJGNvbnN0cmFpbnQgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonRW50ZXIgdGhlIHZlcnNpb24gY29uc3RyYWludCB0byByZXF1aXJlIChvciBsZWF2ZSBibGFuayB0byB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uKTogJywKJHZhbGlkYXRvciwKMywKJycKKTsKCmlmIChmYWxzZSA9PT0gJGNvbnN0cmFpbnQpIHsKWywgJGNvbnN0cmFpbnRdID0gJHRoaXMtPmZpbmRCZXN0VmVyc2lvbkFuZE5hbWVGb3JQYWNrYWdlKCR0aGlzLT5nZXRJTygpLCAkaW5wdXQsICRwYWNrYWdlLCAkcGxhdGZvcm1SZXBvLCAkcHJlZmVycmVkU3RhYmlsaXR5KTsKCiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKAonVXNpbmcgdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4gZm9yIDxpbmZvPiVzPC9pbmZvPicsCiRjb25zdHJhaW50LAokcGFja2FnZQopKTsKfQoKJHBhY2thZ2UgLj0gJyAnLiRjb25zdHJhaW50Owp9CgppZiAoZmFsc2UgIT09ICRwYWNrYWdlKSB7CiRyZXF1aXJlc1tdID0gJHBhY2thZ2U7CiRleGlzdGluZ1BhY2thZ2VzW10gPSBleHBsb2RlKCcgJywgJHBhY2thZ2UpWzBdOwp9Cn0KfQoKcmV0dXJuICRyZXF1aXJlczsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRCZXN0VmVyc2lvbkFuZE5hbWVGb3JQYWNrYWdlKElPSW50ZXJmYWNlICRpbywgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBzdHJpbmcgJG5hbWUsID9QbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbyA9IG51bGwsIHN0cmluZyAkcHJlZmVycmVkU3RhYmlsaXR5ID0gJ3N0YWJsZScsIGJvb2wgJGZpeGVkID0gZmFsc2UpOiBhcnJheQp7CgppZiAoJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykgJiYgJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnKSkgewokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9ICR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCk7Cn0gZWxzZSB7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKfQoKCiRyZXBvU2V0ID0gJHRoaXMtPmdldFJlcG9zaXRvcnlTZXQoJGlucHV0KTsKJHZlcnNpb25TZWxlY3RvciA9IG5ldyBWZXJzaW9uU2VsZWN0b3IoJHJlcG9TZXQsICRwbGF0Zm9ybVJlcG8pOwokZWZmZWN0aXZlTWluaW11bVN0YWJpbGl0eSA9ICR0aGlzLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCRpbnB1dCk7CgokcGFja2FnZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCBudWxsLCAkcHJlZmVycmVkU3RhYmlsaXR5LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgMCwgJHRoaXMtPmdldElPKCkpOwoKaWYgKGZhbHNlID09PSAkcGFja2FnZSkgewoKCmlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRuYW1lKSkgewpyZXR1cm4gWyRuYW1lLCAnKiddOwp9CgoKJHByb3ZpZGVycyA9ICRyZXBvU2V0LT5nZXRQcm92aWRlcnMoJG5hbWUpOwppZiAoY291bnQoJHByb3ZpZGVycykgPiAwKSB7CiRjb25zdHJhaW50ID0gJyonOwppZiAoJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKJGNvbnN0cmFpbnQgPSAkdGhpcy0+Z2V0SU8oKS0+YXNrQW5kVmFsaWRhdGUoJ1BhY2thZ2UgIjxpbmZvPicuJG5hbWUuJzwvaW5mbz4iIGRvZXMgbm90IGV4aXN0IGJ1dCBpcyBwcm92aWRlZCBieSAnLmNvdW50KCRwcm92aWRlcnMpLicgcGFja2FnZXMuIFdoaWNoIHZlcnNpb24gY29uc3RyYWludCB3b3VsZCB5b3UgbGlrZSB0byB1c2U/IFs8aW5mbz4qPC9pbmZvPl0gJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHZhbHVlKTsKCnJldHVybiAkdmFsdWU7Cn0sIDMsICcqJyk7Cn0KCnJldHVybiBbJG5hbWUsICRjb25zdHJhaW50XTsKfQoKCmlmICghKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgJiYgZmFsc2UgIT09ICgkY2FuZGlkYXRlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsIG51bGwsICRwcmVmZXJyZWRTdGFiaWxpdHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVBbGwoKSkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidQYWNrYWdlICVzIGhhcyByZXF1aXJlbWVudHMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQSFAgdmVyc2lvbiwgUEhQIGV4dGVuc2lvbnMgYW5kIENvbXBvc2VyIHZlcnNpb24nIC4gJHRoaXMtPmdldFBsYXRmb3JtRXhjZXB0aW9uRGV0YWlscygkY2FuZGlkYXRlLCAkcGxhdGZvcm1SZXBvKSwKJG5hbWUKKSk7Cn0KCmlmIChmYWxzZSAhPT0gKCRwYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsIG51bGwsICRwcmVmZXJyZWRTdGFiaWxpdHksICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLCBSZXBvc2l0b3J5U2V0OjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpKSkgewoKaWYgKGZhbHNlICE9PSAoJGFsbFJlcG9zUGFja2FnZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCBudWxsLCAkcHJlZmVycmVkU3RhYmlsaXR5LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgUmVwb3NpdG9yeVNldDo6QUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCidQYWNrYWdlICcuJG5hbWUuJyBleGlzdHMgaW4gJy4kYWxsUmVwb3NQYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCktPmdldFJlcG9OYW1lKCkuJyBhbmQgJy4kcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpLT5nZXRSZXBvTmFtZSgpLicgd2hpY2ggaGFzIGEgaGlnaGVyIHJlcG9zaXRvcnkgcHJpb3JpdHkuIFRoZSBwYWNrYWdlcyBmcm9tIHRoZSBoaWdoZXIgcHJpb3JpdHkgcmVwb3NpdG9yeSBkbyBub3QgbWF0Y2ggeW91ciBtaW5pbXVtLXN0YWJpbGl0eSBhbmQgYXJlIHRoZXJlZm9yZSBub3QgaW5zdGFsbGFibGUuIFRoYXQgcmVwb3NpdG9yeSBpcyBjYW5vbmljYWwgc28gdGhlIGxvd2VyIHByaW9yaXR5IHJlcG9cJ3MgcGFja2FnZXMgYXJlIG5vdCBpbnN0YWxsYWJsZS4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3JlcG9wcmlvIGZvciBkZXRhaWxzIGFuZCBhc3Npc3RhbmNlLicKKTsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ0NvdWxkIG5vdCBmaW5kIGEgdmVyc2lvbiBvZiBwYWNrYWdlICVzIG1hdGNoaW5nIHlvdXIgbWluaW11bS1zdGFiaWxpdHkgKCVzKS4gUmVxdWlyZSBpdCB3aXRoIGFuIGV4cGxpY2l0IHZlcnNpb24gY29uc3RyYWludCBhbGxvd2luZyBpdHMgZGVzaXJlZCBzdGFiaWxpdHkuJywKJG5hbWUsCiRlZmZlY3RpdmVNaW5pbXVtU3RhYmlsaXR5CikpOwp9CgppZiAoISRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciAmJiBmYWxzZSAhPT0gKCRjYW5kaWRhdGUgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgbnVsbCwgJHByZWZlcnJlZFN0YWJpbGl0eSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZUFsbCgpLCBSZXBvc2l0b3J5U2V0OjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpKSkgewokYWRkaXRpb25hbCA9ICcnOwppZiAoZmFsc2UgPT09ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCBudWxsLCAkcHJlZmVycmVkU3RhYmlsaXR5LCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlQWxsKCkpKSB7CiRhZGRpdGlvbmFsID0gUEhQX0VPTC5QSFBfRU9MLidBZGRpdGlvbmFsbHksIHRoZSBwYWNrYWdlIHdhcyBvbmx5IGZvdW5kIHdpdGggYSBzdGFiaWxpdHkgb2YgIicuJGNhbmRpZGF0ZS0+Z2V0U3RhYmlsaXR5KCkuJyIgd2hpbGUgeW91ciBtaW5pbXVtIHN0YWJpbGl0eSBpcyAiJy4kZWZmZWN0aXZlTWluaW11bVN0YWJpbGl0eS4nIi4nOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonQ291bGQgbm90IGZpbmQgcGFja2FnZSAlcyBpbiBhbnkgdmVyc2lvbiBtYXRjaGluZyB5b3VyIFBIUCB2ZXJzaW9uLCBQSFAgZXh0ZW5zaW9ucyBhbmQgQ29tcG9zZXIgdmVyc2lvbicgLiAkdGhpcy0+Z2V0UGxhdGZvcm1FeGNlcHRpb25EZXRhaWxzKCRjYW5kaWRhdGUsICRwbGF0Zm9ybVJlcG8pIC4gJyVzJywKJG5hbWUsCiRhZGRpdGlvbmFsCikpOwp9CgoKJHNpbWlsYXIgPSAkdGhpcy0+ZmluZFNpbWlsYXIoJG5hbWUpOwppZiAoY291bnQoJHNpbWlsYXIpID4gMCkgewppZiAoaW5fYXJyYXkoJG5hbWUsICRzaW1pbGFyLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAoiQ291bGQgbm90IGZpbmQgcGFja2FnZSAlcy4gSXQgd2FzIGhvd2V2ZXIgZm91bmQgdmlhIHJlcG9zaXRvcnkgc2VhcmNoLCB3aGljaCBpbmRpY2F0ZXMgYSBjb25zaXN0ZW5jeSBpc3N1ZSB3aXRoIHRoZSByZXBvc2l0b3J5LiIsCiRuYW1lCikpOwp9CgppZiAoJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKJHJlc3VsdCA9ICRpby0+c2VsZWN0KCI8ZXJyb3I+Q291bGQgbm90IGZpbmQgcGFja2FnZSAkbmFtZS48L2Vycm9yPlxuUGljayBvbmUgb2YgdGhlc2Ugb3IgbGVhdmUgZW1wdHkgdG8gYWJvcnQ6IiwgJHNpbWlsYXIsIGZhbHNlLCAxKTsKaWYgKCRyZXN1bHQgIT09IGZhbHNlKSB7CnJldHVybiAkdGhpcy0+ZmluZEJlc3RWZXJzaW9uQW5kTmFtZUZvclBhY2thZ2UoJGlvLCAkaW5wdXQsICRzaW1pbGFyWyRyZXN1bHRdLCAkcGxhdGZvcm1SZXBvLCAkcHJlZmVycmVkU3RhYmlsaXR5LCAkZml4ZWQpOwp9Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCiJDb3VsZCBub3QgZmluZCBwYWNrYWdlICVzLlxuXG5EaWQgeW91IG1lYW4gIiAuIChjb3VudCgkc2ltaWxhcikgPiAxID8gJ29uZSBvZiB0aGVzZScgOiAndGhpcycpIC4gIj9cbiAgICAlcyIsCiRuYW1lLAppbXBsb2RlKCJcbiAgICAiLCAkc2ltaWxhcikKKSk7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHZlcnNpb24gb2YgcGFja2FnZSAlcy4gQ2hlY2sgdGhlIHBhY2thZ2Ugc3BlbGxpbmcsIHlvdXIgdmVyc2lvbiBjb25zdHJhaW50IGFuZCB0aGF0IHRoZSBwYWNrYWdlIGlzIGF2YWlsYWJsZSBpbiBhIHN0YWJpbGl0eSB3aGljaCBtYXRjaGVzIHlvdXIgbWluaW11bS1zdGFiaWxpdHkgKCVzKS4nLAokbmFtZSwKJGVmZmVjdGl2ZU1pbmltdW1TdGFiaWxpdHkKKSk7Cn0KCnJldHVybiBbCiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCiRmaXhlZCA/ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgOiAkdmVyc2lvblNlbGVjdG9yLT5maW5kUmVjb21tZW5kZWRSZXF1aXJlVmVyc2lvbigkcGFja2FnZSksCl07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmluZFNpbWlsYXIoc3RyaW5nICRwYWNrYWdlKTogYXJyYXkKewp0cnkgewppZiAobnVsbCA9PT0gJHRoaXMtPnJlcG9zKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2ZpbmRTaW1pbGFyIHdhcyBjYWxsZWQgYmVmb3JlICR0aGlzLT5yZXBvcyB3YXMgaW5pdGlhbGl6ZWQnKTsKfQokcmVzdWx0cyA9ICR0aGlzLT5yZXBvcy0+c2VhcmNoKCRwYWNrYWdlKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBcTG9naWNFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KCgpyZXR1cm4gW107Cn0KJHNpbWlsYXJQYWNrYWdlcyA9IFtdOwoKJGluc3RhbGxlZFJlcG8gPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewppZiAobnVsbCAhPT0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlKCRyZXN1bHRbJ25hbWUnXSwgJyonKSkgewoKY29udGludWU7Cn0KJHNpbWlsYXJQYWNrYWdlc1skcmVzdWx0WyduYW1lJ11dID0gbGV2ZW5zaHRlaW4oJHBhY2thZ2UsICRyZXN1bHRbJ25hbWUnXSk7Cn0KYXNvcnQoJHNpbWlsYXJQYWNrYWdlcyk7CgpyZXR1cm4gYXJyYXlfa2V5cyhhcnJheV9zbGljZSgkc2ltaWxhclBhY2thZ2VzLCAwLCA1KSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGxhdGZvcm1FeGNlcHRpb25EZXRhaWxzKFBhY2thZ2VJbnRlcmZhY2UgJGNhbmRpZGF0ZSwgP1BsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvID0gbnVsbCk6IHN0cmluZwp7CiRkZXRhaWxzID0gW107CmlmIChudWxsID09PSAkcGxhdGZvcm1SZXBvKSB7CnJldHVybiAnJzsKfQoKZm9yZWFjaCAoJGNhbmRpZGF0ZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewppZiAoIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfQokcGxhdGZvcm1Qa2cgPSAkcGxhdGZvcm1SZXBvLT5maW5kUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCksICcqJyk7CmlmIChudWxsID09PSAkcGxhdGZvcm1Qa2cpIHsKaWYgKCRwbGF0Zm9ybVJlcG8tPmlzUGxhdGZvcm1QYWNrYWdlRGlzYWJsZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewokZGV0YWlsc1tdID0gJGNhbmRpZGF0ZS0+Z2V0UHJldHR5TmFtZSgpLicgJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyByZXF1aXJlcyAnLiRsaW5rLT5nZXRUYXJnZXQoKS4nICcuJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nIGJ1dCBpdCBpcyBkaXNhYmxlZCBieSB5b3VyIHBsYXRmb3JtIGNvbmZpZy4gRW5hYmxlIGl0IGFnYWluIHdpdGggImNvbXBvc2VyIGNvbmZpZyBwbGF0Zm9ybS4nLiRsaW5rLT5nZXRUYXJnZXQoKS4nIC0tdW5zZXQiLic7Cn0gZWxzZSB7CiRkZXRhaWxzW10gPSAkY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkuJyAnLiRjYW5kaWRhdGUtPmdldFByZXR0eVZlcnNpb24oKS4nIHJlcXVpcmVzICcuJGxpbmstPmdldFRhcmdldCgpLicgJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgYnV0IGl0IGlzIG5vdCBwcmVzZW50Lic7Cn0KY29udGludWU7Cn0KaWYgKCEkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwbGF0Zm9ybVBrZy0+Z2V0VmVyc2lvbigpKSkpIHsKJHBsYXRmb3JtUGtnVmVyc2lvbiA9ICRwbGF0Zm9ybVBrZy0+Z2V0UHJldHR5VmVyc2lvbigpOwokcGxhdGZvcm1FeHRyYSA9ICRwbGF0Zm9ybVBrZy0+Z2V0RXh0cmEoKTsKaWYgKGlzc2V0KCRwbGF0Zm9ybUV4dHJhWydjb25maWcucGxhdGZvcm0nXSkgJiYgJHBsYXRmb3JtUGtnIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CiRwbGF0Zm9ybVBrZ1ZlcnNpb24gLj0gJyAoJy4kcGxhdGZvcm1Qa2ctPmdldERlc2NyaXB0aW9uKCkuJyknOwp9CiRkZXRhaWxzW10gPSAkY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkuJyAnLiRjYW5kaWRhdGUtPmdldFByZXR0eVZlcnNpb24oKS4nIHJlcXVpcmVzICcuJGxpbmstPmdldFRhcmdldCgpLicgJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgd2hpY2ggZG9lcyBub3QgbWF0Y2ggeW91ciBpbnN0YWxsZWQgdmVyc2lvbiAnLiRwbGF0Zm9ybVBrZ1ZlcnNpb24uJy4nOwp9Cn0KCmlmIChjb3VudCgkZGV0YWlscykgPT09IDApIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gJzonLlBIUF9FT0wuJyAgLSAnIC4gaW1wbG9kZShQSFBfRU9MLicgIC0gJywgJGRldGFpbHMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgpjbGFzcyBQcm9oaWJpdHNDb21tYW5kIGV4dGVuZHMgQmFzZURlcGVuZGVuY3lDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgncHJvaGliaXRzJykKLT5zZXRBbGlhc2VzKFsnd2h5LW5vdCddKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyB3aGljaCBwYWNrYWdlcyBwcmV2ZW50IHRoZSBnaXZlbiBwYWNrYWdlIGZyb20gYmVpbmcgaW5zdGFsbGVkJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfUEFDS0FHRSwgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICdQYWNrYWdlIHRvIGluc3BlY3QnLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2UoKSksCm5ldyBJbnB1dEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQsIElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAnVmVyc2lvbiBjb25zdHJhaW50LCB3aGljaCB2ZXJzaW9uIHlvdSBleHBlY3RlZCB0byBiZSBpbnN0YWxsZWQnKSwKbmV3IElucHV0T3B0aW9uKHNlbGY6Ok9QVElPTl9SRUNVUlNJVkUsICdyJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZWN1cnNpdmVseSByZXNvbHZlcyB1cCB0byB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbihzZWxmOjpPUFRJT05fVFJFRSwgJ3QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByaW50cyB0aGUgcmVzdWx0cyBhcyBhIG5lc3RlZCB0cmVlJyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZWFkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZnJvbSBjb21wb3Nlci5sb2NrJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UCkRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoeSBhIHBhY2thZ2UgY2Fubm90IGJlIGluc3RhbGxlZC4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHByb2hpYml0cyBjb21wb3Nlci9jb21wb3NlcjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3Byb2hpYml0cy13aHktbm90CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnJldHVybiBwYXJlbnQ6OmRvRXhlY3V0ZSgkaW5wdXQsICRvdXRwdXQsIHRydWUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcVHJhbnNhY3Rpb247CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBSZWluc3RhbGxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdyZWluc3RhbGwnKQotPnNldERlc2NyaXB0aW9uKCdVbmluc3RhbGxzIGFuZCByZWluc3RhbGxzIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc291cmNlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBzb3VyY2VzIHdoZW4gcG9zc2libGUsIGluY2x1ZGluZyBWQ1MgaW5mb3JtYXRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWRpc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3QgKGRlZmF1bHQgYmVoYXZpb3IpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdHxzb3VyY2V8YXV0byAoYXV0byBjaG9vc2VzIHNvdXJjZSBmb3IgZGV2IHZlcnNpb25zLCBkaXN0IGZvciB0aGUgcmVzdCkuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQcmVmZXJJbnN0YWxsKCkpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXBzIGF1dG9sb2FkZXIgZ2VuZXJhdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemUgYXV0b2xvYWRlciBkdXJpbmcgYXV0b2xvYWRlciBkdW1wJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZS1hdXRvbG9hZGVyYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1LWF1dG9sb2FkZXInKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICdMaXN0IG9mIHBhY2thZ2UgbmFtZXMgdG8gcmVpbnN0YWxsLCBjYW4gaW5jbHVkZSBhIHdpbGRjYXJkICgqKSB0byBtYXRjaCBhbnkgc3Vic3RyaW5nLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+cmVpbnN0YWxsPC9pbmZvPiBjb21tYW5kIGxvb2tzIHVwIGluc3RhbGxlZCBwYWNrYWdlcyBieSBuYW1lLAp1bmluc3RhbGxzIHRoZW0gYW5kIHJlaW5zdGFsbHMgdGhlbS4gVGhpcyBsZXRzIHlvdSBkbyBhIGNsZWFuIGluc3RhbGwKb2YgYSBwYWNrYWdlIGlmIHlvdSBtZXNzZWQgd2l0aCBpdHMgZmlsZXMsIG9yIGlmIHlvdSB3aXNoIHRvIGNoYW5nZQp0aGUgaW5zdGFsbGF0aW9uIHR5cGUgdXNpbmcgLS1wcmVmZXItaW5zdGFsbC4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHJlaW5zdGFsbCBhY21lL2ZvbyAiYWNtZS9iYXItKiI8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNyZWluc3RhbGwKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHBhY2thZ2VzVG9SZWluc3RhbGwgPSBbXTsKJHBhY2thZ2VOYW1lc1RvUmVpbnN0YWxsID0gW107CmZvcmVhY2ggKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykgYXMgJHBhdHRlcm4pIHsKJHBhdHRlcm5SZWdleHAgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7CiRtYXRjaGVkID0gZmFsc2U7CmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm5SZWdleHAsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CiRtYXRjaGVkID0gdHJ1ZTsKJHBhY2thZ2VzVG9SZWluc3RhbGxbXSA9ICRwYWNrYWdlOwokcGFja2FnZU5hbWVzVG9SZWluc3RhbGxbXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQoKaWYgKCEkbWF0Y2hlZCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhdHRlcm4gIicgLiAkcGF0dGVybiAuICciIGRvZXMgbm90IG1hdGNoIGFueSBjdXJyZW50bHkgaW5zdGFsbGVkIHBhY2thZ2VzLjwvd2FybmluZz4nKTsKfQp9CgppZiAoISRwYWNrYWdlc1RvUmVpbnN0YWxsKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Rm91bmQgbm8gcGFja2FnZXMgdG8gcmVpbnN0YWxsLCBhYm9ydGluZy48L3dhcm5pbmc+Jyk7CgpyZXR1cm4gMTsKfQoKJHVuaW5zdGFsbE9wZXJhdGlvbnMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzVG9SZWluc3RhbGwgYXMgJHBhY2thZ2UpIHsKJHVuaW5zdGFsbE9wZXJhdGlvbnNbXSA9IG5ldyBVbmluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpOwp9CgoKJHByZXNlbnRQYWNrYWdlcyA9ICRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCk7CiRyZXN1bHRQYWNrYWdlcyA9ICRwcmVzZW50UGFja2FnZXM7CmZvcmVhY2ggKCRwcmVzZW50UGFja2FnZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlKSB7CmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcGFja2FnZU5hbWVzVG9SZWluc3RhbGwsIHRydWUpKSB7CnVuc2V0KCRwcmVzZW50UGFja2FnZXNbJGluZGV4XSk7Cn0KfQokdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oJHByZXNlbnRQYWNrYWdlcywgJHJlc3VsdFBhY2thZ2VzKTsKJGluc3RhbGxPcGVyYXRpb25zID0gJHRyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCk7CgoKJGluc3RhbGxPcmRlciA9IFtdOwpmb3JlYWNoICgkaW5zdGFsbE9wZXJhdGlvbnMgYXMgJGluZGV4ID0+ICRvcCkgewppZiAoJG9wIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbiAmJiAhJG9wLT5nZXRQYWNrYWdlKCkgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGluc3RhbGxPcmRlclskb3AtPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXSA9ICRpbmRleDsKfQp9CnVzb3J0KCR1bmluc3RhbGxPcGVyYXRpb25zLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkaW5zdGFsbE9yZGVyKTogaW50IHsKcmV0dXJuICRpbnN0YWxsT3JkZXJbJGItPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXSAtICRpbnN0YWxsT3JkZXJbJGEtPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXTsKfSk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdyZWluc3RhbGwnLCAkaW5wdXQsICRvdXRwdXQpOwokZXZlbnREaXNwYXRjaGVyID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7CgokaW5zdGFsbGF0aW9uTWFuYWdlciA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpOwokZG93bmxvYWRNYW5hZ2VyID0gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKTsKJHBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCiRpbnN0YWxsYXRpb25NYW5hZ2VyLT5zZXRPdXRwdXRQcm9ncmVzcyghJGlucHV0LT5nZXRPcHRpb24oJ25vLXByb2dyZXNzJykpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokaW5zdGFsbGF0aW9uTWFuYWdlci0+ZGlzYWJsZVBsdWdpbnMoKTsKfQoKJGRvd25sb2FkTWFuYWdlci0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpOwokZG93bmxvYWRNYW5hZ2VyLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KTsKCiRkZXZNb2RlID0gJGxvY2FsUmVwby0+Z2V0RGV2TW9kZSgpICE9PSBudWxsID8gJGxvY2FsUmVwby0+Z2V0RGV2TW9kZSgpIDogdHJ1ZTsKClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0RFVl9NT0RFJywgJGRldk1vZGUgPyAnMScgOiAnMCcpOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBSRV9JTlNUQUxMX0NNRCwgJGRldk1vZGUpOwoKJGluc3RhbGxhdGlvbk1hbmFnZXItPmV4ZWN1dGUoJGxvY2FsUmVwbywgJHVuaW5zdGFsbE9wZXJhdGlvbnMsICRkZXZNb2RlKTsKJGluc3RhbGxhdGlvbk1hbmFnZXItPmV4ZWN1dGUoJGxvY2FsUmVwbywgJGluc3RhbGxPcGVyYXRpb25zLCAkZGV2TW9kZSk7CgppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1hdXRvbG9hZGVyJykpIHsKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb25maWctPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CgokZ2VuZXJhdG9yID0gJGNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwokZ2VuZXJhdG9yLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGF1dGhvcml0YXRpdmUpOwokZ2VuZXJhdG9yLT5zZXRBcGN1KCRhcGN1LCAkYXBjdVByZWZpeCk7CiRnZW5lcmF0b3ItPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSk7CiRnZW5lcmF0b3ItPmR1bXAoCiRjb25maWcsCiRsb2NhbFJlcG8sCiRwYWNrYWdlLAokaW5zdGFsbGF0aW9uTWFuYWdlciwKJ2NvbXBvc2VyJywKJG9wdGltaXplLApudWxsLAokY29tcG9zZXItPmdldExvY2tlcigpCik7Cn0KCiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9JTlNUQUxMX0NNRCwgJGRldk1vZGUpOwoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CgoKCgoKY2xhc3MgUmVtb3ZlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzCi0+c2V0TmFtZSgncmVtb3ZlJykKLT5zZXRBbGlhc2VzKFsncm0nXSkKLT5zZXREZXNjcmlwdGlvbignUmVtb3ZlcyBhIHBhY2thZ2UgZnJvbSB0aGUgcmVxdWlyZSBvciByZXF1aXJlLWRldicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnUGFja2FnZXMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJvb3RSZXF1aXJlbWVudCgpKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlbW92ZXMgYSBwYWNrYWdlIGZyb20gdGhlIHJlcXVpcmUtZGV2IHNlY3Rpb24uJyksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgb3BlcmF0aW9ucyBidXQgd2lsbCBub3QgZXhlY3V0ZSBhbnl0aGluZyAoaW1wbGljaXRseSBlbmFibGVzIC0tdmVyYm9zZSkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tdXBkYXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgYXV0b21hdGljIHVwZGF0ZSBvZiB0aGUgZGVwZW5kZW5jaWVzIChpbXBsaWVzIC0tbm8taW5zdGFsbCkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgaW5zdGFsbCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGF1ZGl0IHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fQVVESVQ9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSdW4gdGhlIGRlcGVuZGVuY3kgdXBkYXRlIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCB3aXRoIGV4cGxpY2l0IGRlcGVuZGVuY2llcy4gKERlcHJlY2F0ZWQsIGlzIG5vdyBkZWZhdWx0IGJlaGF2aW9yKScpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCAnVycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGFsbCBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSByb290IHJlcXVpcmVtZW50cy4nKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsaWFzIGZvciAtLXVwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSwKbmV3IElucHV0T3B0aW9uKCduby11cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvZXMgbm90IGFsbG93IGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCB3aXRoIGV4cGxpY2l0IGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCd1bnVzZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlbW92ZSBhbGwgcGFja2FnZXMgd2hpY2ggYXJlIGxvY2tlZCBidXQgbm90IHJlcXVpcmVkIGJ5IGFueSBvdGhlciBwYWNrYWdlLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcCcpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5yZW1vdmU8L2luZm8+IGNvbW1hbmQgcmVtb3ZlcyBhIHBhY2thZ2UgZnJvbSB0aGUgY3VycmVudApsaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcwoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcmVtb3ZlPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcmVtb3ZlLXJtCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewppZiAoJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSA9PT0gW10gJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCd1bnVzZWQnKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyAobWlzc2luZzogInBhY2thZ2VzIikuJyk7Cn0KCiRwYWNrYWdlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CiRwYWNrYWdlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsICRwYWNrYWdlcyk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VudXNlZCcpKSB7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICghJGxvY2tlci0+aXNMb2NrZWQoKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQSB2YWxpZCBjb21wb3Nlci5sb2NrIGZpbGUgaXMgcmVxdWlyZWQgdG8gcnVuIHRoaXMgY29tbWFuZCB3aXRoIC0tdW51c2VkJyk7Cn0KCiRsb2NrZWRQYWNrYWdlcyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKTsKCiRyZXF1aXJlZCA9IFtdOwpmb3JlYWNoIChhcnJheV9tZXJnZSgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UmVxdWlyZXMoKSwgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkpIGFzICRsaW5rKSB7CiRyZXF1aXJlZFskbGluay0+Z2V0VGFyZ2V0KCldID0gdHJ1ZTsKfQoKZG8gewokZm91bmQgPSBmYWxzZTsKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHJlcXVpcmVkWyRuYW1lXSkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHJlcXVpcmVkWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9CiRmb3VuZCA9IHRydWU7CnVuc2V0KCRsb2NrZWRQYWNrYWdlc1skaW5kZXhdKTsKYnJlYWs7Cn0KfQp9Cn0gd2hpbGUgKCRmb3VuZCk7CgokdW51c2VkID0gW107CmZvcmVhY2ggKCRsb2NrZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdW51c2VkW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHVudXNlZCk7CgppZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+Tm8gdW51c2VkIHBhY2thZ2VzIHRvIHJlbW92ZTwvaW5mbz4nKTsKCnJldHVybiAwOwp9Cn0KCiRmaWxlID0gRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCk7CgokanNvbkZpbGUgPSBuZXcgSnNvbkZpbGUoJGZpbGUpOwoKJGNvbXBvc2VyID0gJGpzb25GaWxlLT5yZWFkKCk7CiRjb21wb3NlckJhY2t1cCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRqc29uRmlsZS0+Z2V0UGF0aCgpKTsKCiRqc29uID0gbmV3IEpzb25Db25maWdTb3VyY2UoJGpzb25GaWxlKTsKCiR0eXBlID0gJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3JlcXVpcmUtZGV2JyA6ICdyZXF1aXJlJzsKJGFsdFR5cGUgPSAhJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3JlcXVpcmUtZGV2JyA6ICdyZXF1aXJlJzsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gInVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcyIuIFRoaXMgaXMgbm93IGRlZmF1bHQgYmVoYXZpb3VyLiBUaGUgLS1uby11cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBhIHBhY2thZ2Ugd2l0aG91dCBpdHMgZGVwZW5kZW5jaWVzLjwvd2FybmluZz4nKTsKfQoKCmZvcmVhY2ggKFsncmVxdWlyZScsICdyZXF1aXJlLWRldiddIGFzICRsaW5rVHlwZSkgewppZiAoaXNzZXQoJGNvbXBvc2VyWyRsaW5rVHlwZV0pKSB7CmZvcmVhY2ggKCRjb21wb3NlclskbGlua1R5cGVdIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CiRjb21wb3NlclskbGlua1R5cGVdW3N0cnRvbG93ZXIoJG5hbWUpXSA9ICRuYW1lOwp9Cn0KfQoKJGRyeVJ1biA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJyk7CiR0b1JlbW92ZSA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKGlzc2V0KCRjb21wb3NlclskdHlwZV1bJHBhY2thZ2VdKSkgewppZiAoJGRyeVJ1bikgewokdG9SZW1vdmVbJHR5cGVdW10gPSAkY29tcG9zZXJbJHR5cGVdWyRwYWNrYWdlXTsKfSBlbHNlIHsKJGpzb24tPnJlbW92ZUxpbmsoJHR5cGUsICRjb21wb3NlclskdHlwZV1bJHBhY2thZ2VdKTsKfQp9IGVsc2VpZiAoaXNzZXQoJGNvbXBvc2VyWyRhbHRUeXBlXVskcGFja2FnZV0pKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+JyAuICRjb21wb3NlclskYWx0VHlwZV1bJHBhY2thZ2VdIC4gJyBjb3VsZCBub3QgYmUgZm91bmQgaW4gJyAuICR0eXBlIC4gJyBidXQgaXQgaXMgcHJlc2VudCBpbiAnIC4gJGFsdFR5cGUgLiAnPC93YXJuaW5nPicpOwppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKCdEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnIC4gJGFsdFR5cGUgLiAnIFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKaWYgKCRkcnlSdW4pIHsKJHRvUmVtb3ZlWyRhbHRUeXBlXVtdID0gJGNvbXBvc2VyWyRhbHRUeXBlXVskcGFja2FnZV07Cn0gZWxzZSB7CiRqc29uLT5yZW1vdmVMaW5rKCRhbHRUeXBlLCAkY29tcG9zZXJbJGFsdFR5cGVdWyRwYWNrYWdlXSk7Cn0KfQp9Cn0gZWxzZWlmIChpc3NldCgkY29tcG9zZXJbJHR5cGVdKSAmJiBjb3VudCgkbWF0Y2hlcyA9IFByZWc6OmdyZXAoQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2UpLCBhcnJheV9rZXlzKCRjb21wb3NlclskdHlwZV0pKSkgPiAwKSB7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaGVkUGFja2FnZSkgewppZiAoJGRyeVJ1bikgewokdG9SZW1vdmVbJHR5cGVdW10gPSAkbWF0Y2hlZFBhY2thZ2U7Cn0gZWxzZSB7CiRqc29uLT5yZW1vdmVMaW5rKCR0eXBlLCAkbWF0Y2hlZFBhY2thZ2UpOwp9Cn0KfSBlbHNlaWYgKGlzc2V0KCRjb21wb3NlclskYWx0VHlwZV0pICYmIGNvdW50KCRtYXRjaGVzID0gUHJlZzo6Z3JlcChCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZSksIGFycmF5X2tleXMoJGNvbXBvc2VyWyRhbHRUeXBlXSkpKSA+IDApIHsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG1hdGNoZWRQYWNrYWdlKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+JyAuICRtYXRjaGVkUGFja2FnZSAuICcgY291bGQgbm90IGJlIGZvdW5kIGluICcgLiAkdHlwZSAuICcgYnV0IGl0IGlzIHByZXNlbnQgaW4gJyAuICRhbHRUeXBlIC4gJzwvd2FybmluZz4nKTsKaWYgKCRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICgkaW8tPmFza0NvbmZpcm1hdGlvbignRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gJyAuICRhbHRUeXBlIC4gJyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CmlmICgkZHJ5UnVuKSB7CiR0b1JlbW92ZVskYWx0VHlwZV1bXSA9ICRtYXRjaGVkUGFja2FnZTsKfSBlbHNlIHsKJGpzb24tPnJlbW92ZUxpbmsoJGFsdFR5cGUsICRtYXRjaGVkUGFja2FnZSk7Cn0KfQp9Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRwYWNrYWdlLicgaXMgbm90IHJlcXVpcmVkIGluIHlvdXIgY29tcG9zZXIuanNvbiBhbmQgaGFzIG5vdCBiZWVuIHJlbW92ZWQ8L3dhcm5pbmc+Jyk7Cn0KfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz4nLiRmaWxlLicgaGFzIGJlZW4gdXBkYXRlZDwvaW5mbz4nKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tdXBkYXRlJykpIHsKcmV0dXJuIDA7Cn0KCmlmICgkY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKSkgewokY29tcG9zZXItPmdldFBsdWdpbk1hbmFnZXIoKS0+ZGVhY3RpdmF0ZUluc3RhbGxlZFBsdWdpbnMoKTsKfQoKCiR0aGlzLT5yZXNldENvbXBvc2VyKCk7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCmlmICgkZHJ5UnVuKSB7CiRyb290UGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokbGlua3MgPSBbCidyZXF1aXJlJyA9PiAkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksCidyZXF1aXJlLWRldicgPT4gJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpLApdOwpmb3JlYWNoICgkdG9SZW1vdmUgYXMgJHR5cGUgPT4gJG5hbWVzKSB7CmZvcmVhY2ggKCRuYW1lcyBhcyAkbmFtZSkgewp1bnNldCgkbGlua3NbJHR5cGVdWyRuYW1lXSk7Cn0KfQokcm9vdFBhY2thZ2UtPnNldFJlcXVpcmVzKCRsaW5rc1sncmVxdWlyZSddKTsKJHJvb3RQYWNrYWdlLT5zZXREZXZSZXF1aXJlcygkbGlua3NbJ3JlcXVpcmUtZGV2J10pOwp9CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdyZW1vdmUnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGFsbG93UGx1Z2lucyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYWxsb3ctcGx1Z2lucycpOwokcmVtb3ZlZFBsdWdpbnMgPSBpc19hcnJheSgkYWxsb3dQbHVnaW5zKSA/IGFycmF5X2ludGVyc2VjdChhcnJheV9rZXlzKCRhbGxvd1BsdWdpbnMpLCAkcGFja2FnZXMpIDogW107CmlmICghJGRyeVJ1biAmJiBpc19hcnJheSgkYWxsb3dQbHVnaW5zKSAmJiBjb3VudCgkcmVtb3ZlZFBsdWdpbnMpID4gMCkgewppZiAoY291bnQoJGFsbG93UGx1Z2lucykgPT09IGNvdW50KCRyZW1vdmVkUGx1Z2lucykpIHsKJGpzb24tPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2FsbG93LXBsdWdpbnMnKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHJlbW92ZWRQbHVnaW5zIGFzICRwbHVnaW4pIHsKJGpzb24tPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2FsbG93LXBsdWdpbnMuJy4kcGx1Z2luKTsKfQp9Cn0KCiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5zZXRPdXRwdXRQcm9ncmVzcyghJGlucHV0LT5nZXRPcHRpb24oJ25vLXByb2dyZXNzJykpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgokdXBkYXRlRGV2TW9kZSA9ICEkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLW5vLWRldicpOwokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTX05PX1JPT1RfUkVRVUlSRTsKJGZsYWdzID0gJyc7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUzsKJGZsYWdzIC49ICcgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CiRmbGFncyAuPSAnIC0td2l0aC1kZXBlbmRlbmNpZXMnOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlJ1bm5pbmcgY29tcG9zZXIgdXBkYXRlICcuaW1wbG9kZSgnICcsICRwYWNrYWdlcykuJGZsYWdzLic8L2luZm8+Jyk7CgokaW5zdGFsbAotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXREZXZNb2RlKCR1cGRhdGVEZXZNb2RlKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKQotPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSkKLT5zZXREcnlSdW4oJGRyeVJ1bikKLT5zZXRBdWRpdCghJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1ZGl0JykpCi0+c2V0QXVkaXRGb3JtYXQoJHRoaXMtPmdldEF1ZGl0Rm9ybWF0KCRpbnB1dCkpCjsKCgoKaWYgKCRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKJGluc3RhbGwtPnNldFVwZGF0ZUFsbG93TGlzdCgkcGFja2FnZXMpOwp9Cgokc3RhdHVzID0gJGluc3RhbGwtPnJ1bigpOwppZiAoJHN0YXR1cyAhPT0gMCkgewokaW8tPndyaXRlRXJyb3IoIlxuIi4nPGVycm9yPlJlbW92YWwgZmFpbGVkLCByZXZlcnRpbmcgJy4kZmlsZS4nIHRvIGl0cyBvcmlnaW5hbCBjb250ZW50LjwvZXJyb3I+Jyk7CmZpbGVfcHV0X2NvbnRlbnRzKCRqc29uRmlsZS0+Z2V0UGF0aCgpLCAkY29tcG9zZXJCYWNrdXApOwp9CgppZiAoISRkcnlSdW4pIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLT5maW5kUGFja2FnZXMoJHBhY2thZ2UpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlJlbW92YWwgZmFpbGVkLCAnLiRwYWNrYWdlLicgaXMgc3RpbGwgcHJlc2VudCwgaXQgbWF5IGJlIHJlcXVpcmVkIGJ5IGFub3RoZXIgcGFja2FnZS4gU2VlIGBjb21wb3NlciB3aHkgJy4kcGFja2FnZS4nYC48L2Vycm9yPicpOwoKcmV0dXJuIDI7Cn0KfQp9CgpyZXR1cm4gJHN0YXR1czsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFJvb3RQYWNrYWdlTG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkJ1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBTZWxkXFNpZ25hbFxTaWduYWxIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckV2ZW50czsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CgoKCgoKY2xhc3MgUmVxdWlyZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CnVzZSBQYWNrYWdlRGlzY292ZXJ5VHJhaXQ7CgoKcHJpdmF0ZSAkbmV3bHlDcmVhdGVkOwoKcHJpdmF0ZSAkZmlyc3RSZXF1aXJlOwoKcHJpdmF0ZSAkanNvbjsKCnByaXZhdGUgJGZpbGU7Cgpwcml2YXRlICRjb21wb3NlckJhY2t1cDsKCnByaXZhdGUgJGxvY2s7Cgpwcml2YXRlICRsb2NrQmFja3VwOwoKcHJpdmF0ZSAkZGVwZW5kZW5jeVJlc29sdXRpb25Db21wbGV0ZWQgPSBmYWxzZTsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzCi0+c2V0TmFtZSgncmVxdWlyZScpCi0+c2V0QWxpYXNlcyhbJ3InXSkKLT5zZXREZXNjcmlwdGlvbignQWRkcyByZXF1aXJlZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24gYW5kIGluc3RhbGxzIHRoZW0nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnT3B0aW9uYWwgcGFja2FnZSBuYW1lIGNhbiBhbHNvIGluY2x1ZGUgYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gZm9vL2JhciBvciBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAgb3IgImZvby9iYXIgMS4wLjAiJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWRkIHJlcXVpcmVtZW50IHRvIHJlcXVpcmUtZGV2LicpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcgKGltcGxpY2l0bHkgZW5hYmxlcyAtLXZlcmJvc2UpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignZml4ZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1dyaXRlIGZpeGVkIHZlcnNpb24gdG8gdGhlIGNvbXBvc2VyLmpzb24uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tc3VnZ2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogVGhpcyBmbGFnIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tdXBkYXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgYXV0b21hdGljIHVwZGF0ZSBvZiB0aGUgZGVwZW5kZW5jaWVzIChpbXBsaWVzIC0tbm8taW5zdGFsbCkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgaW5zdGFsbCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGF1ZGl0IHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fQVVESVQ9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSdW4gdGhlIGRlcGVuZGVuY3kgdXBkYXRlIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHJvb3QgcmVxdWlyZW1lbnRzLicpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCAnVycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGFsbCBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSByb290IHJlcXVpcmVtZW50cy4nKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWRlcGVuZGVuY2llcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxpYXMgZm9yIC0tdXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGlhcyBmb3IgLS11cGRhdGUtd2l0aC1hbGwtZGVwZW5kZW5jaWVzJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zdGFibGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByZWZlciBzdGFibGUgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9QUkVGRVJfU1RBQkxFPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWxvd2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJlZmVyIGxvd2VzdCB2ZXJzaW9ucyBvZiBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1BSRUZFUl9MT1dFU1Q9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdzb3J0LXBhY2thZ2VzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTb3J0cyBwYWNrYWdlcyB3aGVuIGFkZGluZy91cGRhdGluZyBhIG5ldyBkZXBlbmRlbmN5JyksCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZSBhdXRvbG9hZGVyIGR1cmluZyBhdXRvbG9hZGVyIGR1bXAnKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgcmVxdWlyZSBjb21tYW5kIGFkZHMgcmVxdWlyZWQgcGFja2FnZXMgdG8geW91ciBjb21wb3Nlci5qc29uIGFuZCBpbnN0YWxscyB0aGVtLgoKSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcGFja2FnZSwgY29tcG9zZXIgd2lsbCBwcm9tcHQgeW91IHRvIHNlYXJjaCBmb3IgYSBwYWNrYWdlLCBhbmQgZ2l2ZW4gcmVzdWx0cywgcHJvdmlkZSBhIGxpc3Qgb2YKbWF0Y2hlcyB0byByZXF1aXJlLgoKSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBjb25zdHJhaW50LCBjb21wb3NlciB3aWxsIGNob29zZSBhIHN1aXRhYmxlIG9uZSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHBhY2thZ2UgdmVyc2lvbnMuCgpJZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5zdGFsbCB0aGUgbmV3IGRlcGVuZGVuY2llcyBpbW1lZGlhdGVseSB5b3UgY2FuIGNhbGwgaXQgd2l0aCAtLW5vLXVwZGF0ZQoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcmVxdWlyZS1yCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+ZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tc3VnZ2VzdCcpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tbm8tc3VnZ2VzdCIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KCiR0aGlzLT5uZXdseUNyZWF0ZWQgPSAhZmlsZV9leGlzdHMoJHRoaXMtPmZpbGUpOwppZiAoJHRoaXMtPm5ld2x5Q3JlYXRlZCAmJiAhZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGUsICJ7XG59XG4iKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiR0aGlzLT5maWxlLicgY291bGQgbm90IGJlIGNyZWF0ZWQuPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+ZmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kdGhpcy0+ZmlsZS4nIGlzIG5vdCByZWFkYWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIDE7Cn0KCmlmIChmaWxlc2l6ZSgkdGhpcy0+ZmlsZSkgPT09IDApIHsKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGUsICJ7XG59XG4iKTsKfQoKJHRoaXMtPmpzb24gPSBuZXcgSnNvbkZpbGUoJHRoaXMtPmZpbGUpOwokdGhpcy0+bG9jayA9IEZhY3Rvcnk6OmdldExvY2tGaWxlKCR0aGlzLT5maWxlKTsKJHRoaXMtPmNvbXBvc2VyQmFja3VwID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmpzb24tPmdldFBhdGgoKSk7CiR0aGlzLT5sb2NrQmFja3VwID0gZmlsZV9leGlzdHMoJHRoaXMtPmxvY2spID8gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmxvY2spIDogbnVsbDsKCiRzaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKFtTaWduYWxIYW5kbGVyOjpTSUdJTlQsIFNpZ25hbEhhbmRsZXI6OlNJR1RFUk0sIFNpZ25hbEhhbmRsZXI6OlNJR0hVUF0sIGZ1bmN0aW9uIChzdHJpbmcgJHNpZ25hbCwgU2lnbmFsSGFuZGxlciAkaGFuZGxlcikgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignUmVjZWl2ZWQgJy4kc2lnbmFsLicsIGFib3J0aW5nJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJldmVydENvbXBvc2VyRmlsZSgpOwokaGFuZGxlci0+ZXhpdFdpdGhMYXN0U2lnbmFsKCk7Cn0pOwoKCgppZiAoIWlzX3dyaXRhYmxlKCR0aGlzLT5maWxlKSAmJiBmYWxzZSA9PT0gU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJHRoaXMtPmZpbGUsICR0aGlzLT5jb21wb3NlckJhY2t1cCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kdGhpcy0+ZmlsZS4nIGlzIG5vdCB3cml0YWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZml4ZWQnKSA9PT0gdHJ1ZSkgewokY29uZmlnID0gJHRoaXMtPmpzb24tPnJlYWQoKTsKCiRwYWNrYWdlVHlwZSA9IGVtcHR5KCRjb25maWdbJ3R5cGUnXSkgPyAnbGlicmFyeScgOiAkY29uZmlnWyd0eXBlJ107CgoKCgppZiAoJHBhY2thZ2VUeXBlICE9PSAncHJvamVjdCcgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgIi0tZml4ZWQiIG9wdGlvbiBpcyBvbmx5IGFsbG93ZWQgZm9yIHBhY2thZ2VzIHdpdGggYSAicHJvamVjdCIgdHlwZSBvciBmb3IgZGV2IGRlcGVuZGVuY2llcyB0byBwcmV2ZW50IHBvc3NpYmxlIG1pc3VzZXMuPC9lcnJvcj4nKTsKCmlmICghaXNzZXQoJGNvbmZpZ1sndHlwZSddKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JZiB5b3VyIHBhY2thZ2UgaXMgbm90IGEgbGlicmFyeSwgeW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlICJ0eXBlIiBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIHR5cGUgcHJvamVjdCIuPC9lcnJvcj4nKTsKfQoKcmV0dXJuIDE7Cn0KfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcmVwb3MgPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpOwoKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpOwoKJHRoaXMtPnJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoClskcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKV0sCiRyZXBvcwopKTsKCmlmICgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UHJlZmVyU3RhYmxlKCkpIHsKJHByZWZlcnJlZFN0YWJpbGl0eSA9ICdzdGFibGUnOwp9IGVsc2UgewokcHJlZmVycmVkU3RhYmlsaXR5ID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKfQoKdHJ5IHsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5kZXRlcm1pbmVSZXF1aXJlbWVudHMoCiRpbnB1dCwKJG91dHB1dCwKJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSwKJHBsYXRmb3JtUmVwbywKJHByZWZlcnJlZFN0YWJpbGl0eSwKJGlucHV0LT5nZXRPcHRpb24oJ25vLXVwZGF0ZScpLCAKJGlucHV0LT5nZXRPcHRpb24oJ2ZpeGVkJykKKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJHRoaXMtPm5ld2x5Q3JlYXRlZCkgewokdGhpcy0+cmV2ZXJ0Q29tcG9zZXJGaWxlKCk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vIGNvbXBvc2VyLmpzb24gcHJlc2VudCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKCcuJHRoaXMtPmZpbGUuJyksIHRoaXMgbWF5IGJlIHRoZSBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbi4nLCAwLCAkZSk7Cn0KCnRocm93ICRlOwp9CgokcmVxdWlyZW1lbnRzID0gJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkcmVxdWlyZW1lbnRzKTsKCmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2RldicpICYmICRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRkZXZQYWNrYWdlcyA9IFtdOwokZGV2VGFncyA9IFsnZGV2JywgJ3Rlc3RpbmcnLCAnc3RhdGljIGFuYWx5c2lzJ107CiRjdXJyZW50UmVxdWlyZXNCeUtleSA9ICR0aGlzLT5nZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CgppZiAoaXNzZXQoJGN1cnJlbnRSZXF1aXJlc0J5S2V5WyRuYW1lXSkpIHsKY29udGludWU7Cn0KCiRwa2cgPSBQYWNrYWdlU29ydGVyOjpnZXRNb3N0Q3VycmVudFZlcnNpb24oJHRoaXMtPmdldFJlcG9zKCktPmZpbmRQYWNrYWdlcygkbmFtZSkpOwppZiAoJHBrZyBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewokcGtnRGV2VGFncyA9IGFycmF5X2ludGVyc2VjdCgkZGV2VGFncywgYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBrZy0+Z2V0S2V5d29yZHMoKSkpOwppZiAoY291bnQoJHBrZ0RldlRhZ3MpID4gMCkgewokZGV2UGFja2FnZXNbXSA9ICRwa2dEZXZUYWdzOwp9Cn0KfQoKaWYgKGNvdW50KCRkZXZQYWNrYWdlcykgPT09IGNvdW50KCRyZXF1aXJlbWVudHMpKSB7CiRwbHVyYWwgPSBjb3VudCgkcmVxdWlyZW1lbnRzKSA+IDEgPyAncycgOiAnJzsKJHBsdXJhbDIgPSBjb3VudCgkcmVxdWlyZW1lbnRzKSA+IDEgPyAnYXJlJyA6ICdpcyc7CiRwbHVyYWwzID0gY291bnQoJHJlcXVpcmVtZW50cykgPiAxID8gJ3RoZXkgYXJlJyA6ICdpdCBpcyc7CiRwa2dEZXZUYWdzID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKC4uLiRkZXZQYWNrYWdlcykpOwokaW8tPndhcm5pbmcoJ1RoZSBwYWNrYWdlJy4kcGx1cmFsLicgeW91IHJlcXVpcmVkICcuJHBsdXJhbDIuJyByZWNvbW1lbmRlZCB0byBiZSBwbGFjZWQgaW4gcmVxdWlyZS1kZXYgKGJlY2F1c2UgJy4kcGx1cmFsMy4nIHRhZ2dlZCBhcyAiJy5pbXBsb2RlKCciLCAiJywgJHBrZ0RldlRhZ3MpLiciKSBidXQgeW91IGRpZCBub3QgdXNlIC0tZGV2LicpOwppZiAoJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkRvIHlvdSB3YW50IHRvIHJlLXJ1biB0aGUgY29tbWFuZCB3aXRoIC0tZGV2PzwvPiBbPGNvbW1lbnQ+eWVzPC8+XT8gJykpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2RldicsIHRydWUpOwp9Cn0KCnVuc2V0KCRkZXZQYWNrYWdlcywgJHBrZ0RldlRhZ3MpOwp9CgokcmVxdWlyZUtleSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICdyZXF1aXJlLWRldicgOiAncmVxdWlyZSc7CiRyZW1vdmVLZXkgPSAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgPyAncmVxdWlyZScgOiAncmVxdWlyZS1kZXYnOwoKCiRyZXF1aXJlbWVudHNUb0d1ZXNzID0gW107CmZvcmVhY2ggKCRyZXF1aXJlbWVudHMgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRjb25zdHJhaW50ID09PSAnZ3Vlc3MnKSB7CiRyZXF1aXJlbWVudHNbJHBhY2thZ2VdID0gJyonOwokcmVxdWlyZW1lbnRzVG9HdWVzc1tdID0gJHBhY2thZ2U7Cn0KfQoKCiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50cyBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewppZiAoc3RydG9sb3dlcigkcGFja2FnZSkgPT09ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5Sb290IHBhY2thZ2UgXCclc1wnIGNhbm5vdCByZXF1aXJlIGl0c2VsZiBpbiBpdHMgY29tcG9zZXIuanNvbjwvZXJyb3I+JywgJHBhY2thZ2UpKTsKCnJldHVybiAxOwp9CmlmICgkY29uc3RyYWludCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKY29udGludWU7Cn0KJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9CgokaW5jb25zaXN0ZW50UmVxdWlyZUtleXMgPSAkdGhpcy0+Z2V0SW5jb25zaXN0ZW50UmVxdWlyZUtleXMoJHJlcXVpcmVtZW50cywgJHJlcXVpcmVLZXkpOwppZiAoY291bnQoJGluY29uc2lzdGVudFJlcXVpcmVLZXlzKSA+IDApIHsKZm9yZWFjaCAoJGluY29uc2lzdGVudFJlcXVpcmVLZXlzIGFzICRwYWNrYWdlKSB7CiRpby0+d2FybmluZyhzcHJpbnRmKAonJXMgaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlICVzIGtleSBhbmQgeW91IHJhbiB0aGUgY29tbWFuZCAlcyB0aGUgLS1kZXYgZmxhZywgd2hpY2ggd2lsbCBtb3ZlIGl0IHRvIHRoZSAlcyBrZXkuJywKJHBhY2thZ2UsCiRyZW1vdmVLZXksCiRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICd3aXRoJyA6ICd3aXRob3V0JywKJHJlcXVpcmVLZXkKKSk7Cn0KCmlmICgkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKHNwcmludGYoJzxpbmZvPkRvIHlvdSB3YW50IHRvIG1vdmUgJXM/PC9pbmZvPiBbPGNvbW1lbnQ+bm88L2NvbW1lbnQ+XT8gJywgY291bnQoJGluY29uc2lzdGVudFJlcXVpcmVLZXlzKSA+IDEgPyAndGhlc2UgcmVxdWlyZW1lbnRzJyA6ICd0aGlzIHJlcXVpcmVtZW50JyksIGZhbHNlKSkgewppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKHNwcmludGYoJzxpbmZvPkRvIHlvdSB3YW50IHRvIHJlLXJ1biB0aGUgY29tbWFuZCAlcyAtLWRldj88L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJywgJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3dpdGhvdXQnIDogJ3dpdGgnKSwgdHJ1ZSkpIHsKcmV0dXJuIDA7Cn0KCiRpbnB1dC0+c2V0T3B0aW9uKCdkZXYnLCB0cnVlKTsKWyRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5XSA9IFskcmVtb3ZlS2V5LCAkcmVxdWlyZUtleV07Cn0KfQp9Cgokc29ydFBhY2thZ2VzID0gJGlucHV0LT5nZXRPcHRpb24oJ3NvcnQtcGFja2FnZXMnKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3NvcnQtcGFja2FnZXMnKTsKCiR0aGlzLT5maXJzdFJlcXVpcmUgPSAkdGhpcy0+bmV3bHlDcmVhdGVkOwppZiAoISR0aGlzLT5maXJzdFJlcXVpcmUpIHsKJGNvbXBvc2VyRGVmaW5pdGlvbiA9ICR0aGlzLT5qc29uLT5yZWFkKCk7CmlmIChjb3VudCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlJ10gPz8gW10pID09PSAwICYmIGNvdW50KCRjb21wb3NlckRlZmluaXRpb25bJ3JlcXVpcmUtZGV2J10gPz8gW10pID09PSAwKSB7CiR0aGlzLT5maXJzdFJlcXVpcmUgPSB0cnVlOwp9Cn0KCmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSkgewokdGhpcy0+dXBkYXRlRmlsZSgkdGhpcy0+anNvbiwgJHJlcXVpcmVtZW50cywgJHJlcXVpcmVLZXksICRyZW1vdmVLZXksICRzb3J0UGFja2FnZXMpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicuJHRoaXMtPmZpbGUuJyBoYXMgYmVlbiAnLigkdGhpcy0+bmV3bHlDcmVhdGVkID8gJ2NyZWF0ZWQnIDogJ3VwZGF0ZWQnKS4nPC9pbmZvPicpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby11cGRhdGUnKSkgewpyZXR1cm4gMDsKfQoKJGNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRlYWN0aXZhdGVJbnN0YWxsZWRQbHVnaW5zKCk7Cgp0cnkgewokcmVzdWx0ID0gJHRoaXMtPmRvVXBkYXRlKCRpbnB1dCwgJG91dHB1dCwgJGlvLCAkcmVxdWlyZW1lbnRzLCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSk7CmlmICgkcmVzdWx0ID09PSAwICYmIGNvdW50KCRyZXF1aXJlbWVudHNUb0d1ZXNzKSA+IDApIHsKJHJlc3VsdCA9ICR0aGlzLT51cGRhdGVSZXF1aXJlbWVudHNBZnRlclJlc29sdXRpb24oJHJlcXVpcmVtZW50c1RvR3Vlc3MsICRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5LCAkc29ydFBhY2thZ2VzLCAkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpLCAkaW5wdXQtPmdldE9wdGlvbignZml4ZWQnKSk7Cn0KCnJldHVybiAkcmVzdWx0Owp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJHRoaXMtPmRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkKSB7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKfQp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbmNvbnNpc3RlbnRSZXF1aXJlS2V5cyhhcnJheSAkbmV3UmVxdWlyZW1lbnRzLCBzdHJpbmcgJHJlcXVpcmVLZXkpOiBhcnJheQp7CiRyZXF1aXJlS2V5cyA9ICR0aGlzLT5nZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOwokaW5jb25zaXN0ZW50UmVxdWlyZW1lbnRzID0gW107CmZvcmVhY2ggKCRyZXF1aXJlS2V5cyBhcyAkcGFja2FnZSA9PiAkcGFja2FnZVJlcXVpcmVLZXkpIHsKaWYgKCFpc3NldCgkbmV3UmVxdWlyZW1lbnRzWyRwYWNrYWdlXSkpIHsKY29udGludWU7Cn0KaWYgKCRyZXF1aXJlS2V5ICE9PSAkcGFja2FnZVJlcXVpcmVLZXkpIHsKJGluY29uc2lzdGVudFJlcXVpcmVtZW50c1tdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRpbmNvbnNpc3RlbnRSZXF1aXJlbWVudHM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZXNCeVJlcXVpcmVLZXkoKTogYXJyYXkKewokY29tcG9zZXJEZWZpbml0aW9uID0gJHRoaXMtPmpzb24tPnJlYWQoKTsKJHJlcXVpcmUgPSBbXTsKJHJlcXVpcmVEZXYgPSBbXTsKCmlmIChpc3NldCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlJ10pKSB7CiRyZXF1aXJlID0gJGNvbXBvc2VyRGVmaW5pdGlvblsncmVxdWlyZSddOwp9CgppZiAoaXNzZXQoJGNvbXBvc2VyRGVmaW5pdGlvblsncmVxdWlyZS1kZXYnXSkpIHsKJHJlcXVpcmVEZXYgPSAkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlLWRldiddOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoCmFycmF5X2ZpbGxfa2V5cyhhcnJheV9rZXlzKCRyZXF1aXJlKSwgJ3JlcXVpcmUnKSwKYXJyYXlfZmlsbF9rZXlzKGFycmF5X2tleXMoJHJlcXVpcmVEZXYpLCAncmVxdWlyZS1kZXYnKQopOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1VwZGF0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRyZXF1aXJlbWVudHMsIHN0cmluZyAkcmVxdWlyZUtleSwgc3RyaW5nICRyZW1vdmVLZXkpOiBpbnQKewoKJHRoaXMtPnJlc2V0Q29tcG9zZXIoKTsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJHRoaXMtPmRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkID0gZmFsc2U7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmFkZExpc3RlbmVyKEluc3RhbGxlckV2ZW50czo6UFJFX09QRVJBVElPTlNfRVhFQywgZnVuY3Rpb24gKCk6IHZvaWQgewokdGhpcy0+ZGVwZW5kZW5jeVJlc29sdXRpb25Db21wbGV0ZWQgPSB0cnVlOwp9LCAxMDAwMCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSkgewokcm9vdFBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKJGxpbmtzID0gWwoncmVxdWlyZScgPT4gJHJvb3RQYWNrYWdlLT5nZXRSZXF1aXJlcygpLAoncmVxdWlyZS1kZXYnID0+ICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSwKXTsKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigpOwokbmV3TGlua3MgPSAkbG9hZGVyLT5wYXJzZUxpbmtzKCRyb290UGFja2FnZS0+Z2V0TmFtZSgpLCAkcm9vdFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwgQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXNbJHJlcXVpcmVLZXldWydtZXRob2QnXSwgJHJlcXVpcmVtZW50cyk7CiRsaW5rc1skcmVxdWlyZUtleV0gPSBhcnJheV9tZXJnZSgkbGlua3NbJHJlcXVpcmVLZXldLCAkbmV3TGlua3MpOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CnVuc2V0KCRsaW5rc1skcmVtb3ZlS2V5XVskcGFja2FnZV0pOwp9CiRyb290UGFja2FnZS0+c2V0UmVxdWlyZXMoJGxpbmtzWydyZXF1aXJlJ10pOwokcm9vdFBhY2thZ2UtPnNldERldlJlcXVpcmVzKCRsaW5rc1sncmVxdWlyZS1kZXYnXSk7CgoKJHJlZmVyZW5jZXMgPSAkcm9vdFBhY2thZ2UtPmdldFJlZmVyZW5jZXMoKTsKJHJlZmVyZW5jZXMgPSBSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFJlZmVyZW5jZXMoJHJlcXVpcmVtZW50cywgJHJlZmVyZW5jZXMpOwokcm9vdFBhY2thZ2UtPnNldFJlZmVyZW5jZXMoJHJlZmVyZW5jZXMpOwokc3RhYmlsaXR5RmxhZ3MgPSAkcm9vdFBhY2thZ2UtPmdldFN0YWJpbGl0eUZsYWdzKCk7CiRzdGFiaWxpdHlGbGFncyA9IFJvb3RQYWNrYWdlTG9hZGVyOjpleHRyYWN0U3RhYmlsaXR5RmxhZ3MoJHJlcXVpcmVtZW50cywgJHJvb3RQYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksICRzdGFiaWxpdHlGbGFncyk7CiRyb290UGFja2FnZS0+c2V0U3RhYmlsaXR5RmxhZ3MoJHN0YWJpbGl0eUZsYWdzKTsKdW5zZXQoJHN0YWJpbGl0eUZsYWdzLCAkcmVmZXJlbmNlcyk7Cn0KCiR1cGRhdGVEZXZNb2RlID0gISRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUtbm8tZGV2Jyk7CiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJyk7CiRhdXRob3JpdGF0aXZlID0gJGlucHV0LT5nZXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKTsKJGFwY3VQcmVmaXggPSAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcpOwokYXBjdSA9ICRhcGN1UHJlZml4ICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwoKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9PTkxZX0xJU1RFRDsKJGZsYWdzID0gJyc7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUzsKJGZsYWdzIC49ICcgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTX05PX1JPT1RfUkVRVUlSRTsKJGZsYWdzIC49ICcgLS13aXRoLWRlcGVuZGVuY2llcyc7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+UnVubmluZyBjb21wb3NlciB1cGRhdGUgJy5pbXBsb2RlKCcgJywgYXJyYXlfa2V5cygkcmVxdWlyZW1lbnRzKSkuJGZsYWdzLic8L2luZm8+Jyk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdyZXF1aXJlJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5zZXRPdXRwdXRQcm9ncmVzcyghJGlucHV0LT5nZXRPcHRpb24oJ25vLXByb2dyZXNzJykpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRpbnB1dCk7CgokaW5zdGFsbAotPnNldERyeVJ1bigkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpKQotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSkKLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KQotPnNldERldk1vZGUoJHVwZGF0ZURldk1vZGUpCi0+c2V0T3B0aW1pemVBdXRvbG9hZGVyKCRvcHRpbWl6ZSkKLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGF1dGhvcml0YXRpdmUpCi0+c2V0QXBjdUF1dG9sb2FkZXIoJGFwY3UsICRhcGN1UHJlZml4KQotPnNldFVwZGF0ZSh0cnVlKQotPnNldEluc3RhbGwoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1pbnN0YWxsJykpCi0+c2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKQotPnNldFByZWZlclN0YWJsZSgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXN0YWJsZScpKQotPnNldFByZWZlckxvd2VzdCgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWxvd2VzdCcpKQotPnNldEF1ZGl0KCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXVkaXQnKSkKLT5zZXRBdWRpdEZvcm1hdCgkdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0KSkKOwoKCgppZiAoISR0aGlzLT5maXJzdFJlcXVpcmUgJiYgJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewokaW5zdGFsbC0+c2V0VXBkYXRlQWxsb3dMaXN0KGFycmF5X2tleXMoJHJlcXVpcmVtZW50cykpOwp9Cgokc3RhdHVzID0gJGluc3RhbGwtPnJ1bigpOwppZiAoJHN0YXR1cyAhPT0gMCAmJiAkc3RhdHVzICE9PSBJbnN0YWxsZXI6OkVSUk9SX0FVRElUX0ZBSUxFRCkgewppZiAoJHN0YXR1cyA9PT0gSW5zdGFsbGVyOjpFUlJPUl9ERVBFTkRFTkNZX1JFU09MVVRJT05fRkFJTEVEKSB7CmZvcmVhY2ggKCR0aGlzLT5ub3JtYWxpemVSZXF1aXJlbWVudHMoJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSkgYXMgJHJlcSkgewppZiAoIWlzc2V0KCRyZXFbJ3ZlcnNpb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gdHJ5IHJlLXJ1bm5pbmcgY29tcG9zZXIgcmVxdWlyZSB3aXRoIGFuIGV4cGxpY2l0IHZlcnNpb24gY29uc3RyYWludCwgZS5nLiAiY29tcG9zZXIgcmVxdWlyZSAnLiRyZXFbJ25hbWUnXS4nOioiIHRvIGZpZ3VyZSBvdXQgaWYgYW55IHZlcnNpb24gaXMgaW5zdGFsbGFibGUsIG9yICJjb21wb3NlciByZXF1aXJlICcuJHJlcVsnbmFtZSddLic6XjIuMSIgaWYgeW91IGtub3cgd2hpY2ggeW91IG5lZWQuJyk7CmJyZWFrOwp9Cn0KfQokdGhpcy0+cmV2ZXJ0Q29tcG9zZXJGaWxlKCk7Cn0KCnJldHVybiAkc3RhdHVzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZVJlcXVpcmVtZW50c0FmdGVyUmVzb2x1dGlvbihhcnJheSAkcmVxdWlyZW1lbnRzVG9VcGRhdGUsIHN0cmluZyAkcmVxdWlyZUtleSwgc3RyaW5nICRyZW1vdmVLZXksIGJvb2wgJHNvcnRQYWNrYWdlcywgYm9vbCAkZHJ5UnVuLCBib29sICRmaXhlZCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CiRyZXF1aXJlbWVudHMgPSBbXTsKJHZlcnNpb25TZWxlY3RvciA9IG5ldyBWZXJzaW9uU2VsZWN0b3IobmV3IFJlcG9zaXRvcnlTZXQoKSk7CiRyZXBvID0gJGxvY2tlci0+aXNMb2NrZWQoKSA/ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSkgOiAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzVG9VcGRhdGUgYXMgJHBhY2thZ2VOYW1lKSB7CiRwYWNrYWdlID0gJHJlcG8tPmZpbmRQYWNrYWdlKCRwYWNrYWdlTmFtZSwgJyonKTsKd2hpbGUgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIFBhY2thZ2VJbnRlcmZhY2UpIHsKY29udGludWU7Cn0KCmlmICgkZml4ZWQpIHsKJHJlcXVpcmVtZW50c1skcGFja2FnZU5hbWVdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfSBlbHNlIHsKJHJlcXVpcmVtZW50c1skcGFja2FnZU5hbWVdID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZFJlY29tbWVuZGVkUmVxdWlyZVZlcnNpb24oJHBhY2thZ2UpOwp9CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKHNwcmludGYoCidVc2luZyB2ZXJzaW9uIDxpbmZvPiVzPC9pbmZvPiBmb3IgPGluZm8+JXM8L2luZm8+JywKJHJlcXVpcmVtZW50c1skcGFja2FnZU5hbWVdLAokcGFja2FnZU5hbWUKKSk7CgppZiAoUHJlZzo6aXNNYXRjaCgne15kZXYtKD8hbWFpbiR8bWFzdGVyJHx0cnVuayR8bGF0ZXN0JCl9JywgJHJlcXVpcmVtZW50c1skcGFja2FnZU5hbWVdKSkgewokdGhpcy0+Z2V0SU8oKS0+d2FybmluZygnVmVyc2lvbiAnLiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXS4nIGxvb2tzIGxpa2UgaXQgbWF5IGJlIGEgZmVhdHVyZSBicmFuY2ggd2hpY2ggaXMgdW5saWtlbHkgdG8ga2VlcCB3b3JraW5nIGluIHRoZSBsb25nIHJ1biBhbmQgbWF5IGJlIGluIGFuIHVuc3RhYmxlIHN0YXRlJyk7CmlmICgkdGhpcy0+Z2V0SU8oKS0+aXNJbnRlcmFjdGl2ZSgpICYmICEkdGhpcy0+Z2V0SU8oKS0+YXNrQ29uZmlybWF0aW9uKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29uc3RyYWludCAoPGNvbW1lbnQ+WTwvY29tbWVudD4pIG9yIHdvdWxkIHlvdSByYXRoZXIgYWJvcnQgKDxjb21tZW50Pm48L2NvbW1lbnQ+KSB0aGUgd2hvbGUgb3BlcmF0aW9uIFs8Y29tbWVudD5ZLG48L2NvbW1lbnQ+XT8gJykpIHsKJHRoaXMtPnJldmVydENvbXBvc2VyRmlsZSgpOwoKcmV0dXJuIDE7Cn0KfQp9CgppZiAoISRkcnlSdW4pIHsKJHRoaXMtPnVwZGF0ZUZpbGUoJHRoaXMtPmpzb24sICRyZXF1aXJlbWVudHMsICRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5LCAkc29ydFBhY2thZ2VzKTsKaWYgKCRsb2NrZXItPmlzTG9ja2VkKCkpIHsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmpzb24tPmdldFBhdGgoKSk7CmlmIChmYWxzZSA9PT0gJGNvbnRlbnRzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHJlYWQgJy4kdGhpcy0+anNvbi0+Z2V0UGF0aCgpLicgY29udGVudHMgdG8gdXBkYXRlIHRoZSBsb2NrIGZpbGUgaGFzaC4nKTsKfQokbG9ja0ZpbGUgPSBGYWN0b3J5OjpnZXRMb2NrRmlsZSgkdGhpcy0+anNvbi0+Z2V0UGF0aCgpKTsKJGxvY2tNdGltZSA9IGZpbGVtdGltZSgkbG9ja0ZpbGUpOwokbG9jayA9IG5ldyBKc29uRmlsZSgkbG9ja0ZpbGUpOwokbG9ja0RhdGEgPSAkbG9jay0+cmVhZCgpOwokbG9ja0RhdGFbJ2NvbnRlbnQtaGFzaCddID0gTG9ja2VyOjpnZXRDb250ZW50SGFzaCgkY29udGVudHMpOwokbG9jay0+d3JpdGUoJGxvY2tEYXRhKTsKaWYgKGlzX2ludCgkbG9ja010aW1lKSkgewpAdG91Y2goJGxvY2tGaWxlLCAkbG9ja010aW1lKTsKfQp9Cn0KCnJldHVybiAwOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUZpbGUoSnNvbkZpbGUgJGpzb24sIGFycmF5ICRuZXcsIHN0cmluZyAkcmVxdWlyZUtleSwgc3RyaW5nICRyZW1vdmVLZXksIGJvb2wgJHNvcnRQYWNrYWdlcyk6IHZvaWQKewppZiAoJHRoaXMtPnVwZGF0ZUZpbGVDbGVhbmx5KCRqc29uLCAkbmV3LCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSwgJHNvcnRQYWNrYWdlcykpIHsKcmV0dXJuOwp9CgokY29tcG9zZXJEZWZpbml0aW9uID0gJHRoaXMtPmpzb24tPnJlYWQoKTsKZm9yZWFjaCAoJG5ldyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewokY29tcG9zZXJEZWZpbml0aW9uWyRyZXF1aXJlS2V5XVskcGFja2FnZV0gPSAkdmVyc2lvbjsKdW5zZXQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XVskcGFja2FnZV0pOwppZiAoaXNzZXQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XSkgJiYgY291bnQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XSkgPT09IDApIHsKdW5zZXQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XSk7Cn0KfQokdGhpcy0+anNvbi0+d3JpdGUoJGNvbXBvc2VyRGVmaW5pdGlvbik7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlRmlsZUNsZWFubHkoSnNvbkZpbGUgJGpzb24sIGFycmF5ICRuZXcsIHN0cmluZyAkcmVxdWlyZUtleSwgc3RyaW5nICRyZW1vdmVLZXksIGJvb2wgJHNvcnRQYWNrYWdlcyk6IGJvb2wKewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpKTsKCiRtYW5pcHVsYXRvciA9IG5ldyBKc29uTWFuaXB1bGF0b3IoJGNvbnRlbnRzKTsKCmZvcmVhY2ggKCRuZXcgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCEkbWFuaXB1bGF0b3ItPmFkZExpbmsoJHJlcXVpcmVLZXksICRwYWNrYWdlLCAkY29uc3RyYWludCwgJHNvcnRQYWNrYWdlcykpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICghJG1hbmlwdWxhdG9yLT5yZW1vdmVTdWJOb2RlKCRyZW1vdmVLZXksICRwYWNrYWdlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKJG1hbmlwdWxhdG9yLT5yZW1vdmVNYWluS2V5SWZFbXB0eSgkcmVtb3ZlS2V5KTsKCmZpbGVfcHV0X2NvbnRlbnRzKCRqc29uLT5nZXRQYXRoKCksICRtYW5pcHVsYXRvci0+Z2V0Q29udGVudHMoKSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGludGVyYWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXZlcnRDb21wb3NlckZpbGUoKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCR0aGlzLT5uZXdseUNyZWF0ZWQpIHsKJGlvLT53cml0ZUVycm9yKCJcbiIuJzxlcnJvcj5JbnN0YWxsYXRpb24gZmFpbGVkLCBkZWxldGluZyAnLiR0aGlzLT5maWxlLicuPC9lcnJvcj4nKTsKdW5saW5rKCR0aGlzLT5qc29uLT5nZXRQYXRoKCkpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPmxvY2spKSB7CnVubGluaygkdGhpcy0+bG9jayk7Cn0KfSBlbHNlIHsKJG1zZyA9ICcgdG8gaXRzICc7CmlmICgkdGhpcy0+bG9ja0JhY2t1cCkgewokbXNnID0gJyBhbmQgJy4kdGhpcy0+bG9jay4nIHRvIHRoZWlyICc7Cn0KJGlvLT53cml0ZUVycm9yKCJcbiIuJzxlcnJvcj5JbnN0YWxsYXRpb24gZmFpbGVkLCByZXZlcnRpbmcgJy4kdGhpcy0+ZmlsZS4kbXNnLidvcmlnaW5hbCBjb250ZW50LjwvZXJyb3I+Jyk7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5qc29uLT5nZXRQYXRoKCksICR0aGlzLT5jb21wb3NlckJhY2t1cCk7CmlmICgkdGhpcy0+bG9ja0JhY2t1cCkgewpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+bG9jaywgJHRoaXMtPmxvY2tCYWNrdXApOwp9Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFNjcmlwdFxFdmVudCBhcyBTY3JpcHRFdmVudDsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFJ1blNjcmlwdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CgoKCnByb3RlY3RlZCAkc2NyaXB0RXZlbnRzID0gWwpTY3JpcHRFdmVudHM6OlBSRV9JTlNUQUxMX0NNRCwKU2NyaXB0RXZlbnRzOjpQT1NUX0lOU1RBTExfQ01ELApTY3JpcHRFdmVudHM6OlBSRV9VUERBVEVfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfVVBEQVRFX0NNRCwKU2NyaXB0RXZlbnRzOjpQUkVfU1RBVFVTX0NNRCwKU2NyaXB0RXZlbnRzOjpQT1NUX1NUQVRVU19DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9ST09UX1BBQ0tBR0VfSU5TVEFMTCwKU2NyaXB0RXZlbnRzOjpQT1NUX0NSRUFURV9QUk9KRUNUX0NNRCwKU2NyaXB0RXZlbnRzOjpQUkVfQVJDSElWRV9DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9BUkNISVZFX0NNRCwKU2NyaXB0RXZlbnRzOjpQUkVfQVVUT0xPQURfRFVNUCwKU2NyaXB0RXZlbnRzOjpQT1NUX0FVVE9MT0FEX0RVTVAsCl07Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3J1bi1zY3JpcHQnKQotPnNldEFsaWFzZXMoWydydW4nXSkKLT5zZXREZXNjcmlwdGlvbignUnVucyB0aGUgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb24nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnc2NyaXB0JywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdTY3JpcHQgbmFtZSB0byBydW4uJywgbnVsbCwgZnVuY3Rpb24gKCkgewpyZXR1cm4gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHNjcmlwdCkgeyByZXR1cm4gJHNjcmlwdFsnbmFtZSddOyB9LCAkdGhpcy0+Z2V0U2NyaXB0cygpKTsKfSksCm5ldyBJbnB1dEFyZ3VtZW50KCdhcmdzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJycpLApuZXcgSW5wdXRPcHRpb24oJ3RpbWVvdXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdTZXRzIHNjcmlwdCB0aW1lb3V0IGluIHNlY29uZHMsIG9yIDAgZm9yIG5ldmVyLicpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2V0cyB0aGUgZGV2IG1vZGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgZGV2IG1vZGUuJyksCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsICdsJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHNjcmlwdHMuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5ydW4tc2NyaXB0PC9pbmZvPiBjb21tYW5kIHJ1bnMgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb246Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBydW4tc2NyaXB0IHBvc3QtdXBkYXRlLWNtZDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3J1bi1zY3JpcHQtcnVuCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGludGVyYWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJHNjcmlwdHMgPSAkdGhpcy0+Z2V0U2NyaXB0cygpOwppZiAoY291bnQoJHNjcmlwdHMpID09PSAwKSB7CnJldHVybjsKfQoKaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NjcmlwdCcpICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKcmV0dXJuOwp9Cgokb3B0aW9ucyA9IFtdOwpmb3JlYWNoICgkc2NyaXB0cyBhcyAkc2NyaXB0KSB7CiRvcHRpb25zWyRzY3JpcHRbJ25hbWUnXV0gPSAkc2NyaXB0WydkZXNjcmlwdGlvbiddOwp9CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokc2NyaXB0ID0gJGlvLT5zZWxlY3QoCidTY3JpcHQgdG8gcnVuOiAnLAokb3B0aW9ucywKJycsCjEsCidJbnZhbGlkIHNjcmlwdCBuYW1lICIlcyInCik7CgokaW5wdXQtPnNldEFyZ3VtZW50KCdzY3JpcHQnLCAkc2NyaXB0KTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpKSB7CnJldHVybiAkdGhpcy0+bGlzdFNjcmlwdHMoJG91dHB1dCk7Cn0KCiRzY3JpcHQgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzY3JpcHQnKTsKaWYgKCRzY3JpcHQgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50ICJzY3JpcHQiJyk7Cn0KCmlmICghaW5fYXJyYXkoJHNjcmlwdCwgJHRoaXMtPnNjcmlwdEV2ZW50cykpIHsKaWYgKGRlZmluZWQoJ0NvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM6Oicuc3RyX3JlcGxhY2UoJy0nLCAnXycsIHN0cnRvdXBwZXIoJHNjcmlwdCkpKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdTY3JpcHQgIiVzIiBjYW5ub3QgYmUgcnVuIHdpdGggdGhpcyBjb21tYW5kJywgJHNjcmlwdCkpOwp9Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGRldk1vZGUgPSAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgfHwgISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKTsKJGV2ZW50ID0gbmV3IFNjcmlwdEV2ZW50KCRzY3JpcHQsICRjb21wb3NlciwgJHRoaXMtPmdldElPKCksICRkZXZNb2RlKTsKJGhhc0xpc3RlbmVycyA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmhhc0V2ZW50TGlzdGVuZXJzKCRldmVudCk7CmlmICghJGhhc0xpc3RlbmVycykgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdTY3JpcHQgIiVzIiBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UnLCAkc2NyaXB0KSk7Cn0KCiRhcmdzID0gJGlucHV0LT5nZXRBcmd1bWVudCgnYXJncycpOwoKaWYgKG51bGwgIT09ICR0aW1lb3V0ID0gJGlucHV0LT5nZXRPcHRpb24oJ3RpbWVvdXQnKSkgewppZiAoIWN0eXBlX2RpZ2l0KCR0aW1lb3V0KSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RpbWVvdXQgdmFsdWUgbXVzdCBiZSBudW1lcmljIGFuZCBwb3NpdGl2ZSBpZiBkZWZpbmVkLCBvciAwIGZvciBmb3JldmVyJyk7Cn0KClByb2Nlc3NFeGVjdXRvcjo6c2V0VGltZW91dCgoaW50KSAkdGltZW91dCk7Cn0KClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0RFVl9NT0RFJywgJGRldk1vZGUgPyAnMScgOiAnMCcpOwoKcmV0dXJuICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KCRzY3JpcHQsICRkZXZNb2RlLCAkYXJncyk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBsaXN0U2NyaXB0cyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRzY3JpcHRzID0gJHRoaXMtPmdldFNjcmlwdHMoKTsKaWYgKGNvdW50KCRzY3JpcHRzKSA9PT0gMCkgewpyZXR1cm4gMDsKfQoKJGlvID0gJHRoaXMtPmdldElPKCk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+c2NyaXB0czo8L2luZm8+Jyk7CiR0YWJsZSA9IFtdOwpmb3JlYWNoICgkc2NyaXB0cyBhcyAkc2NyaXB0KSB7CiR0YWJsZVtdID0gWycgICcuJHNjcmlwdFsnbmFtZSddLCAkc2NyaXB0WydkZXNjcmlwdGlvbiddXTsKfQoKJHRoaXMtPnJlbmRlclRhYmxlKCR0YWJsZSwgJG91dHB1dCk7CgpyZXR1cm4gMDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTY3JpcHRzKCk6IGFycmF5CnsKJHNjcmlwdHMgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldFBhY2thZ2UoKS0+Z2V0U2NyaXB0cygpOwppZiAoY291bnQoJHNjcmlwdHMpID09PSAwKSB7CnJldHVybiBbXTsKfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoICgkc2NyaXB0cyBhcyAkbmFtZSA9PiAkc2NyaXB0KSB7CiRkZXNjcmlwdGlvbiA9ICcnOwp0cnkgewokY21kID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJG5hbWUpOwppZiAoJGNtZCBpbnN0YW5jZW9mIFNjcmlwdEFsaWFzQ29tbWFuZCkgewokZGVzY3JpcHRpb24gPSAkY21kLT5nZXREZXNjcmlwdGlvbigpOwp9Cn0gY2F0Y2ggKFxTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJGUpIHsKCn0KJHJlc3VsdFtdID0gWyduYW1lJyA9PiAkbmFtZSwgJ2Rlc2NyaXB0aW9uJyA9PiAkZGVzY3JpcHRpb25dOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgU2NyaXB0QWxpYXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKcHJpdmF0ZSAkc2NyaXB0OwoKcHJpdmF0ZSAkZGVzY3JpcHRpb247CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzY3JpcHQsID9zdHJpbmcgJGRlc2NyaXB0aW9uKQp7CiR0aGlzLT5zY3JpcHQgPSAkc2NyaXB0OwokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb24gPz8gJ1J1bnMgdGhlICcuJHNjcmlwdC4nIHNjcmlwdCBhcyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb24nOwoKJHRoaXMtPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCR0aGlzLT5zY3JpcHQpCi0+c2V0RGVzY3JpcHRpb24oJHRoaXMtPmRlc2NyaXB0aW9uKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2V0cyB0aGUgZGV2IG1vZGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgZGV2IG1vZGUuJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdhcmdzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJycpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+cnVuLXNjcmlwdDwvaW5mbz4gY29tbWFuZCBydW5zIHNjcmlwdHMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcnVuLXNjcmlwdCBwb3N0LXVwZGF0ZS1jbWQ8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNydW4tc2NyaXB0LXJ1bgpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokYXJncyA9ICRpbnB1dC0+Z2V0QXJndW1lbnRzKCk7CgoKaWYgKCFtZXRob2RfZXhpc3RzKCRpbnB1dCwgJ19fdG9TdHJpbmcnKSkgeyAKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYW4gSW5wdXQgaW5zdGFuY2UgdGhhdCBpcyBzdHJpbmdhYmxlLCBnb3QgJy5nZXRfY2xhc3MoJGlucHV0KSk7Cn0KCnJldHVybiAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdCgkdGhpcy0+c2NyaXB0LCAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgfHwgISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSwgJGFyZ3NbJ2FyZ3MnXSwgWydzY3JpcHQtYWxpYXMtaW5wdXQnID0+IFByZWc6OnJlcGxhY2UoJ3teXFMrID99JywgJycsICRpbnB1dC0+X190b1N0cmluZygpLCAxKV0pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CgoKCgpjbGFzcyBTZWFyY2hDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3NlYXJjaCcpCi0+c2V0RGVzY3JpcHRpb24oJ1NlYXJjaGVzIGZvciBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignb25seS1uYW1lJywgJ04nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NlYXJjaCBvbmx5IGluIHBhY2thZ2UgbmFtZXMnKSwKbmV3IElucHV0T3B0aW9uKCdvbmx5LXZlbmRvcicsICdPJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTZWFyY2ggb25seSBmb3IgdmVuZG9yIC8gb3JnYW5pemF0aW9uIG5hbWVzLCByZXR1cm5zIG9ubHkgInZlbmRvciIgYXMgcmVzdWx0JyksCm5ldyBJbnB1dE9wdGlvbigndHlwZScsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnU2VhcmNoIGZvciBhIHNwZWNpZmljIHBhY2thZ2UgdHlwZScpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSBvdXRwdXQ6IHRleHQgb3IganNvbicsICd0ZXh0JywgWydqc29uJywgJ3RleHQnXSksCm5ldyBJbnB1dEFyZ3VtZW50KCd0b2tlbnMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAndG9rZW5zIHRvIHNlYXJjaCBmb3InKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHNlYXJjaCBjb21tYW5kIHNlYXJjaGVzIGZvciBwYWNrYWdlcyBieSBpdHMgbmFtZQo8aW5mbz5waHAgY29tcG9zZXIucGhhciBzZWFyY2ggc3ltZm9ueSBjb21wb3NlcjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3NlYXJjaApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewoKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGZvcm1hdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKTsKaWYgKCFpbl9hcnJheSgkZm9ybWF0LCBbJ3RleHQnLCAnanNvbiddKSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgZm9ybWF0ICIlcyIuIFNlZSBoZWxwIGZvciBzdXBwb3J0ZWQgZm9ybWF0cy4nLCAkZm9ybWF0KSk7CgpyZXR1cm4gMTsKfQoKaWYgKCEoJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCkpKSB7CiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZSgkdGhpcy0+Z2V0SU8oKSwgW10sICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXBsdWdpbnMnKSk7Cn0KJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoWyRsb2NhbFJlcG8sICRwbGF0Zm9ybVJlcG9dKTsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoWyRpbnN0YWxsZWRSZXBvXSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnc2VhcmNoJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRtb2RlID0gUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX0ZVTExURVhUOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ29ubHktbmFtZScpID09PSB0cnVlKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignb25seS12ZW5kb3InKSA9PT0gdHJ1ZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1vbmx5LW5hbWUgYW5kIC0tb25seS12ZW5kb3IgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXInKTsKfQokbW9kZSA9IFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9OQU1FOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ29ubHktdmVuZG9yJykgPT09IHRydWUpIHsKJG1vZGUgPSBSZXBvc2l0b3J5SW50ZXJmYWNlOjpTRUFSQ0hfVkVORE9SOwp9CgokdHlwZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCd0eXBlJyk7CgokcXVlcnkgPSBpbXBsb2RlKCcgJywgJGlucHV0LT5nZXRBcmd1bWVudCgndG9rZW5zJykpOwppZiAoJG1vZGUgIT09IFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9GVUxMVEVYVCkgewokcXVlcnkgPSBwcmVnX3F1b3RlKCRxdWVyeSk7Cn0KCiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJHF1ZXJ5LCAkbW9kZSwgJHR5cGUpOwoKaWYgKFxjb3VudCgkcmVzdWx0cykgPiAwICYmICRmb3JtYXQgPT09ICd0ZXh0Jykgewokd2lkdGggPSAkdGhpcy0+Z2V0VGVybWluYWxXaWR0aCgpOwoKJG5hbWVMZW5ndGggPSAwOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7CiRuYW1lTGVuZ3RoID0gbWF4KHN0cmxlbigkcmVzdWx0WyduYW1lJ10pLCAkbmFtZUxlbmd0aCk7Cn0KJG5hbWVMZW5ndGggKz0gMTsKZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewokZGVzY3JpcHRpb24gPSAkcmVzdWx0WydkZXNjcmlwdGlvbiddID8/ICcnOwokd2FybmluZyA9ICFlbXB0eSgkcmVzdWx0WydhYmFuZG9uZWQnXSkgPyAnPHdhcm5pbmc+ISBBYmFuZG9uZWQgITwvd2FybmluZz4gJyA6ICcnOwokcmVtYWluaW5nID0gJHdpZHRoIC0gJG5hbWVMZW5ndGggLSBzdHJsZW4oJHdhcm5pbmcpIC0gMjsKaWYgKHN0cmxlbigkZGVzY3JpcHRpb24pID4gJHJlbWFpbmluZykgewokZGVzY3JpcHRpb24gPSBzdWJzdHIoJGRlc2NyaXB0aW9uLCAwLCAkcmVtYWluaW5nIC0gMykgLiAnLi4uJzsKfQoKJGxpbmsgPSAkcmVzdWx0Wyd1cmwnXSA/PyBudWxsOwppZiAoJGxpbmsgIT09IG51bGwpIHsKJGlvLT53cml0ZSgnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbGluaykuJz4nLiRyZXN1bHRbJ25hbWUnXS4nPC8+Jy4gc3RyX3JlcGVhdCgnICcsICRuYW1lTGVuZ3RoIC0gc3RybGVuKCRyZXN1bHRbJ25hbWUnXSkpIC4gJHdhcm5pbmcgLiAkZGVzY3JpcHRpb24pOwp9IGVsc2UgewokaW8tPndyaXRlKHN0cl9wYWQoJHJlc3VsdFsnbmFtZSddLCAkbmFtZUxlbmd0aCwgJyAnKSAuICR3YXJuaW5nIC4gJGRlc2NyaXB0aW9uKTsKfQp9Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAnanNvbicpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCRyZXN1bHRzKSk7Cn0KCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFNlbGZVcGRhdGVcS2V5czsKdXNlIENvbXBvc2VyXFNlbGZVcGRhdGVcVmVyc2lvbnM7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRmlsZXN5c3RlbUV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwoKCgoKCgpjbGFzcyBTZWxmVXBkYXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJpdmF0ZSBjb25zdCBIT01FUEFHRSA9ICdnZXRjb21wb3Nlci5vcmcnOwpwcml2YXRlIGNvbnN0IE9MRF9JTlNUQUxMX0VYVCA9ICctb2xkLnBoYXInOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdzZWxmLXVwZGF0ZScpCi0+c2V0QWxpYXNlcyhbJ3NlbGZ1cGRhdGUnXSkKLT5zZXREZXNjcmlwdGlvbignVXBkYXRlcyBjb21wb3Nlci5waGFyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbigncm9sbGJhY2snLCAncicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV2ZXJ0IHRvIGFuIG9sZGVyIGluc3RhbGxhdGlvbiBvZiBjb21wb3NlcicpLApuZXcgSW5wdXRPcHRpb24oJ2NsZWFuLWJhY2t1cHMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RlbGV0ZSBvbGQgYmFja3VwcyBkdXJpbmcgYW4gdXBkYXRlLiBUaGlzIG1ha2VzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgY29tcG9zZXIgdGhlIG9ubHkgYmFja3VwIGF2YWlsYWJsZSBhZnRlciB0aGUgdXBkYXRlJyksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgdmVyc2lvbiB0byB1cGRhdGUgdG8nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUta2V5cycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJvbXB0IHVzZXIgZm9yIGEga2V5IHVwZGF0ZScpLApuZXcgSW5wdXRPcHRpb24oJ3N0YWJsZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBzdGFibGUgY2hhbm5lbCcpLApuZXcgSW5wdXRPcHRpb24oJ3ByZXZpZXcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgcHJldmlldyBjaGFubmVsJyksCm5ldyBJbnB1dE9wdGlvbignc25hcHNob3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc25hcHNob3QgY2hhbm5lbCcpLApuZXcgSW5wdXRPcHRpb24oJzEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc3RhYmxlIGNoYW5uZWwsIGJ1dCBvbmx5IHVzZSAxLnggdmVyc2lvbnMnKSwKbmV3IElucHV0T3B0aW9uKCcyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHN0YWJsZSBjaGFubmVsLCBidXQgb25seSB1c2UgMi54IHZlcnNpb25zJyksCm5ldyBJbnB1dE9wdGlvbignMi4yJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHN0YWJsZSBjaGFubmVsLCBidXQgb25seSB1c2UgMi4yLnggTFRTIHZlcnNpb25zJyksCm5ldyBJbnB1dE9wdGlvbignc2V0LWNoYW5uZWwtb25seScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBzdG9yZSB0aGUgY2hhbm5lbCBhcyB0aGUgZGVmYXVsdCBvbmUgYW5kIHRoZW4gZXhpdCcpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+c2VsZi11cGRhdGU8L2luZm8+IGNvbW1hbmQgY2hlY2tzIGdldGNvbXBvc2VyLm9yZyBmb3IgbmV3ZXIKdmVyc2lvbnMgb2YgY29tcG9zZXIgYW5kIGlmIGZvdW5kLCBpbnN0YWxscyB0aGUgbGF0ZXN0LgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgc2VsZi11cGRhdGU8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzZWxmLXVwZGF0ZS1zZWxmdXBkYXRlCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CmlmICgkX1NFUlZFUlsnYXJndiddWzBdID09PSAnU3RhbmRhcmQgaW5wdXQgY29kZScpIHsKcmV0dXJuIDE7Cn0KCgoKY2xhc3NfZXhpc3RzKCdDb21wb3NlclxVdGlsXFBsYXRmb3JtJyk7CmNsYXNzX2V4aXN0cygnQ29tcG9zZXJcRG93bmxvYWRlclxGaWxlc3lzdGVtRXhjZXB0aW9uJyk7CgokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7CgppZiAoJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CiRiYXNlVXJsID0gJ2h0dHA6Ly8nIC4gc2VsZjo6SE9NRVBBR0U7Cn0gZWxzZSB7CiRiYXNlVXJsID0gJ2h0dHBzOi8vJyAuIHNlbGY6OkhPTUVQQUdFOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGh0dHBEb3dubG9hZGVyID0gRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKCiR2ZXJzaW9uc1V0aWwgPSBuZXcgVmVyc2lvbnMoJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyKTsKCgokcmVxdWVzdGVkQ2hhbm5lbCA9IG51bGw7CmZvcmVhY2ggKFZlcnNpb25zOjpDSEFOTkVMUyBhcyAkY2hhbm5lbCkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJGNoYW5uZWwpKSB7CiRyZXF1ZXN0ZWRDaGFubmVsID0gJGNoYW5uZWw7CiR2ZXJzaW9uc1V0aWwtPnNldENoYW5uZWwoJGNoYW5uZWwsICRpbyk7CmJyZWFrOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignc2V0LWNoYW5uZWwtb25seScpKSB7CnJldHVybiAwOwp9CgokY2FjaGVEaXIgPSAkY29uZmlnLT5nZXQoJ2NhY2hlLWRpcicpOwokcm9sbGJhY2tEaXIgPSAkY29uZmlnLT5nZXQoJ2RhdGEtZGlyJyk7CiRob21lID0gJGNvbmZpZy0+Z2V0KCdob21lJyk7CiRsb2NhbEZpbGVuYW1lID0gcmVhbHBhdGgoJF9TRVJWRVJbJ2FyZ3YnXVswXSk7CmlmIChmYWxzZSA9PT0gJGxvY2FsRmlsZW5hbWUpIHsKJGxvY2FsRmlsZW5hbWUgPSAkX1NFUlZFUlsnYXJndiddWzBdOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS1rZXlzJykpIHsKJHRoaXMtPmZldGNoS2V5cygkaW8sICRjb25maWcpOwoKcmV0dXJuIDA7Cn0KCgppZiAoIWZpbGVfZXhpc3RzKCRsb2NhbEZpbGVuYW1lKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgdXBkYXRlIGZhaWxlZDogdGhlICInLiRsb2NhbEZpbGVuYW1lLiciIGlzIG5vdCBhY2Nlc3NpYmxlJyk7Cn0KCgokdG1wRGlyID0gaXNfd3JpdGFibGUoZGlybmFtZSgkbG9jYWxGaWxlbmFtZSkpID8gZGlybmFtZSgkbG9jYWxGaWxlbmFtZSkgOiAkY2FjaGVEaXI7CgoKaWYgKCFpc193cml0YWJsZSgkdG1wRGlyKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgdXBkYXRlIGZhaWxlZDogdGhlICInLiR0bXBEaXIuJyIgZGlyZWN0b3J5IHVzZWQgdG8gZG93bmxvYWQgdGhlIHRlbXAgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbicpOwp9CgoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGV1aWQnKSkgewokY29tcG9zZXJVc2VyID0gcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsKJGhvbWVEaXJPd25lcklkID0gZmlsZW93bmVyKCRob21lKTsKaWYgKGlzX2FycmF5KCRjb21wb3NlclVzZXIpICYmICRob21lRGlyT3duZXJJZCAhPT0gZmFsc2UpIHsKJGhvbWVPd25lciA9IHBvc2l4X2dldHB3dWlkKCRob21lRGlyT3duZXJJZCk7CmlmIChpc19hcnJheSgkaG9tZU93bmVyKSAmJiBpc3NldCgkY29tcG9zZXJVc2VyWyduYW1lJ10sICRob21lT3duZXJbJ25hbWUnXSkgJiYgJGNvbXBvc2VyVXNlclsnbmFtZSddICE9PSAkaG9tZU93bmVyWyduYW1lJ10pIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHJ1bm5pbmcgQ29tcG9zZXIgYXMgIicuJGNvbXBvc2VyVXNlclsnbmFtZSddLiciLCB3aGlsZSAiJy4kaG9tZS4nIiBpcyBvd25lZCBieSAiJy4kaG9tZU93bmVyWyduYW1lJ10uJyI8L3dhcm5pbmc+Jyk7Cn0KfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3JvbGxiYWNrJykpIHsKcmV0dXJuICR0aGlzLT5yb2xsYmFjaygkb3V0cHV0LCAkcm9sbGJhY2tEaXIsICRsb2NhbEZpbGVuYW1lKTsKfQoKJGxhdGVzdCA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgpOwokbGF0ZXN0U3RhYmxlID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCdzdGFibGUnKTsKdHJ5IHsKJGxhdGVzdFByZXZpZXcgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoJ3ByZXZpZXcnKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokbGF0ZXN0UHJldmlldyA9ICRsYXRlc3RTdGFibGU7Cn0KJGxhdGVzdFZlcnNpb24gPSAkbGF0ZXN0Wyd2ZXJzaW9uJ107CiR1cGRhdGVWZXJzaW9uID0gJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpID8/ICRsYXRlc3RWZXJzaW9uOwokY3VycmVudE1ham9yVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFxkKykuKn0nLCAnJDEnLCBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKTsKJHVwZGF0ZU1ham9yVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFxkKykuKn0nLCAnJDEnLCAkdXBkYXRlVmVyc2lvbik7CiRwcmV2aWV3TWFqb3JWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oXGQrKS4qfScsICckMScsICRsYXRlc3RQcmV2aWV3Wyd2ZXJzaW9uJ10pOwoKaWYgKCR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKSA9PT0gJ3N0YWJsZScgJiYgbnVsbCA9PT0gJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpKSB7CgoKaWYgKCRjdXJyZW50TWFqb3JWZXJzaW9uIDwgJHVwZGF0ZU1ham9yVmVyc2lvbikgewokc2tpcHBlZFZlcnNpb24gPSAkdXBkYXRlVmVyc2lvbjsKCiR2ZXJzaW9uc1V0aWwtPnNldENoYW5uZWwoJGN1cnJlbnRNYWpvclZlcnNpb24pOwoKJGxhdGVzdCA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgpOwokbGF0ZXN0U3RhYmxlID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCdzdGFibGUnKTsKJGxhdGVzdFZlcnNpb24gPSAkbGF0ZXN0Wyd2ZXJzaW9uJ107CiR1cGRhdGVWZXJzaW9uID0gJGxhdGVzdFZlcnNpb247CgokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgbmV3IHN0YWJsZSBtYWpvciB2ZXJzaW9uIG9mIENvbXBvc2VyIGlzIGF2YWlsYWJsZSAoJy4kc2tpcHBlZFZlcnNpb24uJyksIHJ1biAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS0nLiR1cGRhdGVNYWpvclZlcnNpb24uJyIgdG8gdXBkYXRlIHRvIGl0LiBTZWUgYWxzbyBodHRwczovL2dldGNvbXBvc2VyLm9yZy8nLiR1cGRhdGVNYWpvclZlcnNpb24uJzwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCRjdXJyZW50TWFqb3JWZXJzaW9uIDwgJHByZXZpZXdNYWpvclZlcnNpb24pIHsKCiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBwcmV2aWV3IHJlbGVhc2Ugb2YgdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBDb21wb3NlciBpcyBhdmFpbGFibGUgKCcuJGxhdGVzdFByZXZpZXdbJ3ZlcnNpb24nXS4nKSwgcnVuICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLXByZXZpZXciIHRvIGdpdmUgaXQgYSB0cnkuIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9yZWxlYXNlcyBmb3IgY2hhbmdlbG9ncy48L3dhcm5pbmc+Jyk7Cn0KfQoKJGVmZmVjdGl2ZUNoYW5uZWwgPSAkcmVxdWVzdGVkQ2hhbm5lbCA9PT0gbnVsbCA/ICR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKSA6ICRyZXF1ZXN0ZWRDaGFubmVsOwppZiAoaXNfbnVtZXJpYygkZWZmZWN0aXZlQ2hhbm5lbCkgJiYgc3RycG9zKCRsYXRlc3RTdGFibGVbJ3ZlcnNpb24nXSwgJGVmZmVjdGl2ZUNoYW5uZWwpICE9PSAwKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+V2FybmluZzogWW91IGZvcmNlZCB0aGUgaW5zdGFsbCBvZiAnLiRsYXRlc3RWZXJzaW9uLicgdmlhIC0tJy4kZWZmZWN0aXZlQ2hhbm5lbC4nLCBidXQgJy4kbGF0ZXN0U3RhYmxlWyd2ZXJzaW9uJ10uJyBpcyB0aGUgbGF0ZXN0IHN0YWJsZSB2ZXJzaW9uLiBVcGRhdGluZyB0byBpdCB2aWEgY29tcG9zZXIgc2VsZi11cGRhdGUgLS1zdGFibGUgaXMgcmVjb21tZW5kZWQuPC93YXJuaW5nPicpOwp9CmlmIChpc3NldCgkbGF0ZXN0Wydlb2wnXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5XYXJuaW5nOiBWZXJzaW9uICcuJGxhdGVzdFZlcnNpb24uJyBpcyBFT0wgLyBFbmQgb2YgTGlmZS4gJy4kbGF0ZXN0U3RhYmxlWyd2ZXJzaW9uJ10uJyBpcyB0aGUgbGF0ZXN0IHN0YWJsZSB2ZXJzaW9uLiBVcGRhdGluZyB0byBpdCB2aWEgY29tcG9zZXIgc2VsZi11cGRhdGUgLS1zdGFibGUgaXMgcmVjb21tZW5kZWQuPC93YXJuaW5nPicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15bMC05YS1mXXs0MH0kfScsICR1cGRhdGVWZXJzaW9uKSAmJiAkdXBkYXRlVmVyc2lvbiAhPT0gJGxhdGVzdFZlcnNpb24pIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91IGNhbiBub3QgdXBkYXRlIHRvIGEgc3BlY2lmaWMgU0hBLTEgYXMgdGhvc2UgcGhhcnMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGRvd25sb2FkPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgokY2hhbm5lbFN0cmluZyA9ICR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKTsKaWYgKGlzX251bWVyaWMoJGNoYW5uZWxTdHJpbmcpKSB7CiRjaGFubmVsU3RyaW5nIC49ICcueCc7Cn0KCmlmIChDb21wb3Nlcjo6VkVSU0lPTiA9PT0gJHVwZGF0ZVZlcnNpb24pIHsKJGlvLT53cml0ZUVycm9yKApzcHJpbnRmKAonPGluZm8+WW91IGFyZSBhbHJlYWR5IHVzaW5nIHRoZSBsYXRlc3QgYXZhaWxhYmxlIENvbXBvc2VyIHZlcnNpb24gJXMgKCVzIGNoYW5uZWwpLjwvaW5mbz4nLAokdXBkYXRlVmVyc2lvbiwKJGNoYW5uZWxTdHJpbmcKKQopOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbignY2xlYW4tYmFja3VwcycpKSB7CiR0aGlzLT5jbGVhbkJhY2t1cHMoJHJvbGxiYWNrRGlyLCAkdGhpcy0+Z2V0TGFzdEJhY2t1cFZlcnNpb24oJHJvbGxiYWNrRGlyKSk7Cn0KCnJldHVybiAwOwp9CgokdGVtcEZpbGVuYW1lID0gJHRtcERpciAuICcvJyAuIGJhc2VuYW1lKCRsb2NhbEZpbGVuYW1lLCAnLnBoYXInKS4nLXRlbXAnLnJhbmRvbV9pbnQoMCwgMTAwMDAwMDApLicucGhhcic7CiRiYWNrdXBGaWxlID0gc3ByaW50ZigKJyVzLyVzLSVzJXMnLAokcm9sbGJhY2tEaXIsCnN0cnRyKENvbXBvc2VyOjpSRUxFQVNFX0RBVEUsICcgOicsICdfLScpLApQcmVnOjpyZXBsYWNlKCd7XihbMC05YS1mXXs3fSlbMC05YS1mXXszM30kfScsICckMScsIENvbXBvc2VyOjpWRVJTSU9OKSwKc2VsZjo6T0xEX0lOU1RBTExfRVhUCik7CgokdXBkYXRpbmdUb1RhZyA9ICFQcmVnOjppc01hdGNoKCd7XlswLTlhLWZdezQwfSR9JywgJHVwZGF0ZVZlcnNpb24pOwoKJGlvLT53cml0ZShzcHJpbnRmKCJVcGdyYWRpbmcgdG8gdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4gKCVzIGNoYW5uZWwpLiIsICR1cGRhdGVWZXJzaW9uLCAkY2hhbm5lbFN0cmluZykpOwokcmVtb3RlRmlsZW5hbWUgPSAkYmFzZVVybCAuICgkdXBkYXRpbmdUb1RhZyA/ICIvZG93bmxvYWQveyR1cGRhdGVWZXJzaW9ufS9jb21wb3Nlci5waGFyIiA6ICcvY29tcG9zZXIucGhhcicpOwp0cnkgewokc2lnbmF0dXJlID0gJGh0dHBEb3dubG9hZGVyLT5nZXQoJHJlbW90ZUZpbGVuYW1lLicuc2lnJyktPmdldEJvZHkoKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1ZlcnNpb24gIicuJHVwZGF0ZVZlcnNpb24uJyIgY291bGQgbm90IGJlIGZvdW5kLicsIDAsICRlKTsKfQp0aHJvdyAkZTsKfQokaW8tPndyaXRlRXJyb3IoJyAgICcsIGZhbHNlKTsKJGh0dHBEb3dubG9hZGVyLT5jb3B5KCRyZW1vdGVGaWxlbmFtZSwgJHRlbXBGaWxlbmFtZSk7CiRpby0+d3JpdGVFcnJvcignJyk7CgppZiAoIWZpbGVfZXhpc3RzKCR0ZW1wRmlsZW5hbWUpIHx8IG51bGwgPT09ICRzaWduYXR1cmUgfHwgJycgPT09ICRzaWduYXR1cmUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGRvd25sb2FkIG9mIHRoZSBuZXcgY29tcG9zZXIgdmVyc2lvbiBmYWlsZWQgZm9yIGFuIHVuZXhwZWN0ZWQgcmVhc29uPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykgJiYgJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBpbmcgcGhhciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFzIHlvdSBoYXZlIGRpc2FibGVkIE9wZW5TU0wgdmlhIGNvbmZpZy5kaXNhYmxlLXRsczwvd2FybmluZz4nKTsKfSBlbHNlIHsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgb3BlbnNzbCBleHRlbnNpb24gaXMgcmVxdWlyZWQgZm9yIHBoYXIgc2lnbmF0dXJlcyB0byBiZSB2ZXJpZmllZCBidXQgaXQgaXMgbm90IGF2YWlsYWJsZS4gJwouICdJZiB5b3UgY2FuIG5vdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uLCB5b3UgY2FuIGRpc2FibGUgdGhpcyBlcnJvciwgYXQgeW91ciBvd24gcmlzaywgYnkgc2V0dGluZyB0aGUgXCdkaXNhYmxlLXRsc1wnIG9wdGlvbiB0byB0cnVlLicpOwp9Cgokc2lnRmlsZSA9ICdmaWxlOi8vJy4kaG9tZS4nLycgLiAoJHVwZGF0aW5nVG9UYWcgPyAna2V5cy50YWdzLnB1YicgOiAna2V5cy5kZXYucHViJyk7CmlmICghZmlsZV9leGlzdHMoJHNpZ0ZpbGUpKSB7CmZpbGVfcHV0X2NvbnRlbnRzKAokaG9tZS4nL2tleXMuZGV2LnB1YicsCjw8PERFVlBVQktFWQotLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQW5CREhqWlM2ZTBaTW9LM3hURDdmCkZOQ3psWGpYL0FpZTJkaXQ4UVhBMDNwU3JPVGJhTW54T04zaFVMNDdMejNnMVNDNllKRU1WSHIwellxNGVsV2kKaTNlY0ZFZ3pMY2orcFpNNVg2cVd1Mk96ejR2V3gzSllvMS9hL0hZZE91VzllM2x3UzhWdFMwQVZKQStVOFgwQQpoWm5CbUdwbHRIaE84aFBLSGdrSnRrVFV4Q2hlVGNicW40d0dIbDhaMlNlZGlEY1BUTHdxZXpXS1Vmcll6dTFmCm8vajNXRndGczZHdEs0d2RZdGlYcit5c3BCWkhPM3kxdWRmOGVGRkdjYjJWM0VhTE9ydGZ1cjZYUVZpempPdWsKOGx3NXp6c2UxUXAva2xIcWJEUnNqU3pKNmlMNkY0YXluQmM2RXVxdC84Y2NOQUl6MHJMakxoT3JhZXlqNGVObgo4aW9rd01LaVhwY3JRTFRLSCtSSDFKQ3VPVnhRNDM2Ykp3YlNzcDFWd2lxZnRQUWllTit0enF5K0VpSEpKbUdmClRCQWJXY25jaWNDazlxMm1kK0FtaE5idkhPNFBXYmJ6OVR6QzdISmI0NjBqeVdldU1FdnczZ05JcEVvMmpZYTkKcE1WNmNWcW5TYSt3T2MwRDdwQzlhNmJuZTBidkxjbTNTK3c2STVpREIzbFpzYjNBOVV0UmlTUDdhR1NvN0Q3Mgo4dEM4K2NJZ1pjSTdrOXZqdk9xSCtkN3NkT1UyeVBDblJZNndGaDYyL2c4YkRuVXByNTZuWk4xRzg5R3dNNGQ0CnIvVFU3QlFRSXpzWmdBaXFPR1h2VmtsSWdBTWlWMGl1Y2dmM3JOQkxqamVORXdOU1RURzlGMEN0USs3Skx3YUUKd1NFdUF1Um0rcFJxaThCUm5RL0dLVWNDQXdFQUFRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCkRFVlBVQktFWQopOwoKZmlsZV9wdXRfY29udGVudHMoCiRob21lLicva2V5cy50YWdzLnB1YicsCjw8PFRBR1NQVUJLRVkKLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEwVmkvMks2YXBDVmo3Nm5DbkNsMgpNUVVQZEsrQTllcWtZQmFjWG8yd1FCWW15VmxYbTIvbi9ac1g2cENMWVBRVEh5cjVqWGJrUXpCdzhTS3FQZGxoCnZBN05wYk1lTkN6N3dQL0FvYnZVWE04eFF1WEtiTURUWTJ1WjRPN3NNK1BmR2JwdEtQQkdMZThaOGQyc1VuVE8KYlh0WDZMcmoxM3drUnRvN3N0L3cvWXAzM1JIZTlTbHFraWlTNE1zSDFqQmtjSWtFSHNSYXZlWnplZFVheFkwTQptYmEwdVBoR1VJbnBQekVId3JZcUJCRXRXdlA5N3QydnRmeDhJNXF2MjhraDBZNnQram5qTDFVcmlkMml1UVpmCm5vQ01GSU91NHZrc0s1SHhKeHhyTjBHT21HbXdWUWpPT3R4a3dpa05pb3RaR1BSNEtzVmo4Tm5CckxYN29HdU0KblF2R2NpaXUrS29DMnIzSERCcnBEZUJWZE9XeER6VDVSNGlJMEtvTHpGaDJwS3F3Ylkrb2JOUFMyYmorMmRnSgpyVjNWNUpqcnk0MlFPQ0JOM2M4OHdVMVBLZnRPTGoyRUNwZXdZNnZuRTQ3OElpcGlFdTdFQWRLOFp3ajJMbVRyClJLUVVTYTlrN2dnQmtZWldBZU8vMkFnMGV5M2cyYmc3ZXFrK3NIRXE1eW5JWGQ1bGh2NnRDNVBCZEhsV2lwREsKdGwySXhpRW5lam5PbUF6R1ZpdkUxWUdkdVlCak4rbWp4RFZ5OEtHQnJqbnoxSlBnQXZnZHdKMmRZdzRSc2MvZQpUekNGV0drL0hNNmE0ZjBJekJXYko1b3QwUElpNGFtazA3SW90QlhEV3dxRGlRVHd5dUdDeW01RXFXUTJCRDk1ClJHdjg5QlBEKzJETG5KeXNuZ3N2VmFVQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQpUQUdTUFVCS0VZCik7Cn0KCiRwdWJrZXlpZCA9IG9wZW5zc2xfcGtleV9nZXRfcHVibGljKCRzaWdGaWxlKTsKaWYgKGZhbHNlID09PSAkcHVia2V5aWQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgbG9hZGluZyB0aGUgcHVibGljIGtleSBmcm9tICcuJHNpZ0ZpbGUpOwp9CiRhbGdvID0gZGVmaW5lZCgnT1BFTlNTTF9BTEdPX1NIQTM4NCcpID8gT1BFTlNTTF9BTEdPX1NIQTM4NCA6ICdTSEEzODQnOwppZiAoIWluX2FycmF5KCdzaGEzODQnLCBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCBvcGVuc3NsX2dldF9tZF9tZXRob2RzKCkpLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1NIQTM4NCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgb3BlbnNzbCBleHRlbnNpb24sIGNvdWxkIG5vdCB2ZXJpZnkgdGhlIHBoYXIgZmlsZSBpbnRlZ3JpdHknKTsKfQokc2lnbmF0dXJlRGF0YSA9IGpzb25fZGVjb2RlKCRzaWduYXR1cmUsIHRydWUpOwokc2lnbmF0dXJlU2hhMzg0ID0gYmFzZTY0X2RlY29kZSgkc2lnbmF0dXJlRGF0YVsnc2hhMzg0J10sIHRydWUpOwppZiAoZmFsc2UgPT09ICRzaWduYXR1cmVTaGEzODQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgbG9hZGluZyB0aGUgcGhhciBzaWduYXR1cmUgZnJvbSAnLiRyZW1vdGVGaWxlbmFtZS4nLnNpZywgZ290ICcuJHNpZ25hdHVyZSk7Cn0KJHZlcmlmaWVkID0gMSA9PT0gb3BlbnNzbF92ZXJpZnkoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJHRlbXBGaWxlbmFtZSksICRzaWduYXR1cmVTaGEzODQsICRwdWJrZXlpZCwgJGFsZ28pOwoKCmlmIChQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CgpvcGVuc3NsX2ZyZWVfa2V5KCRwdWJrZXlpZCk7Cn0KCmlmICghJHZlcmlmaWVkKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBoYXIgc2lnbmF0dXJlIGRpZCBub3QgbWF0Y2ggdGhlIGZpbGUgeW91IGRvd25sb2FkZWQsIHRoaXMgbWVhbnMgeW91ciBwdWJsaWMga2V5cyBhcmUgb3V0ZGF0ZWQgb3IgdGhhdCB0aGUgcGhhciBmaWxlIGlzIGNvcnJ1cHQvaGFzIGJlZW4gbW9kaWZpZWQnKTsKfQp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdjbGVhbi1iYWNrdXBzJykpIHsKJHRoaXMtPmNsZWFuQmFja3Vwcygkcm9sbGJhY2tEaXIpOwp9CgppZiAoISR0aGlzLT5zZXRMb2NhbFBoYXIoJGxvY2FsRmlsZW5hbWUsICR0ZW1wRmlsZW5hbWUsICRiYWNrdXBGaWxlKSkgewpAdW5saW5rKCR0ZW1wRmlsZW5hbWUpOwoKcmV0dXJuIDE7Cn0KCmlmIChmaWxlX2V4aXN0cygkYmFja3VwRmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoCidVc2UgPGluZm8+Y29tcG9zZXIgc2VsZi11cGRhdGUgLS1yb2xsYmFjazwvaW5mbz4gdG8gcmV0dXJuIHRvIHZlcnNpb24gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywKQ29tcG9zZXI6OlZFUlNJT04KKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBiYWNrdXAgb2YgdGhlIGN1cnJlbnQgdmVyc2lvbiBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byAnLiRiYWNrdXBGaWxlLicsIG5vIHJvbGxiYWNrIHBvc3NpYmxlPC93YXJuaW5nPicpOwp9CgpyZXR1cm4gMDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoS2V5cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnKTogdm9pZAp7CmlmICghJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdQdWJsaWMga2V5cyBjYW4gbm90IGJlIGZldGNoZWQgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIHBsZWFzZSBydW4gQ29tcG9zZXIgaW50ZXJhY3RpdmVseScpOwp9CgokaW8tPndyaXRlKCdPcGVuIDxpbmZvPmh0dHBzOi8vY29tcG9zZXIuZ2l0aHViLmlvL3B1YmtleXMuaHRtbDwvaW5mbz4gdG8gZmluZCB0aGUgbGF0ZXN0IGtleXMnKTsKCiR2YWxpZGF0b3IgPSBzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSk6IHN0cmluZyB7CiR2YWx1ZSA9IChzdHJpbmcpICR2YWx1ZTsKaWYgKCFQcmVnOjppc01hdGNoKCd7Xi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tJH0nLCB0cmltKCR2YWx1ZSkpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIGlucHV0Jyk7Cn0KCnJldHVybiB0cmltKCR2YWx1ZSkuIlxuIjsKfTsKCiRkZXZLZXkgPSAnJzsKd2hpbGUgKCFQcmVnOjppc01hdGNoKCd7KC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tLis/LS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tKX1zJywgJGRldktleSwgJG1hdGNoKSkgewokZGV2S2V5ID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgnRW50ZXIgRGV2IC8gU25hcHNob3QgUHVibGljIEtleSAoaW5jbHVkaW5nIGxpbmVzIHdpdGggLS0tLS0pOiAnLCAkdmFsaWRhdG9yKTsKd2hpbGUgKCRsaW5lID0gJGlvLT5hc2soJycsICcnKSkgewokZGV2S2V5IC49IHRyaW0oJGxpbmUpLiJcbiI7CmlmICh0cmltKCRsaW5lKSA9PT0gJy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLScpIHsKYnJlYWs7Cn0KfQp9CmZpbGVfcHV0X2NvbnRlbnRzKCRrZXlQYXRoID0gJGNvbmZpZy0+Z2V0KCdob21lJykuJy9rZXlzLmRldi5wdWInLCAkbWF0Y2hbMF0pOwokaW8tPndyaXRlKCdTdG9yZWQga2V5IHdpdGggZmluZ2VycHJpbnQ6ICcgLiBLZXlzOjpmaW5nZXJwcmludCgka2V5UGF0aCkpOwoKJHRhZ3NLZXkgPSAnJzsKd2hpbGUgKCFQcmVnOjppc01hdGNoKCd7KC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tLis/LS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tKX1zJywgJHRhZ3NLZXksICRtYXRjaCkpIHsKJHRhZ3NLZXkgPSAkaW8tPmFza0FuZFZhbGlkYXRlKCdFbnRlciBUYWdzIFB1YmxpYyBLZXkgKGluY2x1ZGluZyBsaW5lcyB3aXRoIC0tLS0tKTogJywgJHZhbGlkYXRvcik7CndoaWxlICgkbGluZSA9ICRpby0+YXNrKCcnLCAnJykpIHsKJHRhZ3NLZXkgLj0gdHJpbSgkbGluZSkuIlxuIjsKaWYgKHRyaW0oJGxpbmUpID09PSAnLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tJykgewpicmVhazsKfQp9Cn0KZmlsZV9wdXRfY29udGVudHMoJGtleVBhdGggPSAkY29uZmlnLT5nZXQoJ2hvbWUnKS4nL2tleXMudGFncy5wdWInLCAkbWF0Y2hbMF0pOwokaW8tPndyaXRlKCdTdG9yZWQga2V5IHdpdGggZmluZ2VycHJpbnQ6ICcgLiBLZXlzOjpmaW5nZXJwcmludCgka2V5UGF0aCkpOwoKJGlvLT53cml0ZSgnUHVibGljIGtleXMgc3RvcmVkIGluICcuJGNvbmZpZy0+Z2V0KCdob21lJykpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcm9sbGJhY2soT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIHN0cmluZyAkcm9sbGJhY2tEaXIsIHN0cmluZyAkbG9jYWxGaWxlbmFtZSk6IGludAp7CiRyb2xsYmFja1ZlcnNpb24gPSAkdGhpcy0+Z2V0TGFzdEJhY2t1cFZlcnNpb24oJHJvbGxiYWNrRGlyKTsKaWYgKG51bGwgPT09ICRyb2xsYmFja1ZlcnNpb24pIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NvbXBvc2VyIHJvbGxiYWNrIGZhaWxlZDogbm8gaW5zdGFsbGF0aW9uIHRvIHJvbGwgYmFjayB0byBpbiAiJy4kcm9sbGJhY2tEaXIuJyInKTsKfQoKJG9sZEZpbGUgPSAkcm9sbGJhY2tEaXIgLiAnLycgLiAkcm9sbGJhY2tWZXJzaW9uIC4gc2VsZjo6T0xEX0lOU1RBTExfRVhUOwoKaWYgKCFpc19maWxlKCRvbGRGaWxlKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgcm9sbGJhY2sgZmFpbGVkOiAiJy4kb2xkRmlsZS4nIiBjb3VsZCBub3QgYmUgZm91bmQnKTsKfQppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJG9sZEZpbGUpKSB7CnRocm93IG5ldyBGaWxlc3lzdGVtRXhjZXB0aW9uKCdDb21wb3NlciByb2xsYmFjayBmYWlsZWQ6ICInLiRvbGRGaWxlLiciIGNvdWxkIG5vdCBiZSByZWFkJyk7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigiUm9sbGluZyBiYWNrIHRvIHZlcnNpb24gPGluZm8+JXM8L2luZm8+LiIsICRyb2xsYmFja1ZlcnNpb24pKTsKaWYgKCEkdGhpcy0+c2V0TG9jYWxQaGFyKCRsb2NhbEZpbGVuYW1lLCAkb2xkRmlsZSkpIHsKcmV0dXJuIDE7Cn0KCnJldHVybiAwOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0TG9jYWxQaGFyKHN0cmluZyAkbG9jYWxGaWxlbmFtZSwgc3RyaW5nICRuZXdGaWxlbmFtZSwgP3N0cmluZyAkYmFja3VwVGFyZ2V0ID0gbnVsbCk6IGJvb2wKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHBlcm1zID0gQGZpbGVwZXJtcygkbG9jYWxGaWxlbmFtZSk7CmlmICgkcGVybXMgIT09IGZhbHNlKSB7CkBjaG1vZCgkbmV3RmlsZW5hbWUsICRwZXJtcyk7Cn0KCgppZiAoISR0aGlzLT52YWxpZGF0ZVBoYXIoJG5ld0ZpbGVuYW1lLCAkZXJyb3IpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSAnLigkYmFja3VwVGFyZ2V0ICE9PSBudWxsID8gJ3VwZGF0ZScgOiAnYmFja3VwJykuJyBmaWxlIGlzIGNvcnJ1cHRlZCAoJy4kZXJyb3IuJyk8L2Vycm9yPicpOwoKaWYgKCRiYWNrdXBUYXJnZXQgIT09IG51bGwpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+UGxlYXNlIHJlLXJ1biB0aGUgc2VsZi11cGRhdGUgY29tbWFuZCB0byB0cnkgYWdhaW4uPC9lcnJvcj4nKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKCRiYWNrdXBUYXJnZXQgIT09IG51bGwpIHsKQGNvcHkoJGxvY2FsRmlsZW5hbWUsICRiYWNrdXBUYXJnZXQpOwp9Cgp0cnkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CgoKY29weSgkbmV3RmlsZW5hbWUsICRsb2NhbEZpbGVuYW1lKTsKQHVubGluaygkbmV3RmlsZW5hbWUpOwp9IGVsc2UgewpyZW5hbWUoJG5ld0ZpbGVuYW1lLCAkbG9jYWxGaWxlbmFtZSk7Cn0KCnJldHVybiB0cnVlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CgppZiAoIWlzX3dyaXRhYmxlKGRpcm5hbWUoJGxvY2FsRmlsZW5hbWUpKQomJiAkaW8tPmlzSW50ZXJhY3RpdmUoKQomJiAkdGhpcy0+aXNXaW5kb3dzTm9uQWRtaW5Vc2VyKCkpIHsKcmV0dXJuICR0aGlzLT50cnlBc1dpbmRvd3NBZG1pbigkbG9jYWxGaWxlbmFtZSwgJG5ld0ZpbGVuYW1lKTsKfQoKQHVubGluaygkbmV3RmlsZW5hbWUpOwokYWN0aW9uID0gJ0NvbXBvc2VyICcuKCRiYWNrdXBUYXJnZXQgIT09IG51bGwgPyAndXBkYXRlJyA6ICdyb2xsYmFjaycpOwp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbigkYWN0aW9uLicgZmFpbGVkOiAiJy4kbG9jYWxGaWxlbmFtZS4nIiBjb3VsZCBub3QgYmUgd3JpdHRlbi4nLlBIUF9FT0wuJGUtPmdldE1lc3NhZ2UoKSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFuQmFja3VwcyhzdHJpbmcgJHJvbGxiYWNrRGlyLCA/c3RyaW5nICRleGNlcHQgPSBudWxsKTogdm9pZAp7CiRmaW5kZXIgPSAkdGhpcy0+Z2V0T2xkSW5zdGFsbGF0aW9uRmluZGVyKCRyb2xsYmFja0Rpcik7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokZnMgPSBuZXcgRmlsZXN5c3RlbTsKCmZvcmVhY2ggKCRmaW5kZXIgYXMgJGZpbGUpIHsKaWYgKCRmaWxlLT5nZXRCYXNlbmFtZShzZWxmOjpPTERfSU5TVEFMTF9FWFQpID09PSAkZXhjZXB0KSB7CmNvbnRpbnVlOwp9CiRmaWxlID0gKHN0cmluZykgJGZpbGU7CiRpby0+d3JpdGVFcnJvcignPGluZm8+UmVtb3Zpbmc6ICcuJGZpbGUuJzwvaW5mbz4nKTsKJGZzLT5yZW1vdmUoJGZpbGUpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRMYXN0QmFja3VwVmVyc2lvbihzdHJpbmcgJHJvbGxiYWNrRGlyKTogP3N0cmluZwp7CiRmaW5kZXIgPSAkdGhpcy0+Z2V0T2xkSW5zdGFsbGF0aW9uRmluZGVyKCRyb2xsYmFja0Rpcik7CiRmaW5kZXItPnNvcnRCeU5hbWUoKTsKJGZpbGVzID0gaXRlcmF0b3JfdG9fYXJyYXkoJGZpbmRlcik7CgppZiAoY291bnQoJGZpbGVzKSA+IDApIHsKcmV0dXJuIGVuZCgkZmlsZXMpLT5nZXRCYXNlbmFtZShzZWxmOjpPTERfSU5TVEFMTF9FWFQpOwp9CgpyZXR1cm4gbnVsbDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE9sZEluc3RhbGxhdGlvbkZpbmRlcihzdHJpbmcgJHJvbGxiYWNrRGlyKTogRmluZGVyCnsKcmV0dXJuIEZpbmRlcjo6Y3JlYXRlKCkKLT5kZXB0aCgwKQotPmZpbGVzKCkKLT5uYW1lKCcqJyAuIHNlbGY6Ok9MRF9JTlNUQUxMX0VYVCkKLT5pbigkcm9sbGJhY2tEaXIpOwp9CgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVQaGFyKHN0cmluZyAkcGhhckZpbGUsID9zdHJpbmcgJiRlcnJvcik6IGJvb2wKewppZiAoKGJvb2wpIGluaV9nZXQoJ3BoYXIucmVhZG9ubHknKSkgewpyZXR1cm4gdHJ1ZTsKfQoKdHJ5IHsKCiRwaGFyID0gbmV3IFxQaGFyKCRwaGFyRmlsZSk7Cgp1bnNldCgkcGhhcik7CiRyZXN1bHQgPSB0cnVlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJGUgaW5zdGFuY2VvZiBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICYmICEkZSBpbnN0YW5jZW9mIFxQaGFyRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CiRlcnJvciA9ICRlLT5nZXRNZXNzYWdlKCk7CiRyZXN1bHQgPSBmYWxzZTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc1dpbmRvd3NOb25BZG1pblVzZXIoKTogYm9vbAp7CmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBmYWxzZTsKfQoKCmV4ZWMoJ2ZsdG1jLmV4ZSBmaWx0ZXJzJywgJG91dHB1dCwgJGV4aXRDb2RlKTsKCnJldHVybiAkZXhpdENvZGUgIT09IDA7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0cnlBc1dpbmRvd3NBZG1pbihzdHJpbmcgJGxvY2FsRmlsZW5hbWUsIHN0cmluZyAkbmV3RmlsZW5hbWUpOiBib29sCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5VbmFibGUgdG8gd3JpdGUgIicuJGxvY2FsRmlsZW5hbWUuJyIuIEFjY2VzcyBpcyBkZW5pZWQuPC9lcnJvcj4nKTsKJGhlbHBNZXNzYWdlID0gJ1BsZWFzZSBydW4gdGhlIHNlbGYtdXBkYXRlIGNvbW1hbmQgYXMgYW4gQWRtaW5pc3RyYXRvci4nOwokcXVlc3Rpb24gPSAnQ29tcGxldGUgdGhpcyBvcGVyYXRpb24gd2l0aCBBZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMgWzxjb21tZW50PlksbjwvY29tbWVudD5dPyAnOwoKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24sIHRydWUpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+T3BlcmF0aW9uIGNhbmNlbGxlZC4gJy4kaGVscE1lc3NhZ2UuJzwvd2FybmluZz4nKTsKCnJldHVybiBmYWxzZTsKfQoKJHRtcEZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJycpOwppZiAoZmFsc2UgPT09ICR0bXBGaWxlKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPk9wZXJhdGlvbiBmYWlsZWQuJy4kaGVscE1lc3NhZ2UuJzwvZXJyb3I+Jyk7CgpyZXR1cm4gZmFsc2U7Cn0KJHNjcmlwdCA9ICR0bXBGaWxlLicudmJzJzsKcmVuYW1lKCR0bXBGaWxlLCAkc2NyaXB0KTsKCiRjaGVja3N1bSA9IGhhc2hfZmlsZSgnc2hhMjU2JywgJG5ld0ZpbGVuYW1lKTsKCgokc291cmNlID0gc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCAkbmV3RmlsZW5hbWUpOwokZGVzdGluYXRpb24gPSBzdHJfcmVwbGFjZSgnLycsICdcXCcsICRsb2NhbEZpbGVuYW1lKTsKCiR2YnMgPSA8PDxFT1QKU2V0IFVBQyA9IENyZWF0ZU9iamVjdCgiU2hlbGwuQXBwbGljYXRpb24iKQpVQUMuU2hlbGxFeGVjdXRlICJjbWQuZXhlIiwgIi9jIGNvcHkgL2IgL3kgIiIkc291cmNlIiIgIiIkZGVzdGluYXRpb24iIiIsICIiLCAicnVuYXMiLCAwCldzY3JpcHQuU2xlZXAoMzAwKQpFT1Q7CgpmaWxlX3B1dF9jb250ZW50cygkc2NyaXB0LCAkdmJzKTsKZXhlYygnIicuJHNjcmlwdC4nIicpOwpAdW5saW5rKCRzY3JpcHQpOwoKCmlmICgkcmVzdWx0ID0gRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkbG9jYWxGaWxlbmFtZSkgJiYgKGhhc2hfZmlsZSgnc2hhMjU2JywgJGxvY2FsRmlsZW5hbWUpID09PSAkY2hlY2tzdW0pKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+T3BlcmF0aW9uIHN1Y2NlZWRlZC48L2luZm8+Jyk7CkB1bmxpbmsoJG5ld0ZpbGVuYW1lKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+T3BlcmF0aW9uIGZhaWxlZC4nLiRoZWxwTWVzc2FnZS4nPC9lcnJvcj4nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxEZWZhdWx0UG9saWN5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zZXJSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxGaWx0ZXJSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5VXRpbHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcU2VtdmVyOwp1c2UgQ29tcG9zZXJcU3BkeFxTcGR4TGljZW5zZXM7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VJbmZvOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKCgpjbGFzcyBTaG93Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgpwcm90ZWN0ZWQgJHZlcnNpb25QYXJzZXI7Cgpwcm90ZWN0ZWQgJGNvbG9yczsKCgpwcml2YXRlICRyZXBvc2l0b3J5U2V0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJHRoaXMKLT5zZXROYW1lKCdzaG93JykKLT5zZXRBbGlhc2VzKFsnaW5mbyddKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIHRvIGluc3BlY3QuIE9yIGEgbmFtZSBpbmNsdWRpbmcgYSB3aWxkY2FyZCAoKikgdG8gZmlsdGVyIGxpc3RzIG9mIHBhY2thZ2VzIGluc3RlYWQuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQYWNrYWdlQmFzZWRPbk1vZGUoKSksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdWZXJzaW9uIG9yIHZlcnNpb24gY29uc3RyYWludCB0byBpbnNwZWN0JyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGFsbCBwYWNrYWdlcycpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBhbGwgbG9ja2VkIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignaW5zdGFsbGVkJywgJ2knLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgaW5zdGFsbGVkIHBhY2thZ2VzIG9ubHkgKGVuYWJsZWQgYnkgZGVmYXVsdCwgb25seSBwcmVzZW50IGZvciBCQykuJyksCm5ldyBJbnB1dE9wdGlvbigncGxhdGZvcm0nLCAncCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBwbGF0Zm9ybSBwYWNrYWdlcyBvbmx5JyksCm5ldyBJbnB1dE9wdGlvbignYXZhaWxhYmxlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgYXZhaWxhYmxlIHBhY2thZ2VzIG9ubHknKSwKbmV3IElucHV0T3B0aW9uKCdzZWxmJywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgdGhlIHJvb3QgcGFja2FnZSBpbmZvcm1hdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25hbWUtb25seScsICdOJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHBhY2thZ2UgbmFtZXMgb25seScpLApuZXcgSW5wdXRPcHRpb24oJ3BhdGgnLCAnUCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBwYWNrYWdlIHBhdGhzJyksCm5ldyBJbnB1dE9wdGlvbigndHJlZScsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHRoZSBkZXBlbmRlbmNpZXMgYXMgYSB0cmVlJyksCm5ldyBJbnB1dE9wdGlvbignbGF0ZXN0JywgJ2wnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgdGhlIGxhdGVzdCB2ZXJzaW9uJyksCm5ldyBJbnB1dE9wdGlvbignb3V0ZGF0ZWQnLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyB0aGUgbGF0ZXN0IHZlcnNpb24gYnV0IG9ubHkgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG91dGRhdGVkJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIHNwZWNpZmllZCBwYWNrYWdlKHMpLiBVc2UgaXQgd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24gaWYgeW91IGRvblwndCB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0IG5ldyB2ZXJzaW9ucyBvZiBzb21lIHBhY2thZ2VzLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ21ham9yLW9ubHknLCAnTScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgaGF2ZSBtYWpvciBTZW1WZXItY29tcGF0aWJsZSB1cGRhdGVzLiBVc2Ugd2l0aCB0aGUgLS1sYXRlc3Qgb3IgLS1vdXRkYXRlZCBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbignbWlub3Itb25seScsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIG1pbm9yIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwYXRjaC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIHBhdGNoIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdkaXJlY3QnLCAnRCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3Mgb25seSBwYWNrYWdlcyB0aGF0IGFyZSBkaXJlY3RseSByZXF1aXJlZCBieSB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hlbiB0aGVyZSBhcmUgb3V0ZGF0ZWQgcGFja2FnZXMnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0IG9yIGpzb24nLCAndGV4dCcsIFsnanNvbicsICd0ZXh0J10pLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgc2VhcmNoIGluIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuIFVzZSB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuIFVzZSB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgc2hvdyBjb21tYW5kIGRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZSwgb3IKbGlzdHMgYWxsIHBhY2thZ2VzIGF2YWlsYWJsZS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3Nob3ctaW5mbwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzdWdnZXN0UGFja2FnZUJhc2VkT25Nb2RlKCk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignYXZhaWxhYmxlJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CnJldHVybiAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2VJbmNsUGxhdGZvcm0oKSgkaW5wdXQpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpIHsKcmV0dXJuICR0aGlzLT5zdWdnZXN0UGxhdGZvcm1QYWNrYWdlKCkoJGlucHV0KTsKfQoKcmV0dXJuICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkoJGlucHV0KTsKfTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSkgewokdGhpcy0+aW5pdFN0eWxlcygkb3V0cHV0KTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdpbnN0YWxsZWQnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJpbnN0YWxsZWQiLiBPbmx5IGluc3RhbGxlZCBwYWNrYWdlcyBhcmUgc2hvd24gYnkgZGVmYXVsdCBub3cuIFRoZSAtLWFsbCBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2hvdyBhbGwgcGFja2FnZXMuPC93YXJuaW5nPicpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2xhdGVzdCcsIHRydWUpOwp9IGVsc2VpZiAoY291bnQoJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBvcHRpb24gImlnbm9yZSIgZm9yIGFjdGlvbiBvdGhlciB0aGFuICJvdXRkYXRlZCIsIGl0IHdpbGwgYmUgaWdub3JlZC48L3dhcm5pbmc+Jyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykgJiYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignYXZhaWxhYmxlJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tZGlyZWN0ICgtRCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLWFsbCwgLS1wbGF0Zm9ybSAoLXApIG9yIC0tYXZhaWxhYmxlICgtYSknKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSAmJiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkpIHsKJGlvLT53cml0ZUVycm9yKCdUaGUgLS10cmVlICgtdCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLWFsbCBvciAtLWF2YWlsYWJsZSAoLWEpJyk7CgpyZXR1cm4gMTsKfQoKaWYgKGNvdW50KGFycmF5X2ZpbHRlcihbJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKV0pKSA+IDEpIHsKJGlvLT53cml0ZUVycm9yKCdPbmx5IG9uZSBvZiAtLW1ham9yLW9ubHksIC0tbWlub3Itb25seSBvciAtLXBhdGNoLW9ubHkgY2FuIGJlIHVzZWQgYXQgb25jZScpOwoKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJ1RoZSAtLXRyZWUgKC10KSBvcHRpb24gaXMgbm90IHVzYWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIC0tbGF0ZXN0ICgtbCknKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tdHJlZSAoLXQpIG9wdGlvbiBpcyBub3QgdXNhYmxlIGluIGNvbWJpbmF0aW9uIHdpdGggLS1wYXRoICgtUCknKTsKCnJldHVybiAxOwp9CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpOwppZiAoIWluX2FycmF5KCRmb3JtYXQsIFsndGV4dCcsICdqc29uJ10pKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4gU2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLicsICRmb3JtYXQpKTsKCnJldHVybiAxOwp9CgokcGxhdGZvcm1SZXFGaWx0ZXIgPSAkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpOwoKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9IFtdOwppZiAoJGNvbXBvc2VyKSB7CiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKTsKfQokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKJGxvY2tlZFJlcG8gPSBudWxsOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzZWxmJykpIHsKJHBhY2thZ2UgPSBjbG9uZSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldFBhY2thZ2UoKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSkgewokaW8tPndyaXRlKCRwYWNrYWdlLT5nZXROYW1lKCkpOwoKcmV0dXJuIDA7Cn0KaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignWW91IGNhbm5vdCB1c2UgLS1zZWxmIHRvZ2V0aGVyIHdpdGggYSBwYWNrYWdlIG5hbWUnKTsKfQokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFtuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KCRwYWNrYWdlKV0pOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpIHsKJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHBsYXRmb3JtUmVwb10pOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2F2YWlsYWJsZScpKSB7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRwbGF0Zm9ybVJlcG9dKTsKaWYgKCRjb21wb3NlcikgewokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKTsKJGluc3RhbGxlZFJlcG8tPmFkZFJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSk7Cn0gZWxzZSB7CiRkZWZhdWx0UmVwb3MgPSBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCRpbyk7CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KCRkZWZhdWx0UmVwb3MpOwokaW8tPndyaXRlRXJyb3IoJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBzaG93aW5nIGF2YWlsYWJsZSBwYWNrYWdlcyBmcm9tICcgLiBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJGRlZmF1bHRSZXBvcykpKTsKfQp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpICYmICRjb21wb3NlcikgewokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRsb2NrZWRSZXBvID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2tlZFJlcG8sICRsb2NhbFJlcG8sICRwbGF0Zm9ybVJlcG9dKTsKfSBlbHNlIHsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2FsUmVwbywgJHBsYXRmb3JtUmVwb10pOwp9CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFtuZXcgRmlsdGVyUmVwb3NpdG9yeSgkaW5zdGFsbGVkUmVwbywgWydjYW5vbmljYWwnID0+IGZhbHNlXSldLCAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKSk7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignYWxsJykpIHsKJGRlZmF1bHRSZXBvcyA9IFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJGlvKTsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc2hvd2luZyBhdmFpbGFibGUgcGFja2FnZXMgZnJvbSAnIC4gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRkZWZhdWx0UmVwb3MpKSk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRwbGF0Zm9ybVJlcG9dKTsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoWyRpbnN0YWxsZWRSZXBvXSwgJGRlZmF1bHRSZXBvcykpOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CmlmICghJGNvbXBvc2VyIHx8ICEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdBIHZhbGlkIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2sgZmlsZXMgaXMgcmVxdWlyZWQgdG8gcnVuIHRoaXMgY29tbWFuZCB3aXRoIC0tbG9ja2VkJyk7Cn0KJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CiRsb2NrZWRSZXBvID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKTsKJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2tlZFJlcG9dKTsKfSBlbHNlIHsKCmlmICghJGNvbXBvc2VyKSB7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKfQokcm9vdFBrZyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpXSk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlsczo6ZmlsdGVyUmVxdWlyZWRQYWNrYWdlcygkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKSwgJHJvb3RQa2cpOwokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFtuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwa2cpOiBQYWNrYWdlSW50ZXJmYWNlIHsKcmV0dXJuIGNsb25lICRwa2c7Cn0sICRwYWNrYWdlcykpXSk7Cn0KCmlmICghJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkgJiYgKCRyb290UGtnLT5nZXRSZXF1aXJlcygpIHx8ICRyb290UGtnLT5nZXREZXZSZXF1aXJlcygpKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGRlcGVuZGVuY2llcyBpbnN0YWxsZWQuIFRyeSBydW5uaW5nIGNvbXBvc2VyIGluc3RhbGwgb3IgdXBkYXRlLjwvd2FybmluZz4nKTsKfQp9CgppZiAoJGNvbXBvc2VyKSB7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3Nob3cnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpICYmIG51bGwgPT09ICRjb21wb3NlcikgewokaW8tPndyaXRlRXJyb3IoJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBkaXNhYmxpbmcgImxhdGVzdCIgb3B0aW9uJyk7CiRpbnB1dC0+c2V0T3B0aW9uKCdsYXRlc3QnLCBmYWxzZSk7Cn0KCiRwYWNrYWdlRmlsdGVyID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpOwoKCmlmIChpc3NldCgkcGFja2FnZSkpIHsKJHZlcnNpb25zID0gWyRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT4gJHBhY2thZ2UtPmdldFZlcnNpb24oKV07Cn0gZWxzZWlmIChudWxsICE9PSAkcGFja2FnZUZpbHRlciAmJiAhc3RyX2NvbnRhaW5zKCRwYWNrYWdlRmlsdGVyLCAnKicpKSB7ClskcGFja2FnZSwgJHZlcnNpb25zXSA9ICR0aGlzLT5nZXRQYWNrYWdlKCRpbnN0YWxsZWRSZXBvLCAkcmVwb3MsICRwYWNrYWdlRmlsdGVyLCAkaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJykpOwoKaWYgKCFpc3NldCgkcGFja2FnZSkpIHsKJG9wdGlvbnMgPSAkaW5wdXQtPmdldE9wdGlvbnMoKTsKJGhpbnQgPSAnJzsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewokaGludCAuPSAnIGluIGxvY2sgZmlsZSc7Cn0KaWYgKGlzc2V0KCRvcHRpb25zWyd3b3JraW5nLWRpciddKSkgewokaGludCAuPSAnIGluICcgLiAkb3B0aW9uc1snd29ya2luZy1kaXInXSAuICcvY29tcG9zZXIuanNvbic7Cn0KaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBhY2thZ2VGaWx0ZXIpICYmICEkaW5wdXQtPmdldE9wdGlvbigncGxhdGZvcm0nKSkgewokaGludCAuPSAnLCB0cnkgdXNpbmcgLS1wbGF0Zm9ybSAoLXApIHRvIHNob3cgcGxhdGZvcm0gcGFja2FnZXMnOwp9CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CiRoaW50IC49ICcsIHRyeSB1c2luZyAtLWF2YWlsYWJsZSAoLWEpIHRvIHNob3cgYWxsIGF2YWlsYWJsZSBwYWNrYWdlcyc7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VGaWx0ZXIgLiAnIiBub3QgZm91bmQnLiRoaW50LicuJyk7Cn0KfQoKaWYgKGlzc2V0KCRwYWNrYWdlKSkgewphc3NlcnQoaXNzZXQoJHZlcnNpb25zKSk7CgokZXhpdENvZGUgPSAwOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSkgewokYXJyYXlUcmVlID0gJHRoaXMtPmdlbmVyYXRlUGFja2FnZVRyZWUoJHBhY2thZ2UsICRpbnN0YWxsZWRSZXBvLCAkcmVwb3MpOwoKaWYgKCdqc29uJyA9PT0gJGZvcm1hdCkgewokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoWydpbnN0YWxsZWQnID0+IFskYXJyYXlUcmVlXV0pKTsKfSBlbHNlIHsKJHRoaXMtPmRpc3BsYXlQYWNrYWdlVHJlZShbJGFycmF5VHJlZV0pOwp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgokbGF0ZXN0UGFja2FnZSA9IG51bGw7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGF0ZXN0JykpIHsKJGxhdGVzdFBhY2thZ2UgPSAkdGhpcy0+ZmluZExhdGVzdFBhY2thZ2UoJHBhY2thZ2UsICRjb21wb3NlciwgJHBsYXRmb3JtUmVwbywgJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSwgJHBsYXRmb3JtUmVxRmlsdGVyKTsKfQppZiAoCiRpbnB1dC0+Z2V0T3B0aW9uKCdvdXRkYXRlZCcpCiYmICRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QnKQomJiBudWxsICE9PSAkbGF0ZXN0UGFja2FnZQomJiAkbGF0ZXN0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSAhPT0gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkKJiYgKCEkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSB8fCAhJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpCikgewokZXhpdENvZGUgPSAxOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpKSB7CiRpby0+d3JpdGUoJHBhY2thZ2UtPmdldE5hbWUoKSwgZmFsc2UpOwokcGF0aCA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChpc19zdHJpbmcoJHBhdGgpKSB7CiRpby0+d3JpdGUoJyAnIC4gc3RydG9rKHJlYWxwYXRoKCRwYXRoKSwgIlxyXG4iKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJyBudWxsJyk7Cn0KCnJldHVybiAkZXhpdENvZGU7Cn0KCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJHRoaXMtPnByaW50UGFja2FnZUluZm9Bc0pzb24oJHBhY2thZ2UsICR2ZXJzaW9ucywgJGluc3RhbGxlZFJlcG8sICRsYXRlc3RQYWNrYWdlID86IG51bGwpOwp9IGVsc2UgewokdGhpcy0+cHJpbnRQYWNrYWdlSW5mbygkcGFja2FnZSwgJHZlcnNpb25zLCAkaW5zdGFsbGVkUmVwbywgJGxhdGVzdFBhY2thZ2UgPzogbnVsbCk7Cn0KCnJldHVybiAkZXhpdENvZGU7Cn0KCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSkgewokcm9vdFJlcXVpcmVzID0gJHRoaXMtPmdldFJvb3RSZXF1aXJlcygpOwokcGFja2FnZXMgPSAkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKTsKdXNvcnQoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKEJhc2VQYWNrYWdlICRhLCBCYXNlUGFja2FnZSAkYik6IGludCB7CnJldHVybiBzdHJjbXAoKHN0cmluZykgJGEsIChzdHJpbmcpICRiKTsKfSk7CiRhcnJheVRyZWUgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcm9vdFJlcXVpcmVzLCB0cnVlKSkgewokYXJyYXlUcmVlW10gPSAkdGhpcy0+Z2VuZXJhdGVQYWNrYWdlVHJlZSgkcGFja2FnZSwgJGluc3RhbGxlZFJlcG8sICRyZXBvcyk7Cn0KfQoKaWYgKCdqc29uJyA9PT0gJGZvcm1hdCkgewokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoWydpbnN0YWxsZWQnID0+ICRhcnJheVRyZWVdKSk7Cn0gZWxzZSB7CiR0aGlzLT5kaXNwbGF5UGFja2FnZVRyZWUoJGFycmF5VHJlZSk7Cn0KCnJldHVybiAwOwp9CgoKCiRwYWNrYWdlcyA9IFtdOwokcGFja2FnZUZpbHRlclJlZ2V4ID0gbnVsbDsKaWYgKG51bGwgIT09ICRwYWNrYWdlRmlsdGVyKSB7CiRwYWNrYWdlRmlsdGVyUmVnZXggPSAne14nLnN0cl9yZXBsYWNlKCdcXConLCAnLio/JywgcHJlZ19xdW90ZSgkcGFja2FnZUZpbHRlcikpLickfWknOwp9CgokcGFja2FnZUxpc3RGaWx0ZXIgPSBudWxsOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RpcmVjdCcpKSB7CiRwYWNrYWdlTGlzdEZpbHRlciA9ICR0aGlzLT5nZXRSb290UmVxdWlyZXMoKTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRoJykgJiYgbnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRpby0+d3JpdGVFcnJvcignTm8gY29tcG9zZXIuanNvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGRpc2FibGluZyAicGF0aCIgb3B0aW9uJyk7CiRpbnB1dC0+c2V0T3B0aW9uKCdwYXRoJywgZmFsc2UpOwp9Cgpmb3JlYWNoIChSZXBvc2l0b3J5VXRpbHM6OmZsYXR0ZW5SZXBvc2l0b3JpZXMoJHJlcG9zKSBhcyAkcmVwbykgewppZiAoJHJlcG8gPT09ICRwbGF0Zm9ybVJlcG8pIHsKJHR5cGUgPSAncGxhdGZvcm0nOwp9IGVsc2VpZiAoJGxvY2tlZFJlcG8gIT09IG51bGwgJiYgJHJlcG8gPT09ICRsb2NrZWRSZXBvKSB7CiR0eXBlID0gJ2xvY2tlZCc7Cn0gZWxzZWlmICgkcmVwbyA9PT0gJGluc3RhbGxlZFJlcG8gfHwgaW5fYXJyYXkoJHJlcG8sICRpbnN0YWxsZWRSZXBvLT5nZXRSZXBvc2l0b3JpZXMoKSwgdHJ1ZSkpIHsKJHR5cGUgPSAnaW5zdGFsbGVkJzsKfSBlbHNlIHsKJHR5cGUgPSAnYXZhaWxhYmxlJzsKfQppZiAoJHJlcG8gaW5zdGFuY2VvZiBDb21wb3NlclJlcG9zaXRvcnkpIHsKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VOYW1lcygkcGFja2FnZUZpbHRlcikgYXMgJG5hbWUpIHsKJHBhY2thZ2VzWyR0eXBlXVskbmFtZV0gPSAkbmFtZTsKfQp9IGVsc2Ugewpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoIWlzc2V0KCRwYWNrYWdlc1skdHlwZV1bJHBhY2thZ2UtPmdldE5hbWUoKV0pCnx8ICFpc19vYmplY3QoJHBhY2thZ2VzWyR0eXBlXVskcGFja2FnZS0+Z2V0TmFtZSgpXSkKfHwgdmVyc2lvbl9jb21wYXJlKCRwYWNrYWdlc1skdHlwZV1bJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldFZlcnNpb24oKSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJzwnKQopIHsKd2hpbGUgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQppZiAoISRwYWNrYWdlRmlsdGVyUmVnZXggfHwgUHJlZzo6aXNNYXRjaCgkcGFja2FnZUZpbHRlclJlZ2V4LCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewppZiAobnVsbCA9PT0gJHBhY2thZ2VMaXN0RmlsdGVyIHx8IGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRwYWNrYWdlTGlzdEZpbHRlciwgdHJ1ZSkpIHsKJHBhY2thZ2VzWyR0eXBlXVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9Cn0KfQp9CmlmICgkcmVwbyA9PT0gJHBsYXRmb3JtUmVwbykgewpmb3JlYWNoICgkcGxhdGZvcm1SZXBvLT5nZXREaXNhYmxlZFBhY2thZ2VzKCkgYXMgJG5hbWUgPT4gJHBhY2thZ2UpIHsKJHBhY2thZ2VzWyR0eXBlXVskbmFtZV0gPSAkcGFja2FnZTsKfQp9Cn0KfQoKJHNob3dBbGxUeXBlcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKTsKJHNob3dMYXRlc3QgPSAkaW5wdXQtPmdldE9wdGlvbignbGF0ZXN0Jyk7CiRzaG93TWFqb3JPbmx5ID0gJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKTsKJHNob3dNaW5vck9ubHkgPSAkaW5wdXQtPmdldE9wdGlvbignbWlub3Itb25seScpOwokc2hvd1BhdGNoT25seSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRjaC1vbmx5Jyk7CiRpZ25vcmVkUGFja2FnZXMgPSBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlJykpOwokaW5kZW50ID0gJHNob3dBbGxUeXBlcyA/ICcgICcgOiAnJzsKCiRsYXRlc3RQYWNrYWdlcyA9IFtdOwokZXhpdENvZGUgPSAwOwokdmlld0RhdGEgPSBbXTsKJHZpZXdNZXRhRGF0YSA9IFtdOwoKJHdyaXRlVmVyc2lvbiA9IGZhbHNlOwokd3JpdGVEZXNjcmlwdGlvbiA9IGZhbHNlOwoKZm9yZWFjaCAoWydwbGF0Zm9ybScgPT4gdHJ1ZSwgJ2xvY2tlZCcgPT4gdHJ1ZSwgJ2F2YWlsYWJsZScgPT4gZmFsc2UsICdpbnN0YWxsZWQnID0+IHRydWVdIGFzICR0eXBlID0+ICRzaG93VmVyc2lvbikgewppZiAoaXNzZXQoJHBhY2thZ2VzWyR0eXBlXSkpIHsKa3NvcnQoJHBhY2thZ2VzWyR0eXBlXSk7CgokbmFtZUxlbmd0aCA9ICR2ZXJzaW9uTGVuZ3RoID0gJGxhdGVzdExlbmd0aCA9IDA7CgppZiAoJHNob3dMYXRlc3QgJiYgJHNob3dWZXJzaW9uKSB7CmZvcmVhY2ggKCRwYWNrYWdlc1skdHlwZV0gYXMgJHBhY2thZ2UpIHsKaWYgKGlzX29iamVjdCgkcGFja2FnZSkpIHsKJGxhdGVzdFBhY2thZ2UgPSAkdGhpcy0+ZmluZExhdGVzdFBhY2thZ2UoJHBhY2thZ2UsICRjb21wb3NlciwgJHBsYXRmb3JtUmVwbywgJHNob3dNYWpvck9ubHksICRzaG93TWlub3JPbmx5LCAkc2hvd1BhdGNoT25seSwgJHBsYXRmb3JtUmVxRmlsdGVyKTsKaWYgKCRsYXRlc3RQYWNrYWdlID09PSBudWxsKSB7CmNvbnRpbnVlOwp9CgokbGF0ZXN0UGFja2FnZXNbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV0gPSAkbGF0ZXN0UGFja2FnZTsKfQp9Cn0KCiR3cml0ZVBhdGggPSAhJGlucHV0LT5nZXRPcHRpb24oJ25hbWUtb25seScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRoJyk7CiR3cml0ZVZlcnNpb24gPSAhJGlucHV0LT5nZXRPcHRpb24oJ25hbWUtb25seScpICYmICEkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpICYmICRzaG93VmVyc2lvbjsKJHdyaXRlTGF0ZXN0ID0gJHdyaXRlVmVyc2lvbiAmJiAkc2hvd0xhdGVzdDsKJHdyaXRlRGVzY3JpcHRpb24gPSAhJGlucHV0LT5nZXRPcHRpb24oJ25hbWUtb25seScpICYmICEkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpOwoKJGhhc091dGRhdGVkUGFja2FnZXMgPSBmYWxzZTsKCiR2aWV3RGF0YVskdHlwZV0gPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzWyR0eXBlXSBhcyAkcGFja2FnZSkgewokcGFja2FnZVZpZXdEYXRhID0gW107CmlmIChpc19vYmplY3QoJHBhY2thZ2UpKSB7CiRsYXRlc3RQYWNrYWdlID0gbnVsbDsKaWYgKCRzaG93TGF0ZXN0ICYmIGlzc2V0KCRsYXRlc3RQYWNrYWdlc1skcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXSkpIHsKJGxhdGVzdFBhY2thZ2UgPSAkbGF0ZXN0UGFja2FnZXNbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV07Cn0KCgokcGFja2FnZUlzVXBUb0RhdGUgPSAkbGF0ZXN0UGFja2FnZSAmJiAkbGF0ZXN0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSA9PT0gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgJiYgKCEkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSB8fCAhJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpOwoKJHBhY2thZ2VJc1VwVG9EYXRlID0gJHBhY2thZ2VJc1VwVG9EYXRlIHx8ICgkbGF0ZXN0UGFja2FnZSA9PT0gbnVsbCAmJiAkc2hvd01ham9yT25seSk7CiRwYWNrYWdlSXNJZ25vcmVkID0gXGluX2FycmF5KCRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksICRpZ25vcmVkUGFja2FnZXMsIHRydWUpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykgJiYgKCRwYWNrYWdlSXNVcFRvRGF0ZSB8fCAkcGFja2FnZUlzSWdub3JlZCkpIHsKY29udGludWU7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0JykpIHsKJGhhc091dGRhdGVkUGFja2FnZXMgPSB0cnVlOwp9CgokcGFja2FnZVZpZXdEYXRhWyduYW1lJ10gPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokcGFja2FnZVZpZXdEYXRhWydkaXJlY3QtZGVwZW5kZW5jeSddID0gaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHRoaXMtPmdldFJvb3RSZXF1aXJlcygpLCB0cnVlKTsKaWYgKCRmb3JtYXQgIT09ICdqc29uJyB8fCB0cnVlICE9PSAkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykpIHsKJHBhY2thZ2VWaWV3RGF0YVsnaG9tZXBhZ2UnXSA9ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCkgOiBudWxsOwokcGFja2FnZVZpZXdEYXRhWydzb3VyY2UnXSA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlVXJsKCRwYWNrYWdlKTsKfQokbmFtZUxlbmd0aCA9IG1heCgkbmFtZUxlbmd0aCwgc3RybGVuKCRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpKTsKaWYgKCR3cml0ZVZlcnNpb24pIHsKJHBhY2thZ2VWaWV3RGF0YVsndmVyc2lvbiddID0gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7CiR2ZXJzaW9uTGVuZ3RoID0gbWF4KCR2ZXJzaW9uTGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkpKTsKfQppZiAoJHdyaXRlTGF0ZXN0ICYmICRsYXRlc3RQYWNrYWdlKSB7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddID0gJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdC1zdGF0dXMnXSA9ICR0aGlzLT5nZXRVcGRhdGVTdGF0dXMoJGxhdGVzdFBhY2thZ2UsICRwYWNrYWdlKTsKJGxhdGVzdExlbmd0aCA9IG1heCgkbGF0ZXN0TGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10pKTsKfSBlbHNlaWYgKCR3cml0ZUxhdGVzdCkgewokcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSA9ICdbbm9uZSBtYXRjaGVkXSc7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdC1zdGF0dXMnXSA9ICd1cC10by1kYXRlJzsKJGxhdGVzdExlbmd0aCA9IG1heCgkbGF0ZXN0TGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10pKTsKfQppZiAoJHdyaXRlRGVzY3JpcHRpb24gJiYgJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKJHBhY2thZ2VWaWV3RGF0YVsnZGVzY3JpcHRpb24nXSA9ICRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpOwp9CmlmICgkd3JpdGVQYXRoKSB7CiRwYXRoID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKaWYgKGlzX3N0cmluZygkcGF0aCkpIHsKJHBhY2thZ2VWaWV3RGF0YVsncGF0aCddID0gc3RydG9rKHJlYWxwYXRoKCRwYXRoKSwgIlxyXG4iKTsKfSBlbHNlIHsKJHBhY2thZ2VWaWV3RGF0YVsncGF0aCddID0gbnVsbDsKfQp9CgokcGFja2FnZUlzQWJhbmRvbmVkID0gZmFsc2U7CmlmICgkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkbGF0ZXN0UGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewokcmVwbGFjZW1lbnRQYWNrYWdlTmFtZSA9ICRsYXRlc3RQYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKTsKJHJlcGxhY2VtZW50ID0gJHJlcGxhY2VtZW50UGFja2FnZU5hbWUgIT09IG51bGwKPyAnVXNlICcgLiAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgLiAnIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwokcGFja2FnZVdhcm5pbmcgPSBzcHJpbnRmKAonUGFja2FnZSAlcyBpcyBhYmFuZG9uZWQsIHlvdSBzaG91bGQgYXZvaWQgdXNpbmcgaXQuICVzLicsCiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCiRyZXBsYWNlbWVudAopOwokcGFja2FnZVZpZXdEYXRhWyd3YXJuaW5nJ10gPSAkcGFja2FnZVdhcm5pbmc7CiRwYWNrYWdlSXNBYmFuZG9uZWQgPSAkcmVwbGFjZW1lbnRQYWNrYWdlTmFtZSA/PyB0cnVlOwp9CgokcGFja2FnZVZpZXdEYXRhWydhYmFuZG9uZWQnXSA9ICRwYWNrYWdlSXNBYmFuZG9uZWQ7Cn0gZWxzZSB7CiRwYWNrYWdlVmlld0RhdGFbJ25hbWUnXSA9ICRwYWNrYWdlOwokbmFtZUxlbmd0aCA9IG1heCgkbmFtZUxlbmd0aCwgc3RybGVuKCRwYWNrYWdlKSk7Cn0KJHZpZXdEYXRhWyR0eXBlXVtdID0gJHBhY2thZ2VWaWV3RGF0YTsKfQokdmlld01ldGFEYXRhWyR0eXBlXSA9IFsKJ25hbWVMZW5ndGgnID0+ICRuYW1lTGVuZ3RoLAondmVyc2lvbkxlbmd0aCcgPT4gJHZlcnNpb25MZW5ndGgsCidsYXRlc3RMZW5ndGgnID0+ICRsYXRlc3RMZW5ndGgsCid3cml0ZUxhdGVzdCcgPT4gJHdyaXRlTGF0ZXN0LApdOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpICYmICRoYXNPdXRkYXRlZFBhY2thZ2VzKSB7CiRleGl0Q29kZSA9IDE7CmJyZWFrOwp9Cn0KfQoKaWYgKCdqc29uJyA9PT0gJGZvcm1hdCkgewokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJHZpZXdEYXRhKSk7Cn0gZWxzZSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGF0ZXN0JykgJiYgYXJyYXlfZmlsdGVyKCR2aWV3RGF0YSkpIHsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGlvLT53cml0ZUVycm9yKCdMZWdlbmQ6Jyk7CiRpby0+d3JpdGVFcnJvcignISBwYXRjaCBvciBtaW5vciByZWxlYXNlIGF2YWlsYWJsZSAtIHVwZGF0ZSByZWNvbW1lbmRlZCcpOwokaW8tPndyaXRlRXJyb3IoJ34gbWFqb3IgcmVsZWFzZSBhdmFpbGFibGUgLSB1cGRhdGUgcG9zc2libGUnKTsKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSkgewokaW8tPndyaXRlRXJyb3IoJz0gdXAgdG8gZGF0ZSB2ZXJzaW9uJyk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5Db2xvciBsZWdlbmQ6PC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJy0gPGhpZ2hsaWdodD5wYXRjaCBvciBtaW5vcjwvaGlnaGxpZ2h0PiByZWxlYXNlIGF2YWlsYWJsZSAtIHVwZGF0ZSByZWNvbW1lbmRlZCcpOwokaW8tPndyaXRlRXJyb3IoJy0gPGNvbW1lbnQ+bWFqb3I8L2NvbW1lbnQ+IHJlbGVhc2UgYXZhaWxhYmxlIC0gdXBkYXRlIHBvc3NpYmxlJyk7CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykpIHsKJGlvLT53cml0ZUVycm9yKCctIDxpbmZvPnVwIHRvIGRhdGU8L2luZm8+IHZlcnNpb24nKTsKfQp9Cn0KCiR3aWR0aCA9ICR0aGlzLT5nZXRUZXJtaW5hbFdpZHRoKCk7Cgpmb3JlYWNoICgkdmlld0RhdGEgYXMgJHR5cGUgPT4gJHBhY2thZ2VzKSB7CiRuYW1lTGVuZ3RoID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ25hbWVMZW5ndGgnXTsKJHZlcnNpb25MZW5ndGggPSAkdmlld01ldGFEYXRhWyR0eXBlXVsndmVyc2lvbkxlbmd0aCddOwokbGF0ZXN0TGVuZ3RoID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ2xhdGVzdExlbmd0aCddOwokd3JpdGVMYXRlc3QgPSAkdmlld01ldGFEYXRhWyR0eXBlXVsnd3JpdGVMYXRlc3QnXTsKCiR2ZXJzaW9uRml0cyA9ICRuYW1lTGVuZ3RoICsgJHZlcnNpb25MZW5ndGggKyAzIDw9ICR3aWR0aDsKJGxhdGVzdEZpdHMgPSAkbmFtZUxlbmd0aCArICR2ZXJzaW9uTGVuZ3RoICsgJGxhdGVzdExlbmd0aCArIDMgPD0gJHdpZHRoOwokZGVzY3JpcHRpb25GaXRzID0gJG5hbWVMZW5ndGggKyAkdmVyc2lvbkxlbmd0aCArICRsYXRlc3RMZW5ndGggKyAyNCA8PSAkd2lkdGg7CgppZiAoJGxhdGVzdEZpdHMgJiYgISRpby0+aXNEZWNvcmF0ZWQoKSkgewokbGF0ZXN0TGVuZ3RoICs9IDI7Cn0KCmlmICgkc2hvd0FsbFR5cGVzKSB7CmlmICgnYXZhaWxhYmxlJyA9PT0gJHR5cGUpIHsKJGlvLT53cml0ZSgnPGNvbW1lbnQ+JyAuICR0eXBlIC4gJzwvY29tbWVudD46Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkdHlwZSAuICc8L2luZm8+OicpOwp9Cn0KCmlmICgkd3JpdGVMYXRlc3QgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSkgewokZGlyZWN0RGVwcyA9IFtdOwokdHJhbnNpdGl2ZURlcHMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwa2cpIHsKaWYgKCRwa2dbJ2RpcmVjdC1kZXBlbmRlbmN5J10gPz8gZmFsc2UpIHsKJGRpcmVjdERlcHNbXSA9ICRwa2c7Cn0gZWxzZSB7CiR0cmFuc2l0aXZlRGVwc1tdID0gJHBrZzsKfQp9CgokaW8tPndyaXRlRXJyb3IoJycpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkRpcmVjdCBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgaW4gY29tcG9zZXIuanNvbjo8Lz4nKTsKaWYgKFxjb3VudCgkZGlyZWN0RGVwcykgPiAwKSB7CiR0aGlzLT5wcmludFBhY2thZ2VzKCRpbywgJGRpcmVjdERlcHMsICRpbmRlbnQsICR3cml0ZVZlcnNpb24gJiYgJHZlcnNpb25GaXRzLCAkbGF0ZXN0Rml0cywgJHdyaXRlRGVzY3JpcHRpb24gJiYgJGRlc2NyaXB0aW9uRml0cywgJHdpZHRoLCAkdmVyc2lvbkxlbmd0aCwgJG5hbWVMZW5ndGgsICRsYXRlc3RMZW5ndGgpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJ0V2ZXJ5dGhpbmcgdXAgdG8gZGF0ZScpOwp9CiRpby0+d3JpdGVFcnJvcignJyk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+VHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgbm90IHJlcXVpcmVkIGluIGNvbXBvc2VyLmpzb246PC8+Jyk7CmlmIChcY291bnQoJHRyYW5zaXRpdmVEZXBzKSA+IDApIHsKJHRoaXMtPnByaW50UGFja2FnZXMoJGlvLCAkdHJhbnNpdGl2ZURlcHMsICRpbmRlbnQsICR3cml0ZVZlcnNpb24gJiYgJHZlcnNpb25GaXRzLCAkbGF0ZXN0Rml0cywgJHdyaXRlRGVzY3JpcHRpb24gJiYgJGRlc2NyaXB0aW9uRml0cywgJHdpZHRoLCAkdmVyc2lvbkxlbmd0aCwgJG5hbWVMZW5ndGgsICRsYXRlc3RMZW5ndGgpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJ0V2ZXJ5dGhpbmcgdXAgdG8gZGF0ZScpOwp9Cn0gZWxzZSB7CmlmICgkd3JpdGVMYXRlc3QgJiYgXGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJGlvLT53cml0ZUVycm9yKCdBbGwgeW91ciBkaXJlY3QgZGVwZW5kZW5jaWVzIGFyZSB1cCB0byBkYXRlJyk7Cn0gZWxzZSB7CiR0aGlzLT5wcmludFBhY2thZ2VzKCRpbywgJHBhY2thZ2VzLCAkaW5kZW50LCAkd3JpdGVWZXJzaW9uICYmICR2ZXJzaW9uRml0cywgJHdyaXRlTGF0ZXN0ICYmICRsYXRlc3RGaXRzLCAkd3JpdGVEZXNjcmlwdGlvbiAmJiAkZGVzY3JpcHRpb25GaXRzLCAkd2lkdGgsICR2ZXJzaW9uTGVuZ3RoLCAkbmFtZUxlbmd0aCwgJGxhdGVzdExlbmd0aCk7Cn0KfQoKaWYgKCRzaG93QWxsVHlwZXMpIHsKJGlvLT53cml0ZSgnJyk7Cn0KfQp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByaW50UGFja2FnZXMoSU9JbnRlcmZhY2UgJGlvLCBhcnJheSAkcGFja2FnZXMsIHN0cmluZyAkaW5kZW50LCBib29sICR3cml0ZVZlcnNpb24sIGJvb2wgJHdyaXRlTGF0ZXN0LCBib29sICR3cml0ZURlc2NyaXB0aW9uLCBpbnQgJHdpZHRoLCBpbnQgJHZlcnNpb25MZW5ndGgsIGludCAkbmFtZUxlbmd0aCwgaW50ICRsYXRlc3RMZW5ndGgpOiB2b2lkCnsKJHBhZE5hbWUgPSAkd3JpdGVWZXJzaW9uIHx8ICR3cml0ZUxhdGVzdCB8fCAkd3JpdGVEZXNjcmlwdGlvbjsKJHBhZFZlcnNpb24gPSAkd3JpdGVMYXRlc3QgfHwgJHdyaXRlRGVzY3JpcHRpb247CiRwYWRMYXRlc3QgPSAkd3JpdGVEZXNjcmlwdGlvbjsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaW5rID0gJHBhY2thZ2VbJ3NvdXJjZSddID8/ICRwYWNrYWdlWydob21lcGFnZSddID8/ICcnOwppZiAoJGxpbmsgIT09ICcnKSB7CiRpby0+d3JpdGUoJGluZGVudCAuICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRsaW5rKS4nPicuJHBhY2thZ2VbJ25hbWUnXS4nPC8+Jy4gc3RyX3JlcGVhdCgnICcsICgkcGFkTmFtZSA/ICRuYW1lTGVuZ3RoIC0gc3RybGVuKCRwYWNrYWdlWyduYW1lJ10pIDogMCkpLCBmYWxzZSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJGluZGVudCAuIHN0cl9wYWQoJHBhY2thZ2VbJ25hbWUnXSwgKCRwYWROYW1lID8gJG5hbWVMZW5ndGggOiAwKSwgJyAnKSwgZmFsc2UpOwp9CmlmIChpc3NldCgkcGFja2FnZVsndmVyc2lvbiddKSAmJiAkd3JpdGVWZXJzaW9uKSB7CiRpby0+d3JpdGUoJyAnIC4gc3RyX3BhZCgkcGFja2FnZVsndmVyc2lvbiddLCAoJHBhZFZlcnNpb24gPyAkdmVyc2lvbkxlbmd0aCA6IDApLCAnICcpLCBmYWxzZSk7Cn0KaWYgKGlzc2V0KCRwYWNrYWdlWydsYXRlc3QnXSkgJiYgaXNzZXQoJHBhY2thZ2VbJ2xhdGVzdC1zdGF0dXMnXSkgJiYgJHdyaXRlTGF0ZXN0KSB7CiRsYXRlc3RWZXJzaW9uID0gJHBhY2thZ2VbJ2xhdGVzdCddOwokdXBkYXRlU3RhdHVzID0gJHBhY2thZ2VbJ2xhdGVzdC1zdGF0dXMnXTsKJHN0eWxlID0gJHRoaXMtPnVwZGF0ZVN0YXR1c1RvVmVyc2lvblN0eWxlKCR1cGRhdGVTdGF0dXMpOwppZiAoISRpby0+aXNEZWNvcmF0ZWQoKSkgewokbGF0ZXN0VmVyc2lvbiA9IHN0cl9yZXBsYWNlKFsndXAtdG8tZGF0ZScsICdzZW12ZXItc2FmZS11cGRhdGUnLCAndXBkYXRlLXBvc3NpYmxlJ10sIFsnPScsICchJywgJ34nXSwgJHVwZGF0ZVN0YXR1cykgLiAnICcgLiAkbGF0ZXN0VmVyc2lvbjsKfQokaW8tPndyaXRlKCcgPCcgLiAkc3R5bGUgLiAnPicgLiBzdHJfcGFkKCRsYXRlc3RWZXJzaW9uLCAoJHBhZExhdGVzdCA/ICRsYXRlc3RMZW5ndGggOiAwKSwgJyAnKSAuICc8LycgLiAkc3R5bGUgLiAnPicsIGZhbHNlKTsKfQppZiAoaXNzZXQoJHBhY2thZ2VbJ2Rlc2NyaXB0aW9uJ10pICYmICR3cml0ZURlc2NyaXB0aW9uKSB7CiRkZXNjcmlwdGlvbiA9IHN0cnRvaygkcGFja2FnZVsnZGVzY3JpcHRpb24nXSwgIlxyXG4iKTsKJHJlbWFpbmluZyA9ICR3aWR0aCAtICRuYW1lTGVuZ3RoIC0gJHZlcnNpb25MZW5ndGggLSA0OwppZiAoJHdyaXRlTGF0ZXN0KSB7CiRyZW1haW5pbmcgLT0gJGxhdGVzdExlbmd0aDsKfQppZiAoc3RybGVuKCRkZXNjcmlwdGlvbikgPiAkcmVtYWluaW5nKSB7CiRkZXNjcmlwdGlvbiA9IHN1YnN0cigkZGVzY3JpcHRpb24sIDAsICRyZW1haW5pbmcgLSAzKSAuICcuLi4nOwp9CiRpby0+d3JpdGUoJyAnIC4gJGRlc2NyaXB0aW9uLCBmYWxzZSk7Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3BhdGgnLCAkcGFja2FnZSkpIHsKJGlvLT53cml0ZSgnICcuKGlzX3N0cmluZygkcGFja2FnZVsncGF0aCddKSA/ICRwYWNrYWdlWydwYXRoJ10gOiAnbnVsbCcpLCBmYWxzZSk7Cn0KJGlvLT53cml0ZSgnJyk7CmlmIChpc3NldCgkcGFja2FnZVsnd2FybmluZyddKSkgewokaW8tPndyaXRlKCc8d2FybmluZz4nIC4gJHBhY2thZ2VbJ3dhcm5pbmcnXSAuICc8L3dhcm5pbmc+Jyk7Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Um9vdFJlcXVpcmVzKCk6IGFycmF5CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CmlmICgkY29tcG9zZXIgPT09IG51bGwpIHsKcmV0dXJuIFtdOwp9Cgokcm9vdFBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCnJldHVybiBhcnJheV9tYXAoCidzdHJ0b2xvd2VyJywKYXJyYXlfa2V5cyhhcnJheV9tZXJnZSgkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSkpCik7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRWZXJzaW9uU3R5bGUoUGFja2FnZUludGVyZmFjZSAkbGF0ZXN0UGFja2FnZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gJHRoaXMtPnVwZGF0ZVN0YXR1c1RvVmVyc2lvblN0eWxlKCR0aGlzLT5nZXRVcGRhdGVTdGF0dXMoJGxhdGVzdFBhY2thZ2UsICRwYWNrYWdlKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGFja2FnZShJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLCBSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvcywgc3RyaW5nICRuYW1lLCAkdmVyc2lvbiA9IG51bGwpOiBhcnJheQp7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiRjb25zdHJhaW50ID0gaXNfc3RyaW5nKCR2ZXJzaW9uKSA/ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCR2ZXJzaW9uKSA6ICR2ZXJzaW9uOwoKJHBvbGljeSA9IG5ldyBEZWZhdWx0UG9saWN5KCk7CiRyZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJ2RldicpOwokcmVwb3NpdG9yeVNldC0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMoKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG9zKTsKCiRtYXRjaGVkUGFja2FnZSA9IG51bGw7CiR2ZXJzaW9ucyA9IFtdOwppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkpIHsKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbFdpdGhBbGxQYWNrYWdlcygpOwp9IGVsc2UgewokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sRm9yUGFja2FnZSgkbmFtZSk7Cn0KJG1hdGNoZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRuYW1lLCAkY29uc3RyYWludCk7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKCmlmIChudWxsID09PSAkdmVyc2lvbiAmJiAkaW5zdGFsbGVkUmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJG1hdGNoZWRQYWNrYWdlID0gJHBhY2thZ2U7Cn0KCiR2ZXJzaW9uc1skcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpXSA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CiRtYXRjaGVzWyRpbmRleF0gPSAkcGFja2FnZS0+Z2V0SWQoKTsKfQoKCmlmIChudWxsID09PSAkbWF0Y2hlZFBhY2thZ2UgJiYgJG1hdGNoZXMgJiYgJHByZWZlcnJlZCA9ICRwb2xpY3ktPnNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKCRwb29sLCAkbWF0Y2hlcykpIHsKJG1hdGNoZWRQYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHByZWZlcnJlZFswXSk7Cn0KCmlmICgkbWF0Y2hlZFBhY2thZ2UgIT09IG51bGwgJiYgISRtYXRjaGVkUGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdTaG93Q29tbWFuZDo6Z2V0UGFja2FnZSBjYW4gb25seSB3b3JrIHdpdGggQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlLCBidXQgZ290ICcuZ2V0X2NsYXNzKCRtYXRjaGVkUGFja2FnZSkpOwp9CgpyZXR1cm4gWyRtYXRjaGVkUGFja2FnZSwgJHZlcnNpb25zXTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRQYWNrYWdlSW5mbyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgP1BhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UgPSBudWxsKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJHRoaXMtPnByaW50TWV0YSgkcGFja2FnZSwgJHZlcnNpb25zLCAkaW5zdGFsbGVkUmVwbywgJGxhdGVzdFBhY2thZ2UgPzogbnVsbCk7CiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX1JFUVVJUkUpOwokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9ERVZfUkVRVUlSRSwgJ3JlcXVpcmVzIChkZXYpJyk7CgppZiAoJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCkpIHsKJGlvLT53cml0ZSgiXG48aW5mbz5zdWdnZXN0czwvaW5mbz4iKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCkgYXMgJHN1Z2dlc3RlZCA9PiAkcmVhc29uKSB7CiRpby0+d3JpdGUoJHN1Z2dlc3RlZCAuICcgPGNvbW1lbnQ+JyAuICRyZWFzb24gLiAnPC9jb21tZW50PicpOwp9Cn0KCiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX1BST1ZJREUpOwokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9DT05GTElDVCk7CiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX1JFUExBQ0UpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludE1ldGEoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkdmVyc2lvbnMsIEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sID9QYWNrYWdlSW50ZXJmYWNlICRsYXRlc3RQYWNrYWdlID0gbnVsbCk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGlvLT53cml0ZSgnPGluZm8+bmFtZTwvaW5mbz4gICAgIDogJyAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpOwokaW8tPndyaXRlKCc8aW5mbz5kZXNjcmlwLjwvaW5mbz4gOiAnIC4gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkpOwokaW8tPndyaXRlKCc8aW5mbz5rZXl3b3JkczwvaW5mbz4gOiAnIC4gaW1wbG9kZSgnLCAnLCAkcGFja2FnZS0+Z2V0S2V5d29yZHMoKSA/OiBbXSkpOwokdGhpcy0+cHJpbnRWZXJzaW9ucygkcGFja2FnZSwgJHZlcnNpb25zLCAkaW5zdGFsbGVkUmVwbyk7CmlmICgkbGF0ZXN0UGFja2FnZSkgewokc3R5bGUgPSAkdGhpcy0+Z2V0VmVyc2lvblN0eWxlKCRsYXRlc3RQYWNrYWdlLCAkcGFja2FnZSk7CiRpby0+d3JpdGUoJzxpbmZvPmxhdGVzdDwvaW5mbz4gICA6IDwnLiRzdHlsZS4nPicgLiAkbGF0ZXN0UGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJzwvJy4kc3R5bGUuJz4nKTsKfSBlbHNlIHsKJGxhdGVzdFBhY2thZ2UgPSAkcGFja2FnZTsKfQokaW8tPndyaXRlKCc8aW5mbz50eXBlPC9pbmZvPiAgICAgOiAnIC4gJHBhY2thZ2UtPmdldFR5cGUoKSk7CiR0aGlzLT5wcmludExpY2Vuc2VzKCRwYWNrYWdlKTsKJGlvLT53cml0ZSgnPGluZm8+aG9tZXBhZ2U8L2luZm8+IDogJyAuICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpKTsKJGlvLT53cml0ZSgnPGluZm8+c291cmNlPC9pbmZvPiAgIDogJyAuIHNwcmludGYoJ1slc10gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+ICVzJywgJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSwgJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpLCAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpKTsKJGlvLT53cml0ZSgnPGluZm8+ZGlzdDwvaW5mbz4gICAgIDogJyAuIHNwcmludGYoJ1slc10gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+ICVzJywgJHBhY2thZ2UtPmdldERpc3RUeXBlKCksICRwYWNrYWdlLT5nZXREaXN0VXJsKCksICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpKTsKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlLT5nZXROYW1lKCkpICYmICRpbnN0YWxsZWRSZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokcGF0aCA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChpc19zdHJpbmcoJHBhdGgpKSB7CiRpby0+d3JpdGUoJzxpbmZvPnBhdGg8L2luZm8+ICAgICA6ICcgLiByZWFscGF0aCgkcGF0aCkpOwp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz5wYXRoPC9pbmZvPiAgICAgOiBudWxsJyk7Cn0KfQokaW8tPndyaXRlKCc8aW5mbz5uYW1lczwvaW5mbz4gICAgOiAnIC4gaW1wbG9kZSgnLCAnLCAkcGFja2FnZS0+Z2V0TmFtZXMoKSkpOwoKaWYgKCRsYXRlc3RQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICRsYXRlc3RQYWNrYWdlLT5pc0FiYW5kb25lZCgpKSB7CiRyZXBsYWNlbWVudCA9ICgkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgIT09IG51bGwpCj8gJyBUaGUgYXV0aG9yIHN1Z2dlc3RzIHVzaW5nIHRoZSAnIC4gJGxhdGVzdFBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpLiAnIHBhY2thZ2UgaW5zdGVhZC4nCjogbnVsbDsKCiRpby0+d3JpdGVFcnJvcigKc3ByaW50ZignPHdhcm5pbmc+QXR0ZW50aW9uOiBUaGlzIHBhY2thZ2UgaXMgYWJhbmRvbmVkIGFuZCBubyBsb25nZXIgbWFpbnRhaW5lZC4lczwvd2FybmluZz4nLCAkcmVwbGFjZW1lbnQpCik7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U3VwcG9ydCgpKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+c3VwcG9ydDwvaW5mbz4iKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFN1cHBvcnQoKSBhcyAkdHlwZSA9PiAkdmFsdWUpIHsKJGlvLT53cml0ZSgnPGNvbW1lbnQ+JyAuICR0eXBlIC4gJzwvY29tbWVudD4gOiAnLiR2YWx1ZSk7Cn0KfQoKaWYgKFxjb3VudCgkcGFja2FnZS0+Z2V0QXV0b2xvYWQoKSkgPiAwKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+YXV0b2xvYWQ8L2luZm8+Iik7CiRhdXRvbG9hZENvbmZpZyA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwpmb3JlYWNoICgkYXV0b2xvYWRDb25maWcgYXMgJHR5cGUgPT4gJGF1dG9sb2FkcykgewokaW8tPndyaXRlKCc8Y29tbWVudD4nIC4gJHR5cGUgLiAnPC9jb21tZW50PicpOwoKaWYgKCR0eXBlID09PSAncHNyLTAnIHx8ICR0eXBlID09PSAncHNyLTQnKSB7CmZvcmVhY2ggKCRhdXRvbG9hZHMgYXMgJG5hbWUgPT4gJHBhdGgpIHsKJGlvLT53cml0ZSgoJG5hbWUgPzogJyonKSAuICcgPT4gJyAuIChpc19hcnJheSgkcGF0aCkgPyBpbXBsb2RlKCcsICcsICRwYXRoKSA6ICgkcGF0aCA/OiAnLicpKSk7Cn0KfSBlbHNlaWYgKCR0eXBlID09PSAnY2xhc3NtYXAnKSB7CiRpby0+d3JpdGUoaW1wbG9kZSgnLCAnLCAkYXV0b2xvYWRDb25maWdbJHR5cGVdKSk7Cn0KfQppZiAoJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpKSB7CiRpby0+d3JpdGUoJzxjb21tZW50PmluY2x1ZGUtcGF0aDwvY29tbWVudD4nKTsKJGlvLT53cml0ZShpbXBsb2RlKCcsICcsICRwYWNrYWdlLT5nZXRJbmNsdWRlUGF0aHMoKSkpOwp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRWZXJzaW9ucyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbyk6IHZvaWQKewokdmVyc2lvbnMgPSBhcnJheV9rZXlzKCR2ZXJzaW9ucyk7CiR2ZXJzaW9ucyA9IFNlbXZlcjo6cnNvcnQoJHZlcnNpb25zKTsKCgppZiAoJGluc3RhbGxlZFBhY2thZ2VzID0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlcygkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpmb3JlYWNoICgkaW5zdGFsbGVkUGFja2FnZXMgYXMgJGluc3RhbGxlZFBhY2thZ2UpIHsKJGluc3RhbGxlZFZlcnNpb24gPSAkaW5zdGFsbGVkUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwoka2V5ID0gYXJyYXlfc2VhcmNoKCRpbnN0YWxsZWRWZXJzaW9uLCAkdmVyc2lvbnMpOwppZiAoZmFsc2UgIT09ICRrZXkpIHsKJHZlcnNpb25zWyRrZXldID0gJzxpbmZvPiogJyAuICRpbnN0YWxsZWRWZXJzaW9uIC4gJzwvaW5mbz4nOwp9Cn0KfQoKJHZlcnNpb25zID0gaW1wbG9kZSgnLCAnLCAkdmVyc2lvbnMpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz52ZXJzaW9uczwvaW5mbz4gOiAnIC4gJHZlcnNpb25zKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRMaW5rcyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkbGlua1R5cGUsID9zdHJpbmcgJHRpdGxlID0gbnVsbCk6IHZvaWQKewokdGl0bGUgPSAkdGl0bGUgPzogJGxpbmtUeXBlOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCRsaW5rcyA9ICRwYWNrYWdlLT57J2dldCcudWNmaXJzdCgkbGlua1R5cGUpfSgpKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+IiAuICR0aXRsZSAuICI8L2luZm8+Iik7Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJGlvLT53cml0ZSgkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIDxjb21tZW50PicgLiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpIC4gJzwvY29tbWVudD4nKTsKfQp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludExpY2Vuc2VzKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewokc3BkeExpY2Vuc2VzID0gbmV3IFNwZHhMaWNlbnNlcygpOwoKJGxpY2Vuc2VzID0gJHBhY2thZ2UtPmdldExpY2Vuc2UoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7Cgpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2VJZCkgewokbGljZW5zZSA9ICRzcGR4TGljZW5zZXMtPmdldExpY2Vuc2VCeUlkZW50aWZpZXIoJGxpY2Vuc2VJZCk7IAoKaWYgKCEkbGljZW5zZSkgewokb3V0ID0gJGxpY2Vuc2VJZDsKfSBlbHNlIHsKCmlmICgkbGljZW5zZVsxXSA9PT0gdHJ1ZSkgewokb3V0ID0gc3ByaW50ZignJXMgKCVzKSAoT1NJIGFwcHJvdmVkKSAlcycsICRsaWNlbnNlWzBdLCAkbGljZW5zZUlkLCAkbGljZW5zZVsyXSk7Cn0gZWxzZSB7CiRvdXQgPSBzcHJpbnRmKCclcyAoJXMpICVzJywgJGxpY2Vuc2VbMF0sICRsaWNlbnNlSWQsICRsaWNlbnNlWzJdKTsKfQp9CgokaW8tPndyaXRlKCc8aW5mbz5saWNlbnNlPC9pbmZvPiAgOiAnIC4gJG91dCk7Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRQYWNrYWdlSW5mb0FzSnNvbihDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgP1BhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UgPSBudWxsKTogdm9pZAp7CiRqc29uID0gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJ2Rlc2NyaXB0aW9uJyA9PiAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSwKJ2tleXdvcmRzJyA9PiAkcGFja2FnZS0+Z2V0S2V5d29yZHMoKSA/OiBbXSwKJ3R5cGUnID0+ICRwYWNrYWdlLT5nZXRUeXBlKCksCidob21lcGFnZScgPT4gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCksCiduYW1lcycgPT4gJHBhY2thZ2UtPmdldE5hbWVzKCksCl07CgokanNvbiA9ICR0aGlzLT5hcHBlbmRWZXJzaW9ucygkanNvbiwgJHZlcnNpb25zKTsKJGpzb24gPSAkdGhpcy0+YXBwZW5kTGljZW5zZXMoJGpzb24sICRwYWNrYWdlKTsKCmlmICgkbGF0ZXN0UGFja2FnZSkgewokanNvblsnbGF0ZXN0J10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9IGVsc2UgewokbGF0ZXN0UGFja2FnZSA9ICRwYWNrYWdlOwp9CgppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSkgewokanNvblsnc291cmNlJ10gPSBbCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpLAondXJsJyA9PiAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCksCidyZWZlcmVuY2UnID0+ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwKXTsKfQoKaWYgKG51bGwgIT09ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpKSB7CiRqc29uWydkaXN0J10gPSBbCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSwKJ3VybCcgPT4gJHBhY2thZ2UtPmdldERpc3RVcmwoKSwKJ3JlZmVyZW5jZScgPT4gJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSwKXTsKfQoKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlLT5nZXROYW1lKCkpICYmICRpbnN0YWxsZWRSZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokcGF0aCA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChpc19zdHJpbmcoJHBhdGgpKSB7CiRwYXRoID0gcmVhbHBhdGgoJHBhdGgpOwppZiAoJHBhdGggIT09IGZhbHNlKSB7CiRqc29uWydwYXRoJ10gPSAkcGF0aDsKfQp9IGVsc2UgewokanNvblsncGF0aCddID0gbnVsbDsKfQp9CgppZiAoJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJGpzb25bJ3JlcGxhY2VtZW50J10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSkgewokanNvblsnc3VnZ2VzdHMnXSA9ICRwYWNrYWdlLT5nZXRTdWdnZXN0cygpOwp9CgppZiAoJHBhY2thZ2UtPmdldFN1cHBvcnQoKSkgewokanNvblsnc3VwcG9ydCddID0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKTsKfQoKJGpzb24gPSAkdGhpcy0+YXBwZW5kQXV0b2xvYWQoJGpzb24sICRwYWNrYWdlKTsKCmlmICgkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCkpIHsKJGpzb25bJ2luY2x1ZGVfcGF0aCddID0gJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpOwp9CgokanNvbiA9ICR0aGlzLT5hcHBlbmRMaW5rcygkanNvbiwgJHBhY2thZ2UpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJGpzb24pKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZFZlcnNpb25zKGFycmF5ICRqc29uLCBhcnJheSAkdmVyc2lvbnMpOiBhcnJheQp7CnVhc29ydCgkdmVyc2lvbnMsICd2ZXJzaW9uX2NvbXBhcmUnKTsKJHZlcnNpb25zID0gYXJyYXlfa2V5cyhhcnJheV9yZXZlcnNlKCR2ZXJzaW9ucykpOwokanNvblsndmVyc2lvbnMnXSA9ICR2ZXJzaW9uczsKCnJldHVybiAkanNvbjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kTGljZW5zZXMoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKaWYgKCRsaWNlbnNlcyA9ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCkpIHsKJHNwZHhMaWNlbnNlcyA9IG5ldyBTcGR4TGljZW5zZXMoKTsKCiRqc29uWydsaWNlbnNlcyddID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpY2Vuc2VJZCkgdXNlICgkc3BkeExpY2Vuc2VzKSB7CiRsaWNlbnNlID0gJHNwZHhMaWNlbnNlcy0+Z2V0TGljZW5zZUJ5SWRlbnRpZmllcigkbGljZW5zZUlkKTsgCgppZiAoISRsaWNlbnNlKSB7CnJldHVybiAkbGljZW5zZUlkOwp9CgpyZXR1cm4gWwonbmFtZScgPT4gJGxpY2Vuc2VbMF0sCidvc2knID0+ICRsaWNlbnNlSWQsCid1cmwnID0+ICRsaWNlbnNlWzJdLApdOwp9LCAkbGljZW5zZXMpOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZEF1dG9sb2FkKGFycmF5ICRqc29uLCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CmlmIChcY291bnQoJHBhY2thZ2UtPmdldEF1dG9sb2FkKCkpID4gMCkgewokYXV0b2xvYWQgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpIGFzICR0eXBlID0+ICRhdXRvbG9hZHMpIHsKaWYgKCR0eXBlID09PSAncHNyLTAnIHx8ICR0eXBlID09PSAncHNyLTQnKSB7CiRwc3IgPSBbXTsKCmZvcmVhY2ggKCRhdXRvbG9hZHMgYXMgJG5hbWUgPT4gJHBhdGgpIHsKaWYgKCEkcGF0aCkgewokcGF0aCA9ICcuJzsKfQoKJHBzclskbmFtZSA/OiAnKiddID0gJHBhdGg7Cn0KCiRhdXRvbG9hZFskdHlwZV0gPSAkcHNyOwp9IGVsc2VpZiAoJHR5cGUgPT09ICdjbGFzc21hcCcpIHsKJGF1dG9sb2FkWydjbGFzc21hcCddID0gJGF1dG9sb2FkczsKfQp9CgokanNvblsnYXV0b2xvYWQnXSA9ICRhdXRvbG9hZDsKfQoKcmV0dXJuICRqc29uOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBlbmRMaW5rcyhhcnJheSAkanNvbiwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpmb3JlYWNoIChMaW5rOjokVFlQRVMgYXMgJGxpbmtUeXBlKSB7CiRqc29uID0gJHRoaXMtPmFwcGVuZExpbmsoJGpzb24sICRwYWNrYWdlLCAkbGlua1R5cGUpOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZExpbmsoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRsaW5rVHlwZSk6IGFycmF5CnsKJGxpbmtzID0gJHBhY2thZ2UtPnsnZ2V0JyAuIHVjZmlyc3QoJGxpbmtUeXBlKX0oKTsKCmlmICgkbGlua3MpIHsKJGpzb25bJGxpbmtUeXBlXSA9IFtdOwoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRqc29uWyRsaW5rVHlwZV1bJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0KfQoKcmV0dXJuICRqc29uOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFN0eWxlcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdGhpcy0+Y29sb3JzID0gWwonZ3JlZW4nLAoneWVsbG93JywKJ2N5YW4nLAonbWFnZW50YScsCidibHVlJywKXTsKCmZvcmVhY2ggKCR0aGlzLT5jb2xvcnMgYXMgJGNvbG9yKSB7CiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgkY29sb3IpOwokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJGNvbG9yLCAkc3R5bGUpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BsYXlQYWNrYWdlVHJlZShhcnJheSAkYXJyYXlUcmVlKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwpmb3JlYWNoICgkYXJyYXlUcmVlIGFzICRwYWNrYWdlKSB7CiRpby0+d3JpdGUoc3ByaW50ZignPGluZm8+JXM8L2luZm8+JywgJHBhY2thZ2VbJ25hbWUnXSksIGZhbHNlKTsKJGlvLT53cml0ZSgnICcgLiAkcGFja2FnZVsndmVyc2lvbiddLCBmYWxzZSk7CmlmIChpc3NldCgkcGFja2FnZVsnZGVzY3JpcHRpb24nXSkpIHsKJGlvLT53cml0ZSgnICcgLiBzdHJ0b2soJHBhY2thZ2VbJ2Rlc2NyaXB0aW9uJ10sICJcclxuIikpOwp9IGVsc2UgewoKJGlvLT53cml0ZSgnJyk7Cn0KCmlmIChpc3NldCgkcGFja2FnZVsncmVxdWlyZXMnXSkpIHsKJHJlcXVpcmVzID0gJHBhY2thZ2VbJ3JlcXVpcmVzJ107CiR0cmVlQmFyID0gJ+KUnCc7CiRqID0gMDsKJHRvdGFsID0gY291bnQoJHJlcXVpcmVzKTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiRyZXF1aXJlTmFtZSA9ICRyZXF1aXJlWyduYW1lJ107CiRqKys7CmlmICgkaiA9PT0gJHRvdGFsKSB7CiR0cmVlQmFyID0gJ+KUlCc7Cn0KJGxldmVsID0gMTsKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skbGV2ZWxdOwokaW5mbyA9IHNwcmludGYoCiclc+KUgOKUgDwlcz4lczwvJXM+ICVzJywKJHRyZWVCYXIsCiRjb2xvciwKJHJlcXVpcmVOYW1lLAokY29sb3IsCiRyZXF1aXJlWyd2ZXJzaW9uJ10KKTsKJHRoaXMtPndyaXRlVHJlZUxpbmUoJGluZm8pOwoKJHRyZWVCYXIgPSBzdHJfcmVwbGFjZSgn4pSUJywgJyAnLCAkdHJlZUJhcik7CiRwYWNrYWdlc0luVHJlZSA9IFskcGFja2FnZVsnbmFtZSddLCAkcmVxdWlyZU5hbWVdOwoKJHRoaXMtPmRpc3BsYXlUcmVlKCRyZXF1aXJlLCAkcGFja2FnZXNJblRyZWUsICR0cmVlQmFyLCAkbGV2ZWwgKyAxKTsKfQp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlVHJlZSgKUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwKSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywKUmVwb3NpdG9yeUludGVyZmFjZSAkcmVtb3RlUmVwb3MKKTogYXJyYXkgewokcmVxdWlyZXMgPSAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKa3NvcnQoJHJlcXVpcmVzKTsKJGNoaWxkcmVuID0gW107CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZU5hbWUgPT4gJHJlcXVpcmUpIHsKJHBhY2thZ2VzSW5UcmVlID0gWyRwYWNrYWdlLT5nZXROYW1lKCksICRyZXF1aXJlTmFtZV07CgokdHJlZUNoaWxkRGVzYyA9IFsKJ25hbWUnID0+ICRyZXF1aXJlTmFtZSwKJ3ZlcnNpb24nID0+ICRyZXF1aXJlLT5nZXRQcmV0dHlDb25zdHJhaW50KCksCl07CgokZGVlcENoaWxkcmVuID0gJHRoaXMtPmFkZFRyZWUoJHJlcXVpcmVOYW1lLCAkcmVxdWlyZSwgJGluc3RhbGxlZFJlcG8sICRyZW1vdGVSZXBvcywgJHBhY2thZ2VzSW5UcmVlKTsKCmlmICgkZGVlcENoaWxkcmVuKSB7CiR0cmVlQ2hpbGREZXNjWydyZXF1aXJlcyddID0gJGRlZXBDaGlsZHJlbjsKfQoKJGNoaWxkcmVuW10gPSAkdHJlZUNoaWxkRGVzYzsKfQokdHJlZSA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAonZGVzY3JpcHRpb24nID0+ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkgOiAnJywKXTsKCmlmICgkY2hpbGRyZW4pIHsKJHRyZWVbJ3JlcXVpcmVzJ10gPSAkY2hpbGRyZW47Cn0KCnJldHVybiAkdHJlZTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BsYXlUcmVlKAokcGFja2FnZSwKYXJyYXkgJHBhY2thZ2VzSW5UcmVlLApzdHJpbmcgJHByZXZpb3VzVHJlZUJhciA9ICfilJwnLAppbnQgJGxldmVsID0gMQopOiB2b2lkIHsKJHByZXZpb3VzVHJlZUJhciA9IHN0cl9yZXBsYWNlKCfilJwnLCAn4pSCJywgJHByZXZpb3VzVHJlZUJhcik7CmlmIChpc19hcnJheSgkcGFja2FnZSkgJiYgaXNzZXQoJHBhY2thZ2VbJ3JlcXVpcmVzJ10pKSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlWydyZXF1aXJlcyddOwokdHJlZUJhciA9ICRwcmV2aW91c1RyZWVCYXIgLiAnICDilJwnOwokaSA9IDA7CiR0b3RhbCA9IGNvdW50KCRyZXF1aXJlcyk7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZSkgewokY3VycmVudFRyZWUgPSAkcGFja2FnZXNJblRyZWU7CiRpKys7CmlmICgkaSA9PT0gJHRvdGFsKSB7CiR0cmVlQmFyID0gJHByZXZpb3VzVHJlZUJhciAuICcgIOKUlCc7Cn0KJGNvbG9ySWRlbnQgPSAkbGV2ZWwgJSBjb3VudCgkdGhpcy0+Y29sb3JzKTsKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skY29sb3JJZGVudF07Cgphc3NlcnQoaXNfc3RyaW5nKCRyZXF1aXJlWyduYW1lJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkcmVxdWlyZVsndmVyc2lvbiddKSk7CgokY2lyY3VsYXJXYXJuID0gaW5fYXJyYXkoCiRyZXF1aXJlWyduYW1lJ10sCiRjdXJyZW50VHJlZSwKdHJ1ZQopID8gJyhjaXJjdWxhciBkZXBlbmRlbmN5IGFib3J0ZWQgaGVyZSknIDogJyc7CiRpbmZvID0gcnRyaW0oc3ByaW50ZigKJyVz4pSA4pSAPCVzPiVzPC8lcz4gJXMgJXMnLAokdHJlZUJhciwKJGNvbG9yLAokcmVxdWlyZVsnbmFtZSddLAokY29sb3IsCiRyZXF1aXJlWyd2ZXJzaW9uJ10sCiRjaXJjdWxhcldhcm4KKSk7CiR0aGlzLT53cml0ZVRyZWVMaW5lKCRpbmZvKTsKCiR0cmVlQmFyID0gc3RyX3JlcGxhY2UoJ+KUlCcsICcgJywgJHRyZWVCYXIpOwoKJGN1cnJlbnRUcmVlW10gPSAkcmVxdWlyZVsnbmFtZSddOwokdGhpcy0+ZGlzcGxheVRyZWUoJHJlcXVpcmUsICRjdXJyZW50VHJlZSwgJHRyZWVCYXIsICRsZXZlbCArIDEpOwp9Cn0KfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFRyZWUoCnN0cmluZyAkbmFtZSwKTGluayAkbGluaywKSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywKUmVwb3NpdG9yeUludGVyZmFjZSAkcmVtb3RlUmVwb3MsCmFycmF5ICRwYWNrYWdlc0luVHJlZQopOiBhcnJheSB7CiRjaGlsZHJlbiA9IFtdOwpbJHBhY2thZ2VdID0gJHRoaXMtPmdldFBhY2thZ2UoCiRpbnN0YWxsZWRSZXBvLAokcmVtb3RlUmVwb3MsCiRuYW1lLAokbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJyA/ICRsaW5rLT5nZXRDb25zdHJhaW50KCkgOiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpCik7CmlmIChpc19vYmplY3QoJHBhY2thZ2UpKSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwprc29ydCgkcmVxdWlyZXMpOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcXVpcmVOYW1lID0+ICRyZXF1aXJlKSB7CiRjdXJyZW50VHJlZSA9ICRwYWNrYWdlc0luVHJlZTsKCiR0cmVlQ2hpbGREZXNjID0gWwonbmFtZScgPT4gJHJlcXVpcmVOYW1lLAondmVyc2lvbicgPT4gJHJlcXVpcmUtPmdldFByZXR0eUNvbnN0cmFpbnQoKSwKXTsKCmlmICghaW5fYXJyYXkoJHJlcXVpcmVOYW1lLCAkY3VycmVudFRyZWUsIHRydWUpKSB7CiRjdXJyZW50VHJlZVtdID0gJHJlcXVpcmVOYW1lOwokZGVlcENoaWxkcmVuID0gJHRoaXMtPmFkZFRyZWUoJHJlcXVpcmVOYW1lLCAkcmVxdWlyZSwgJGluc3RhbGxlZFJlcG8sICRyZW1vdGVSZXBvcywgJGN1cnJlbnRUcmVlKTsKaWYgKCRkZWVwQ2hpbGRyZW4pIHsKJHRyZWVDaGlsZERlc2NbJ3JlcXVpcmVzJ10gPSAkZGVlcENoaWxkcmVuOwp9Cn0KCiRjaGlsZHJlbltdID0gJHRyZWVDaGlsZERlc2M7Cn0KfQoKcmV0dXJuICRjaGlsZHJlbjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVTdGF0dXNUb1ZlcnNpb25TdHlsZShzdHJpbmcgJHVwZGF0ZVN0YXR1cyk6IHN0cmluZwp7CgoKCnJldHVybiBzdHJfcmVwbGFjZShbJ3VwLXRvLWRhdGUnLCAnc2VtdmVyLXNhZmUtdXBkYXRlJywgJ3VwZGF0ZS1wb3NzaWJsZSddLCBbJ2luZm8nLCAnaGlnaGxpZ2h0JywgJ2NvbW1lbnQnXSwgJHVwZGF0ZVN0YXR1cyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0VXBkYXRlU3RhdHVzKFBhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewppZiAoJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgPT09ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpKSB7CnJldHVybiAndXAtdG8tZGF0ZSc7Cn0KCiRjb25zdHJhaW50ID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKDAgIT09IHN0cnBvcygkY29uc3RyYWludCwgJ2Rldi0nKSkgewokY29uc3RyYWludCA9ICdeJy4kY29uc3RyYWludDsKfQppZiAoJGxhdGVzdFBhY2thZ2UtPmdldFZlcnNpb24oKSAmJiBTZW12ZXI6OnNhdGlzZmllcygkbGF0ZXN0UGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkY29uc3RyYWludCkpIHsKCnJldHVybiAnc2VtdmVyLXNhZmUtdXBkYXRlJzsKfQoKCnJldHVybiAndXBkYXRlLXBvc3NpYmxlJzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRyZWVMaW5lKHN0cmluZyAkbGluZSk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxpbmUgPSBzdHJfcmVwbGFjZShbJ+KUlCcsICfilJwnLCAn4pSA4pSAJywgJ+KUgiddLCBbJ2AtJywgJ3wtJywgJy0nLCAnfCddLCAkbGluZSk7Cn0KCiRpby0+d3JpdGUoJGxpbmUpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRMYXRlc3RQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIENvbXBvc2VyICRjb21wb3NlciwgUGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8sIGJvb2wgJG1ham9yT25seSwgYm9vbCAkbWlub3JPbmx5LCBib29sICRwYXRjaE9ubHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxRmlsdGVyKTogP1BhY2thZ2VJbnRlcmZhY2UKewoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkdGhpcy0+Z2V0UmVwb3NpdG9yeVNldCgkY29tcG9zZXIpLCAkcGxhdGZvcm1SZXBvKTsKJHN0YWJpbGl0eSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CiRmbGFncyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpOwppZiAoaXNzZXQoJGZsYWdzWyRuYW1lXSkpIHsKJHN0YWJpbGl0eSA9IGFycmF5X3NlYXJjaCgkZmxhZ3NbJG5hbWVdLCBCYXNlUGFja2FnZTo6JHN0YWJpbGl0aWVzLCB0cnVlKTsKfQoKJGJlc3RTdGFiaWxpdHkgPSAkc3RhYmlsaXR5OwppZiAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFByZWZlclN0YWJsZSgpKSB7CiRiZXN0U3RhYmlsaXR5ID0gJHBhY2thZ2UtPmdldFN0YWJpbGl0eSgpOwp9CgokdGFyZ2V0VmVyc2lvbiA9IG51bGw7CmlmICgwID09PSBzdHJwb3MoJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkgewokdGFyZ2V0VmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CgoKaWYgKCRtYWpvck9ubHkpIHsKcmV0dXJuIG51bGw7Cn0KfQoKaWYgKCR0YXJnZXRWZXJzaW9uID09PSBudWxsKSB7CmlmICgkbWFqb3JPbmx5ICYmIFByZWc6OmlzTWF0Y2goJ3teKD9QPHplcm9fbWFqb3I+KD86MFwuKSspPyg/UDxmaXJzdF9tZWFuaW5nZnVsPlxkKylcLn0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkbWF0Y2gpKSB7CiR0YXJnZXRWZXJzaW9uID0gJz49Jy4kbWF0Y2hbJ3plcm9fbWFqb3InXS4oKChpbnQpICRtYXRjaFsnZmlyc3RfbWVhbmluZ2Z1bCddKSArIDEpLicsPDk5OTk5OTktZGV2JzsKfQoKaWYgKCRtaW5vck9ubHkpIHsKJHRhcmdldFZlcnNpb24gPSAnXicuJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKfQoKaWYgKCRwYXRjaE9ubHkpIHsKJHRyaW1tZWRWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgneyhcLjApKyR9RCcsICcnLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKJHBhcnRzTmVlZGVkID0gc3Vic3RyKCR0cmltbWVkVmVyc2lvbiwgMCwgMSkgPT09ICcwJyA/IDQgOiAzOwp3aGlsZSAoc3Vic3RyX2NvdW50KCR0cmltbWVkVmVyc2lvbiwgJy4nKSArIDEgPCAkcGFydHNOZWVkZWQpIHsKJHRyaW1tZWRWZXJzaW9uIC49ICcuMCc7Cn0KJHRhcmdldFZlcnNpb24gPSAnficuJHRyaW1tZWRWZXJzaW9uOwp9Cn0KCmlmICgkdGhpcy0+Z2V0SU8oKS0+aXNWZXJib3NlKCkpIHsKJHNob3dXYXJuaW5ncyA9IHRydWU7Cn0gZWxzZSB7CiRzaG93V2FybmluZ3MgPSBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJGNhbmRpZGF0ZSkgdXNlICgkcGFja2FnZSk6IGJvb2wgewppZiAoc3RyX3N0YXJ0c193aXRoKCRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSB8fCBzdHJfc3RhcnRzX3dpdGgoJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkgewpyZXR1cm4gZmFsc2U7Cn0KcmV0dXJuIHZlcnNpb25fY29tcGFyZSgkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCksICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICc8PScpOwp9Owp9CiRjYW5kaWRhdGUgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgJHRhcmdldFZlcnNpb24sICRiZXN0U3RhYmlsaXR5LCAkcGxhdGZvcm1SZXFGaWx0ZXIsIDAsICR0aGlzLT5nZXRJTygpLCAkc2hvd1dhcm5pbmdzKTsKd2hpbGUgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGNhbmRpZGF0ZSA9ICRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKTsKfQoKcmV0dXJuICRjYW5kaWRhdGUgIT09IGZhbHNlID8gJGNhbmRpZGF0ZSA6IG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeVNldChDb21wb3NlciAkY29tcG9zZXIpOiBSZXBvc2l0b3J5U2V0CnsKaWYgKCEkdGhpcy0+cmVwb3NpdG9yeVNldCkgewokdGhpcy0+cmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpKTsKJHRoaXMtPnJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkobmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcnlTZXQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcQ2hhbmdlUmVwb3J0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEdmNzRG93bmxvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CgoKCgoKY2xhc3MgU3RhdHVzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJpdmF0ZSBjb25zdCBFWElUX0NPREVfRVJST1JTID0gMTsKcHJpdmF0ZSBjb25zdCBFWElUX0NPREVfVU5QVVNIRURfQ0hBTkdFUyA9IDI7CnByaXZhdGUgY29uc3QgRVhJVF9DT0RFX1ZFUlNJT05fQ0hBTkdFUyA9IDQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3N0YXR1cycpCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIGEgbGlzdCBvZiBsb2NhbGx5IG1vZGlmaWVkIHBhY2thZ2VzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCd2ZXJib3NlJywgJ3Z8dnZ8dnZ2JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG1vZGlmaWVkIGZpbGVzIGZvciBlYWNoIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGNoYW5nZXMuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBzdGF0dXMgY29tbWFuZCBkaXNwbGF5cyBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZQpiZWVuIG1vZGlmaWVkIGxvY2FsbHkuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzdGF0dXMKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnc3RhdHVzJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCgokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBSRV9TVEFUVVNfQ01ELCB0cnVlKTsKCiRleGl0Q29kZSA9ICR0aGlzLT5kb0V4ZWN1dGUoJGlucHV0KTsKCgokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfU1RBVFVTX0NNRCwgdHJ1ZSk7CgpyZXR1cm4gJGV4aXRDb2RlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRvRXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBpbnQKewoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGluc3RhbGxlZFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKJGRtID0gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKTsKJGltID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCk7CgokZXJyb3JzID0gW107CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokdW5wdXNoZWRDaGFuZ2VzID0gW107CiR2Y3NWZXJzaW9uQ2hhbmdlcyA9IFtdOwoKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkY29tcG9zZXItPmdldENvbmZpZygpLCAkY29tcG9zZXItPmdldExvb3AoKS0+Z2V0UHJvY2Vzc0V4ZWN1dG9yKCkgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pLCAkcGFyc2VyKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcjsKCgpmb3JlYWNoICgkaW5zdGFsbGVkUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokZG93bmxvYWRlciA9ICRkbS0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwokdGFyZ2V0RGlyID0gJGltLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmICgkdGFyZ2V0RGlyID09PSBudWxsKSB7CmNvbnRpbnVlOwp9CgppZiAoJGRvd25sb2FkZXIgaW5zdGFuY2VvZiBDaGFuZ2VSZXBvcnRJbnRlcmZhY2UpIHsKaWYgKGlzX2xpbmsoJHRhcmdldERpcikpIHsKJGVycm9yc1skdGFyZ2V0RGlyXSA9ICR0YXJnZXREaXIgLiAnIGlzIGEgc3ltYm9saWMgbGluay4nOwp9CgppZiAobnVsbCAhPT0gKCRjaGFuZ2VzID0gJGRvd25sb2FkZXItPmdldExvY2FsQ2hhbmdlcygkcGFja2FnZSwgJHRhcmdldERpcikpKSB7CiRlcnJvcnNbJHRhcmdldERpcl0gPSAkY2hhbmdlczsKfQp9CgppZiAoJGRvd25sb2FkZXIgaW5zdGFuY2VvZiBWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZSkgewppZiAoJGRvd25sb2FkZXItPmdldFZjc1JlZmVyZW5jZSgkcGFja2FnZSwgJHRhcmdldERpcikpIHsKc3dpdGNoICgkcGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCkpIHsKY2FzZSAnc291cmNlJzoKJHByZXZpb3VzUmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwpicmVhazsKY2FzZSAnZGlzdCc6CiRwcmV2aW91c1JlZiA9ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7CmJyZWFrOwpkZWZhdWx0OgokcHJldmlvdXNSZWYgPSBudWxsOwp9CgokY3VycmVudFZlcnNpb24gPSAkZ3Vlc3Nlci0+Z3Vlc3NWZXJzaW9uKCRkdW1wZXItPmR1bXAoJHBhY2thZ2UpLCAkdGFyZ2V0RGlyKTsKCmlmICgkcHJldmlvdXNSZWYgJiYgJGN1cnJlbnRWZXJzaW9uICYmICRjdXJyZW50VmVyc2lvblsnY29tbWl0J10gIT09ICRwcmV2aW91c1JlZiAmJiAkY3VycmVudFZlcnNpb25bJ3ByZXR0eV92ZXJzaW9uJ10gIT09ICRwcmV2aW91c1JlZikgewokdmNzVmVyc2lvbkNoYW5nZXNbJHRhcmdldERpcl0gPSBbCidwcmV2aW91cycgPT4gWwondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwKJ3JlZicgPT4gJHByZXZpb3VzUmVmLApdLAonY3VycmVudCcgPT4gWwondmVyc2lvbicgPT4gJGN1cnJlbnRWZXJzaW9uWydwcmV0dHlfdmVyc2lvbiddLAoncmVmJyA9PiAkY3VycmVudFZlcnNpb25bJ2NvbW1pdCddLApdLApdOwp9Cn0KfQoKaWYgKCRkb3dubG9hZGVyIGluc3RhbmNlb2YgRHZjc0Rvd25sb2FkZXJJbnRlcmZhY2UpIHsKaWYgKCR1bnB1c2hlZCA9ICRkb3dubG9hZGVyLT5nZXRVbnB1c2hlZENoYW5nZXMoJHBhY2thZ2UsICR0YXJnZXREaXIpKSB7CiR1bnB1c2hlZENoYW5nZXNbJHRhcmdldERpcl0gPSAkdW5wdXNoZWQ7Cn0KfQp9CgoKaWYgKCEkZXJyb3JzICYmICEkdW5wdXNoZWRDaGFuZ2VzICYmICEkdmNzVmVyc2lvbkNoYW5nZXMpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5ObyBsb2NhbCBjaGFuZ2VzPC9pbmZvPicpOwoKcmV0dXJuIDA7Cn0KCmlmICgkZXJyb3JzKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPllvdSBoYXZlIGNoYW5nZXMgaW4gdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6PC9lcnJvcj4nKTsKCmZvcmVhY2ggKCRlcnJvcnMgYXMgJHBhdGggPT4gJGNoYW5nZXMpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd2ZXJib3NlJykpIHsKJGluZGVudGVkQ2hhbmdlcyA9IGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpOiBzdHJpbmcgewpyZXR1cm4gJyAgICAnIC4gbHRyaW0oJGxpbmUpOwp9LCBleHBsb2RlKCJcbiIsICRjaGFuZ2VzKSkpOwokaW8tPndyaXRlKCc8aW5mbz4nLiRwYXRoLic8L2luZm8+OicpOwokaW8tPndyaXRlKCRpbmRlbnRlZENoYW5nZXMpOwp9IGVsc2UgewokaW8tPndyaXRlKCRwYXRoKTsKfQp9Cn0KCmlmICgkdW5wdXNoZWRDaGFuZ2VzKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGhhdmUgdW5wdXNoZWQgY2hhbmdlcyBvbiB0aGUgY3VycmVudCBicmFuY2ggaW4gdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6PC93YXJuaW5nPicpOwoKZm9yZWFjaCAoJHVucHVzaGVkQ2hhbmdlcyBhcyAkcGF0aCA9PiAkY2hhbmdlcykgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkgewokaW5kZW50ZWRDaGFuZ2VzID0gaW1wbG9kZSgiXG4iLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkbGluZSk6IHN0cmluZyB7CnJldHVybiAnICAgICcgLiBsdHJpbSgkbGluZSk7Cn0sIGV4cGxvZGUoIlxuIiwgJGNoYW5nZXMpKSk7CiRpby0+d3JpdGUoJzxpbmZvPicuJHBhdGguJzwvaW5mbz46Jyk7CiRpby0+d3JpdGUoJGluZGVudGVkQ2hhbmdlcyk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJHBhdGgpOwp9Cn0KfQoKaWYgKCR2Y3NWZXJzaW9uQ2hhbmdlcykgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBoYXZlIHZlcnNpb24gdmFyaWF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY2llczo8L3dhcm5pbmc+Jyk7Cgpmb3JlYWNoICgkdmNzVmVyc2lvbkNoYW5nZXMgYXMgJHBhdGggPT4gJGNoYW5nZXMpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd2ZXJib3NlJykpIHsKCiRjdXJyZW50VmVyc2lvbiA9ICRjaGFuZ2VzWydjdXJyZW50J11bJ3ZlcnNpb24nXSA/OiAkY2hhbmdlc1snY3VycmVudCddWydyZWYnXTsKJHByZXZpb3VzVmVyc2lvbiA9ICRjaGFuZ2VzWydwcmV2aW91cyddWyd2ZXJzaW9uJ10gPzogJGNoYW5nZXNbJ3ByZXZpb3VzJ11bJ3JlZiddOwoKaWYgKCRpby0+aXNWZXJ5VmVyYm9zZSgpKSB7CgokY3VycmVudFZlcnNpb24gLj0gc3ByaW50ZignICglcyknLCAkY2hhbmdlc1snY3VycmVudCddWydyZWYnXSk7CiRwcmV2aW91c1ZlcnNpb24gLj0gc3ByaW50ZignICglcyknLCAkY2hhbmdlc1sncHJldmlvdXMnXVsncmVmJ10pOwp9CgokaW8tPndyaXRlKCc8aW5mbz4nLiRwYXRoLic8L2luZm8+OicpOwokaW8tPndyaXRlKHNwcmludGYoJyAgICBGcm9tIDxjb21tZW50PiVzPC9jb21tZW50PiB0byA8Y29tbWVudD4lczwvY29tbWVudD4nLCAkcHJldmlvdXNWZXJzaW9uLCAkY3VycmVudFZlcnNpb24pKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgkcGF0aCk7Cn0KfQp9CgppZiAoKCRlcnJvcnMgfHwgJHVucHVzaGVkQ2hhbmdlcyB8fCAkdmNzVmVyc2lvbkNoYW5nZXMpICYmICEkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKSB7CiRpby0+d3JpdGVFcnJvcignVXNlIC0tdmVyYm9zZSAoLXYpIHRvIHNlZSBhIGxpc3Qgb2YgZmlsZXMnKTsKfQoKcmV0dXJuICgkZXJyb3JzID8gc2VsZjo6RVhJVF9DT0RFX0VSUk9SUyA6IDApICsgKCR1bnB1c2hlZENoYW5nZXMgPyBzZWxmOjpFWElUX0NPREVfVU5QVVNIRURfQ0hBTkdFUyA6IDApICsgKCR2Y3NWZXJzaW9uQ2hhbmdlcyA/IHNlbGY6OkVYSVRfQ09ERV9WRVJTSU9OX0NIQU5HRVMgOiAwKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKY2xhc3MgU3VnZ2VzdHNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdzdWdnZXN0cycpCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIHBhY2thZ2Ugc3VnZ2VzdGlvbnMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2J5LXBhY2thZ2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0dyb3VwcyBvdXRwdXQgYnkgc3VnZ2VzdGluZyBwYWNrYWdlIChkZWZhdWx0KScpLApuZXcgSW5wdXRPcHRpb24oJ2J5LXN1Z2dlc3Rpb24nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0dyb3VwcyBvdXRwdXQgYnkgc3VnZ2VzdGVkIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCdhbGwnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBzdWdnZXN0aW9ucyBmcm9tIGFsbCBkZXBlbmRlbmNpZXMsIGluY2x1ZGluZyB0cmFuc2l0aXZlIG9uZXMnKSwKbmV3IElucHV0T3B0aW9uKCdsaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgbGlzdCBvZiBzdWdnZXN0ZWQgcGFja2FnZSBuYW1lcycpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRXhjbHVkZSBzdWdnZXN0aW9ucyBmcm9tIHJlcXVpcmUtZGV2IHBhY2thZ2VzJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlcyB0aGF0IHlvdSB3YW50IHRvIGxpc3Qgc3VnZ2VzdGlvbnMgZnJvbS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoKSksCl0pCi0+c2V0SGVscCgKPDw8RU9UCgpUaGUgPGluZm8+JWNvbW1hbmQubmFtZSU8L2luZm8+IGNvbW1hbmQgc2hvd3MgYSBzb3J0ZWQgbGlzdCBvZiBzdWdnZXN0ZWQgcGFja2FnZXMuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzdWdnZXN0cwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokaW5zdGFsbGVkUmVwb3MgPSBbCm5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpLApdOwoKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGxvY2tlci0+Z2V0UGxhdGZvcm1PdmVycmlkZXMoKSk7CiRpbnN0YWxsZWRSZXBvc1tdID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKTsKfSBlbHNlIHsKJGluc3RhbGxlZFJlcG9zW10gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3BsYXRmb3JtJykpOwokaW5zdGFsbGVkUmVwb3NbXSA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7Cn0KCiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoJGluc3RhbGxlZFJlcG9zKTsKJHJlcG9ydGVyID0gbmV3IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIoJHRoaXMtPmdldElPKCkpOwoKJGZpbHRlciA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CiRwYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpOwokcGFja2FnZXNbXSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCFlbXB0eSgkZmlsdGVyKSAmJiAhaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJGZpbHRlcikpIHsKY29udGludWU7Cn0KCiRyZXBvcnRlci0+YWRkU3VnZ2VzdGlvbnNGcm9tUGFja2FnZSgkcGFja2FnZSk7Cn0KCgokbW9kZSA9IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI6Ok1PREVfQllfUEFDS0FHRTsKCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2J5LXN1Z2dlc3Rpb24nKSkgewokbW9kZSA9IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI6Ok1PREVfQllfU1VHR0VTVElPTjsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdieS1wYWNrYWdlJykpIHsKJG1vZGUgfD0gU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjo6TU9ERV9CWV9QQUNLQUdFOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewokbW9kZSA9IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI6Ok1PREVfTElTVDsKfQoKJHJlcG9ydGVyLT5vdXRwdXQoJG1vZGUsICRpbnN0YWxsZWRSZXBvLCBlbXB0eSgkZmlsdGVyKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpID8gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkgOiBudWxsKTsKCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUmVxdWVzdDsKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcUm9vdFBhY2thZ2VMb2FkZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CgoKCgoKY2xhc3MgVXBkYXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzCi0+c2V0TmFtZSgndXBkYXRlJykKLT5zZXRBbGlhc2VzKFsndScsICd1cGdyYWRlJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1VwZGF0ZXMgeW91ciBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIGFjY29yZGluZyB0byBjb21wb3Nlci5qc29uLCBhbmQgdXBkYXRlcyB0aGUgY29tcG9zZXIubG9jayBmaWxlJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1BhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQsIGlmIG5vdCBwcm92aWRlZCBhbGwgcGFja2FnZXMgYXJlLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVkgfCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUZW1wb3JhcnkgdmVyc2lvbiBjb25zdHJhaW50IHRvIGFkZCwgZS5nLiBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAnKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc291cmNlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBzb3VyY2VzIHdoZW4gcG9zc2libGUsIGluY2x1ZGluZyBWQ1MgaW5mb3JtYXRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWRpc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3QgKGRlZmF1bHQgYmVoYXZpb3IpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdHxzb3VyY2V8YXV0byAoYXV0byBjaG9vc2VzIHNvdXJjZSBmb3IgZGV2IHZlcnNpb25zLCBkaXN0IGZvciB0aGUgcmVzdCkuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQcmVmZXJJbnN0YWxsKCkpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcgKGltcGxpY2l0bHkgZW5hYmxlcyAtLXZlcmJvc2UpLicpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogRW5hYmxlcyBpbnN0YWxsYXRpb24gb2YgcmVxdWlyZS1kZXYgcGFja2FnZXMgKGVuYWJsZWQgYnkgZGVmYXVsdCwgb25seSBwcmVzZW50IGZvciBCQykuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBpbnN0YWxsYXRpb24gb2YgcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignbG9jaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3ZlcndyaXRlcyB0aGUgbG9jayBmaWxlIGhhc2ggdG8gc3VwcHJlc3Mgd2FybmluZyBhYm91dCB0aGUgbG9jayBmaWxlIGJlaW5nIG91dCBvZiBkYXRlIHdpdGhvdXQgdXBkYXRpbmcgcGFja2FnZSB2ZXJzaW9ucy4gUGFja2FnZSBtZXRhZGF0YSBsaWtlIG1pcnJvcnMgYW5kIFVSTHMgYXJlIHVwZGF0ZWQgaWYgdGhleSBjaGFuZ2VkLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGluc3RhbGwgc3RlcCBhZnRlciB1cGRhdGluZyB0aGUgY29tcG9zZXIubG9jayBmaWxlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1ZGl0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwIHRoZSBhdWRpdCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIsIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgYXV0b2xvYWRlciBnZW5lcmF0aW9uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tc3VnZ2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogVGhpcyBmbGFnIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXBkYXRlIGFsc28gZGVwZW5kZW5jaWVzIG9mIHBhY2thZ2VzIGluIHRoZSBhcmd1bWVudCBsaXN0LCBleGNlcHQgdGhvc2Ugd2hpY2ggYXJlIHJvb3QgcmVxdWlyZW1lbnRzLicpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycsICdXJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVcGRhdGUgYWxzbyBkZXBlbmRlbmNpZXMgb2YgcGFja2FnZXMgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIGluY2x1ZGluZyB0aG9zZSB3aGljaCBhcmUgcm9vdCByZXF1aXJlbWVudHMuJyksCm5ldyBJbnB1dE9wdGlvbigndmVyYm9zZScsICd2fHZ2fHZ2dicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3MgbW9yZSBkZXRhaWxzIGluY2x1ZGluZyBuZXcgY29tbWl0cyBwdWxsZWQgaW4gd2hlbiB1cGRhdGluZyBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcC4nKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc3RhYmxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmVmZXIgc3RhYmxlIHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfUFJFRkVSX1NUQUJMRT0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1sb3dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByZWZlciBsb3dlc3QgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9QUkVGRVJfTE9XRVNUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignaW50ZXJhY3RpdmUnLCAnaScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSW50ZXJhY3RpdmUgaW50ZXJmYWNlIHdpdGggYXV0b2NvbXBsZXRpb24gdG8gc2VsZWN0IHRoZSBwYWNrYWdlcyB0byB1cGRhdGUuJyksCm5ldyBJbnB1dE9wdGlvbigncm9vdC1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXN0cmljdHMgdGhlIHVwZGF0ZSB0byB5b3VyIGZpcnN0IGRlZ3JlZSBkZXBlbmRlbmNpZXMuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz51cGRhdGU8L2luZm8+IGNvbW1hbmQgcmVhZHMgdGhlIGNvbXBvc2VyLmpzb24gZmlsZSBmcm9tIHRoZQpjdXJyZW50IGRpcmVjdG9yeSwgcHJvY2Vzc2VzIGl0LCBhbmQgdXBkYXRlcywgcmVtb3ZlcyBvciBpbnN0YWxscyBhbGwgdGhlCmRlcGVuZGVuY2llcy4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZTwvaW5mbz4KClRvIGxpbWl0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIHRvIGEgZmV3IHBhY2thZ2VzLCB5b3UgY2FuIGxpc3QgdGhlIHBhY2thZ2UocykKeW91IHdhbnQgdG8gdXBkYXRlIGFzIHN1Y2g6Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciB1cGRhdGUgdmVuZG9yL3BhY2thZ2UxIGZvby9teXBhY2thZ2UgWy4uLl08L2luZm8+CgpZb3UgbWF5IGFsc28gdXNlIGFuIGFzdGVyaXNrICgqKSBwYXR0ZXJuIHRvIGxpbWl0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIHRvIHBhY2thZ2UocykKZnJvbSBhIHNwZWNpZmljIHZlbmRvcjoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSB2ZW5kb3IvcGFja2FnZTEgZm9vLyogWy4uLl08L2luZm8+CgpUbyBydW4gYW4gdXBkYXRlIHdpdGggbW9yZSByZXN0cmljdGl2ZSBjb25zdHJhaW50cyB5b3UgY2FuIHVzZToKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSAtLXdpdGggdmVuZG9yL3BhY2thZ2U6MS4wLio8L2luZm8+CgpUbyBydW4gYSBwYXJ0aWFsIHVwZGF0ZSB3aXRoIG1vcmUgcmVzdHJpY3RpdmUgY29uc3RyYWludHMgeW91IGNhbiB1c2UgdGhlIHNob3J0aGFuZDoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSB2ZW5kb3IvcGFja2FnZToxLjAuKjwvaW5mbz4KClRvIHNlbGVjdCBwYWNrYWdlcyBuYW1lcyBpbnRlcmFjdGl2ZWx5IHdpdGggYXV0by1jb21wbGV0aW9uIHVzZSA8aW5mbz4taTwvaW5mbz4uCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCN1cGRhdGUtdS11cGdyYWRlCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICItLWRldiIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1zdWdnZXN0JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1uby1zdWdnZXN0Ii4gSXQgaGFzIG5vIGVmZmVjdCBhbmQgd2lsbCBicmVhayBpbiBDb21wb3NlciAzLjwvd2FybmluZz4nKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKaWYgKCFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgaXMgb3BlcmF0aW5nIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2UgeW91IGRvIG5vdCBoYXZlIHRoZSBQSFAgY3VybCBleHRlbnNpb24gZW5hYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRwYWNrYWdlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CiRyZXFzID0gJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkaW5wdXQtPmdldE9wdGlvbignd2l0aCcpKTsKCgppZiAoY291bnQoJHBhY2thZ2VzKSA+IDApIHsKJGFsbG93bGlzdFBhY2thZ2VzV2l0aFJlcXVpcmVtZW50cyA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHBrZyk6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgne1xTK1sgPTpdXFMrfScsICRwa2cpOwp9KTsKZm9yZWFjaCAoJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkYWxsb3dsaXN0UGFja2FnZXNXaXRoUmVxdWlyZW1lbnRzKSBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewokcmVxc1skcGFja2FnZV0gPSAkY29uc3RyYWludDsKfQoKCmZvcmVhY2ggKCRhbGxvd2xpc3RQYWNrYWdlc1dpdGhSZXF1aXJlbWVudHMgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VOYW1lID0gUHJlZzo6cmVwbGFjZSgne14oW14gPTpdKylbID06XS4qJH0nLCAnJDEnLCAkcGFja2FnZSk7CiRpbmRleCA9IGFycmF5X3NlYXJjaCgkcGFja2FnZSwgJHBhY2thZ2VzKTsKJHBhY2thZ2VzWyRpbmRleF0gPSAkcGFja2FnZU5hbWU7Cn0KfQoKJHJvb3RQYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRyb290UGFja2FnZS0+c2V0UmVmZXJlbmNlcyhSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFJlZmVyZW5jZXMoJHJlcXMsICRyb290UGFja2FnZS0+Z2V0UmVmZXJlbmNlcygpKSk7CiRyb290UGFja2FnZS0+c2V0U3RhYmlsaXR5RmxhZ3MoUm9vdFBhY2thZ2VMb2FkZXI6OmV4dHJhY3RTdGFiaWxpdHlGbGFncygkcmVxcywgJHJvb3RQYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksICRyb290UGFja2FnZS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKSkpOwoKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokdGVtcG9yYXJ5Q29uc3RyYWludHMgPSBbXTsKJHJvb3RSZXF1aXJlbWVudHMgPSBhcnJheV9tZXJnZSgkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7CmZvcmVhY2ggKCRyZXFzIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CiRwYWNrYWdlID0gc3RydG9sb3dlcigkcGFja2FnZSk7CiRwYXJzZWRDb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7CiR0ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZV0gPSAkcGFyc2VkQ29uc3RyYWludDsKaWYgKGlzc2V0KCRyb290UmVxdWlyZW1lbnRzWyRwYWNrYWdlXSkgJiYgIUludGVydmFsczo6aGF2ZUludGVyc2VjdGlvbnMoJHBhcnNlZENvbnN0cmFpbnQsICRyb290UmVxdWlyZW1lbnRzWyRwYWNrYWdlXS0+Z2V0Q29uc3RyYWludCgpKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIHRlbXBvcmFyeSBjb25zdHJhaW50ICInLiRjb25zdHJhaW50LiciIGZvciAiJy4kcGFja2FnZS4nIiBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBjb25zdHJhaW50IGluIHlvdXIgY29tcG9zZXIuanNvbiAoJy4kcm9vdFJlcXVpcmVtZW50c1skcGFja2FnZV0tPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nKScpOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignaW50ZXJhY3RpdmUnKSkgewokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXNJbnRlcmFjdGl2ZWx5KCRpbywgJGlucHV0LCAkb3V0cHV0LCAkY29tcG9zZXIsICRwYWNrYWdlcyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncm9vdC1yZXFzJykpIHsKJHJlcXVpcmVzID0gYXJyYXlfa2V5cygkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCkpOwppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZXMsIGFycmF5X2tleXMoJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKSk7Cn0KCmlmICghZW1wdHkoJHBhY2thZ2VzKSkgewokcGFja2FnZXMgPSBhcnJheV9pbnRlcnNlY3QoJHBhY2thZ2VzLCAkcmVxdWlyZXMpOwp9IGVsc2UgewokcGFja2FnZXMgPSAkcmVxdWlyZXM7Cn0KfQoKCgokZmlsdGVyZWRQYWNrYWdlcyA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHBhY2thZ2UpOiBib29sIHsKcmV0dXJuICFpbl9hcnJheSgkcGFja2FnZSwgWydsb2NrJywgJ25vdGhpbmcnLCAnbWlycm9ycyddLCB0cnVlKTsKfSk7CiR1cGRhdGVNaXJyb3JzID0gJGlucHV0LT5nZXRPcHRpb24oJ2xvY2snKSB8fCBjb3VudCgkZmlsdGVyZWRQYWNrYWdlcykgIT09IGNvdW50KCRwYWNrYWdlcyk7CiRwYWNrYWdlcyA9ICRmaWx0ZXJlZFBhY2thZ2VzOwoKaWYgKCR1cGRhdGVNaXJyb3JzICYmICFlbXB0eSgkcGFja2FnZXMpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPllvdSBjYW5ub3Qgc2ltdWx0YW5lb3VzbHkgdXBkYXRlIG9ubHkgYSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgYW5kIHJlZ2VuZXJhdGUgdGhlIGxvY2sgZmlsZSBtZXRhZGF0YS48L2Vycm9yPicpOwoKcmV0dXJuIC0xOwp9CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICd1cGRhdGUnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CgokaW5zdGFsbCA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7Cgokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CmlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFM7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkU7Cn0KCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKQotPnNldER1bXBBdXRvbG9hZGVyKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZU1pcnJvcnMoJHVwZGF0ZU1pcnJvcnMpCi0+c2V0VXBkYXRlQWxsb3dMaXN0KCRwYWNrYWdlcykKLT5zZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcykKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0UHJlZmVyU3RhYmxlKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc3RhYmxlJykpCi0+c2V0UHJlZmVyTG93ZXN0KCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItbG93ZXN0JykpCi0+c2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoJHRlbXBvcmFyeUNvbnN0cmFpbnRzKQotPnNldEF1ZGl0KCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXVkaXQnKSkKLT5zZXRBdWRpdEZvcm1hdCgkdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0KSkKOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJykpIHsKJGluc3RhbGwtPmRpc2FibGVQbHVnaW5zKCk7Cn0KCnJldHVybiAkaW5zdGFsbC0+cnVuKCk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VzSW50ZXJhY3RpdmVseShJT0ludGVyZmFjZSAkaW8sIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIENvbXBvc2VyICRjb21wb3NlciwgYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewppZiAoISRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLWludGVyYWN0aXZlIGNhbm5vdCBiZSB1c2VkIGluIG5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbHMuJyk7Cn0KCiRyZXF1aXJlcyA9IGFycmF5X21lcmdlKAokY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UmVxdWlyZXMoKSwKJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkKKTsKJGF1dG9jb21wbGV0ZXJWYWx1ZXMgPSBbXTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiR0YXJnZXQgPSAkcmVxdWlyZS0+Z2V0VGFyZ2V0KCk7CiRhdXRvY29tcGxldGVyVmFsdWVzW3N0cnRvbG93ZXIoJHRhcmdldCldID0gJHRhcmdldDsKfQoKJGluc3RhbGxlZFBhY2thZ2VzID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKTsKZm9yZWFjaCAoJGluc3RhbGxlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRhdXRvY29tcGxldGVyVmFsdWVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKfQoKJGhlbHBlciA9ICR0aGlzLT5nZXRIZWxwZXIoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbignPGNvbW1lbnQ+RW50ZXIgcGFja2FnZSBuYW1lOiA8L2NvbW1lbnQ+JywgbnVsbCk7CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlByZXNzIGVudGVyIHdpdGhvdXQgdmFsdWUgdG8gZW5kIHN1Ym1pc3Npb248L2luZm8+Jyk7CgpkbyB7CiRhdXRvY29tcGxldGVyVmFsdWVzID0gYXJyYXlfZGlmZigkYXV0b2NvbXBsZXRlclZhbHVlcywgJHBhY2thZ2VzKTsKJHF1ZXN0aW9uLT5zZXRBdXRvY29tcGxldGVyVmFsdWVzKCRhdXRvY29tcGxldGVyVmFsdWVzKTsKJGFkZGVkUGFja2FnZSA9ICRoZWxwZXItPmFzaygkaW5wdXQsICRvdXRwdXQsICRxdWVzdGlvbik7CgppZiAoIWlzX3N0cmluZygkYWRkZWRQYWNrYWdlKSB8fCBlbXB0eSgkYWRkZWRQYWNrYWdlKSkgewpicmVhazsKfQoKJGFkZGVkUGFja2FnZSA9IHN0cnRvbG93ZXIoJGFkZGVkUGFja2FnZSk7CmlmICghaW5fYXJyYXkoJGFkZGVkUGFja2FnZSwgJHBhY2thZ2VzKSkgewokcGFja2FnZXNbXSA9ICRhZGRlZFBhY2thZ2U7Cn0KfSB3aGlsZSAodHJ1ZSk7CgokcGFja2FnZXMgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzKTsKaWYgKCEkcGFja2FnZXMpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBtdXN0IGVudGVyIG1pbmltdW0gb25lIHBhY2thZ2UuJyk7Cn0KCiR0YWJsZSA9IG5ldyBUYWJsZSgkb3V0cHV0KTsKJHRhYmxlLT5zZXRIZWFkZXJzKFsnU2VsZWN0ZWQgcGFja2FnZXMnXSk7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdGFibGUtPmFkZFJvdyhbJHBhY2thZ2VdKTsKfQokdGFibGUtPnJlbmRlcigpOwoKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKHNwcmludGYoCidXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZSBhbmQgdXBkYXRlIHRoZSBhYm92ZSBwYWNrYWdlJXMgWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnLAoxID09PSBjb3VudCgkcGFja2FnZXMpID8gJycgOiAncycKKSkpIHsKcmV0dXJuICRwYWNrYWdlczsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnN0YWxsYXRpb24gYWJvcnRlZC4nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXENvbmZpZ1ZhbGlkYXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgoKY2xhc3MgVmFsaWRhdGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3ZhbGlkYXRlJykKLT5zZXREZXNjcmlwdGlvbignVmFsaWRhdGVzIGEgY29tcG9zZXIuanNvbiBhbmQgY29tcG9zZXIubG9jaycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignbm8tY2hlY2stYWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgdmFsaWRhdGUgcmVxdWlyZXMgZm9yIG92ZXJseSBzdHJpY3QvbG9vc2UgY29uc3RyYWludHMnKSwKbmV3IElucHV0T3B0aW9uKCdjaGVjay1sb2NrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdDaGVjayBpZiBsb2NrIGZpbGUgaXMgdXAgdG8gZGF0ZSAoZXZlbiB3aGVuIGNvbmZpZy5sb2NrIGlzIGZhbHNlKScpLApuZXcgSW5wdXRPcHRpb24oJ25vLWNoZWNrLWxvY2snLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBjaGVjayBpZiBsb2NrIGZpbGUgaXMgdXAgdG8gZGF0ZScpLApuZXcgSW5wdXRPcHRpb24oJ25vLWNoZWNrLXB1Ymxpc2gnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBjaGVjayBmb3IgcHVibGlzaCBlcnJvcnMnKSwKbmV3IElucHV0T3B0aW9uKCduby1jaGVjay12ZXJzaW9uJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgcmVwb3J0IGEgd2FybmluZyBpZiB0aGUgdmVyc2lvbiBmaWVsZCBpcyBwcmVzZW50JyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnLCAnQScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxzbyB2YWxpZGF0ZSB0aGUgY29tcG9zZXIuanNvbiBvZiBhbGwgaW5zdGFsbGVkIGRlcGVuZGVuY2llcycpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlIGZvciB3YXJuaW5ncyBhcyB3ZWxsIGFzIGVycm9ycycpLApuZXcgSW5wdXRBcmd1bWVudCgnZmlsZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAncGF0aCB0byBjb21wb3Nlci5qc29uIGZpbGUnKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHZhbGlkYXRlIGNvbW1hbmQgdmFsaWRhdGVzIGEgZ2l2ZW4gY29tcG9zZXIuanNvbiBhbmQgY29tcG9zZXIubG9jawoKRXhpdCBjb2RlcyBpbiBjYXNlIG9mIGVycm9ycyBhcmU6CjEgdmFsaWRhdGlvbiB3YXJuaW5nKHMpLCBvbmx5IHdoZW4gLS1zdHJpY3QgaXMgZ2l2ZW4KMiB2YWxpZGF0aW9uIGVycm9yKHMpCjMgZmlsZSB1bnJlYWRhYmxlIG9yIG1pc3NpbmcKClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3ZhbGlkYXRlCkVPVAopOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGZpbGUgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdmaWxlJykgPzogRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCFmaWxlX2V4aXN0cygkZmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+JyAuICRmaWxlIC4gJyBub3QgZm91bmQuPC9lcnJvcj4nKTsKCnJldHVybiAzOwp9CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkZmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+JyAuICRmaWxlIC4gJyBpcyBub3QgcmVhZGFibGUuPC9lcnJvcj4nKTsKCnJldHVybiAzOwp9CgokdmFsaWRhdG9yID0gbmV3IENvbmZpZ1ZhbGlkYXRvcigkaW8pOwokY2hlY2tBbGwgPSAkaW5wdXQtPmdldE9wdGlvbignbm8tY2hlY2stYWxsJykgPyAwIDogVmFsaWRhdGluZ0FycmF5TG9hZGVyOjpDSEVDS19BTEw7CiRjaGVja1B1Ymxpc2ggPSAhJGlucHV0LT5nZXRPcHRpb24oJ25vLWNoZWNrLXB1Ymxpc2gnKTsKJGNoZWNrTG9jayA9ICEkaW5wdXQtPmdldE9wdGlvbignbm8tY2hlY2stbG9jaycpOwokY2hlY2tWZXJzaW9uID0gJGlucHV0LT5nZXRPcHRpb24oJ25vLWNoZWNrLXZlcnNpb24nKSA/IDAgOiBDb25maWdWYWxpZGF0b3I6OkNIRUNLX1ZFUlNJT047CiRpc1N0cmljdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QnKTsKWyRlcnJvcnMsICRwdWJsaXNoRXJyb3JzLCAkd2FybmluZ3NdID0gJHZhbGlkYXRvci0+dmFsaWRhdGUoJGZpbGUsICRjaGVja0FsbCwgJGNoZWNrVmVyc2lvbik7CgokbG9ja0Vycm9ycyA9IFtdOwokY29tcG9zZXIgPSBGYWN0b3J5OjpjcmVhdGUoJGlvLCAkZmlsZSwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tcGx1Z2lucycpKTsKCiRjaGVja0xvY2sgPSAoJGNoZWNrTG9jayAmJiAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2xvY2snKSkgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2NoZWNrLWxvY2snKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpICYmICEkbG9ja2VyLT5pc0ZyZXNoKCkpIHsKJGxvY2tFcnJvcnNbXSA9ICctIFRoZSBsb2NrIGZpbGUgaXMgbm90IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IGNoYW5nZXMgaW4gY29tcG9zZXIuanNvbiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgcnVuIGBjb21wb3NlciB1cGRhdGVgIG9yIGBjb21wb3NlciB1cGRhdGUgPHBhY2thZ2UgbmFtZT5gLic7Cn0KCmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRsb2NrRXJyb3JzID0gYXJyYXlfbWVyZ2UoJGxvY2tFcnJvcnMsICRsb2NrZXItPmdldE1pc3NpbmdSZXF1aXJlbWVudEluZm8oJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCksIHRydWUpKTsKfQoKJHRoaXMtPm91dHB1dFJlc3VsdCgkaW8sICRmaWxlLCAkZXJyb3JzLCAkd2FybmluZ3MsICRjaGVja1B1Ymxpc2gsICRwdWJsaXNoRXJyb3JzLCAkY2hlY2tMb2NrLCAkbG9ja0Vycm9ycywgdHJ1ZSk7CgoKJGV4aXRDb2RlID0gJGVycm9ycyA/IDIgOiAoJGlzU3RyaWN0ICYmICR3YXJuaW5ncyA/IDEgOiAwKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcGF0aCA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChudWxsID09PSAkcGF0aCkgewpjb250aW51ZTsKfQokZmlsZSA9ICRwYXRoIC4gJy9jb21wb3Nlci5qc29uJzsKaWYgKGlzX2RpcigkcGF0aCkgJiYgZmlsZV9leGlzdHMoJGZpbGUpKSB7ClskZXJyb3JzLCAkcHVibGlzaEVycm9ycywgJHdhcm5pbmdzXSA9ICR2YWxpZGF0b3ItPnZhbGlkYXRlKCRmaWxlLCAkY2hlY2tBbGwsICRjaGVja1ZlcnNpb24pOwoKJHRoaXMtPm91dHB1dFJlc3VsdCgkaW8sICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksICRlcnJvcnMsICR3YXJuaW5ncywgJGNoZWNrUHVibGlzaCwgJHB1Ymxpc2hFcnJvcnMpOwoKCiRkZXBDb2RlID0gJGVycm9ycyA/IDIgOiAoJGlzU3RyaWN0ICYmICR3YXJuaW5ncyA/IDEgOiAwKTsKJGV4aXRDb2RlID0gbWF4KCRkZXBDb2RlLCAkZXhpdENvZGUpOwp9Cn0KfQoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAndmFsaWRhdGUnLCAkaW5wdXQsICRvdXRwdXQpOwokZXZlbnRDb2RlID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCnJldHVybiBtYXgoJGV2ZW50Q29kZSwgJGV4aXRDb2RlKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRSZXN1bHQoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJG5hbWUsIGFycmF5ICYkZXJyb3JzLCBhcnJheSAmJHdhcm5pbmdzLCBib29sICRjaGVja1B1Ymxpc2ggPSBmYWxzZSwgYXJyYXkgJHB1Ymxpc2hFcnJvcnMgPSBbXSwgYm9vbCAkY2hlY2tMb2NrID0gZmFsc2UsIGFycmF5ICRsb2NrRXJyb3JzID0gW10sIGJvb2wgJHByaW50U2NoZW1hVXJsID0gZmFsc2UpOiB2b2lkCnsKJGRvUHJpbnRTY2hlbWFVcmwgPSBmYWxzZTsKCmlmICgkZXJyb3JzKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicgLiAkbmFtZSAuICcgaXMgaW52YWxpZCwgdGhlIGZvbGxvd2luZyBlcnJvcnMvd2FybmluZ3Mgd2VyZSBmb3VuZDo8L2Vycm9yPicpOwp9IGVsc2VpZiAoJHB1Ymxpc2hFcnJvcnMpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz4nIC4gJG5hbWUgLiAnIGlzIHZhbGlkIGZvciBzaW1wbGUgdXNhZ2Ugd2l0aCBDb21wb3NlciBidXQgaGFzPC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPnN0cmljdCBlcnJvcnMgdGhhdCBtYWtlIGl0IHVuYWJsZSB0byBiZSBwdWJsaXNoZWQgYXMgYSBwYWNrYWdlPC9pbmZvPicpOwokZG9QcmludFNjaGVtYVVybCA9ICRwcmludFNjaGVtYVVybDsKfSBlbHNlaWYgKCR3YXJuaW5ncykgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQsIGJ1dCB3aXRoIGEgZmV3IHdhcm5pbmdzPC9pbmZvPicpOwokZG9QcmludFNjaGVtYVVybCA9ICRwcmludFNjaGVtYVVybDsKfSBlbHNlaWYgKCRsb2NrRXJyb3JzKSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQgYnV0IHlvdXIgY29tcG9zZXIubG9jayBoYXMgc29tZSAnLigkY2hlY2tMb2NrID8gJ2Vycm9ycycgOiAnd2FybmluZ3MnKS4nPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz4nIC4gJG5hbWUgLiAnIGlzIHZhbGlkPC9pbmZvPicpOwp9CgppZiAoJGRvUHJpbnRTY2hlbWFVcmwpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5TZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCBmb3IgZGV0YWlscyBvbiB0aGUgc2NoZW1hPC93YXJuaW5nPicpOwp9CgppZiAoJGVycm9ycykgewokZXJyb3JzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVycik6IHN0cmluZyB7CnJldHVybiAnLSAnIC4gJGVycjsKfSwgJGVycm9ycyk7CmFycmF5X3Vuc2hpZnQoJGVycm9ycywgJyMgR2VuZXJhbCBlcnJvcnMnKTsKfQppZiAoJHdhcm5pbmdzKSB7CiR3YXJuaW5ncyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRlcnIpOiBzdHJpbmcgewpyZXR1cm4gJy0gJyAuICRlcnI7Cn0sICR3YXJuaW5ncyk7CmFycmF5X3Vuc2hpZnQoJHdhcm5pbmdzLCAnIyBHZW5lcmFsIHdhcm5pbmdzJyk7Cn0KCgokZXh0cmFXYXJuaW5ncyA9IFtdOwoKCmlmICgkcHVibGlzaEVycm9ycykgewokcHVibGlzaEVycm9ycyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRlcnIpOiBzdHJpbmcgewpyZXR1cm4gJy0gJyAuICRlcnI7Cn0sICRwdWJsaXNoRXJyb3JzKTsKCmlmICgkY2hlY2tQdWJsaXNoKSB7CmFycmF5X3Vuc2hpZnQoJHB1Ymxpc2hFcnJvcnMsICcjIFB1Ymxpc2ggZXJyb3JzJyk7CiRlcnJvcnMgPSBhcnJheV9tZXJnZSgkZXJyb3JzLCAkcHVibGlzaEVycm9ycyk7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoJHB1Ymxpc2hFcnJvcnMsICcjIFB1Ymxpc2ggd2FybmluZ3MnKTsKJGV4dHJhV2FybmluZ3MgPSBhcnJheV9tZXJnZSgkZXh0cmFXYXJuaW5ncywgJHB1Ymxpc2hFcnJvcnMpOwp9Cn0KCgppZiAoJGxvY2tFcnJvcnMpIHsKaWYgKCRjaGVja0xvY2spIHsKYXJyYXlfdW5zaGlmdCgkbG9ja0Vycm9ycywgJyMgTG9jayBmaWxlIGVycm9ycycpOwokZXJyb3JzID0gYXJyYXlfbWVyZ2UoJGVycm9ycywgJGxvY2tFcnJvcnMpOwp9IGVsc2UgewphcnJheV91bnNoaWZ0KCRsb2NrRXJyb3JzLCAnIyBMb2NrIGZpbGUgd2FybmluZ3MnKTsKJGV4dHJhV2FybmluZ3MgPSBhcnJheV9tZXJnZSgkZXh0cmFXYXJuaW5ncywgJGxvY2tFcnJvcnMpOwp9Cn0KCiRtZXNzYWdlcyA9IFsKJ2Vycm9yJyA9PiAkZXJyb3JzLAond2FybmluZycgPT4gYXJyYXlfbWVyZ2UoJHdhcm5pbmdzLCAkZXh0cmFXYXJuaW5ncyksCl07Cgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJHN0eWxlID0+ICRtc2dzKSB7CmZvcmVhY2ggKCRtc2dzIGFzICRtc2cpIHsKaWYgKHN0cnBvcygkbXNnLCAnIycpID09PSAwKSB7CiRpby0+d3JpdGVFcnJvcignPCcgLiAkc3R5bGUgLiAnPicgLiAkbXNnIC4gJzwvJyAuICRzdHlsZSAuICc+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcigkbXNnKTsKfQp9Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXExvY2tlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXI7CnVzZSBDb21wb3NlclxBdXRvbG9hZFxBdXRvbG9hZEdlbmVyYXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXJcQXJjaGl2ZU1hbmFnZXI7CgoKCgoKCmNsYXNzIENvbXBvc2VyIGV4dGVuZHMgUGFydGlhbENvbXBvc2VyCnsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBjb25zdCBWRVJTSU9OID0gJzIuNi41JzsKcHVibGljIGNvbnN0IEJSQU5DSF9BTElBU19WRVJTSU9OID0gJyc7CnB1YmxpYyBjb25zdCBSRUxFQVNFX0RBVEUgPSAnMjAyMy0xMC0wNiAxMDoxMTo1Mic7CnB1YmxpYyBjb25zdCBTT1VSQ0VfVkVSU0lPTiA9ICcnOwoKCgoKCgoKCgoKcHVibGljIGNvbnN0IFJVTlRJTUVfQVBJX1ZFUlNJT04gPSAnMi4yLjInOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZwp7CgppZiAoc2VsZjo6VkVSU0lPTiA9PT0gJ0BwYWNrYWdlX3ZlcnNpb24nLidAJykgewpyZXR1cm4gc2VsZjo6U09VUkNFX1ZFUlNJT047Cn0KCgppZiAoc2VsZjo6QlJBTkNIX0FMSUFTX1ZFUlNJT04gIT09ICcnICYmIFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCBzZWxmOjpWRVJTSU9OKSkgewpyZXR1cm4gc2VsZjo6QlJBTkNIX0FMSUFTX1ZFUlNJT04uJysnLnNlbGY6OlZFUlNJT047Cn0KCnJldHVybiBzZWxmOjpWRVJTSU9OOwp9CgoKCgpwcml2YXRlICRsb2NrZXI7CgoKCgpwcml2YXRlICRkb3dubG9hZE1hbmFnZXI7CgoKCgpwcml2YXRlICRwbHVnaW5NYW5hZ2VyOwoKCgoKcHJpdmF0ZSAkYXV0b2xvYWRHZW5lcmF0b3I7CgoKCgpwcml2YXRlICRhcmNoaXZlTWFuYWdlcjsKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NrZXIoTG9ja2VyICRsb2NrZXIpOiB2b2lkCnsKJHRoaXMtPmxvY2tlciA9ICRsb2NrZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZXIoKTogTG9ja2VyCnsKcmV0dXJuICR0aGlzLT5sb2NrZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREb3dubG9hZE1hbmFnZXIoRG93bmxvYWRNYW5hZ2VyICRtYW5hZ2VyKTogdm9pZAp7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERvd25sb2FkTWFuYWdlcigpOiBEb3dubG9hZE1hbmFnZXIKewpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVNYW5hZ2VyKEFyY2hpdmVNYW5hZ2VyICRtYW5hZ2VyKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlTWFuYWdlciA9ICRtYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZU1hbmFnZXIoKTogQXJjaGl2ZU1hbmFnZXIKewpyZXR1cm4gJHRoaXMtPmFyY2hpdmVNYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UGx1Z2luTWFuYWdlcihQbHVnaW5NYW5hZ2VyICRtYW5hZ2VyKTogdm9pZAp7CiR0aGlzLT5wbHVnaW5NYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQbHVnaW5NYW5hZ2VyKCk6IFBsdWdpbk1hbmFnZXIKewpyZXR1cm4gJHRoaXMtPnBsdWdpbk1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvbG9hZEdlbmVyYXRvcihBdXRvbG9hZEdlbmVyYXRvciAkYXV0b2xvYWRHZW5lcmF0b3IpOiB2b2lkCnsKJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yID0gJGF1dG9sb2FkR2VuZXJhdG9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2xvYWRHZW5lcmF0b3IoKTogQXV0b2xvYWRHZW5lcmF0b3IKewpyZXR1cm4gJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxDb25maWdcQ29uZmlnU291cmNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCmNsYXNzIENvbmZpZwp7CnB1YmxpYyBjb25zdCBTT1VSQ0VfREVGQVVMVCA9ICdkZWZhdWx0JzsKcHVibGljIGNvbnN0IFNPVVJDRV9DT01NQU5EID0gJ2NvbW1hbmQnOwpwdWJsaWMgY29uc3QgU09VUkNFX1VOS05PV04gPSAndW5rbm93bic7CgpwdWJsaWMgY29uc3QgUkVMQVRJVkVfUEFUSFMgPSAxOwoKCnB1YmxpYyBzdGF0aWMgJGRlZmF1bHRDb25maWcgPSBbCidwcm9jZXNzLXRpbWVvdXQnID0+IDMwMCwKJ3VzZS1pbmNsdWRlLXBhdGgnID0+IGZhbHNlLAonYWxsb3ctcGx1Z2lucycgPT4gW10sCid1c2UtcGFyZW50LWRpcicgPT4gJ3Byb21wdCcsCidwcmVmZXJyZWQtaW5zdGFsbCcgPT4gJ2Rpc3QnLAonYXVkaXQnID0+IFsnaWdub3JlJyA9PiBbXSwgJ2FiYW5kb25lZCcgPT4gJ2RlZmF1bHQnXSwgCidub3RpZnktb24taW5zdGFsbCcgPT4gdHJ1ZSwKJ2dpdGh1Yi1wcm90b2NvbHMnID0+IFsnaHR0cHMnLCAnc3NoJywgJ2dpdCddLAonZ2l0bGFiLXByb3RvY29sJyA9PiBudWxsLAondmVuZG9yLWRpcicgPT4gJ3ZlbmRvcicsCidiaW4tZGlyJyA9PiAneyR2ZW5kb3ItZGlyfS9iaW4nLAonY2FjaGUtZGlyJyA9PiAneyRob21lfS9jYWNoZScsCidkYXRhLWRpcicgPT4gJ3skaG9tZX0nLAonY2FjaGUtZmlsZXMtZGlyJyA9PiAneyRjYWNoZS1kaXJ9L2ZpbGVzJywKJ2NhY2hlLXJlcG8tZGlyJyA9PiAneyRjYWNoZS1kaXJ9L3JlcG8nLAonY2FjaGUtdmNzLWRpcicgPT4gJ3skY2FjaGUtZGlyfS92Y3MnLAonY2FjaGUtdHRsJyA9PiAxNTU1MjAwMCwgCidjYWNoZS1maWxlcy10dGwnID0+IG51bGwsIAonY2FjaGUtZmlsZXMtbWF4c2l6ZScgPT4gJzMwME1pQicsCidjYWNoZS1yZWFkLW9ubHknID0+IGZhbHNlLAonYmluLWNvbXBhdCcgPT4gJ2F1dG8nLAonZGlzY2FyZC1jaGFuZ2VzJyA9PiBmYWxzZSwKJ2F1dG9sb2FkZXItc3VmZml4JyA9PiBudWxsLAonc29ydC1wYWNrYWdlcycgPT4gZmFsc2UsCidvcHRpbWl6ZS1hdXRvbG9hZGVyJyA9PiBmYWxzZSwKJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnID0+IGZhbHNlLAonYXBjdS1hdXRvbG9hZGVyJyA9PiBmYWxzZSwKJ3ByZXBlbmQtYXV0b2xvYWRlcicgPT4gdHJ1ZSwKJ2dpdGh1Yi1kb21haW5zJyA9PiBbJ2dpdGh1Yi5jb20nXSwKJ2JpdGJ1Y2tldC1leHBvc2UtaG9zdG5hbWUnID0+IHRydWUsCidkaXNhYmxlLXRscycgPT4gZmFsc2UsCidzZWN1cmUtaHR0cCcgPT4gdHJ1ZSwKJ3NlY3VyZS1zdm4tZG9tYWlucycgPT4gW10sCidjYWZpbGUnID0+IG51bGwsCidjYXBhdGgnID0+IG51bGwsCidnaXRodWItZXhwb3NlLWhvc3RuYW1lJyA9PiB0cnVlLAonZ2l0bGFiLWRvbWFpbnMnID0+IFsnZ2l0bGFiLmNvbSddLAonc3RvcmUtYXV0aHMnID0+ICdwcm9tcHQnLAoncGxhdGZvcm0nID0+IFtdLAonYXJjaGl2ZS1mb3JtYXQnID0+ICd0YXInLAonYXJjaGl2ZS1kaXInID0+ICcuJywKJ2h0YWNjZXNzLXByb3RlY3QnID0+IHRydWUsCid1c2UtZ2l0aHViLWFwaScgPT4gdHJ1ZSwKJ2xvY2snID0+IHRydWUsCidwbGF0Zm9ybS1jaGVjaycgPT4gJ3BocC1vbmx5JywKJ2JpdGJ1Y2tldC1vYXV0aCcgPT4gW10sCidnaXRodWItb2F1dGgnID0+IFtdLAonZ2l0bGFiLW9hdXRoJyA9PiBbXSwKJ2dpdGxhYi10b2tlbicgPT4gW10sCidodHRwLWJhc2ljJyA9PiBbXSwKJ2JlYXJlcicgPT4gW10sCl07CgoKcHVibGljIHN0YXRpYyAkZGVmYXVsdFJlcG9zaXRvcmllcyA9IFsKJ3BhY2thZ2lzdC5vcmcnID0+IFsKJ3R5cGUnID0+ICdjb21wb3NlcicsCid1cmwnID0+ICdodHRwczovL3JlcG8ucGFja2FnaXN0Lm9yZycsCl0sCl07CgoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkYmFzZURpcjsKCnByaXZhdGUgJHJlcG9zaXRvcmllczsKCnByaXZhdGUgJGNvbmZpZ1NvdXJjZTsKCnByaXZhdGUgJGF1dGhDb25maWdTb3VyY2U7Cgpwcml2YXRlICRsb2NhbEF1dGhDb25maWdTb3VyY2UgPSBudWxsOwoKcHJpdmF0ZSAkdXNlRW52aXJvbm1lbnQ7Cgpwcml2YXRlICR3YXJuZWRIb3N0cyA9IFtdOwoKcHJpdmF0ZSAkc3NsVmVyaWZ5V2FybmVkSG9zdHMgPSBbXTsKCnByaXZhdGUgJHNvdXJjZU9mQ29uZmlnVmFsdWUgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkdXNlRW52aXJvbm1lbnQgPSB0cnVlLCA/c3RyaW5nICRiYXNlRGlyID0gbnVsbCkKewoKJHRoaXMtPmNvbmZpZyA9IHN0YXRpYzo6JGRlZmF1bHRDb25maWc7CgokdGhpcy0+cmVwb3NpdG9yaWVzID0gc3RhdGljOjokZGVmYXVsdFJlcG9zaXRvcmllczsKJHRoaXMtPnVzZUVudmlyb25tZW50ID0gKGJvb2wpICR1c2VFbnZpcm9ubWVudDsKJHRoaXMtPmJhc2VEaXIgPSBpc19zdHJpbmcoJGJhc2VEaXIpICYmICcnICE9PSAkYmFzZURpciA/ICRiYXNlRGlyIDogbnVsbDsKCmZvcmVhY2ggKCR0aGlzLT5jb25maWcgYXMgJGNvbmZpZ0tleSA9PiAkY29uZmlnVmFsdWUpIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJGNvbmZpZ1ZhbHVlLCAkY29uZmlnS2V5LCBzZWxmOjpTT1VSQ0VfREVGQVVMVCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJGNvbmZpZ0tleSA9PiAkY29uZmlnVmFsdWUpIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJGNvbmZpZ1ZhbHVlLCAncmVwb3NpdG9yaWVzLicgLiAkY29uZmlnS2V5LCBzZWxmOjpTT1VSQ0VfREVGQVVMVCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZ1NvdXJjZShDb25maWdTb3VyY2VJbnRlcmZhY2UgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+Y29uZmlnU291cmNlID0gJHNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZ1NvdXJjZSgpOiBDb25maWdTb3VyY2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNvbmZpZ1NvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhDb25maWdTb3VyY2UoQ29uZmlnU291cmNlSW50ZXJmYWNlICRzb3VyY2UpOiB2b2lkCnsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UgPSAkc291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aENvbmZpZ1NvdXJjZSgpOiBDb25maWdTb3VyY2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmF1dGhDb25maWdTb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoQ29uZmlnU291cmNlSW50ZXJmYWNlICRzb3VyY2UpOiB2b2lkCnsKJHRoaXMtPmxvY2FsQXV0aENvbmZpZ1NvdXJjZSA9ICRzb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTogP0NvbmZpZ1NvdXJjZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+bG9jYWxBdXRoQ29uZmlnU291cmNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtZXJnZShhcnJheSAkY29uZmlnLCBzdHJpbmcgJHNvdXJjZSA9IHNlbGY6OlNPVVJDRV9VTktOT1dOKTogdm9pZAp7CgppZiAoIWVtcHR5KCRjb25maWdbJ2NvbmZpZyddKSAmJiBpc19hcnJheSgkY29uZmlnWydjb25maWcnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snY29uZmlnJ10gYXMgJGtleSA9PiAkdmFsKSB7CmlmIChpbl9hcnJheSgka2V5LCBbJ2JpdGJ1Y2tldC1vYXV0aCcsICdnaXRodWItb2F1dGgnLCAnZ2l0bGFiLW9hdXRoJywgJ2dpdGxhYi10b2tlbicsICdodHRwLWJhc2ljJywgJ2JlYXJlciddLCB0cnVlKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9IGVsc2VpZiAoaW5fYXJyYXkoJGtleSwgWydhbGxvdy1wbHVnaW5zJ10sIHRydWUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pICYmIGlzX2FycmF5KCR0aGlzLT5jb25maWdbJGtleV0pICYmIGlzX2FycmF5KCR2YWwpKSB7CgoKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X21lcmdlKCR2YWwsICR0aGlzLT5jb25maWdbJGtleV0sICR2YWwpOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKfSBlbHNlaWYgKGluX2FycmF5KCRrZXksIFsnZ2l0bGFiLWRvbWFpbnMnLCAnZ2l0aHViLWRvbWFpbnMnXSwgdHJ1ZSkgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSgkdGhpcy0+Y29uZmlnWyRrZXldLCAkdmFsKSk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9IGVsc2VpZiAoJ3ByZWZlcnJlZC1pbnN0YWxsJyA9PT0gJGtleSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewppZiAoaXNfYXJyYXkoJHZhbCkgfHwgaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKaWYgKGlzX3N0cmluZygkdmFsKSkgewokdmFsID0gWycqJyA9PiAkdmFsXTsKfQppZiAoaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJGtleV0pKSB7CiR0aGlzLT5jb25maWdbJGtleV0gPSBbJyonID0+ICR0aGlzLT5jb25maWdbJGtleV1dOwokdGhpcy0+c291cmNlT2ZDb25maWdWYWx1ZVska2V5IC4gJyonXSA9ICRzb3VyY2U7Cn0KJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5jb25maWdbJGtleV0sICR2YWwpOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldWycqJ10pKSB7CiR3aWxkY2FyZCA9ICR0aGlzLT5jb25maWdbJGtleV1bJyonXTsKdW5zZXQoJHRoaXMtPmNvbmZpZ1ska2V5XVsnKiddKTsKJHRoaXMtPmNvbmZpZ1ska2V5XVsnKiddID0gJHdpbGRjYXJkOwp9Cn0gZWxzZSB7CiR0aGlzLT5jb25maWdbJGtleV0gPSAkdmFsOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKfQp9IGVsc2VpZiAoJ2F1ZGl0JyA9PT0gJGtleSkgewokY3VycmVudElnbm9yZXMgPSAkdGhpcy0+Y29uZmlnWydhdWRpdCddWydpZ25vcmUnXTsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5jb25maWdbJ2F1ZGl0J10sICR2YWwpOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKJHRoaXMtPmNvbmZpZ1snYXVkaXQnXVsnaWdub3JlJ10gPSBhcnJheV9tZXJnZSgkY3VycmVudElnbm9yZXMsICR2YWxbJ2lnbm9yZSddID8/IFtdKTsKfSBlbHNlIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9ICR2YWw7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9Cn0KfQoKaWYgKCFlbXB0eSgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkgJiYgaXNfYXJyYXkoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10pKSB7CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSBhcnJheV9yZXZlcnNlKCR0aGlzLT5yZXBvc2l0b3JpZXMsIHRydWUpOwokbmV3UmVwb3MgPSBhcnJheV9yZXZlcnNlKCRjb25maWdbJ3JlcG9zaXRvcmllcyddLCB0cnVlKTsKZm9yZWFjaCAoJG5ld1JlcG9zIGFzICRuYW1lID0+ICRyZXBvc2l0b3J5KSB7CgppZiAoZmFsc2UgPT09ICRyZXBvc2l0b3J5KSB7CiR0aGlzLT5kaXNhYmxlUmVwb0J5TmFtZSgoc3RyaW5nKSAkbmFtZSk7CmNvbnRpbnVlOwp9CgoKaWYgKGlzX2FycmF5KCRyZXBvc2l0b3J5KSAmJiAxID09PSBjb3VudCgkcmVwb3NpdG9yeSkgJiYgZmFsc2UgPT09IGN1cnJlbnQoJHJlcG9zaXRvcnkpKSB7CiR0aGlzLT5kaXNhYmxlUmVwb0J5TmFtZSgoc3RyaW5nKSBrZXkoJHJlcG9zaXRvcnkpKTsKY29udGludWU7Cn0KCgppZiAoaXNzZXQoJHJlcG9zaXRvcnlbJ3R5cGUnXSwgJHJlcG9zaXRvcnlbJ3VybCddKSAmJiAkcmVwb3NpdG9yeVsndHlwZSddID09PSAnY29tcG9zZXInICYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vKD86W2EtejAtOS0uXStcLik/cGFja2FnaXN0Lm9yZygvfCQpfScsICRyZXBvc2l0b3J5Wyd1cmwnXSkpIHsKJHRoaXMtPmRpc2FibGVSZXBvQnlOYW1lKCdwYWNrYWdpc3Qub3JnJyk7Cn0KCgppZiAoaXNfaW50KCRuYW1lKSkgewokdGhpcy0+cmVwb3NpdG9yaWVzW10gPSAkcmVwb3NpdG9yeTsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHJlcG9zaXRvcnksICdyZXBvc2l0b3JpZXMuJyAuIGFycmF5X3NlYXJjaCgkcmVwb3NpdG9yeSwgJHRoaXMtPnJlcG9zaXRvcmllcywgdHJ1ZSksICRzb3VyY2UpOwp9IGVsc2UgewppZiAoJG5hbWUgPT09ICdwYWNrYWdpc3QnKSB7IAokdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lIC4gJy5vcmcnXSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkcmVwb3NpdG9yeSwgJ3JlcG9zaXRvcmllcy4nIC4gJG5hbWUgLiAnLm9yZycsICRzb3VyY2UpOwp9IGVsc2UgewokdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lXSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkcmVwb3NpdG9yeSwgJ3JlcG9zaXRvcmllcy4nIC4gJG5hbWUsICRzb3VyY2UpOwp9Cn0KfQokdGhpcy0+cmVwb3NpdG9yaWVzID0gYXJyYXlfcmV2ZXJzZSgkdGhpcy0+cmVwb3NpdG9yaWVzLCB0cnVlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJGtleSwgaW50ICRmbGFncyA9IDApCnsKc3dpdGNoICgka2V5KSB7CgpjYXNlICd2ZW5kb3ItZGlyJzoKY2FzZSAnYmluLWRpcic6CmNhc2UgJ3Byb2Nlc3MtdGltZW91dCc6CmNhc2UgJ2RhdGEtZGlyJzoKY2FzZSAnY2FjaGUtZGlyJzoKY2FzZSAnY2FjaGUtZmlsZXMtZGlyJzoKY2FzZSAnY2FjaGUtcmVwby1kaXInOgpjYXNlICdjYWNoZS12Y3MtZGlyJzoKY2FzZSAnY2FmaWxlJzoKY2FzZSAnY2FwYXRoJzoKCiRlbnYgPSAnQ09NUE9TRVJfJyAuIHN0cnRvdXBwZXIoc3RydHIoJGtleSwgJy0nLCAnXycpKTsKCiR2YWwgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJGVudik7CmlmICgkdmFsICE9PSBmYWxzZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkZW52KTsKfQoKaWYgKCRrZXkgPT09ICdwcm9jZXNzLXRpbWVvdXQnKSB7CnJldHVybiBtYXgoMCwgZmFsc2UgIT09ICR2YWwgPyAoaW50KSAkdmFsIDogJHRoaXMtPmNvbmZpZ1ska2V5XSk7Cn0KCiR2YWwgPSBydHJpbSgoc3RyaW5nKSAkdGhpcy0+cHJvY2VzcyhmYWxzZSAhPT0gJHZhbCA/ICR2YWwgOiAkdGhpcy0+Y29uZmlnWyRrZXldLCAkZmxhZ3MpLCAnL1xcJyk7CiR2YWwgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkdmFsKTsKCmlmIChzdWJzdHIoJGtleSwgLTQpICE9PSAnLWRpcicpIHsKcmV0dXJuICR2YWw7Cn0KCnJldHVybiAoKCRmbGFncyAmIHNlbGY6OlJFTEFUSVZFX1BBVEhTKSA9PT0gc2VsZjo6UkVMQVRJVkVfUEFUSFMpID8gJHZhbCA6ICR0aGlzLT5yZWFscGF0aCgkdmFsKTsKCgpjYXNlICdjYWNoZS1yZWFkLW9ubHknOgpjYXNlICdodGFjY2Vzcy1wcm90ZWN0JzoKCiRlbnYgPSAnQ09NUE9TRVJfJyAuIHN0cnRvdXBwZXIoc3RydHIoJGtleSwgJy0nLCAnXycpKTsKCiR2YWwgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJGVudik7CmlmIChmYWxzZSA9PT0gJHZhbCkgewokdmFsID0gJHRoaXMtPmNvbmZpZ1ska2V5XTsKfSBlbHNlIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJGVudik7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwoKCmNhc2UgJ2Rpc2FibGUtdGxzJzoKY2FzZSAnc2VjdXJlLWh0dHAnOgpjYXNlICd1c2UtZ2l0aHViLWFwaSc6CmNhc2UgJ2xvY2snOgoKaWYgKCRrZXkgPT09ICdzZWN1cmUtaHR0cCcgJiYgJHRoaXMtPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+Y29uZmlnWyRrZXldICE9PSAnZmFsc2UnICYmIChib29sKSAkdGhpcy0+Y29uZmlnWyRrZXldOwoKCmNhc2UgJ2NhY2hlLXR0bCc6CnJldHVybiBtYXgoMCwgKGludCkgJHRoaXMtPmNvbmZpZ1ska2V5XSk7CgoKY2FzZSAnY2FjaGUtZmlsZXMtbWF4c2l6ZSc6CmlmICghUHJlZzo6aXNNYXRjaCgnL15ccyooWzAtOS5dKylccyooPzooW2ttZ10pKD86aT9iKT8pP1xzKiQvaScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJGtleV0sICRtYXRjaGVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJDb3VsZCBub3QgcGFyc2UgdGhlIHZhbHVlIG9mICcka2V5JzogeyR0aGlzLT5jb25maWdbJGtleV19IgopOwp9CiRzaXplID0gKGZsb2F0KSAkbWF0Y2hlc1sxXTsKaWYgKGlzc2V0KCRtYXRjaGVzWzJdKSkgewpzd2l0Y2ggKHN0cnRvbG93ZXIoJG1hdGNoZXNbMl0pKSB7CmNhc2UgJ2cnOgokc2l6ZSAqPSAxMDI0OwoKCmNhc2UgJ20nOgokc2l6ZSAqPSAxMDI0OwoKCmNhc2UgJ2snOgokc2l6ZSAqPSAxMDI0OwpicmVhazsKfQp9CgpyZXR1cm4gbWF4KDAsIChpbnQpICRzaXplKTsKCgpjYXNlICdjYWNoZS1maWxlcy10dGwnOgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKcmV0dXJuIG1heCgwLCAoaW50KSAkdGhpcy0+Y29uZmlnWyRrZXldKTsKfQoKcmV0dXJuICR0aGlzLT5nZXQoJ2NhY2hlLXR0bCcpOwoKY2FzZSAnaG9tZSc6CnJldHVybiBydHJpbSgkdGhpcy0+cHJvY2VzcyhQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkdGhpcy0+Y29uZmlnWyRrZXldKSwgJGZsYWdzKSwgJy9cXCcpOwoKY2FzZSAnYmluLWNvbXBhdCc6CiR2YWx1ZSA9ICR0aGlzLT5nZXRDb21wb3NlckVudignQ09NUE9TRVJfQklOX0NPTVBBVCcpID86ICR0aGlzLT5jb25maWdbJGtleV07CgppZiAoIWluX2FycmF5KCR2YWx1ZSwgWydhdXRvJywgJ2Z1bGwnLCAncHJveHknLCAnc3ltbGluayddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJJbnZhbGlkIHZhbHVlIGZvciAnYmluLWNvbXBhdCc6IHskdmFsdWV9LiBFeHBlY3RlZCBhdXRvLCBmdWxsIG9yIHByb3h5IgopOwp9CgppZiAoJHZhbHVlID09PSAnc3ltbGluaycpIHsKdHJpZ2dlcl9lcnJvcignY29uZmlnLmJpbi1jb21wYXQgInN5bWxpbmsiIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2UgYXV0bywgZnVsbCAoZm9yIFdpbmRvd3MgY29tcGF0aWJpbGl0eSkgb3IgcHJveHkgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCnJldHVybiAkdmFsdWU7CgpjYXNlICdkaXNjYXJkLWNoYW5nZXMnOgokZW52ID0gJHRoaXMtPmdldENvbXBvc2VyRW52KCdDT01QT1NFUl9ESVNDQVJEX0NIQU5HRVMnKTsKaWYgKCRlbnYgIT09IGZhbHNlKSB7CmlmICghaW5fYXJyYXkoJGVudiwgWydzdGFzaCcsICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJJbnZhbGlkIHZhbHVlIGZvciBDT01QT1NFUl9ESVNDQVJEX0NIQU5HRVM6IHskZW52fS4gRXhwZWN0ZWQgMSwgMCwgdHJ1ZSwgZmFsc2Ugb3Igc3Rhc2giCik7Cn0KaWYgKCdzdGFzaCcgPT09ICRlbnYpIHsKcmV0dXJuICdzdGFzaCc7Cn0KCgpyZXR1cm4gJGVudiAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJGVudjsKfQoKaWYgKCFpbl9hcnJheSgkdGhpcy0+Y29uZmlnWyRrZXldLCBbdHJ1ZSwgZmFsc2UsICdzdGFzaCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJJbnZhbGlkIHZhbHVlIGZvciAnZGlzY2FyZC1jaGFuZ2VzJzogeyR0aGlzLT5jb25maWdbJGtleV19LiBFeHBlY3RlZCB0cnVlLCBmYWxzZSBvciBzdGFzaCIKKTsKfQoKcmV0dXJuICR0aGlzLT5jb25maWdbJGtleV07CgpjYXNlICdnaXRodWItcHJvdG9jb2xzJzoKJHByb3RvcyA9ICR0aGlzLT5jb25maWdbJ2dpdGh1Yi1wcm90b2NvbHMnXTsKaWYgKCR0aGlzLT5jb25maWdbJ3NlY3VyZS1odHRwJ10gJiYgZmFsc2UgIT09ICgkaW5kZXggPSBhcnJheV9zZWFyY2goJ2dpdCcsICRwcm90b3MpKSkgewp1bnNldCgkcHJvdG9zWyRpbmRleF0pOwp9CmlmIChyZXNldCgkcHJvdG9zKSA9PT0gJ2h0dHAnKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGh0dHAgcHJvdG9jb2wgZm9yIGdpdGh1YiBpcyBub3QgYXZhaWxhYmxlIGFueW1vcmUsIHVwZGF0ZSB5b3VyIGNvbmZpZ1wncyBnaXRodWItcHJvdG9jb2xzIHRvIHVzZSAiaHR0cHMiLCAiZ2l0IiBvciAic3NoIicpOwp9CgpyZXR1cm4gJHByb3RvczsKCmNhc2UgJ2F1dG9sb2FkZXItc3VmZml4JzoKaWYgKCR0aGlzLT5jb25maWdbJGtleV0gPT09ICcnKSB7IApyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzKCR0aGlzLT5jb25maWdbJGtleV0sICRmbGFncyk7CgpkZWZhdWx0OgppZiAoIWlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJGZsYWdzKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxsKGludCAkZmxhZ3MgPSAwKTogYXJyYXkKewokYWxsID0gWwoncmVwb3NpdG9yaWVzJyA9PiAkdGhpcy0+Z2V0UmVwb3NpdG9yaWVzKCksCl07CmZvcmVhY2ggKGFycmF5X2tleXMoJHRoaXMtPmNvbmZpZykgYXMgJGtleSkgewokYWxsWydjb25maWcnXVska2V5XSA9ICR0aGlzLT5nZXQoJGtleSwgJGZsYWdzKTsKfQoKcmV0dXJuICRhbGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VPZlZhbHVlKHN0cmluZyAka2V5KTogc3RyaW5nCnsKJHRoaXMtPmdldCgka2V5KTsKCnJldHVybiAkdGhpcy0+c291cmNlT2ZDb25maWdWYWx1ZVska2V5XSA/PyBzZWxmOjpTT1VSQ0VfVU5LTk9XTjsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCRjb25maWdWYWx1ZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+c291cmNlT2ZDb25maWdWYWx1ZVskcGF0aF0gPSAkc291cmNlOwoKaWYgKGlzX2FycmF5KCRjb25maWdWYWx1ZSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1ZhbHVlIGFzICRrZXkgPT4gJHZhbHVlKSB7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWx1ZSwgJHBhdGggLiAnLicgLiAka2V5LCAkc291cmNlKTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByYXcoKTogYXJyYXkKewpyZXR1cm4gWwoncmVwb3NpdG9yaWVzJyA9PiAkdGhpcy0+Z2V0UmVwb3NpdG9yaWVzKCksCidjb25maWcnID0+ICR0aGlzLT5jb25maWcsCl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRrZXkpOiBib29sCnsKcmV0dXJuIGFycmF5X2tleV9leGlzdHMoJGtleSwgJHRoaXMtPmNvbmZpZyk7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwcm9jZXNzKCR2YWx1ZSwgaW50ICRmbGFncykKewppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybiAkdmFsdWU7Cn0KCnJldHVybiBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJyNce1wkKC4rKVx9IycsIGZ1bmN0aW9uICgkbWF0Y2gpIHVzZSAoJGZsYWdzKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWzFdKSk7CnJldHVybiAkdGhpcy0+Z2V0KCRtYXRjaFsxXSwgJGZsYWdzKTsKfSwgJHZhbHVlKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWxwYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoKCd7Xig/Oi98W2Etel06fFthLXowLTkuXSs6Ly98XFxcXFxcXFwpfWknLCAkcGF0aCkpIHsKcmV0dXJuICRwYXRoOwp9CgpyZXR1cm4gJHRoaXMtPmJhc2VEaXIgPyAkdGhpcy0+YmFzZURpciAuICcvJyAuICRwYXRoIDogJHBhdGg7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21wb3NlckVudihzdHJpbmcgJHZhcikKewppZiAoJHRoaXMtPnVzZUVudmlyb25tZW50KSB7CnJldHVybiBQbGF0Zm9ybTo6Z2V0RW52KCR2YXIpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGlzYWJsZVJlcG9CeU5hbWUoc3RyaW5nICRuYW1lKTogdm9pZAp7CmlmIChpc3NldCgkdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lXSkpIHsKdW5zZXQoJHRoaXMtPnJlcG9zaXRvcmllc1skbmFtZV0pOwp9IGVsc2VpZiAoJG5hbWUgPT09ICdwYWNrYWdpc3QnKSB7IAp1bnNldCgkdGhpcy0+cmVwb3NpdG9yaWVzWydwYWNrYWdpc3Qub3JnJ10pOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9oaWJpdFVybEJ5Q29uZmlnKHN0cmluZyAkdXJsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgYXJyYXkgJHJlcG9PcHRpb25zID0gW10pOiB2b2lkCnsKCmlmIChmYWxzZSA9PT0gZmlsdGVyX3ZhcigkdXJsLCBGSUxURVJfVkFMSURBVEVfVVJMKSkgewpyZXR1cm47Cn0KCgokc2NoZW1lID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfU0NIRU1FKTsKJGhvc3RuYW1lID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCk7CmlmIChpbl9hcnJheSgkc2NoZW1lLCBbJ2h0dHAnLCAnZ2l0JywgJ2Z0cCcsICdzdm4nXSkpIHsKaWYgKCR0aGlzLT5nZXQoJ3NlY3VyZS1odHRwJykpIHsKaWYgKCRzY2hlbWUgPT09ICdzdm4nKSB7CmlmIChpbl9hcnJheSgkaG9zdG5hbWUsICR0aGlzLT5nZXQoJ3NlY3VyZS1zdm4tZG9tYWlucycpLCB0cnVlKSkgewpyZXR1cm47Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIllvdXIgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBhbGxvdyBjb25uZWN0aW9ucyB0byAkdXJsLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA2LWNvbmZpZy5tZCNzZWN1cmUtc3ZuLWRvbWFpbnMgZm9yIGRldGFpbHMuIik7Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIllvdXIgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBhbGxvdyBjb25uZWN0aW9ucyB0byAkdXJsLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA2LWNvbmZpZy5tZCNzZWN1cmUtaHR0cCBmb3IgZGV0YWlscy4iKTsKfQppZiAoJGlvICE9PSBudWxsKSB7CmlmIChpc19zdHJpbmcoJGhvc3RuYW1lKSkgewppZiAoIWlzc2V0KCR0aGlzLT53YXJuZWRIb3N0c1skaG9zdG5hbWVdKSkgewokaW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPldhcm5pbmc6IEFjY2Vzc2luZyAkaG9zdG5hbWUgb3ZlciAkc2NoZW1lIHdoaWNoIGlzIGFuIGluc2VjdXJlIHByb3RvY29sLjwvd2FybmluZz4iKTsKfQokdGhpcy0+d2FybmVkSG9zdHNbJGhvc3RuYW1lXSA9IHRydWU7Cn0KfQp9CgppZiAoJGlvICE9PSBudWxsICYmIGlzX3N0cmluZygkaG9zdG5hbWUpICYmICFpc3NldCgkdGhpcy0+c3NsVmVyaWZ5V2FybmVkSG9zdHNbJGhvc3RuYW1lXSkpIHsKJHdhcm5pbmcgPSBudWxsOwppZiAoaXNzZXQoJHJlcG9PcHRpb25zWydzc2wnXVsndmVyaWZ5X3BlZXInXSkgJiYgIShib29sKSAkcmVwb09wdGlvbnNbJ3NzbCddWyd2ZXJpZnlfcGVlciddKSB7CiR3YXJuaW5nID0gJ3ZlcmlmeV9wZWVyJzsKfQoKaWYgKGlzc2V0KCRyZXBvT3B0aW9uc1snc3NsJ11bJ3ZlcmlmeV9wZWVyX25hbWUnXSkgJiYgIShib29sKSAkcmVwb09wdGlvbnNbJ3NzbCddWyd2ZXJpZnlfcGVlcl9uYW1lJ10pIHsKJHdhcm5pbmcgPSAkd2FybmluZyA9PT0gbnVsbCA/ICd2ZXJpZnlfcGVlcl9uYW1lJyA6ICR3YXJuaW5nIC4gJyBhbmQgdmVyaWZ5X3BlZXJfbmFtZSc7Cn0KCmlmICgkd2FybmluZyAhPT0gbnVsbCkgewokaW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPldhcm5pbmc6IEFjY2Vzc2luZyAkaG9zdG5hbWUgd2l0aCAkd2FybmluZyBkaXNhYmxlZC48L3dhcm5pbmc+Iik7CiR0aGlzLT5zc2xWZXJpZnlXYXJuZWRIb3N0c1skaG9zdG5hbWVdID0gdHJ1ZTsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRpc2FibGVQcm9jZXNzVGltZW91dCgpOiB2b2lkCnsKClByb2Nlc3NFeGVjdXRvcjo6c2V0VGltZW91dCgwKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb25maWc7CgoKCgoKCgppbnRlcmZhY2UgQ29uZmlnU291cmNlSW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgYm9vbCAkYXBwZW5kID0gdHJ1ZSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbmZpZ1NldHRpbmcoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNvbmZpZ1NldHRpbmcoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQcm9wZXJ0eShzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbmZpZzsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uTWFuaXB1bGF0b3I7CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCgoKCmNsYXNzIEpzb25Db25maWdTb3VyY2UgaW1wbGVtZW50cyBDb25maWdTb3VyY2VJbnRlcmZhY2UKewoKCgpwcml2YXRlICRmaWxlOwoKCgoKcHJpdmF0ZSAkYXV0aENvbmZpZzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChKc29uRmlsZSAkZmlsZSwgYm9vbCAkYXV0aENvbmZpZyA9IGZhbHNlKQp7CiR0aGlzLT5maWxlID0gJGZpbGU7CiR0aGlzLT5hdXRoQ29uZmlnID0gJGF1dGhDb25maWc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUsICRjb25maWcsIGJvb2wgJGFwcGVuZCA9IHRydWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdhZGRSZXBvc2l0b3J5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHJlcG8sICRyZXBvQ29uZmlnKSB1c2UgKCRhcHBlbmQpOiB2b2lkIHsKCgppZiAoaXNzZXQoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10pKSB7CmZvcmVhY2ggKCRjb25maWdbJ3JlcG9zaXRvcmllcyddIGFzICRpbmRleCA9PiAkdmFsKSB7CmlmICgkaW5kZXggPT09ICRyZXBvKSB7CmNvbnRpbnVlOwp9CmlmIChpc19udW1lcmljKCRpbmRleCkgJiYgKCR2YWwgPT09IFsncGFja2FnaXN0JyA9PiBmYWxzZV0gfHwgJHZhbCA9PT0gWydwYWNrYWdpc3Qub3JnJyA9PiBmYWxzZV0pKSB7CnVuc2V0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddWyRpbmRleF0pOwokY29uZmlnWydyZXBvc2l0b3JpZXMnXVsncGFja2FnaXN0Lm9yZyddID0gZmFsc2U7CmJyZWFrOwp9Cn0KfQoKaWYgKCRhcHBlbmQpIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bJHJlcG9dID0gJHJlcG9Db25maWc7Cn0gZWxzZSB7CiRjb25maWdbJ3JlcG9zaXRvcmllcyddID0gWyRyZXBvID0+ICRyZXBvQ29uZmlnXSArICRjb25maWdbJ3JlcG9zaXRvcmllcyddOwp9Cn0sICRuYW1lLCAkY29uZmlnLCAkYXBwZW5kKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlUmVwb3NpdG9yeScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRyZXBvKTogdm9pZCB7CnVuc2V0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddWyRyZXBvXSk7Cn0sICRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbmZpZ1NldHRpbmcoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkCnsKJGF1dGhDb25maWcgPSAkdGhpcy0+YXV0aENvbmZpZzsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdhZGRDb25maWdTZXR0aW5nJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJGtleSwgJHZhbCkgdXNlICgkYXV0aENvbmZpZyk6IHZvaWQgewppZiAoUHJlZzo6aXNNYXRjaCgne14oYml0YnVja2V0LW9hdXRofGdpdGh1Yi1vYXV0aHxnaXRsYWItb2F1dGh8Z2l0bGFiLXRva2VufGJlYXJlcnxodHRwLWJhc2ljfHBsYXRmb3JtKVwufScsICRrZXkpKSB7Clska2V5LCAkaG9zdF0gPSBleHBsb2RlKCcuJywgJGtleSwgMik7CmlmICgkYXV0aENvbmZpZykgewokY29uZmlnWyRrZXldWyRob3N0XSA9ICR2YWw7Cn0gZWxzZSB7CiRjb25maWdbJ2NvbmZpZyddWyRrZXldWyRob3N0XSA9ICR2YWw7Cn0KfSBlbHNlIHsKJGNvbmZpZ1snY29uZmlnJ11bJGtleV0gPSAkdmFsOwp9Cn0sICRuYW1lLCAkdmFsdWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJGF1dGhDb25maWcgPSAkdGhpcy0+YXV0aENvbmZpZzsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVDb25maWdTZXR0aW5nJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJGtleSkgdXNlICgkYXV0aENvbmZpZyk6IHZvaWQgewppZiAoUHJlZzo6aXNNYXRjaCgne14oYml0YnVja2V0LW9hdXRofGdpdGh1Yi1vYXV0aHxnaXRsYWItb2F1dGh8Z2l0bGFiLXRva2VufGJlYXJlcnxodHRwLWJhc2ljfHBsYXRmb3JtKVwufScsICRrZXkpKSB7Clska2V5LCAkaG9zdF0gPSBleHBsb2RlKCcuJywgJGtleSwgMik7CmlmICgkYXV0aENvbmZpZykgewp1bnNldCgkY29uZmlnWyRrZXldWyRob3N0XSk7Cn0gZWxzZSB7CnVuc2V0KCRjb25maWdbJ2NvbmZpZyddWyRrZXldWyRob3N0XSk7Cn0KfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1snY29uZmlnJ11bJGtleV0pOwp9Cn0sICRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFByb3BlcnR5KHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbignYWRkUHJvcGVydHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5LCAkdmFsKTogdm9pZCB7CmlmIChzdHJwb3MoJGtleSwgJ2V4dHJhLicpID09PSAwIHx8IHN0cnBvcygka2V5LCAnc2NyaXB0cy4nKSA9PT0gMCkgewokYml0cyA9IGV4cGxvZGUoJy4nLCAka2V5KTsKJGxhc3QgPSBhcnJheV9wb3AoJGJpdHMpOwokYXJyID0gJiRjb25maWdbcmVzZXQoJGJpdHMpXTsKZm9yZWFjaCAoJGJpdHMgYXMgJGJpdCkgewppZiAoIWlzc2V0KCRhcnJbJGJpdF0pKSB7CiRhcnJbJGJpdF0gPSBbXTsKfQokYXJyID0gJiRhcnJbJGJpdF07Cn0KJGFyclskbGFzdF0gPSAkdmFsOwp9IGVsc2UgewokY29uZmlnWyRrZXldID0gJHZhbDsKfQp9LCAkbmFtZSwgJHZhbHVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KHN0cmluZyAkbmFtZSk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ3JlbW92ZVByb3BlcnR5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJGtleSk6IHZvaWQgewppZiAoc3RycG9zKCRrZXksICdleHRyYS4nKSA9PT0gMCB8fCBzdHJwb3MoJGtleSwgJ3NjcmlwdHMuJykgPT09IDApIHsKJGJpdHMgPSBleHBsb2RlKCcuJywgJGtleSk7CiRsYXN0ID0gYXJyYXlfcG9wKCRiaXRzKTsKJGFyciA9ICYkY29uZmlnW3Jlc2V0KCRiaXRzKV07CmZvcmVhY2ggKCRiaXRzIGFzICRiaXQpIHsKaWYgKCFpc3NldCgkYXJyWyRiaXRdKSkgewpyZXR1cm47Cn0KJGFyciA9ICYkYXJyWyRiaXRdOwp9CnVuc2V0KCRhcnJbJGxhc3RdKTsKfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1ska2V5XSk7Cn0KfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ2FkZExpbmsnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkdHlwZSwgJG5hbWUsICR2YWx1ZSk6IHZvaWQgewokY29uZmlnWyR0eXBlXVskbmFtZV0gPSAkdmFsdWU7Cn0sICR0eXBlLCAkbmFtZSwgJHZhbHVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUxpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVTdWJOb2RlJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHR5cGUsICRuYW1lKTogdm9pZCB7CnVuc2V0KCRjb25maWdbJHR5cGVdWyRuYW1lXSk7Cn0sICR0eXBlLCAkbmFtZSk7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlTWFpbktleUlmRW1wdHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkdHlwZSk6IHZvaWQgewppZiAoMCA9PT0gY291bnQoJGNvbmZpZ1skdHlwZV0pKSB7CnVuc2V0KCRjb25maWdbJHR5cGVdKTsKfQp9LCAkdHlwZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFuaXB1bGF0ZUpzb24oc3RyaW5nICRtZXRob2QsIGNhbGxhYmxlICRmYWxsYmFjaywgLi4uJGFyZ3MpOiB2b2lkCnsKaWYgKCR0aGlzLT5maWxlLT5leGlzdHMoKSkgewppZiAoIWlzX3dyaXRhYmxlKCR0aGlzLT5maWxlLT5nZXRQYXRoKCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgZmlsZSAiJXMiIGlzIG5vdCB3cml0YWJsZS4nLCAkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSk7Cn0KCmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlIGZpbGUgIiVzIiBpcyBub3QgcmVhZGFibGUuJywgJHRoaXMtPmZpbGUtPmdldFBhdGgoKSkpOwp9CgokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKTsKfSBlbHNlaWYgKCR0aGlzLT5hdXRoQ29uZmlnKSB7CiRjb250ZW50cyA9ICJ7XG59XG4iOwp9IGVsc2UgewokY29udGVudHMgPSAie1xuICAgIFwiY29uZmlnXCI6IHtcbiAgICB9XG59XG4iOwp9CgokbWFuaXB1bGF0b3IgPSBuZXcgSnNvbk1hbmlwdWxhdG9yKCRjb250ZW50cyk7CgokbmV3RmlsZSA9ICEkdGhpcy0+ZmlsZS0+ZXhpc3RzKCk7CgoKaWYgKCR0aGlzLT5hdXRoQ29uZmlnICYmICRtZXRob2QgPT09ICdhZGRDb25maWdTZXR0aW5nJykgewokbWV0aG9kID0gJ2FkZFN1Yk5vZGUnOwpbJG1haW5Ob2RlLCAkbmFtZV0gPSBleHBsb2RlKCcuJywgJGFyZ3NbMF0sIDIpOwokYXJncyA9IFskbWFpbk5vZGUsICRuYW1lLCAkYXJnc1sxXV07Cn0gZWxzZWlmICgkdGhpcy0+YXV0aENvbmZpZyAmJiAkbWV0aG9kID09PSAncmVtb3ZlQ29uZmlnU2V0dGluZycpIHsKJG1ldGhvZCA9ICdyZW1vdmVTdWJOb2RlJzsKWyRtYWluTm9kZSwgJG5hbWVdID0gZXhwbG9kZSgnLicsICRhcmdzWzBdLCAyKTsKJGFyZ3MgPSBbJG1haW5Ob2RlLCAkbmFtZV07Cn0KCgppZiAoY2FsbF91c2VyX2Z1bmNfYXJyYXkoWyRtYW5pcHVsYXRvciwgJG1ldGhvZF0sICRhcmdzKSkgewpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpLCAkbWFuaXB1bGF0b3ItPmdldENvbnRlbnRzKCkpOwp9IGVsc2UgewoKJGNvbmZpZyA9ICR0aGlzLT5maWxlLT5yZWFkKCk7CiR0aGlzLT5hcnJheVVuc2hpZnRSZWYoJGFyZ3MsICRjb25maWcpOwokZmFsbGJhY2soLi4uJGFyZ3MpOwoKZm9yZWFjaCAoWydyZXF1aXJlJywgJ3JlcXVpcmUtZGV2JywgJ2NvbmZsaWN0JywgJ3Byb3ZpZGUnLCAncmVwbGFjZScsICdzdWdnZXN0JywgJ2NvbmZpZycsICdhdXRvbG9hZCcsICdhdXRvbG9hZC1kZXYnLCAnc2NyaXB0cycsICdzY3JpcHRzLWRlc2NyaXB0aW9ucycsICdzdXBwb3J0J10gYXMgJHByb3ApIHsKaWYgKGlzc2V0KCRjb25maWdbJHByb3BdKSAmJiAkY29uZmlnWyRwcm9wXSA9PT0gW10pIHsKJGNvbmZpZ1skcHJvcF0gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KZm9yZWFjaCAoWydwc3ItMCcsICdwc3ItNCddIGFzICRwcm9wKSB7CmlmIChpc3NldCgkY29uZmlnWydhdXRvbG9hZCddWyRwcm9wXSkgJiYgJGNvbmZpZ1snYXV0b2xvYWQnXVskcHJvcF0gPT09IFtdKSB7CiRjb25maWdbJ2F1dG9sb2FkJ11bJHByb3BdID0gbmV3IFxzdGRDbGFzczsKfQppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQtZGV2J11bJHByb3BdKSAmJiAkY29uZmlnWydhdXRvbG9hZC1kZXYnXVskcHJvcF0gPT09IFtdKSB7CiRjb25maWdbJ2F1dG9sb2FkLWRldiddWyRwcm9wXSA9IG5ldyBcc3RkQ2xhc3M7Cn0KfQpmb3JlYWNoIChbJ3BsYXRmb3JtJywgJ2h0dHAtYmFzaWMnLCAnYmVhcmVyJywgJ2dpdGxhYi10b2tlbicsICdnaXRsYWItb2F1dGgnLCAnZ2l0aHViLW9hdXRoJywgJ3ByZWZlcnJlZC1pbnN0YWxsJ10gYXMgJHByb3ApIHsKaWYgKGlzc2V0KCRjb25maWdbJ2NvbmZpZyddWyRwcm9wXSkgJiYgJGNvbmZpZ1snY29uZmlnJ11bJHByb3BdID09PSBbXSkgewokY29uZmlnWydjb25maWcnXVskcHJvcF0gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KJHRoaXMtPmZpbGUtPndyaXRlKCRjb25maWcpOwp9Cgp0cnkgewokdGhpcy0+ZmlsZS0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxBWF9TQ0hFTUEpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewoKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGUtPmdldFBhdGgoKSwgJGNvbnRlbnRzKTsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gdXBkYXRlIGNvbXBvc2VyLmpzb24gd2l0aCBhIHZhbGlkIGZvcm1hdCwgcmV2ZXJ0aW5nIHRvIHRoZSBvcmlnaW5hbCBjb250ZW50LiBQbGVhc2UgcmVwb3J0IGFuIGlzc3VlIHRvIHVzIHdpdGggZGV0YWlscyAoY29tbWFuZCB5b3UgcnVuIGFuZCBhIGNvcHkgb2YgeW91ciBjb21wb3Nlci5qc29uKS4gJy5QSFBfRU9MLmltcGxvZGUoUEhQX0VPTCwgJGUtPmdldEVycm9ycygpKSwgMCwgJGUpOwp9CgppZiAoJG5ld0ZpbGUpIHsKU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJHRoaXMtPmZpbGUtPmdldFBhdGgoKSwgMDYwMCk7Cn0KfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcnJheVVuc2hpZnRSZWYoYXJyYXkgJiRhcnJheSwgJiR2YWx1ZSk6IGludAp7CiRyZXR1cm4gPSBhcnJheV91bnNoaWZ0KCRhcnJheSwgJycpOwokYXJyYXlbMF0gPSAmJHZhbHVlOwoKcmV0dXJuICRyZXR1cm47Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZTsKCnVzZSBDb21wb3NlclxJT1xOdWxsSU87CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIExvZ2ljRXhjZXB0aW9uOwp1c2UgUnVudGltZUV4Y2VwdGlvbjsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uIGFzIEJhc2VBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFF1ZXN0aW9uSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTZWxkXEpzb25MaW50XFBhcnNpbmdFeGNlcHRpb247CnVzZSBDb21wb3NlclxDb21tYW5kOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcVXRpbFxFcnJvckhhbmRsZXI7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxOb1NzbEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBBcHBsaWNhdGlvbiBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbgp7CgoKCnByb3RlY3RlZCAkY29tcG9zZXI7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCnByaXZhdGUgc3RhdGljICRsb2dvID0gJyAgIF9fX19fXwogIC8gX19fXy9fX18gIF9fX18gX19fICBfX19fICBfX19fICBfX19fX19fXyAgX19fX18KIC8gLyAgIC8gX18gXC8gX18gYF9fIFwvIF9fIFwvIF9fIFwvIF9fXy8gXyBcLyBfX18vCi8gL19fXy8gL18vIC8gLyAvIC8gLyAvIC9fLyAvIC9fLyAoX18gICkgIF9fLyAvClxfX19fL1xfX19fL18vIC9fLyAvXy8gLl9fXy9cX19fXy9fX19fL1xfX18vXy8KICAgICAgICAgICAgICAgICAgICAvXy8KJzsKCgpwcml2YXRlICRoYXNQbHVnaW5Db21tYW5kcyA9IGZhbHNlOwoKcHJpdmF0ZSAkZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgPSBmYWxzZTsKCnByaXZhdGUgJGRpc2FibGVTY3JpcHRzQnlEZWZhdWx0ID0gZmFsc2U7CgoKCgpwcml2YXRlICRpbml0aWFsV29ya2luZ0RpcmVjdG9yeTsKCgpwcml2YXRlICRzaWduYWxIYW5kbGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSA9ICdDb21wb3NlcicsIHN0cmluZyAkdmVyc2lvbiA9ICcnKQp7CmlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAnc2V0Q2F0Y2hFcnJvcnMnKSkgewokdGhpcy0+c2V0Q2F0Y2hFcnJvcnModHJ1ZSk7Cn0KCnN0YXRpYyAkc2h1dGRvd25SZWdpc3RlcmVkID0gZmFsc2U7CmlmICgkdmVyc2lvbiA9PT0gJycpIHsKJHZlcnNpb24gPSBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpOwp9CmlmIChmdW5jdGlvbl9leGlzdHMoJ2luaV9zZXQnKSAmJiBleHRlbnNpb25fbG9hZGVkKCd4ZGVidWcnKSkgewppbmlfc2V0KCd4ZGVidWcuc2hvd19leGNlcHRpb25fdHJhY2UnLCAnMCcpOwppbmlfc2V0KCd4ZGVidWcuc2NyZWFtJywgJzAnKTsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCcpICYmIGZ1bmN0aW9uX2V4aXN0cygnZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCcpKSB7CmRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoU2lsZW5jZXI6OmNhbGwoJ2RhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQnKSk7Cn0KCiR0aGlzLT5pbyA9IG5ldyBOdWxsSU8oKTsKCiR0aGlzLT5zaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKFtTaWduYWxIYW5kbGVyOjpTSUdJTlQsIFNpZ25hbEhhbmRsZXI6OlNJR1RFUk0sIFNpZ25hbEhhbmRsZXI6OlNJR0hVUF0sIGZ1bmN0aW9uIChzdHJpbmcgJHNpZ25hbCwgU2lnbmFsSGFuZGxlciAkaGFuZGxlcikgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1JlY2VpdmVkICcuJHNpZ25hbC4nLCBhYm9ydGluZycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgokaGFuZGxlci0+ZXhpdFdpdGhMYXN0U2lnbmFsKCk7Cn0pOwoKaWYgKCEkc2h1dGRvd25SZWdpc3RlcmVkKSB7CiRzaHV0ZG93blJlZ2lzdGVyZWQgPSB0cnVlOwoKcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oc3RhdGljIGZ1bmN0aW9uICgpOiB2b2lkIHsKJGxhc3RFcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CgppZiAoJGxhc3RFcnJvciAmJiAkbGFzdEVycm9yWydtZXNzYWdlJ10gJiYKKHN0cnBvcygkbGFzdEVycm9yWydtZXNzYWdlJ10sICdBbGxvd2VkIG1lbW9yeScpICE9PSBmYWxzZSAgfHwKc3RycG9zKCRsYXN0RXJyb3JbJ21lc3NhZ2UnXSwgJ2V4Y2VlZGVkIG1lbW9yeScpICE9PSBmYWxzZSApKSB7CmVjaG8gIlxuIi4gJ0NoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy90cm91Ymxlc2hvb3RpbmcubWQjbWVtb3J5LWxpbWl0LWVycm9ycyBmb3IgbW9yZSBpbmZvIG9uIGhvdyB0byBoYW5kbGUgb3V0IG9mIG1lbW9yeSBlcnJvcnMuJzsKfQp9KTsKfQoKJHRoaXMtPmluaXRpYWxXb3JraW5nRGlyZWN0b3J5ID0gZ2V0Y3dkKCk7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkdmVyc2lvbik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewokdGhpcy0+c2lnbmFsSGFuZGxlci0+dW5yZWdpc3RlcigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuKD9JbnB1dEludGVyZmFjZSAkaW5wdXQgPSBudWxsLCA/T3V0cHV0SW50ZXJmYWNlICRvdXRwdXQgPSBudWxsKTogaW50CnsKaWYgKG51bGwgPT09ICRvdXRwdXQpIHsKJG91dHB1dCA9IEZhY3Rvcnk6OmNyZWF0ZU91dHB1dCgpOwp9CgpyZXR1cm4gcGFyZW50OjpydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGRvUnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgPSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1wbHVnaW5zJyk7CiR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdCA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXNjcmlwdHMnKTsKCiRzdGRpbiA9IGRlZmluZWQoJ1NURElOJykgPyBTVERJTiA6IGZvcGVuKCdwaHA6Ly9zdGRpbicsICdyJyk7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpICE9PSAnMScgJiYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX05PX0lOVEVSQUNUSU9OJykgfHwgJHN0ZGluID09PSBmYWxzZSB8fCAhUGxhdGZvcm06OmlzVHR5KCRzdGRpbikpKSB7CiRpbnB1dC0+c2V0SW50ZXJhY3RpdmUoZmFsc2UpOwp9CgokaW8gPSAkdGhpcy0+aW8gPSBuZXcgQ29uc29sZUlPKCRpbnB1dCwgJG91dHB1dCwgbmV3IEhlbHBlclNldChbCm5ldyBRdWVzdGlvbkhlbHBlcigpLApdKSk7CgoKRXJyb3JIYW5kbGVyOjpyZWdpc3RlcigkaW8pOwoKaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLWNhY2hlJykpIHsKJGlvLT53cml0ZUVycm9yKCdEaXNhYmxpbmcgY2FjaGUgdXNhZ2UnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9DQUNIRV9ESVInLCBQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgPyAnbnVsJyA6ICcvZGV2L251bGwnKTsKfQoKCiRuZXdXb3JrRGlyID0gJHRoaXMtPmdldE5ld1dvcmtpbmdEaXIoJGlucHV0KTsKaWYgKG51bGwgIT09ICRuZXdXb3JrRGlyKSB7CiRvbGRXb3JraW5nRGlyID0gUGxhdGZvcm06OmdldEN3ZCh0cnVlKTsKY2hkaXIoJG5ld1dvcmtEaXIpOwokdGhpcy0+aW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkgPSAkbmV3V29ya0RpcjsKJGN3ZCA9IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CiRpby0+d3JpdGVFcnJvcignQ2hhbmdlZCBDV0QgdG8gJyAuICgkY3dkICE9PSAnJyA/ICRjd2QgOiAkbmV3V29ya0RpciksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KCgokY29tbWFuZE5hbWUgPSAnJzsKaWYgKCRuYW1lID0gJHRoaXMtPmdldENvbW1hbmROYW1lKCRpbnB1dCkpIHsKdHJ5IHsKJGNvbW1hbmROYW1lID0gJHRoaXMtPmZpbmQoJG5hbWUpLT5nZXROYW1lKCk7Cn0gY2F0Y2ggKENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiAkZSkgewoKJGNvbW1hbmROYW1lID0gZmFsc2U7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKfQp9CgoKaWYgKCRpby0+aXNJbnRlcmFjdGl2ZSgpICYmIG51bGwgPT09ICRuZXdXb3JrRGlyICYmICFpbl9hcnJheSgkY29tbWFuZE5hbWUsIFsnJywgJ2xpc3QnLCAnaW5pdCcsICdhYm91dCcsICdoZWxwJywgJ2RpYWdub3NlJywgJ3NlbGYtdXBkYXRlJywgJ2dsb2JhbCcsICdjcmVhdGUtcHJvamVjdCcsICdvdXRkYXRlZCddLCB0cnVlKSAmJiAhZmlsZV9leGlzdHMoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpICYmICgkdXNlUGFyZW50RGlySWZOb0pzb25BdmFpbGFibGUgPSAkdGhpcy0+Z2V0VXNlUGFyZW50RGlyQ29uZmlnVmFsdWUoKSkgIT09IGZhbHNlKSB7CiRkaXIgPSBkaXJuYW1lKFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSkpOwokaG9tZSA9IHJlYWxwYXRoKFBsYXRmb3JtOjpnZXRFbnYoJ0hPTUUnKSA/OiBQbGF0Zm9ybTo6Z2V0RW52KCdVU0VSUFJPRklMRScpID86ICcvJyk7CgoKd2hpbGUgKGRpcm5hbWUoJGRpcikgIT09ICRkaXIgJiYgJGRpciAhPT0gJGhvbWUpIHsKaWYgKGZpbGVfZXhpc3RzKCRkaXIuJy8nLkZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpKSkgewppZiAoJHVzZVBhcmVudERpcklmTm9Kc29uQXZhaWxhYmxlID09PSB0cnVlIHx8ICRpby0+YXNrQ29uZmlybWF0aW9uKCc8aW5mbz5ObyBjb21wb3Nlci5qc29uIGluIGN1cnJlbnQgZGlyZWN0b3J5LCBkbyB5b3Ugd2FudCB0byB1c2UgdGhlIG9uZSBhdCAnLiRkaXIuJz88L2luZm8+IFs8Y29tbWVudD5ZLG48L2NvbW1lbnQ+XT8gJykpIHsKaWYgKCR1c2VQYXJlbnREaXJJZk5vSnNvbkF2YWlsYWJsZSA9PT0gdHJ1ZSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk5vIGNvbXBvc2VyLmpzb24gaW4gY3VycmVudCBkaXJlY3RvcnksIGNoYW5naW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICcuJGRpci4nPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkFsd2F5cyB3YW50IHRvIHVzZSB0aGUgcGFyZW50IGRpcj8gVXNlICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgdXNlLXBhcmVudC1kaXIgdHJ1ZSIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0LjwvaW5mbz4nKTsKfQokb2xkV29ya2luZ0RpciA9IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CmNoZGlyKCRkaXIpOwp9CmJyZWFrOwp9CiRkaXIgPSBkaXJuYW1lKCRkaXIpOwp9Cn0KCiRuZWVkc1N1ZG9DaGVjayA9ICFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkKJiYgZnVuY3Rpb25fZXhpc3RzKCdleGVjJykKJiYgIVBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0FMTE9XX1NVUEVSVVNFUicpCiYmIChpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSB8fCAhZmlsZV9leGlzdHMoJy8uZG9ja2VyZW52JykpOwokaXNOb25BbGxvd2VkUm9vdCA9IGZhbHNlOwoKCmlmICgkbmVlZHNTdWRvQ2hlY2spIHsKJGlzTm9uQWxsb3dlZFJvb3QgPSBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHVpZCcpICYmIHBvc2l4X2dldHVpZCgpID09PSAwOwoKaWYgKCRpc05vbkFsbG93ZWRSb290KSB7CmlmICgkdWlkID0gKGludCkgUGxhdGZvcm06OmdldEVudignU1VET19VSUQnKSkgewoKClNpbGVuY2VyOjpjYWxsKCdleGVjJywgInN1ZG8gLXUgXFwjeyR1aWR9IHN1ZG8gLUsgPiAvZGV2L251bGwgMj4mMSIpOwp9Cn0KCgpTaWxlbmNlcjo6Y2FsbCgnZXhlYycsICdzdWRvIC1LID4gL2Rldi9udWxsIDI+JjEnKTsKfQoKCgokbWF5TmVlZFBsdWdpbkNvbW1hbmQgPSBmYWxzZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLXZlcnNpb24nLCAnLVYnXSkKJiYgKAoKZmFsc2UgPT09ICRjb21tYW5kTmFtZQoKfHwgaW5fYXJyYXkoJGNvbW1hbmROYW1lLCBbJycsICdsaXN0JywgJ2hlbHAnXSwgdHJ1ZSkKCgp8fCAoJGNvbW1hbmROYW1lID09PSAnX2NvbXBsZXRlJyAmJiAhJGlzTm9uQWxsb3dlZFJvb3QpCik7CgppZiAoJG1heU5lZWRQbHVnaW5Db21tYW5kICYmICEkdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgJiYgISR0aGlzLT5oYXNQbHVnaW5Db21tYW5kcykgewoKCmlmICgkaXNOb25BbGxvd2VkUm9vdCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkRvIG5vdCBydW4gQ29tcG9zZXIgYXMgcm9vdC9zdXBlciB1c2VyISBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdCBmb3IgZGV0YWlsczwvd2FybmluZz4nKTsKCmlmICgkaW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAkaW8tPmFza0NvbmZpcm1hdGlvbignPGluZm8+Q29udGludWUgYXMgcm9vdC9zdXBlciB1c2VyPC9pbmZvPiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CgokaXNOb25BbGxvd2VkUm9vdCA9IGZhbHNlOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkFib3J0aW5nIGFzIG5vIHBsdWdpbiBzaG91bGQgYmUgbG9hZGVkIGlmIHJ1bm5pbmcgYXMgc3VwZXIgdXNlciBpcyBub3QgZXhwbGljaXRseSBhbGxvd2VkPC93YXJuaW5nPicpOwoKcmV0dXJuIDE7Cn0KfQoKdHJ5IHsKZm9yZWFjaCAoJHRoaXMtPmdldFBsdWdpbkNvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKaWYgKCR0aGlzLT5oYXMoJGNvbW1hbmQtPmdldE5hbWUoKSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5QbHVnaW4gY29tbWFuZCAnLiRjb21tYW5kLT5nZXROYW1lKCkuJyAoJy5nZXRfY2xhc3MoJGNvbW1hbmQpLicpIHdvdWxkIG92ZXJyaWRlIGEgQ29tcG9zZXIgY29tbWFuZCBhbmQgaGFzIGJlZW4gc2tpcHBlZDwvd2FybmluZz4nKTsKfSBlbHNlIHsKJHRoaXMtPmFkZCgkY29tbWFuZCk7Cn0KfQp9IGNhdGNoIChOb1NzbEV4Y2VwdGlvbiAkZSkgewoKfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiAkZSkgewokZGV0YWlscyA9ICRlLT5nZXREZXRhaWxzKCk7CgokZmlsZSA9IHJlYWxwYXRoKEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpKTsKCiRsaW5lID0gbnVsbDsKaWYgKCRkZXRhaWxzICYmIGlzc2V0KCRkZXRhaWxzWydsaW5lJ10pKSB7CiRsaW5lID0gJGRldGFpbHNbJ2xpbmUnXTsKfQoKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlLT5nZXRNZXNzYWdlKCksICRmaWxlLCAkbGluZSk7Cgp0aHJvdyAkZTsKfQoKJHRoaXMtPmhhc1BsdWdpbkNvbW1hbmRzID0gdHJ1ZTsKfQoKaWYgKCRpc05vbkFsbG93ZWRSb290ICYmICEkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Db21wb3NlciBwbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZCBmb3Igc2FmZXR5IGluIHRoaXMgbm9uLWludGVyYWN0aXZlIHNlc3Npb24uIFNldCBDT01QT1NFUl9BTExPV19TVVBFUlVTRVI9MSBpZiB5b3Ugd2FudCB0byBhbGxvdyBwbHVnaW5zIHRvIHJ1biBhcyByb290L3N1cGVyIHVzZXIuPC9lcnJvcj4nKTsKJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ID0gdHJ1ZTsKfQoKCiRpc1Byb3h5Q29tbWFuZCA9IGZhbHNlOwppZiAoJG5hbWUgPSAkdGhpcy0+Z2V0Q29tbWFuZE5hbWUoJGlucHV0KSkgewp0cnkgewokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRuYW1lKTsKJGNvbW1hbmROYW1lID0gJGNvbW1hbmQtPmdldE5hbWUoKTsKJGlzUHJveHlDb21tYW5kID0gKCRjb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZFxCYXNlQ29tbWFuZCAmJiAkY29tbWFuZC0+aXNQcm94eUNvbW1hbmQoKSk7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKfQp9CgppZiAoISRpc1Byb3h5Q29tbWFuZCkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1J1bm5pbmcgJXMgKCVzKSB3aXRoICVzIG9uICVzJywKQ29tcG9zZXI6OmdldFZlcnNpb24oKSwKQ29tcG9zZXI6OlJFTEVBU0VfREFURSwKZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgPyAnSEhWTSAnLkhIVk1fVkVSU0lPTiA6ICdQSFAgJy5QSFBfVkVSU0lPTiwKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncycpIC4gJyAvICcgLiBwaHBfdW5hbWUoJ3InKSA6ICdVbmtub3duIE9TJwopLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAyMDUpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Db21wb3NlciBzdXBwb3J0cyBQSFAgNy4yLjUgYW5kIGFib3ZlLCB5b3Ugd2lsbCBtb3N0IGxpa2VseSBlbmNvdW50ZXIgcHJvYmxlbXMgd2l0aCB5b3VyIFBIUCAnLlBIUF9WRVJTSU9OLicuIFVwZ3JhZGluZyBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCBidXQgeW91IGNhbiB1c2UgQ29tcG9zZXIgMi4yLnggTFRTIGFzIGEgZmFsbGJhY2suPC93YXJuaW5nPicpOwp9CgppZiAoWGRlYnVnSGFuZGxlcjo6aXNYZGVidWdBY3RpdmUoKSAmJiAhUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9YREVCVUdfV0FSTicpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgaXMgb3BlcmF0aW5nIHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIHlvdSBoYXZlIFhkZWJ1ZyBlbmFibGVkLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcveGRlYnVnPC93YXJuaW5nPicpOwp9CgppZiAoZGVmaW5lZCgnQ09NUE9TRVJfREVWX1dBUk5JTkdfVElNRScpICYmICRjb21tYW5kTmFtZSAhPT0gJ3NlbGYtdXBkYXRlJyAmJiAkY29tbWFuZE5hbWUgIT09ICdzZWxmdXBkYXRlJyAmJiB0aW1lKCkgPiBDT01QT1NFUl9ERVZfV0FSTklOR19USU1FKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8d2FybmluZz5XYXJuaW5nOiBUaGlzIGRldmVsb3BtZW50IGJ1aWxkIG9mIENvbXBvc2VyIGlzIG92ZXIgNjAgZGF5cyBvbGQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVwZGF0ZSBpdCBieSBydW5uaW5nICIlcyBzZWxmLXVwZGF0ZSIgdG8gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbi48L3dhcm5pbmc+JywgJF9TRVJWRVJbJ1BIUF9TRUxGJ10pKTsKfQoKaWYgKCRpc05vbkFsbG93ZWRSb290KSB7CmlmICgkY29tbWFuZE5hbWUgIT09ICdzZWxmLXVwZGF0ZScgJiYgJGNvbW1hbmROYW1lICE9PSAnc2VsZnVwZGF0ZScgJiYgJGNvbW1hbmROYW1lICE9PSAnX2NvbXBsZXRlJykgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkRvIG5vdCBydW4gQ29tcG9zZXIgYXMgcm9vdC9zdXBlciB1c2VyISBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdCBmb3IgZGV0YWlsczwvd2FybmluZz4nKTsKCmlmICgkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKCc8aW5mbz5Db250aW51ZSBhcyByb290L3N1cGVyIHVzZXI8L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKcmV0dXJuIDE7Cn0KfQp9Cn0KCgpTaWxlbmNlcjo6Y2FsbChzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkaW8pOiB2b2lkIHsKJHBpZCA9IGZ1bmN0aW9uX2V4aXN0cygnZ2V0bXlwaWQnKSA/IGdldG15cGlkKCkgLiAnLScgOiAnJzsKJHRlbXBmaWxlID0gc3lzX2dldF90ZW1wX2RpcigpIC4gJy90ZW1wLScgLiAkcGlkIC4gbWQ1KG1pY3JvdGltZSgpKTsKaWYgKCEoZmlsZV9wdXRfY29udGVudHMoJHRlbXBmaWxlLCBfX0ZJTEVfXykgJiYgKGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wZmlsZSkgPT09IF9fRklMRV9fKSAmJiB1bmxpbmsoJHRlbXBmaWxlKSAmJiAhZmlsZV9leGlzdHMoJHRlbXBmaWxlKSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5QSFAgdGVtcCBkaXJlY3RvcnkgKCVzKSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgd3JpdGFibGUgdG8gQ29tcG9zZXIuIFNldCBzeXNfdGVtcF9kaXIgaW4geW91ciBwaHAuaW5pPC9lcnJvcj4nLCBzeXNfZ2V0X3RlbXBfZGlyKCkpKTsKfQp9KTsKCgokZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwppZiAoaXNfZmlsZSgkZmlsZSkgJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkZmlsZSkgJiYgaXNfYXJyYXkoJGNvbXBvc2VyID0ganNvbl9kZWNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCB0cnVlKSkpIHsKaWYgKGlzc2V0KCRjb21wb3Nlclsnc2NyaXB0cyddKSAmJiBpc19hcnJheSgkY29tcG9zZXJbJ3NjcmlwdHMnXSkpIHsKZm9yZWFjaCAoJGNvbXBvc2VyWydzY3JpcHRzJ10gYXMgJHNjcmlwdCA9PiAkZHVtbXkpIHsKaWYgKCFkZWZpbmVkKCdDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOjonLnN0cl9yZXBsYWNlKCctJywgJ18nLCBzdHJ0b3VwcGVyKCRzY3JpcHQpKSkpIHsKaWYgKCR0aGlzLT5oYXMoJHNjcmlwdCkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BIHNjcmlwdCBuYW1lZCAnLiRzY3JpcHQuJyB3b3VsZCBvdmVycmlkZSBhIENvbXBvc2VyIGNvbW1hbmQgYW5kIGhhcyBiZWVuIHNraXBwZWQ8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiRkZXNjcmlwdGlvbiA9IG51bGw7CgppZiAoaXNzZXQoJGNvbXBvc2VyWydzY3JpcHRzLWRlc2NyaXB0aW9ucyddWyRzY3JpcHRdKSkgewokZGVzY3JpcHRpb24gPSAkY29tcG9zZXJbJ3NjcmlwdHMtZGVzY3JpcHRpb25zJ11bJHNjcmlwdF07Cn0KCiR0aGlzLT5hZGQobmV3IENvbW1hbmRcU2NyaXB0QWxpYXNDb21tYW5kKCRzY3JpcHQsICRkZXNjcmlwdGlvbikpOwp9Cn0KfQp9Cn0KfQoKdHJ5IHsKaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLXByb2ZpbGUnKSkgewokc3RhcnRUaW1lID0gbWljcm90aW1lKHRydWUpOwokdGhpcy0+aW8tPmVuYWJsZURlYnVnZ2luZygkc3RhcnRUaW1lKTsKfQoKJHJlc3VsdCA9IHBhcmVudDo6ZG9SdW4oJGlucHV0LCAkb3V0cHV0KTsKCgppZiAoaXNzZXQoJG9sZFdvcmtpbmdEaXIpICYmICcnICE9PSAkb2xkV29ya2luZ0RpcikgewpTaWxlbmNlcjo6Y2FsbCgnY2hkaXInLCAkb2xkV29ya2luZ0Rpcik7Cn0KCmlmIChpc3NldCgkc3RhcnRUaW1lKSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk1lbW9yeSB1c2FnZTogJy5yb3VuZChtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDI0IC8gMTAyNCwgMikuJ01pQiAocGVhazogJy5yb3VuZChtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKSAvIDEwMjQgLyAxMDI0LCAyKS4nTWlCKSwgdGltZTogJy5yb3VuZChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnRUaW1lLCAyKS4ncycpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfSBjYXRjaCAoU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uICRlKSB7CnJldHVybiAkZS0+Z2V0Q29kZSgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZS0+Z2V0TWVzc2FnZSgpKTsKCiR0aGlzLT5oaW50Q29tbW9uRXJyb3JzKCRlLCAkb3V0cHV0KTsKCgoKCmlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJ3NldENhdGNoRXJyb3JzJykgJiYgISRlIGluc3RhbmNlb2YgXEV4Y2VwdGlvbikgewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJHRoaXMtPnJlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0gZWxzZSB7CiR0aGlzLT5yZW5kZXJUaHJvd2FibGUoJGUsICRvdXRwdXQpOwp9CgpyZXR1cm4gbWF4KDEsICRlLT5nZXRDb2RlKCkpOwp9Cgp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TmV3V29ya2luZ0RpcihJbnB1dEludGVyZmFjZSAkaW5wdXQpOiA/c3RyaW5nCnsKCiR3b3JraW5nRGlyID0gJGlucHV0LT5nZXRQYXJhbWV0ZXJPcHRpb24oWyctLXdvcmtpbmctZGlyJywgJy1kJ10sIG51bGwsIHRydWUpOwppZiAobnVsbCAhPT0gJHdvcmtpbmdEaXIgJiYgIWlzX2Rpcigkd29ya2luZ0RpcikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIHdvcmtpbmcgZGlyZWN0b3J5IHNwZWNpZmllZCwgJy4kd29ya2luZ0Rpci4nIGRvZXMgbm90IGV4aXN0LicpOwp9CgpyZXR1cm4gJHdvcmtpbmdEaXI7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaGludENvbW1vbkVycm9ycyhcVGhyb3dhYmxlICRleGNlcHRpb24sIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKChnZXRfY2xhc3MoJGV4Y2VwdGlvbikgPT09IExvZ2ljRXhjZXB0aW9uOjpjbGFzcyB8fCAkZXhjZXB0aW9uIGluc3RhbmNlb2YgXEVycm9yKSAmJiAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSA8IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UpIHsKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UpOwp9CgpTaWxlbmNlcjo6c3VwcHJlc3MoKTsKdHJ5IHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldENvbXBvc2VyKGZhbHNlLCB0cnVlKTsKaWYgKG51bGwgIT09ICRjb21wb3NlciAmJiBmdW5jdGlvbl9leGlzdHMoJ2Rpc2tfZnJlZV9zcGFjZScpKSB7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJG1pblNwYWNlRnJlZSA9IDEwMCAqIDEwMjQgKiAxMDI0OwppZiAoKCgkZGYgPSBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgnaG9tZScpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCnx8ICgoJGRmID0gZGlza19mcmVlX3NwYWNlKCRkaXIgPSAkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSkpICE9PSBmYWxzZSAmJiAkZGYgPCAkbWluU3BhY2VGcmVlKQp8fCAoKCRkZiA9IGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gc3lzX2dldF90ZW1wX2RpcigpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCikgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgZGlzayBob3N0aW5nICcuJGRpci4nIGhhcyBsZXNzIHRoYW4gMTAwTWlCIG9mIGZyZWUgc3BhY2UsIHRoaXMgbWF5IGJlIHRoZSBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQpTaWxlbmNlcjo6cmVzdG9yZSgpOwoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBmYWxzZSAhPT0gc3RycG9zKCRleGNlcHRpb24tPmdldE1lc3NhZ2UoKSwgJ1RoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIHBhdGggc3BlY2lmaWVkJykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gbWF5IGJlIGNhdXNlZCBieSBhIHN0YWxlIGVudHJ5IGluIHlvdXIgY21kLmV4ZSBBdXRvUnVuPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5DaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kIy10aGUtc3lzdGVtLWNhbm5vdC1maW5kLXRoZS1wYXRoLXNwZWNpZmllZC13aW5kb3dzLSBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKaWYgKGZhbHNlICE9PSBzdHJwb3MoJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCAnZm9yayBmYWlsZWQgLSBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5JykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaXMgY2F1c2VkIGJ5IGEgbGFjayBvZiBtZW1vcnkgb3Igc3dhcCwgb3Igbm90IGhhdmluZyBzd2FwIGNvbmZpZ3VyZWQ8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy90cm91Ymxlc2hvb3RpbmcubWQjcHJvYy1vcGVuLWZvcmstZmFpbGVkLWVycm9ycyBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKaWYgKCRleGNlcHRpb24gaW5zdGFuY2VvZiBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb24pIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaXMgY2F1c2VkIGJ5IGEgcHJvY2VzcyB0aW1lb3V0PC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5DaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDYtY29uZmlnLm1kI3Byb2Nlc3MtdGltZW91dCBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKJGhpbnRzID0gSHR0cERvd25sb2FkZXI6OmdldEV4Y2VwdGlvbkhpbnRzKCRleGNlcHRpb24pOwppZiAobnVsbCAhPT0gJGhpbnRzICYmIGNvdW50KCRoaW50cykgPiAwKSB7CmZvcmVhY2ggKCRoaW50cyBhcyAkaGludCkgewokaW8tPndyaXRlRXJyb3IoJGhpbnQsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3Nlcihib29sICRyZXF1aXJlZCA9IHRydWUsID9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiA/Q29tcG9zZXIKewppZiAobnVsbCA9PT0gJGRpc2FibGVQbHVnaW5zKSB7CiRkaXNhYmxlUGx1Z2lucyA9ICR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdDsKfQppZiAobnVsbCA9PT0gJGRpc2FibGVTY3JpcHRzKSB7CiRkaXNhYmxlU2NyaXB0cyA9ICR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdDsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5jb21wb3Nlcikgewp0cnkgewokdGhpcy0+Y29tcG9zZXIgPSBGYWN0b3J5OjpjcmVhdGUoUGxhdGZvcm06OmlzSW5wdXRDb21wbGV0aW9uUHJvY2VzcygpID8gbmV3IE51bGxJTygpIDogJHRoaXMtPmlvLCBudWxsLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKaWYgKCRyZXF1aXJlZCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJGUtPmdldE1lc3NhZ2UoKSk7CmlmICgkdGhpcy0+YXJlRXhjZXB0aW9uc0NhdWdodCgpKSB7CmV4aXQoMSk7Cn0KdGhyb3cgJGU7Cn0KfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKaWYgKCRyZXF1aXJlZCkgewp0aHJvdyAkZTsKfQp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkcmVxdWlyZWQpIHsKdGhyb3cgJGU7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRDb21wb3NlcigpOiB2b2lkCnsKJHRoaXMtPmNvbXBvc2VyID0gbnVsbDsKaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMtPmdldElPKCksICdyZXNldEF1dGhlbnRpY2F0aW9ucycpKSB7CiR0aGlzLT5nZXRJTygpLT5yZXNldEF1dGhlbnRpY2F0aW9ucygpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpOiBJT0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjokbG9nbyAuIHBhcmVudDo6Z2V0SGVscCgpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRDb21tYW5kcygpOiBhcnJheQp7CiRjb21tYW5kcyA9IGFycmF5X21lcmdlKHBhcmVudDo6Z2V0RGVmYXVsdENvbW1hbmRzKCksIFsKbmV3IENvbW1hbmRcQWJvdXRDb21tYW5kKCksCm5ldyBDb21tYW5kXENvbmZpZ0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcRGVwZW5kc0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcUHJvaGliaXRzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxJbml0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxJbnN0YWxsQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxDcmVhdGVQcm9qZWN0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxVcGRhdGVDb21tYW5kKCksCm5ldyBDb21tYW5kXFNlYXJjaENvbW1hbmQoKSwKbmV3IENvbW1hbmRcVmFsaWRhdGVDb21tYW5kKCksCm5ldyBDb21tYW5kXEF1ZGl0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxTaG93Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxTdWdnZXN0c0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcUmVxdWlyZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcRHVtcEF1dG9sb2FkQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxTdGF0dXNDb21tYW5kKCksCm5ldyBDb21tYW5kXEFyY2hpdmVDb21tYW5kKCksCm5ldyBDb21tYW5kXERpYWdub3NlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSdW5TY3JpcHRDb21tYW5kKCksCm5ldyBDb21tYW5kXExpY2Vuc2VzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxHbG9iYWxDb21tYW5kKCksCm5ldyBDb21tYW5kXENsZWFyQ2FjaGVDb21tYW5kKCksCm5ldyBDb21tYW5kXFJlbW92ZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcSG9tZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcRXhlY0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcT3V0ZGF0ZWRDb21tYW5kKCksCm5ldyBDb21tYW5kXENoZWNrUGxhdGZvcm1SZXFzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxGdW5kQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSZWluc3RhbGxDb21tYW5kKCksCm5ldyBDb21tYW5kXEJ1bXBDb21tYW5kKCksCl0pOwoKaWYgKHN0cnBvcyhfX0ZJTEVfXywgJ3BoYXI6JykgPT09IDAgfHwgJzEnID09PSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpKSB7CiRjb21tYW5kc1tdID0gbmV3IENvbW1hbmRcU2VsZlVwZGF0ZUNvbW1hbmQoKTsKfQoKcmV0dXJuICRjb21tYW5kczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvbmdWZXJzaW9uKCk6IHN0cmluZwp7CiRicmFuY2hBbGlhc1N0cmluZyA9ICcnOwppZiAoQ29tcG9zZXI6OkJSQU5DSF9BTElBU19WRVJTSU9OICYmIENvbXBvc2VyOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTiAhPT0gJ0BwYWNrYWdlX2JyYW5jaF9hbGlhc192ZXJzaW9uJy4nQCcpIHsKJGJyYW5jaEFsaWFzU3RyaW5nID0gc3ByaW50ZignICglcyknLCBDb21wb3Nlcjo6QlJBTkNIX0FMSUFTX1ZFUlNJT04pOwp9CgpyZXR1cm4gc3ByaW50ZigKJzxpbmZvPiVzPC9pbmZvPiB2ZXJzaW9uIDxjb21tZW50PiVzJXM8L2NvbW1lbnQ+ICVzJywKJHRoaXMtPmdldE5hbWUoKSwKJHRoaXMtPmdldFZlcnNpb24oKSwKJGJyYW5jaEFsaWFzU3RyaW5nLApDb21wb3Nlcjo6UkVMRUFTRV9EQVRFCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk6IElucHV0RGVmaW5pdGlvbgp7CiRkZWZpbml0aW9uID0gcGFyZW50OjpnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLXByb2ZpbGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgdGltaW5nIGFuZCBtZW1vcnkgdXNhZ2UgaW5mb3JtYXRpb24nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLXBsdWdpbnMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gZGlzYWJsZSBwbHVnaW5zLicpKTsKJGRlZmluaXRpb24tPmFkZE9wdGlvbihuZXcgSW5wdXRPcHRpb24oJy0tbm8tc2NyaXB0cycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgdGhlIGV4ZWN1dGlvbiBvZiBhbGwgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb24gZmlsZS4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLXdvcmtpbmctZGlyJywgJy1kJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnSWYgc3BlY2lmaWVkLCB1c2UgdGhlIGdpdmVuIGRpcmVjdG9yeSBhcyB3b3JraW5nIGRpcmVjdG9yeS4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLWNhY2hlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmV2ZW50IHVzZSBvZiB0aGUgY2FjaGUnKSk7CgpyZXR1cm4gJGRlZmluaXRpb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGx1Z2luQ29tbWFuZHMoKTogYXJyYXkKewokY29tbWFuZHMgPSBbXTsKCiRjb21wb3NlciA9ICR0aGlzLT5nZXRDb21wb3NlcihmYWxzZSwgZmFsc2UpOwppZiAobnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZUdsb2JhbCgkdGhpcy0+aW8sICR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCwgJHRoaXMtPmRpc2FibGVTY3JpcHRzQnlEZWZhdWx0KTsKfQoKaWYgKG51bGwgIT09ICRjb21wb3NlcikgewokcG0gPSAkY29tcG9zZXItPmdldFBsdWdpbk1hbmFnZXIoKTsKZm9yZWFjaCAoJHBtLT5nZXRQbHVnaW5DYXBhYmlsaXRpZXMoJ0NvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5XENvbW1hbmRQcm92aWRlcicsIFsnY29tcG9zZXInID0+ICRjb21wb3NlciwgJ2lvJyA9PiAkdGhpcy0+aW9dKSBhcyAkY2FwYWJpbGl0eSkgewokbmV3Q29tbWFuZHMgPSAkY2FwYWJpbGl0eS0+Z2V0Q29tbWFuZHMoKTsKaWYgKCFpc19hcnJheSgkbmV3Q29tbWFuZHMpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gY2FwYWJpbGl0eSAnLmdldF9jbGFzcygkY2FwYWJpbGl0eSkuJyBmYWlsZWQgdG8gcmV0dXJuIGFuIGFycmF5IGZyb20gZ2V0Q29tbWFuZHMnKTsKfQpmb3JlYWNoICgkbmV3Q29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKaWYgKCEkY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRcQmFzZUNvbW1hbmQpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1BsdWdpbiBjYXBhYmlsaXR5ICcuZ2V0X2NsYXNzKCRjYXBhYmlsaXR5KS4nIHJldHVybmVkIGFuIGludmFsaWQgdmFsdWUsIHdlIGV4cGVjdGVkIGFuIGFycmF5IG9mIENvbXBvc2VyXENvbW1hbmRcQmFzZUNvbW1hbmQgb2JqZWN0cycpOwp9Cn0KJGNvbW1hbmRzID0gYXJyYXlfbWVyZ2UoJGNvbW1hbmRzLCAkbmV3Q29tbWFuZHMpOwp9Cn0KCnJldHVybiAkY29tbWFuZHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkKewpyZXR1cm4gJHRoaXMtPmluaXRpYWxXb3JraW5nRGlyZWN0b3J5Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFVzZVBhcmVudERpckNvbmZpZ1ZhbHVlKCkKewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCR0aGlzLT5pbyk7CgpyZXR1cm4gJGNvbmZpZy0+Z2V0KCd1c2UtcGFyZW50LWRpcicpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGU7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKZmluYWwgY2xhc3MgR2l0aHViQWN0aW9uRXJyb3IKewoKCgpwcm90ZWN0ZWQgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbWl0KHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsKTogdm9pZAp7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICYmICFQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpKSB7CiRtZXNzYWdlID0gJHRoaXMtPmVzY2FwZURhdGEoJG1lc3NhZ2UpOwoKaWYgKCRmaWxlICYmICRsaW5lKSB7CiRmaWxlID0gJHRoaXMtPmVzY2FwZVByb3BlcnR5KCRmaWxlKTsKJHRoaXMtPmlvLT53cml0ZSgiOjplcnJvciBmaWxlPSIuICRmaWxlIC4iLGxpbmU9Ii4gJGxpbmUgLiI6OiIuICRtZXNzYWdlKTsKfSBlbHNlaWYgKCRmaWxlKSB7CiRmaWxlID0gJHRoaXMtPmVzY2FwZVByb3BlcnR5KCRmaWxlKTsKJHRoaXMtPmlvLT53cml0ZSgiOjplcnJvciBmaWxlPSIuICRmaWxlIC4iOjoiLiAkbWVzc2FnZSk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGUoIjo6ZXJyb3IgOjoiLiAkbWVzc2FnZSk7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGVzY2FwZURhdGEoc3RyaW5nICRkYXRhKTogc3RyaW5nCnsKCiRkYXRhID0gc3RyX3JlcGxhY2UoIiUiLCAnJTI1JywgJGRhdGEpOwokZGF0YSA9IHN0cl9yZXBsYWNlKCJcciIsICclMEQnLCAkZGF0YSk7CiRkYXRhID0gc3RyX3JlcGxhY2UoIlxuIiwgJyUwQScsICRkYXRhKTsKCnJldHVybiAkZGF0YTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVQcm9wZXJ0eShzdHJpbmcgJHByb3BlcnR5KTogc3RyaW5nCnsKCiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCIlIiwgJyUyNScsICRwcm9wZXJ0eSk7CiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCJcciIsICclMEQnLCAkcHJvcGVydHkpOwokcHJvcGVydHkgPSBzdHJfcmVwbGFjZSgiXG4iLCAnJTBBJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIjoiLCAnJTNBJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIiwiLCAnJTJDJywgJHByb3BlcnR5KTsKCnJldHVybiAkcHJvcGVydHk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZTsKCnVzZSBDbG9zdXJlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyU3R5bGU7CgoKCgpjbGFzcyBIdG1sT3V0cHV0Rm9ybWF0dGVyIGV4dGVuZHMgT3V0cHV0Rm9ybWF0dGVyCnsKCnByaXZhdGUgc3RhdGljICRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzID0gWwozMCA9PiAnYmxhY2snLAozMSA9PiAncmVkJywKMzIgPT4gJ2dyZWVuJywKMzMgPT4gJ3llbGxvdycsCjM0ID0+ICdibHVlJywKMzUgPT4gJ21hZ2VudGEnLAozNiA9PiAnY3lhbicsCjM3ID0+ICd3aGl0ZScsCl07Cgpwcml2YXRlIHN0YXRpYyAkYXZhaWxhYmxlQmFja2dyb3VuZENvbG9ycyA9IFsKNDAgPT4gJ2JsYWNrJywKNDEgPT4gJ3JlZCcsCjQyID0+ICdncmVlbicsCjQzID0+ICd5ZWxsb3cnLAo0NCA9PiAnYmx1ZScsCjQ1ID0+ICdtYWdlbnRhJywKNDYgPT4gJ2N5YW4nLAo0NyA9PiAnd2hpdGUnLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGF2YWlsYWJsZU9wdGlvbnMgPSBbCjEgPT4gJ2JvbGQnLAo0ID0+ICd1bmRlcnNjb3JlJywKCgoKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc3R5bGVzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCh0cnVlLCAkc3R5bGVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdCg/c3RyaW5nICRtZXNzYWdlKTogP3N0cmluZwp7CiRmb3JtYXR0ZWQgPSBwYXJlbnQ6OmZvcm1hdCgkbWVzc2FnZSk7CgppZiAoJGZvcm1hdHRlZCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKJGNsZWFyRXNjYXBlQ29kZXMgPSAnKD86Mzl8NDl8MHwyMnwyNHwyNXwyN3wyOCknOwoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygie1wwMzNcWyhbMC05O10rKW0oLio/KVwwMzNcWyg/OiIuJGNsZWFyRXNjYXBlQ29kZXMuIjspKj8iLiRjbGVhckVzY2FwZUNvZGVzLiJtfXMiLCBDbG9zdXJlOjpmcm9tQ2FsbGFibGUoWyR0aGlzLCAnZm9ybWF0SHRtbCddKSwgJGZvcm1hdHRlZCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZm9ybWF0SHRtbChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZwp7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbMV0pKTsKJG91dCA9ICc8c3BhbiBzdHlsZT0iJzsKZm9yZWFjaCAoZXhwbG9kZSgnOycsICRtYXRjaGVzWzFdKSBhcyAkY29kZSkgewppZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZUZvcmVncm91bmRDb2xvcnNbKGludCkgJGNvZGVdKSkgewokb3V0IC49ICdjb2xvcjonLnNlbGY6OiRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzWyhpbnQpICRjb2RlXS4nOyc7Cn0gZWxzZWlmIChpc3NldChzZWxmOjokYXZhaWxhYmxlQmFja2dyb3VuZENvbG9yc1soaW50KSAkY29kZV0pKSB7CiRvdXQgLj0gJ2JhY2tncm91bmQtY29sb3I6Jy5zZWxmOjokYXZhaWxhYmxlQmFja2dyb3VuZENvbG9yc1soaW50KSAkY29kZV0uJzsnOwp9IGVsc2VpZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZU9wdGlvbnNbKGludCkgJGNvZGVdKSkgewpzd2l0Y2ggKHNlbGY6OiRhdmFpbGFibGVPcHRpb25zWyhpbnQpICRjb2RlXSkgewpjYXNlICdib2xkJzoKJG91dCAuPSAnZm9udC13ZWlnaHQ6Ym9sZDsnOwpicmVhazsKCmNhc2UgJ3VuZGVyc2NvcmUnOgokb3V0IC49ICd0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyc7CmJyZWFrOwp9Cn0KfQoKcmV0dXJuICRvdXQuJyI+Jy4kbWF0Y2hlc1syXS4nPC9zcGFuPic7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxTdWdnZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQgYXMgQmFzZUlucHV0QXJndW1lbnQ7CgoKCgoKCgoKCgpjbGFzcyBJbnB1dEFyZ3VtZW50IGV4dGVuZHMgQmFzZUlucHV0QXJndW1lbnQKewoKCgpwcml2YXRlICRzdWdnZXN0ZWRWYWx1ZXM7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwsICRzdWdnZXN0ZWRWYWx1ZXMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+c3VnZ2VzdGVkVmFsdWVzID0gJHN1Z2dlc3RlZFZhbHVlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokdmFsdWVzID0gJHRoaXMtPnN1Z2dlc3RlZFZhbHVlczsKaWYgKCR2YWx1ZXMgaW5zdGFuY2VvZiBcQ2xvc3VyZSAmJiAhXGlzX2FycmF5KCR2YWx1ZXMgPSAkdmFsdWVzKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKSkpIHsgCnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDbG9zdXJlIGZvciBvcHRpb24gIiVzIiBtdXN0IHJldHVybiBhbiBhcnJheS4gR290ICIlcyIuJywgJHRoaXMtPmdldE5hbWUoKSwgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlcykpKTsKfQppZiAoW10gIT09ICR2YWx1ZXMpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR2YWx1ZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxTdWdnZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uIGFzIEJhc2VJbnB1dE9wdGlvbjsKCgoKCgoKCgoKCmNsYXNzIElucHV0T3B0aW9uIGV4dGVuZHMgQmFzZUlucHV0T3B0aW9uCnsKCgoKcHJpdmF0ZSAkc3VnZ2VzdGVkVmFsdWVzOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCAkc2hvcnRjdXQgPSBudWxsLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwsICRzdWdnZXN0ZWRWYWx1ZXMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KTsKCiR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXMgPSAkc3VnZ2VzdGVkVmFsdWVzOwoKaWYgKFtdICE9PSAkc3VnZ2VzdGVkVmFsdWVzICYmICEkdGhpcy0+YWNjZXB0VmFsdWUoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZXQgc3VnZ2VzdGVkIHZhbHVlcyBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IGFjY2VwdCBhIHZhbHVlLicpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJHZhbHVlcyA9ICR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXM7CmlmICgkdmFsdWVzIGluc3RhbmNlb2YgXENsb3N1cmUgJiYgIVxpc19hcnJheSgkdmFsdWVzID0gJHZhbHVlcygkaW5wdXQsICRzdWdnZXN0aW9ucykpKSB7IAp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2xvc3VyZSBmb3IgYXJndW1lbnQgIiVzIiBtdXN0IHJldHVybiBhbiBhcnJheS4gR290ICIlcyIuJywgJHRoaXMtPmdldE5hbWUoKSwgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlcykpKTsKfQppZiAoW10gIT09ICR2YWx1ZXMpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR2YWx1ZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgoKY2xhc3MgRGVjaXNpb25zIGltcGxlbWVudHMgXEl0ZXJhdG9yLCBcQ291bnRhYmxlCnsKcHVibGljIGNvbnN0IERFQ0lTSU9OX0xJVEVSQUwgPSAwOwpwdWJsaWMgY29uc3QgREVDSVNJT05fUkVBU09OID0gMTsKCgpwcm90ZWN0ZWQgJHBvb2w7Cgpwcm90ZWN0ZWQgJGRlY2lzaW9uTWFwOwoKCgpwcm90ZWN0ZWQgJGRlY2lzaW9uUXVldWUgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb29sICRwb29sKQp7CiR0aGlzLT5wb29sID0gJHBvb2w7CiR0aGlzLT5kZWNpc2lvbk1hcCA9IFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlKGludCAkbGl0ZXJhbCwgaW50ICRsZXZlbCwgUnVsZSAkd2h5KTogdm9pZAp7CiR0aGlzLT5hZGREZWNpc2lvbigkbGl0ZXJhbCwgJGxldmVsKTsKJHRoaXMtPmRlY2lzaW9uUXVldWVbXSA9IFsKc2VsZjo6REVDSVNJT05fTElURVJBTCA9PiAkbGl0ZXJhbCwKc2VsZjo6REVDSVNJT05fUkVBU09OID0+ICR3aHksCl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzYXRpc2Z5KGludCAkbGl0ZXJhbCk6IGJvb2wKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAoCiRsaXRlcmFsID4gMCAmJiBpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA+IDAgfHwKJGxpdGVyYWwgPCAwICYmIGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdIDwgMAopOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29uZmxpY3QoaW50ICRsaXRlcmFsKTogYm9vbAp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWwpOwoKcmV0dXJuICgKKGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID4gMCAmJiAkbGl0ZXJhbCA8IDApIHx8Cihpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA8IDAgJiYgJGxpdGVyYWwgPiAwKQopOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlZChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewpyZXR1cm4gIWVtcHR5KCR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGxpdGVyYWxPclBhY2thZ2VJZCldKTsKfQoKcHVibGljIGZ1bmN0aW9uIHVuZGVjaWRlZChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewpyZXR1cm4gZW1wdHkoJHRoaXMtPmRlY2lzaW9uTWFwW2FicygkbGl0ZXJhbE9yUGFja2FnZUlkKV0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlZEluc3RhbGwoaW50ICRsaXRlcmFsT3JQYWNrYWdlSWQpOiBib29sCnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbE9yUGFja2FnZUlkKTsKCnJldHVybiBpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA+IDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkZWNpc2lvbkxldmVsKGludCAkbGl0ZXJhbE9yUGFja2FnZUlkKTogaW50CnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbE9yUGFja2FnZUlkKTsKaWYgKGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkpIHsKcmV0dXJuIGFicygkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pOwp9CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGRlY2lzaW9uUnVsZShpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6ID9SdWxlCnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbE9yUGFja2FnZUlkKTsKCmZvcmVhY2ggKCR0aGlzLT5kZWNpc2lvblF1ZXVlIGFzICRkZWNpc2lvbikgewppZiAoJHBhY2thZ2VJZCA9PT0gYWJzKCRkZWNpc2lvbltzZWxmOjpERUNJU0lPTl9MSVRFUkFMXSkpIHsKcmV0dXJuICRkZWNpc2lvbltzZWxmOjpERUNJU0lPTl9SRUFTT05dOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXRPZmZzZXQoaW50ICRxdWV1ZU9mZnNldCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kZWNpc2lvblF1ZXVlWyRxdWV1ZU9mZnNldF07Cn0KCnB1YmxpYyBmdW5jdGlvbiB2YWxpZE9mZnNldChpbnQgJHF1ZXVlT2Zmc2V0KTogYm9vbAp7CnJldHVybiAkcXVldWVPZmZzZXQgPj0gMCAmJiAkcXVldWVPZmZzZXQgPCBcY291bnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbGFzdFJlYXNvbigpOiBSdWxlCnsKcmV0dXJuICR0aGlzLT5kZWNpc2lvblF1ZXVlW1xjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSkgLSAxXVtzZWxmOjpERUNJU0lPTl9SRUFTT05dOwp9CgpwdWJsaWMgZnVuY3Rpb24gbGFzdExpdGVyYWwoKTogaW50CnsKcmV0dXJuICR0aGlzLT5kZWNpc2lvblF1ZXVlW1xjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSkgLSAxXVtzZWxmOjpERUNJU0lPTl9MSVRFUkFMXTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewp3aGlsZSAoJGRlY2lzaW9uID0gYXJyYXlfcG9wKCR0aGlzLT5kZWNpc2lvblF1ZXVlKSkgewokdGhpcy0+ZGVjaXNpb25NYXBbYWJzKCRkZWNpc2lvbltzZWxmOjpERUNJU0lPTl9MSVRFUkFMXSldID0gMDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRUb09mZnNldChpbnQgJG9mZnNldCk6IHZvaWQKewp3aGlsZSAoXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSA+ICRvZmZzZXQgKyAxKSB7CiRkZWNpc2lvbiA9IGFycmF5X3BvcCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7CiR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGRlY2lzaW9uW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdKV0gPSAwOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXZlcnRMYXN0KCk6IHZvaWQKewokdGhpcy0+ZGVjaXNpb25NYXBbYWJzKCR0aGlzLT5sYXN0TGl0ZXJhbCgpKV0gPSAwOwphcnJheV9wb3AoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuIFxjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKTogdm9pZAp7CmVuZCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gY3VycmVudCgpCnsKcmV0dXJuIGN1cnJlbnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24ga2V5KCk6ID9pbnQKewpyZXR1cm4ga2V5KCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIG5leHQoKTogdm9pZAp7CnByZXYoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKTogYm9vbAp7CnJldHVybiBmYWxzZSAhPT0gY3VycmVudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCk6IGJvb2wKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSA9PT0gMDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZERlY2lzaW9uKGludCAkbGl0ZXJhbCwgaW50ICRsZXZlbCk6IHZvaWQKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCiRwcmV2aW91c0RlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID8/IDA7CmlmICgkcHJldmlvdXNEZWNpc2lvbiAhPT0gMCkgewokbGl0ZXJhbFN0cmluZyA9ICR0aGlzLT5wb29sLT5saXRlcmFsVG9QcmV0dHlTdHJpbmcoJGxpdGVyYWwsIFtdKTsKJHBhY2thZ2UgPSAkdGhpcy0+cG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJUcnlpbmcgdG8gZGVjaWRlICRsaXRlcmFsU3RyaW5nIG9uIGxldmVsICRsZXZlbCwgZXZlbiB0aG91Z2ggJHBhY2thZ2Ugd2FzIHByZXZpb3VzbHkgZGVjaWRlZCBhcyAiLiRwcmV2aW91c0RlY2lzaW9uLiIuIgopOwp9CgppZiAoJGxpdGVyYWwgPiAwKSB7CiR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA9ICRsZXZlbDsKfSBlbHNlIHsKJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID0gLSRsZXZlbDsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoP1Bvb2wgJHBvb2wgPSBudWxsKTogc3RyaW5nCnsKJGRlY2lzaW9uTWFwID0gJHRoaXMtPmRlY2lzaW9uTWFwOwprc29ydCgkZGVjaXNpb25NYXApOwokc3RyID0gJ1snOwpmb3JlYWNoICgkZGVjaXNpb25NYXAgYXMgJHBhY2thZ2VJZCA9PiAkbGV2ZWwpIHsKJHN0ciAuPSAoKCRwb29sKSA/ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwYWNrYWdlSWQpIDogJHBhY2thZ2VJZCkuJzonLiRsZXZlbC4nLCc7Cn0KJHN0ciAuPSAnXSc7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50b1N0cmluZygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgoKY2xhc3MgRGVmYXVsdFBvbGljeSBpbXBsZW1lbnRzIFBvbGljeUludGVyZmFjZQp7Cgpwcml2YXRlICRwcmVmZXJTdGFibGU7Cgpwcml2YXRlICRwcmVmZXJMb3dlc3Q7Cgpwcml2YXRlICRwcmVmZXJyZWRQYWNrYWdlUmVzdWx0Q2FjaGVQZXJQb29sOwoKcHJpdmF0ZSAkc29ydGluZ0NhY2hlUGVyUG9vbDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChib29sICRwcmVmZXJTdGFibGUgPSBmYWxzZSwgYm9vbCAkcHJlZmVyTG93ZXN0ID0gZmFsc2UpCnsKJHRoaXMtPnByZWZlclN0YWJsZSA9ICRwcmVmZXJTdGFibGU7CiR0aGlzLT5wcmVmZXJMb3dlc3QgPSAkcHJlZmVyTG93ZXN0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2ZXJzaW9uQ29tcGFyZShQYWNrYWdlSW50ZXJmYWNlICRhLCBQYWNrYWdlSW50ZXJmYWNlICRiLCBzdHJpbmcgJG9wZXJhdG9yKTogYm9vbAp7CmlmICgkdGhpcy0+cHJlZmVyU3RhYmxlICYmICgkc3RhYkEgPSAkYS0+Z2V0U3RhYmlsaXR5KCkpICE9PSAoJHN0YWJCID0gJGItPmdldFN0YWJpbGl0eSgpKSkgewpyZXR1cm4gQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllc1skc3RhYkFdIDwgQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllc1skc3RhYkJdOwp9CgoKaWYgKHN0cnBvcygkYS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpID09PSAwIHx8IHN0cnBvcygkYi0+Z2V0VmVyc2lvbigpLCAnZGV2LScpID09PSAwKSB7CiRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJG9wZXJhdG9yLCAkYi0+Z2V0VmVyc2lvbigpKTsKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkYS0+Z2V0VmVyc2lvbigpKTsKCnJldHVybiAkY29uc3RyYWludC0+bWF0Y2hTcGVjaWZpYygkdmVyc2lvbiwgdHJ1ZSk7Cn0KCnJldHVybiBDb21waWxpbmdNYXRjaGVyOjptYXRjaChuZXcgQ29uc3RyYWludCgkb3BlcmF0b3IsICRiLT5nZXRWZXJzaW9uKCkpLCBDb25zdHJhaW50OjpPUF9FUSwgJGEtPmdldFZlcnNpb24oKSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscywgP3N0cmluZyAkcmVxdWlyZWRQYWNrYWdlID0gbnVsbCk6IGFycmF5CnsKc29ydCgkbGl0ZXJhbHMpOwokcmVzdWx0Q2FjaGVLZXkgPSBpbXBsb2RlKCcsJywgJGxpdGVyYWxzKS4kcmVxdWlyZWRQYWNrYWdlOwokcG9vbElkID0gc3BsX29iamVjdF9pZCgkcG9vbCk7CgppZiAoaXNzZXQoJHRoaXMtPnByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2xbJHBvb2xJZF1bJHJlc3VsdENhY2hlS2V5XSkpIHsKcmV0dXJuICR0aGlzLT5wcmVmZXJyZWRQYWNrYWdlUmVzdWx0Q2FjaGVQZXJQb29sWyRwb29sSWRdWyRyZXN1bHRDYWNoZUtleV07Cn0KCiRwYWNrYWdlcyA9ICR0aGlzLT5ncm91cExpdGVyYWxzQnlOYW1lKCRwb29sLCAkbGl0ZXJhbHMpOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICYkbmFtZUxpdGVyYWxzKSB7CnVzb3J0KCRuYW1lTGl0ZXJhbHMsIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHBvb2wsICRyZXF1aXJlZFBhY2thZ2UsICRwb29sSWQpOiBpbnQgewokY2FjaGVLZXkgPSAnaScuJGEuJy4nLiRiLiRyZXF1aXJlZFBhY2thZ2U7IAoKaWYgKGlzc2V0KCR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV0pKSB7CnJldHVybiAkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldOwp9CgpyZXR1cm4gJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XSA9ICR0aGlzLT5jb21wYXJlQnlQcmlvcml0eSgkcG9vbCwgJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGEpLCAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkYiksICRyZXF1aXJlZFBhY2thZ2UsIHRydWUpOwp9KTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICYkc29ydGVkTGl0ZXJhbHMpIHsKJHNvcnRlZExpdGVyYWxzID0gJHRoaXMtPnBydW5lVG9CZXN0VmVyc2lvbigkcG9vbCwgJHNvcnRlZExpdGVyYWxzKTsKJHNvcnRlZExpdGVyYWxzID0gJHRoaXMtPnBydW5lUmVtb3RlQWxpYXNlcygkcG9vbCwgJHNvcnRlZExpdGVyYWxzKTsKfQoKJHNlbGVjdGVkID0gYXJyYXlfbWVyZ2UoLi4uYXJyYXlfdmFsdWVzKCRwYWNrYWdlcykpOwoKCnVzb3J0KCRzZWxlY3RlZCwgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkcG9vbCwgJHJlcXVpcmVkUGFja2FnZSwgJHBvb2xJZCk6IGludCB7CiRjYWNoZUtleSA9ICRhLicuJy4kYi4kcmVxdWlyZWRQYWNrYWdlOyAKCmlmIChpc3NldCgkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldKSkgewpyZXR1cm4gJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XTsKfQoKcmV0dXJuICR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV0gPSAkdGhpcy0+Y29tcGFyZUJ5UHJpb3JpdHkoJHBvb2wsICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRhKSwgJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGIpLCAkcmVxdWlyZWRQYWNrYWdlKTsKfSk7CgpyZXR1cm4gJHRoaXMtPnByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2xbJHBvb2xJZF1bJHJlc3VsdENhY2hlS2V5XSA9ICRzZWxlY3RlZDsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBncm91cExpdGVyYWxzQnlOYW1lKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscyk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZU5hbWUgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCktPmdldE5hbWUoKTsKCmlmICghaXNzZXQoJHBhY2thZ2VzWyRwYWNrYWdlTmFtZV0pKSB7CiRwYWNrYWdlc1skcGFja2FnZU5hbWVdID0gW107Cn0KJHBhY2thZ2VzWyRwYWNrYWdlTmFtZV1bXSA9ICRsaXRlcmFsOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGFyZUJ5UHJpb3JpdHkoUG9vbCAkcG9vbCwgQmFzZVBhY2thZ2UgJGEsIEJhc2VQYWNrYWdlICRiLCA/c3RyaW5nICRyZXF1aXJlZFBhY2thZ2UgPSBudWxsLCBib29sICRpZ25vcmVSZXBsYWNlID0gZmFsc2UpOiBpbnQKewoKaWYgKCRhLT5nZXROYW1lKCkgPT09ICRiLT5nZXROYW1lKCkpIHsKJGFBbGlhc2VkID0gJGEgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2U7CiRiQWxpYXNlZCA9ICRiIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlOwppZiAoJGFBbGlhc2VkICYmICEkYkFsaWFzZWQpIHsKcmV0dXJuIC0xOyAKfQppZiAoISRhQWxpYXNlZCAmJiAkYkFsaWFzZWQpIHsKcmV0dXJuIDE7IAp9Cn0KCmlmICghJGlnbm9yZVJlcGxhY2UpIHsKCmlmICgkdGhpcy0+cmVwbGFjZXMoJGEsICRiKSkgewpyZXR1cm4gMTsgCn0KaWYgKCR0aGlzLT5yZXBsYWNlcygkYiwgJGEpKSB7CnJldHVybiAtMTsgCn0KCgoKaWYgKCRyZXF1aXJlZFBhY2thZ2UgJiYgZmFsc2UgIT09ICgkcG9zID0gc3RycG9zKCRyZXF1aXJlZFBhY2thZ2UsICcvJykpKSB7CiRyZXF1aXJlZFZlbmRvciA9IHN1YnN0cigkcmVxdWlyZWRQYWNrYWdlLCAwLCAkcG9zKTsKCiRhSXNTYW1lVmVuZG9yID0gc3RycG9zKCRhLT5nZXROYW1lKCksICRyZXF1aXJlZFZlbmRvcikgPT09IDA7CiRiSXNTYW1lVmVuZG9yID0gc3RycG9zKCRiLT5nZXROYW1lKCksICRyZXF1aXJlZFZlbmRvcikgPT09IDA7CgppZiAoJGJJc1NhbWVWZW5kb3IgIT09ICRhSXNTYW1lVmVuZG9yKSB7CnJldHVybiAkYUlzU2FtZVZlbmRvciA/IC0xIDogMTsKfQp9Cn0KCgppZiAoJGEtPmlkID09PSAkYi0+aWQpIHsKcmV0dXJuIDA7Cn0KCnJldHVybiAoJGEtPmlkIDwgJGItPmlkKSA/IC0xIDogMTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlcGxhY2VzKEJhc2VQYWNrYWdlICRzb3VyY2UsIEJhc2VQYWNrYWdlICR0YXJnZXQpOiBib29sCnsKZm9yZWFjaCAoJHNvdXJjZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkdGFyZ2V0LT5nZXROYW1lKCkKCgopIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBydW5lVG9CZXN0VmVyc2lvbihQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMpOiBhcnJheQp7CiRvcGVyYXRvciA9ICR0aGlzLT5wcmVmZXJMb3dlc3QgPyAnPCcgOiAnPic7CiRiZXN0TGl0ZXJhbHMgPSBbJGxpdGVyYWxzWzBdXTsKJGJlc3RQYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzBdKTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRpID0+ICRsaXRlcmFsKSB7CmlmICgwID09PSAkaSkgewpjb250aW51ZTsKfQoKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoJHRoaXMtPnZlcnNpb25Db21wYXJlKCRwYWNrYWdlLCAkYmVzdFBhY2thZ2UsICRvcGVyYXRvcikpIHsKJGJlc3RQYWNrYWdlID0gJHBhY2thZ2U7CiRiZXN0TGl0ZXJhbHMgPSBbJGxpdGVyYWxdOwp9IGVsc2VpZiAoJHRoaXMtPnZlcnNpb25Db21wYXJlKCRwYWNrYWdlLCAkYmVzdFBhY2thZ2UsICc9PScpKSB7CiRiZXN0TGl0ZXJhbHNbXSA9ICRsaXRlcmFsOwp9Cn0KCnJldHVybiAkYmVzdExpdGVyYWxzOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcnVuZVJlbW90ZUFsaWFzZXMoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzKTogYXJyYXkKewokaGFzTG9jYWxBbGlhcyA9IGZhbHNlOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRwYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5pc1Jvb3RQYWNrYWdlQWxpYXMoKSkgewokaGFzTG9jYWxBbGlhcyA9IHRydWU7CmJyZWFrOwp9Cn0KCmlmICghJGhhc0xvY2FsQWxpYXMpIHsKcmV0dXJuICRsaXRlcmFsczsKfQoKJHNlbGVjdGVkID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkpIHsKJHNlbGVjdGVkW10gPSAkbGl0ZXJhbDsKfQp9CgpyZXR1cm4gJHNlbGVjdGVkOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCmNsYXNzIEdlbmVyaWNSdWxlIGV4dGVuZHMgUnVsZQp7Cgpwcm90ZWN0ZWQgJGxpdGVyYWxzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVhc29uLCAkcmVhc29uRGF0YSk7CgoKc29ydCgkbGl0ZXJhbHMpOwoKJHRoaXMtPmxpdGVyYWxzID0gJGxpdGVyYWxzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmxpdGVyYWxzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpCnsKJGRhdGEgPSB1bnBhY2soJ2loYXNoJywgbWQ1KGltcGxvZGUoJywnLCAkdGhpcy0+bGl0ZXJhbHMpLCB0cnVlKSk7CgpyZXR1cm4gJGRhdGFbJ2hhc2gnXTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFJ1bGUgJHJ1bGUpOiBib29sCnsKcmV0dXJuICR0aGlzLT5saXRlcmFscyA9PT0gJHJ1bGUtPmdldExpdGVyYWxzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sCnsKcmV0dXJuIDEgPT09IFxjb3VudCgkdGhpcy0+bGl0ZXJhbHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewokcmVzdWx0ID0gJHRoaXMtPmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZCgnIDogJygnOwoKZm9yZWFjaCAoJHRoaXMtPmxpdGVyYWxzIGFzICRpID0+ICRsaXRlcmFsKSB7CmlmICgkaSAhPT0gMCkgewokcmVzdWx0IC49ICd8JzsKfQokcmVzdWx0IC49ICRsaXRlcmFsOwp9CgokcmVzdWx0IC49ICcpJzsKCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CgoKCgoKY2xhc3MgTG9jYWxSZXBvVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbgp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NrZWRSZXBvc2l0b3J5LCBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG9zaXRvcnkpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgKJGxvY2FsUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSwKJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlOwoKCgoKCmNsYXNzIExvY2tUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uCnsKCgoKCgoKCnByb3RlY3RlZCAkcHJlc2VudE1hcDsKCgoKCgoKCgpwcm90ZWN0ZWQgJHVubG9ja2FibGVNYXA7CgoKCgpwcm90ZWN0ZWQgJHJlc3VsdFBhY2thZ2VzOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb29sICRwb29sLCBhcnJheSAkcHJlc2VudE1hcCwgYXJyYXkgJHVubG9ja2FibGVNYXAsIERlY2lzaW9ucyAkZGVjaXNpb25zKQp7CiR0aGlzLT5wcmVzZW50TWFwID0gJHByZXNlbnRNYXA7CiR0aGlzLT51bmxvY2thYmxlTWFwID0gJHVubG9ja2FibGVNYXA7CgokdGhpcy0+c2V0UmVzdWx0UGFja2FnZXMoJHBvb2wsICRkZWNpc2lvbnMpOwpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0aGlzLT5wcmVzZW50TWFwLCAkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2FsbCddKTsKfQoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVzdWx0UGFja2FnZXMoUG9vbCAkcG9vbCwgRGVjaXNpb25zICRkZWNpc2lvbnMpOiB2b2lkCnsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzID0gWydhbGwnID0+IFtdLCAnbm9uLWRldicgPT4gW10sICdkZXYnID0+IFtdXTsKZm9yZWFjaCAoJGRlY2lzaW9ucyBhcyAkaSA9PiAkZGVjaXNpb24pIHsKJGxpdGVyYWwgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9MSVRFUkFMXTsKCmlmICgkbGl0ZXJhbCA+IDApIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2FsbCddW10gPSAkcGFja2FnZTsKaWYgKCFpc3NldCgkdGhpcy0+dW5sb2NrYWJsZU1hcFskcGFja2FnZS0+aWRdKSkgewokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ25vbi1kZXYnXVtdID0gJHBhY2thZ2U7Cn0KfQp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXROb25EZXZQYWNrYWdlcyhMb2NrVHJhbnNhY3Rpb24gJGV4dHJhY3Rpb25SZXN1bHQpOiB2b2lkCnsKJHBhY2thZ2VzID0gJGV4dHJhY3Rpb25SZXN1bHQtPmdldE5ld0xvY2tQYWNrYWdlcyhmYWxzZSk7CgokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2RldiddID0gJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydub24tZGV2J107CiR0aGlzLT5yZXN1bHRQYWNrYWdlc1snbm9uLWRldiddID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKZm9yZWFjaCAoJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydkZXYnXSBhcyAkaSA9PiAkcmVzdWx0UGFja2FnZSkgewoKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICRyZXN1bHRQYWNrYWdlLT5nZXROYW1lKCkpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydub24tZGV2J11bXSA9ICRyZXN1bHRQYWNrYWdlOwp1bnNldCgkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2RldiddWyRpXSk7Cn0KfQp9Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmV3TG9ja1BhY2thZ2VzKGJvb2wgJGRldk1vZGUsIGJvb2wgJHVwZGF0ZU1pcnJvcnMgPSBmYWxzZSk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlc1skZGV2TW9kZSA/ICdkZXYnIDogJ25vbi1kZXYnXSBhcyAkcGFja2FnZSkgewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CgoKaWYgKCR1cGRhdGVNaXJyb3JzICYmICFpc3NldCgkdGhpcy0+cHJlc2VudE1hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKZm9yZWFjaCAoJHRoaXMtPnByZXNlbnRNYXAgYXMgJHByZXNlbnRQYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAkcHJlc2VudFBhY2thZ2UtPmdldE5hbWUoKSAmJiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpID09PSAkcHJlc2VudFBhY2thZ2UtPmdldFZlcnNpb24oKSkgewppZiAoJHByZXNlbnRQYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSAmJiAkcHJlc2VudFBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSA9PT0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSkgewokcGFja2FnZS0+c2V0U291cmNlRGlzdFJlZmVyZW5jZXMoJHByZXNlbnRQYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7Cn0KaWYgKCRwcmVzZW50UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSAhPT0gbnVsbCAmJiAkcGFja2FnZSBpbnN0YW5jZW9mIFBhY2thZ2UpIHsKJHBhY2thZ2UtPnNldFJlbGVhc2VEYXRlKCRwcmVzZW50UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSk7Cn0KfQp9Cn0KJHBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKGFycmF5ICRhbGlhc2VzKTogYXJyYXkKewokdXNlZEFsaWFzZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlc1snYWxsJ10gYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmZvcmVhY2ggKCRhbGlhc2VzIGFzICRpbmRleCA9PiAkYWxpYXMpIHsKaWYgKCRhbGlhc1sncGFja2FnZSddID09PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CiR1c2VkQWxpYXNlc1tdID0gJGFsaWFzOwp1bnNldCgkYWxpYXNlc1skaW5kZXhdKTsKfQp9Cn0KfQoKdXNvcnQoJHVzZWRBbGlhc2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYik6IGludCB7CnJldHVybiBzdHJjbXAoJGFbJ3BhY2thZ2UnXSwgJGJbJ3BhY2thZ2UnXSk7Cn0pOwoKcmV0dXJuICR1c2VkQWxpYXNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKCmNsYXNzIE11bHRpQ29uZmxpY3RSdWxlIGV4dGVuZHMgUnVsZQp7Cgpwcm90ZWN0ZWQgJGxpdGVyYWxzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVhc29uLCAkcmVhc29uRGF0YSk7CgppZiAoXGNvdW50KCRsaXRlcmFscykgPCAzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigibXVsdGkgY29uZmxpY3QgcnVsZSByZXF1aXJlcyBhdCBsZWFzdCAzIGxpdGVyYWxzIik7Cn0KCgpzb3J0KCRsaXRlcmFscyk7CgokdGhpcy0+bGl0ZXJhbHMgPSAkbGl0ZXJhbHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaXRlcmFscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bGl0ZXJhbHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoKCkKewokZGF0YSA9IHVucGFjaygnaWhhc2gnLCBtZDUoJ2M6Jy5pbXBsb2RlKCcsJywgJHRoaXMtPmxpdGVyYWxzKSwgdHJ1ZSkpOwoKcmV0dXJuICRkYXRhWydoYXNoJ107Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbAp7CmlmICgkcnVsZSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlKSB7CnJldHVybiAkdGhpcy0+bGl0ZXJhbHMgPT09ICRydWxlLT5nZXRMaXRlcmFscygpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGUoKTogdm9pZAp7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiRGlzYWJsaW5nIG11bHRpIGNvbmZsaWN0IHJ1bGVzIGlzIG5vdCBwb3NzaWJsZS4gUGxlYXNlIGNvbnRhY3QgY29tcG9zZXIgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyIHRvIGxldCB1cyBkZWJ1ZyB3aGF0IGxlYWQgdG8gdGhpcyBzaXR1YXRpb24uIik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CgokcmVzdWx0ID0gJHRoaXMtPmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZChtdWx0aSgnIDogJyhtdWx0aSgnOwoKZm9yZWFjaCAoJHRoaXMtPmxpdGVyYWxzIGFzICRpID0+ICRsaXRlcmFsKSB7CmlmICgkaSAhPT0gMCkgewokcmVzdWx0IC49ICd8JzsKfQokcmVzdWx0IC49ICRsaXRlcmFsOwp9CgokcmVzdWx0IC49ICcpKSc7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgSW5zdGFsbE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ2luc3RhbGwnOwoKCgoKcHJvdGVjdGVkICRwYWNrYWdlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogUGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Zm9ybWF0KCR0aGlzLT5wYWNrYWdlLCAkbG9jayk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJGxvY2sgPSBmYWxzZSk6IHN0cmluZwp7CnJldHVybiAoJGxvY2sgPyAnTG9ja2luZyAnIDogJ0luc3RhbGxpbmcgJykuJzxpbmZvPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PiknOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CgoKCgoKCmNsYXNzIE1hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ21hcmtBbGlhc0luc3RhbGxlZCc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQWxpYXNQYWNrYWdlICRwYWNrYWdlKQp7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6IEFsaWFzUGFja2FnZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gJ01hcmtpbmcgPGluZm8+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiR0aGlzLT5wYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSBhcyBpbnN0YWxsZWQsIGFsaWFzIG9mIDxpbmZvPicuJHRoaXMtPnBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwoKCgoKCgpjbGFzcyBNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ21hcmtBbGlhc1VuaW5zdGFsbGVkJzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBbGlhc1BhY2thZ2UgJHBhY2thZ2UpCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogQWxpYXNQYWNrYWdlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiAnTWFya2luZyA8aW5mbz4nLiR0aGlzLT5wYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHRoaXMtPnBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pIGFzIHVuaW5zdGFsbGVkLCBhbGlhcyBvZiA8aW5mbz4nLiR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCgoKCgoKaW50ZXJmYWNlIE9wZXJhdGlvbkludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvblR5cGUoKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KGJvb2wgJGxvY2spOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewoKCgpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICcnOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvblR5cGUoKTogc3RyaW5nCnsKcmV0dXJuIHN0YXRpYzo6VFlQRTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAkdGhpcy0+c2hvdyhmYWxzZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFVuaW5zdGFsbE9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ3VuaW5zdGFsbCc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpmb3JtYXQoJHRoaXMtPnBhY2thZ2UsICRsb2NrKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkbG9jayA9IGZhbHNlKTogc3RyaW5nCnsKcmV0dXJuICdSZW1vdmluZyA8aW5mbz4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwoKCgoKCgpjbGFzcyBVcGRhdGVPcGVyYXRpb24gZXh0ZW5kcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICd1cGRhdGUnOwoKCgoKcHJvdGVjdGVkICRpbml0aWFsUGFja2FnZTsKCgoKCnByb3RlY3RlZCAkdGFyZ2V0UGFja2FnZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CiR0aGlzLT5pbml0aWFsUGFja2FnZSA9ICRpbml0aWFsOwokdGhpcy0+dGFyZ2V0UGFja2FnZSA9ICR0YXJnZXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbml0aWFsUGFja2FnZSgpOiBQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbml0aWFsUGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldFBhY2thZ2UoKTogUGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGFyZ2V0UGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Zm9ybWF0KCR0aGlzLT5pbml0aWFsUGFja2FnZSwgJHRoaXMtPnRhcmdldFBhY2thZ2UsICRsb2NrKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXQoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbFBhY2thZ2UsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldFBhY2thZ2UsIGJvb2wgJGxvY2sgPSBmYWxzZSk6IHN0cmluZwp7CiRmcm9tVmVyc2lvbiA9ICRpbml0aWFsUGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKJHRvVmVyc2lvbiA9ICR0YXJnZXRQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwoKaWYgKCRmcm9tVmVyc2lvbiA9PT0gJHRvVmVyc2lvbiAmJiAkaW5pdGlhbFBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpICE9PSAkdGFyZ2V0UGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKJGZyb21WZXJzaW9uID0gJGluaXRpYWxQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUYpOwokdG9WZXJzaW9uID0gJHRhcmdldFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKHRydWUsIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRik7Cn0gZWxzZWlmICgkZnJvbVZlcnNpb24gPT09ICR0b1ZlcnNpb24gJiYgJGluaXRpYWxQYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkgIT09ICR0YXJnZXRQYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpIHsKJGZyb21WZXJzaW9uID0gJGluaXRpYWxQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGKTsKJHRvVmVyc2lvbiA9ICR0YXJnZXRQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGKTsKfQoKJGFjdGlvbk5hbWUgPSBWZXJzaW9uUGFyc2VyOjppc1VwZ3JhZGUoJGluaXRpYWxQYWNrYWdlLT5nZXRWZXJzaW9uKCksICR0YXJnZXRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpID8gJ1VwZ3JhZGluZycgOiAnRG93bmdyYWRpbmcnOwoKcmV0dXJuICRhY3Rpb25OYW1lLicgPGluZm8+Jy4kaW5pdGlhbFBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kZnJvbVZlcnNpb24uJzwvY29tbWVudD4gPT4gPGNvbW1lbnQ+Jy4kdG9WZXJzaW9uLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgppbnRlcmZhY2UgUG9saWN5SW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHZlcnNpb25Db21wYXJlKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIsIHN0cmluZyAkb3BlcmF0b3IpOiBib29sOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3RQcmVmZXJyZWRQYWNrYWdlcyhQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMsID9zdHJpbmcgJHJlcXVpcmVkUGFja2FnZSA9IG51bGwpOiBhcnJheTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb21waWxpbmdNYXRjaGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgoKCgpjbGFzcyBQb29sIGltcGxlbWVudHMgXENvdW50YWJsZQp7Cgpwcm90ZWN0ZWQgJHBhY2thZ2VzID0gW107Cgpwcm90ZWN0ZWQgJHBhY2thZ2VCeU5hbWUgPSBbXTsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkcHJvdmlkZXJDYWNoZSA9IFtdOwoKcHJvdGVjdGVkICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7Cgpwcm90ZWN0ZWQgJHJlbW92ZWRWZXJzaW9ucyA9IFtdOwoKcHJvdGVjdGVkICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcGFja2FnZXMgPSBbXSwgYXJyYXkgJHVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9IFtdLCBhcnJheSAkcmVtb3ZlZFZlcnNpb25zID0gW10sIGFycmF5ICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXSkKewokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokdGhpcy0+c2V0UGFja2FnZXMoJHBhY2thZ2VzKTsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9ICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnMgPSAkcmVtb3ZlZFZlcnNpb25zOwokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gJHJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbW92ZWRWZXJzaW9ucyhzdHJpbmcgJG5hbWUsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnJlbW92ZWRWZXJzaW9uc1skbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVtb3ZlZFZlcnNpb25zWyRuYW1lXSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewppZiAoJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb24pKSkgewokcmVzdWx0WyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlKHN0cmluZyAkb2JqZWN0SGFzaCk6IGFycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlWyRvYmplY3RIYXNoXSkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZVskb2JqZWN0SGFzaF07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0UGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiRpZCA9IDE7Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPnBhY2thZ2VzW10gPSAkcGFja2FnZTsKCiRwYWNrYWdlLT5pZCA9ICRpZCsrOwoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJHByb3ZpZGVkKSB7CiR0aGlzLT5wYWNrYWdlQnlOYW1lWyRwcm92aWRlZF1bXSA9ICRwYWNrYWdlOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHBhY2thZ2VCeUlkKGludCAkaWQpOiBCYXNlUGFja2FnZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZXNbJGlkIC0gMV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5wYWNrYWdlcyk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdoYXRQcm92aWRlcyhzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJGtleSA9IChzdHJpbmcpICRjb25zdHJhaW50OwppZiAoaXNzZXQoJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldKSkgewpyZXR1cm4gJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldOwp9CgpyZXR1cm4gJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldID0gJHRoaXMtPmNvbXB1dGVXaGF0UHJvdmlkZXMoJG5hbWUsICRjb25zdHJhaW50KTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb21wdXRlV2hhdFByb3ZpZGVzKHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5wYWNrYWdlQnlOYW1lWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9CgokbWF0Y2hlcyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VCeU5hbWVbJG5hbWVdIGFzICRjYW5kaWRhdGUpIHsKaWYgKCR0aGlzLT5tYXRjaCgkY2FuZGlkYXRlLCAkbmFtZSwgJGNvbnN0cmFpbnQpKSB7CiRtYXRjaGVzW10gPSAkY2FuZGlkYXRlOwp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIGxpdGVyYWxUb1BhY2thZ2UoaW50ICRsaXRlcmFsKTogQmFzZVBhY2thZ2UKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAkdGhpcy0+cGFja2FnZUJ5SWQoJHBhY2thZ2VJZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsaXRlcmFsVG9QcmV0dHlTdHJpbmcoaW50ICRsaXRlcmFsLCBhcnJheSAkaW5zdGFsbGVkTWFwKTogc3RyaW5nCnsKJHBhY2thZ2UgPSAkdGhpcy0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFskcGFja2FnZS0+aWRdKSkgewokcHJlZml4ID0gKCRsaXRlcmFsID4gMCA/ICdrZWVwJyA6ICdyZW1vdmUnKTsKfSBlbHNlIHsKJHByZWZpeCA9ICgkbGl0ZXJhbCA+IDAgPyAnaW5zdGFsbCcgOiAnZG9uXCd0IGluc3RhbGwnKTsKfQoKcmV0dXJuICRwcmVmaXguJyAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoKEJhc2VQYWNrYWdlICRjYW5kaWRhdGUsIHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYm9vbAp7CiRjYW5kaWRhdGVOYW1lID0gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpOwokY2FuZGlkYXRlVmVyc2lvbiA9ICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKTsKCmlmICgkY2FuZGlkYXRlTmFtZSA9PT0gJG5hbWUpIHsKcmV0dXJuICRjb25zdHJhaW50ID09PSBudWxsIHx8IENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJGNhbmRpZGF0ZVZlcnNpb24pOwp9CgokcHJvdmlkZXMgPSAkY2FuZGlkYXRlLT5nZXRQcm92aWRlcygpOwokcmVwbGFjZXMgPSAkY2FuZGlkYXRlLT5nZXRSZXBsYWNlcygpOwoKCmlmIChpc3NldCgkcmVwbGFjZXNbMF0pIHx8IGlzc2V0KCRwcm92aWRlc1swXSkpIHsKZm9yZWFjaCAoJHByb3ZpZGVzIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuYW1lICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKZm9yZWFjaCAoJHJlcGxhY2VzIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuYW1lICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNzZXQoJHByb3ZpZGVzWyRuYW1lXSkgJiYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKCRwcm92aWRlc1skbmFtZV0tPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNzZXQoJHJlcGxhY2VzWyRuYW1lXSkgJiYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKCRyZXBsYWNlc1skbmFtZV0tPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiBcaW5fYXJyYXkoJHBhY2thZ2UsICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CiRzdHIgPSAiUG9vbDpcbiI7Cgpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHN0ciAuPSAnLSAnLnN0cl9wYWQoKHN0cmluZykgJHBhY2thZ2UtPmlkLCA2LCAnICcsIFNUUl9QQURfTEVGVCkuJzogJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiJcbiI7Cn0KCnJldHVybiAkc3RyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVQb29sQ3JlYXRlRXZlbnQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CgoKCgpjbGFzcyBQb29sQnVpbGRlcgp7CgoKCgpwcml2YXRlICRhY2NlcHRhYmxlU3RhYmlsaXRpZXM7CgoKCgpwcml2YXRlICRzdGFiaWxpdHlGbGFnczsKCgoKCnByaXZhdGUgJHJvb3RBbGlhc2VzOwoKCgoKcHJpdmF0ZSAkcm9vdFJlZmVyZW5jZXM7CgoKCnByaXZhdGUgJHRlbXBvcmFyeUNvbnN0cmFpbnRzOwoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgoKCnByaXZhdGUgJHBvb2xPcHRpbWl6ZXI7CgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkYWxpYXNNYXAgPSBbXTsKCgoKCnByaXZhdGUgJHBhY2thZ2VzVG9Mb2FkID0gW107CgoKCgpwcml2YXRlICRsb2FkZWRQYWNrYWdlcyA9IFtdOwoKCgoKcHJpdmF0ZSAkbG9hZGVkUGVyUmVwbyA9IFtdOwoKCgpwcml2YXRlICRwYWNrYWdlcyA9IFtdOwoKCgpwcml2YXRlICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMgPSBbXTsKCnByaXZhdGUgJHVwZGF0ZUFsbG93TGlzdCA9IFtdOwoKcHJpdmF0ZSAkc2tpcHBlZExvYWQgPSBbXTsKCgoKCgoKCgoKcHJpdmF0ZSAkcmVzdHJpY3RlZFBhY2thZ2VzTGlzdCA9IG51bGw7CgoKCgoKCgoKCnByaXZhdGUgJHBhdGhSZXBvVW5sb2NrZWQgPSBbXTsKCgoKCgoKCgoKCgpwcml2YXRlICRtYXhFeHRlbmRlZFJlcXMgPSBbXTsKCgoKCnByaXZhdGUgJHVwZGF0ZUFsbG93V2FybmVkID0gW107CgoKcHJpdmF0ZSAkaW5kZXhDb3VudGVyID0gMDsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJHJvb3RBbGlhc2VzLCBhcnJheSAkcm9vdFJlZmVyZW5jZXMsIElPSW50ZXJmYWNlICRpbywgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Bvb2xPcHRpbWl6ZXIgJHBvb2xPcHRpbWl6ZXIgPSBudWxsLCBhcnJheSAkdGVtcG9yYXJ5Q29uc3RyYWludHMgPSBbXSkKewokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gJGFjY2VwdGFibGVTdGFiaWxpdGllczsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdEFsaWFzZXMgPSAkcm9vdEFsaWFzZXM7CiR0aGlzLT5yb290UmVmZXJlbmNlcyA9ICRyb290UmVmZXJlbmNlczsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5wb29sT3B0aW1pemVyID0gJHBvb2xPcHRpbWl6ZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzID0gJHRlbXBvcmFyeUNvbnN0cmFpbnRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVpbGRQb29sKGFycmF5ICRyZXBvc2l0b3JpZXMsIFJlcXVlc3QgJHJlcXVlc3QpOiBQb29sCnsKJHRoaXMtPnJlc3RyaWN0ZWRQYWNrYWdlc0xpc3QgPSAkcmVxdWVzdC0+Z2V0UmVzdHJpY3RlZFBhY2thZ2VzKCkgIT09IG51bGwgPyBhcnJheV9mbGlwKCRyZXF1ZXN0LT5nZXRSZXN0cmljdGVkUGFja2FnZXMoKSkgOiBudWxsOwoKaWYgKCRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd0xpc3QoKSkgewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93TGlzdCgpOwokdGhpcy0+d2FybkFib3V0Tm9uTWF0Y2hpbmdVcGRhdGVBbGxvd0xpc3QoJHJlcXVlc3QpOwoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSBhcyAkbG9ja2VkUGFja2FnZSkgewppZiAoISR0aGlzLT5pc1VwZGF0ZUFsbG93ZWQoJGxvY2tlZFBhY2thZ2UpKSB7CgokdGhpcy0+c2tpcHBlZExvYWRbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV1bXSA9ICRsb2NrZWRQYWNrYWdlOwpmb3JlYWNoICgkbG9ja2VkUGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewokdGhpcy0+c2tpcHBlZExvYWRbJGxpbmstPmdldFRhcmdldCgpXVtdID0gJGxvY2tlZFBhY2thZ2U7Cn0KCgoKCgppZiAoJGxvY2tlZFBhY2thZ2UtPmdldERpc3RUeXBlKCkgPT09ICdwYXRoJykgewokdHJhbnNwb3J0T3B0aW9ucyA9ICRsb2NrZWRQYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7CmlmICghaXNzZXQoJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSkgfHwgJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSAhPT0gZmFsc2UpIHsKJHRoaXMtPnBhdGhSZXBvVW5sb2NrZWRbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV0gPSB0cnVlOwpjb250aW51ZTsKfQp9CgokcmVxdWVzdC0+bG9ja1BhY2thZ2UoJGxvY2tlZFBhY2thZ2UpOwp9Cn0KfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkT3JMb2NrZWRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CiR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbGluay0+Z2V0VGFyZ2V0KCldID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgoKCgppZiAoCiRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBSb290UGFja2FnZVJlcG9zaXRvcnkKfHwgJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeQp8fCBTdGFiaWxpdHlGaWx0ZXI6OmlzUGFja2FnZUFjY2VwdGFibGUoJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcywgJHRoaXMtPnN0YWJpbGl0eUZsYWdzLCAkcGFja2FnZS0+Z2V0TmFtZXMoKSwgJHBhY2thZ2UtPmdldFN0YWJpbGl0eSgpKQopIHsKJHRoaXMtPmxvYWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcGFja2FnZSwgZmFsc2UpOwp9IGVsc2UgewokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQp9Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKSBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKCmlmIChpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5wYWNrYWdlc1RvTG9hZFskcGFja2FnZU5hbWVdID0gJGNvbnN0cmFpbnQ7CiR0aGlzLT5tYXhFeHRlbmRlZFJlcXNbJHBhY2thZ2VOYW1lXSA9IHRydWU7Cn0KCgpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXNUb0xvYWQgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKGlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pKSB7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0pOwp9Cn0KCndoaWxlICghZW1wdHkoJHRoaXMtPnBhY2thZ2VzVG9Mb2FkKSkgewokdGhpcy0+bG9hZFBhY2thZ2VzTWFya2VkRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcG9zaXRvcmllcyk7Cn0KCmlmIChcY291bnQoJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzKSA+IDApIHsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRpID0+ICRwYWNrYWdlKSB7CgppZiAoIWlzc2V0KCR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXSkgfHwgJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCiRjb25zdHJhaW50ID0gJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldOwokcGFja2FnZUFuZEFsaWFzZXMgPSBbJGkgPT4gJHBhY2thZ2VdOwppZiAoaXNzZXQoJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewokcGFja2FnZUFuZEFsaWFzZXMgKz0gJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldOwp9CgokZm91bmQgPSBmYWxzZTsKZm9yZWFjaCAoJHBhY2thZ2VBbmRBbGlhc2VzIGFzICRwYWNrYWdlT3JBbGlhcykgewppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGNvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZU9yQWxpYXMtPmdldFZlcnNpb24oKSkpIHsKJGZvdW5kID0gdHJ1ZTsKfQp9CgppZiAoISRmb3VuZCkgewpmb3JlYWNoICgkcGFja2FnZUFuZEFsaWFzZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlT3JBbGlhcykgewp1bnNldCgkdGhpcy0+cGFja2FnZXNbJGluZGV4XSk7Cn0KfQp9Cn0KCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwcmVQb29sQ3JlYXRlRXZlbnQgPSBuZXcgUHJlUG9vbENyZWF0ZUV2ZW50KApQbHVnaW5FdmVudHM6OlBSRV9QT09MX0NSRUFURSwKJHJlcG9zaXRvcmllcywKJHJlcXVlc3QsCiR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsCiR0aGlzLT5zdGFiaWxpdHlGbGFncywKJHRoaXMtPnJvb3RBbGlhc2VzLAokdGhpcy0+cm9vdFJlZmVyZW5jZXMsCiR0aGlzLT5wYWNrYWdlcywKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcwopOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcHJlUG9vbENyZWF0ZUV2ZW50LT5nZXROYW1lKCksICRwcmVQb29sQ3JlYXRlRXZlbnQpOwokdGhpcy0+cGFja2FnZXMgPSAkcHJlUG9vbENyZWF0ZUV2ZW50LT5nZXRQYWNrYWdlcygpOwokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzID0gJHByZVBvb2xDcmVhdGVFdmVudC0+Z2V0VW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcygpOwp9CgokcG9vbCA9IG5ldyBQb29sKCR0aGlzLT5wYWNrYWdlcywgJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyk7CgokdGhpcy0+YWxpYXNNYXAgPSBbXTsKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkID0gW107CiR0aGlzLT5sb2FkZWRQYWNrYWdlcyA9IFtdOwokdGhpcy0+bG9hZGVkUGVyUmVwbyA9IFtdOwokdGhpcy0+cGFja2FnZXMgPSBbXTsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9IFtdOwokdGhpcy0+bWF4RXh0ZW5kZWRSZXFzID0gW107CiR0aGlzLT5za2lwcGVkTG9hZCA9IFtdOwokdGhpcy0+aW5kZXhDb3VudGVyID0gMDsKCiR0aGlzLT5pby0+ZGVidWcoJ0J1aWx0IHBvb2wuJyk7CgokcG9vbCA9ICR0aGlzLT5ydW5PcHRpbWl6ZXIoJHJlcXVlc3QsICRwb29sKTsKCkludGVydmFsczo6Y2xlYXIoKTsKCnJldHVybiAkcG9vbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKFJlcXVlc3QgJHJlcXVlc3QsIHN0cmluZyAkbmFtZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCk6IHZvaWQKewoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpKSB7CnJldHVybjsKfQoKCgppZiAoaXNzZXQoJHRoaXMtPm1heEV4dGVuZGVkUmVxc1skbmFtZV0pKSB7CnJldHVybjsKfQoKCgoKCiRyb290UmVxdWlyZXMgPSAkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKTsKaWYgKGlzc2V0KCRyb290UmVxdWlyZXNbJG5hbWVdKSAmJiAhSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkcm9vdFJlcXVpcmVzWyRuYW1lXSkpIHsKJGNvbnN0cmFpbnQgPSAkcm9vdFJlcXVpcmVzWyRuYW1lXTsKfQoKCmlmICghaXNzZXQoJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSkpIHsKCgoKaWYgKGlzc2V0KCR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0pKSB7CgppZiAoSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdKSkgewpyZXR1cm47Cn0KCgokY29uc3RyYWludCA9IEludGVydmFsczo6Y29tcGFjdENvbnN0cmFpbnQoTXVsdGlDb25zdHJhaW50OjpjcmVhdGUoWyR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0sICRjb25zdHJhaW50XSwgZmFsc2UpKTsKfQoKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSA9ICRjb25zdHJhaW50OwoKcmV0dXJuOwp9CgoKCmlmIChJbnRlcnZhbHM6OmlzU3Vic2V0T2YoJGNvbnN0cmFpbnQsICR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pKSB7CnJldHVybjsKfQoKCgoKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSA9IEludGVydmFsczo6Y29tcGFjdENvbnN0cmFpbnQoTXVsdGlDb25zdHJhaW50OjpjcmVhdGUoWyR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0sICRjb25zdHJhaW50XSwgZmFsc2UpKTsKdW5zZXQoJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFBhY2thZ2VzTWFya2VkRm9yTG9hZGluZyhSZXF1ZXN0ICRyZXF1ZXN0LCBhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlc1RvTG9hZCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJHRoaXMtPnJlc3RyaWN0ZWRQYWNrYWdlc0xpc3QgIT09IG51bGwgJiYgIWlzc2V0KCR0aGlzLT5yZXN0cmljdGVkUGFja2FnZXNMaXN0WyRuYW1lXSkpIHsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSk7CmNvbnRpbnVlOwp9CiR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0gPSAkY29uc3RyYWludDsKfQoKJHBhY2thZ2VCYXRjaCA9ICR0aGlzLT5wYWNrYWdlc1RvTG9hZDsKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkID0gW107Cgpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvSW5kZXggPT4gJHJlcG9zaXRvcnkpIHsKaWYgKGVtcHR5KCRwYWNrYWdlQmF0Y2gpKSB7CmJyZWFrOwp9CgoKCmlmICgkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeSB8fCAkcmVwb3NpdG9yeSA9PT0gJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKSkgewpjb250aW51ZTsKfQokcmVzdWx0ID0gJHJlcG9zaXRvcnktPmxvYWRQYWNrYWdlcygkcGFja2FnZUJhdGNoLCAkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MsICR0aGlzLT5sb2FkZWRQZXJSZXBvWyRyZXBvSW5kZXhdID8/IFtdKTsKCmZvcmVhY2ggKCRyZXN1bHRbJ25hbWVzRm91bmQnXSBhcyAkbmFtZSkgewoKdW5zZXQoJHBhY2thZ2VCYXRjaFskbmFtZV0pOwp9CmZvcmVhY2ggKCRyZXN1bHRbJ3BhY2thZ2VzJ10gYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmxvYWRlZFBlclJlcG9bJHJlcG9JbmRleF1bJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0gPSAkcGFja2FnZTsKJHRoaXMtPmxvYWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcGFja2FnZSwgIWlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRwYWNrYWdlLT5nZXROYW1lKCldKSk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQYWNrYWdlKFJlcXVlc3QgJHJlcXVlc3QsIGFycmF5ICRyZXBvc2l0b3JpZXMsIEJhc2VQYWNrYWdlICRwYWNrYWdlLCBib29sICRwcm9wYWdhdGVVcGRhdGUpOiB2b2lkCnsKJGluZGV4ID0gJHRoaXMtPmluZGV4Q291bnRlcisrOwokdGhpcy0+cGFja2FnZXNbJGluZGV4XSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldWyRpbmRleF0gPSAkcGFja2FnZTsKfQoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwoKCgoKaWYgKGlzc2V0KCR0aGlzLT5yb290UmVmZXJlbmNlc1skbmFtZV0pKSB7CgppZiAoISRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpICYmICEkcmVxdWVzdC0+aXNGaXhlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CiRwYWNrYWdlLT5zZXRTb3VyY2VEaXN0UmVmZXJlbmNlcygkdGhpcy0+cm9vdFJlZmVyZW5jZXNbJG5hbWVdKTsKfQp9CgoKCgoKCmlmICgoJHByb3BhZ2F0ZVVwZGF0ZSB8fCBpc3NldCgkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpICYmIGlzc2V0KCR0aGlzLT5yb290QWxpYXNlc1skbmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0pKSB7CiRhbGlhcyA9ICR0aGlzLT5yb290QWxpYXNlc1skbmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV07CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYmFzZVBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9IGVsc2UgewokYmFzZVBhY2thZ2UgPSAkcGFja2FnZTsKfQppZiAoJGJhc2VQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CiRhbGlhc1BhY2thZ2UgPSBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJGJhc2VQYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfSBlbHNlIHsKJGFsaWFzUGFja2FnZSA9IG5ldyBBbGlhc1BhY2thZ2UoJGJhc2VQYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfQokYWxpYXNQYWNrYWdlLT5zZXRSb290UGFja2FnZUFsaWFzKHRydWUpOwoKJG5ld0luZGV4ID0gJHRoaXMtPmluZGV4Q291bnRlcisrOwokdGhpcy0+cGFja2FnZXNbJG5ld0luZGV4XSA9ICRhbGlhc1BhY2thZ2U7CiR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJGFsaWFzUGFja2FnZS0+Z2V0QWxpYXNPZigpKV1bJG5ld0luZGV4XSA9ICRhbGlhc1BhY2thZ2U7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRyZXF1aXJlID0gJGxpbmstPmdldFRhcmdldCgpOwokbGlua0NvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwoKCmlmIChpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJHJlcXVpcmVdKSkgewoKCgppZiAoJHByb3BhZ2F0ZVVwZGF0ZSAmJiAkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCkpIHsKJHNraXBwZWRSb290UmVxdWlyZXMgPSAkdGhpcy0+Z2V0U2tpcHBlZFJvb3RSZXF1aXJlcygkcmVxdWVzdCwgJHJlcXVpcmUpOwoKaWYgKCRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCkgfHwgISRza2lwcGVkUm9vdFJlcXVpcmVzKSB7CiR0aGlzLT51bmxvY2tQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcmVxdWlyZSk7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVxdWlyZSwgJGxpbmtDb25zdHJhaW50KTsKfSBlbHNlIHsKZm9yZWFjaCAoJHNraXBwZWRSb290UmVxdWlyZXMgYXMgJHJvb3RSZXF1aXJlKSB7CmlmICghaXNzZXQoJHRoaXMtPnVwZGF0ZUFsbG93V2FybmVkWyRyb290UmVxdWlyZV0pKSB7CiR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EZXBlbmRlbmN5ICcuJHJvb3RSZXF1aXJlLicgaXMgYWxzbyBhIHJvb3QgcmVxdWlyZW1lbnQuIFBhY2thZ2UgaGFzIG5vdCBiZWVuIGxpc3RlZCBhcyBhbiB1cGRhdGUgYXJndW1lbnQsIHNvIGtlZXBpbmcgbG9ja2VkIGF0IG9sZCB2ZXJzaW9uLiBVc2UgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMgKC1XKSB0byBpbmNsdWRlIHJvb3QgZGVwZW5kZW5jaWVzLjwvd2FybmluZz4nKTsKfQp9Cn0KfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRyZXF1aXJlXSkgJiYgIWlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skcmVxdWlyZV0pKSB7CgoKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRyZXF1aXJlLCAkbGlua0NvbnN0cmFpbnQpOwp9Cn0gZWxzZSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVxdWlyZSwgJGxpbmtDb25zdHJhaW50KTsKfQp9CgoKCmlmICgkcHJvcGFnYXRlVXBkYXRlICYmICRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoKSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewokcmVwbGFjZSA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKaWYgKGlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skcmVwbGFjZV0sICR0aGlzLT5za2lwcGVkTG9hZFskcmVwbGFjZV0pKSB7CiRza2lwcGVkUm9vdFJlcXVpcmVzID0gJHRoaXMtPmdldFNraXBwZWRSb290UmVxdWlyZXMoJHJlcXVlc3QsICRyZXBsYWNlKTsKCmlmICgkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlUm9vdERlcGVuZGVuY2llcygpIHx8ICEkc2tpcHBlZFJvb3RSZXF1aXJlcykgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcGxhY2UpOwoKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmdJZlJlcXVpcmVkKCRyZXF1ZXN0LCAkcmVwbGFjZSk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRza2lwcGVkUm9vdFJlcXVpcmVzIGFzICRyb290UmVxdWlyZSkgewppZiAoIWlzc2V0KCR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdKSkgewokdGhpcy0+dXBkYXRlQWxsb3dXYXJuZWRbJHJvb3RSZXF1aXJlXSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RGVwZW5kZW5jeSAnLiRyb290UmVxdWlyZS4nIGlzIGFsc28gYSByb290IHJlcXVpcmVtZW50LiBQYWNrYWdlIGhhcyBub3QgYmVlbiBsaXN0ZWQgYXMgYW4gdXBkYXRlIGFyZ3VtZW50LCBzbyBrZWVwaW5nIGxvY2tlZCBhdCBvbGQgdmVyc2lvbi4gVXNlIC0td2l0aC1hbGwtZGVwZW5kZW5jaWVzICgtVykgdG8gaW5jbHVkZSByb290IGRlcGVuZGVuY2llcy48L3dhcm5pbmc+Jyk7Cn0KfQp9Cn0KfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc1Jvb3RSZXF1aXJlKFJlcXVlc3QgJHJlcXVlc3QsIHN0cmluZyAkbmFtZSk6IGJvb2wKewokcm9vdFJlcXVpcmVzID0gJHJlcXVlc3QtPmdldFJlcXVpcmVzKCk7CgpyZXR1cm4gaXNzZXQoJHJvb3RSZXF1aXJlc1skbmFtZV0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFNraXBwZWRSb290UmVxdWlyZXMoUmVxdWVzdCAkcmVxdWVzdCwgc3RyaW5nICRuYW1lKTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJHJvb3RSZXF1aXJlcyA9ICRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpOwokbWF0Y2hlcyA9IFtdOwoKaWYgKGlzc2V0KCRyb290UmVxdWlyZXNbJG5hbWVdKSkgewpyZXR1cm4gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkgdXNlICgkbmFtZSk6IHN0cmluZyB7CmlmICgkbmFtZSAhPT0gJHBhY2thZ2UtPmdldE5hbWUoKSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldE5hbWUoKSAuJyAodmlhIHJlcGxhY2Ugb2YgJy4kbmFtZS4nKSc7Cn0KCnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9LCAkdGhpcy0+c2tpcHBlZExvYWRbJG5hbWVdKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSBhcyAkcGFja2FnZU9yUmVwbGFjZXIpIHsKaWYgKGlzc2V0KCRyb290UmVxdWlyZXNbJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCldKSkgewokbWF0Y2hlc1tdID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCk7Cn0KZm9yZWFjaCAoJHBhY2thZ2VPclJlcGxhY2VyLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CmlmIChpc3NldCgkcm9vdFJlcXVpcmVzWyRsaW5rLT5nZXRUYXJnZXQoKV0pKSB7CmlmICgkbmFtZSAhPT0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCkpIHsKJG1hdGNoZXNbXSA9ICRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpIC4nICh2aWEgcmVwbGFjZSBvZiAnLiRuYW1lLicpJzsKfSBlbHNlIHsKJG1hdGNoZXNbXSA9ICRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpOwp9CmJyZWFrOwp9Cn0KfQoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzVXBkYXRlQWxsb3dlZChCYXNlUGFja2FnZSAkcGFja2FnZSk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0IGFzICRwYXR0ZXJuKSB7CiRwYXR0ZXJuUmVnZXhwID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhdHRlcm4pOwppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVyblJlZ2V4cCwgJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHdhcm5BYm91dE5vbk1hdGNoaW5nVXBkYXRlQWxsb3dMaXN0KFJlcXVlc3QgJHJlcXVlc3QpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCBhcyAkcGF0dGVybikgewokcGF0dGVyblJlZ2V4cCA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKTsKCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm5SZWdleHAsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmNvbnRpbnVlIDI7Cn0KfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHBhY2thZ2VOYW1lID0+ICRjb25zdHJhaW50KSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZU5hbWUpKSB7CmNvbnRpbnVlIDI7Cn0KfQppZiAoc3RycG9zKCRwYXR0ZXJuLCAnKicpICE9PSBmYWxzZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhdHRlcm4gIicgLiAkcGF0dGVybiAuICciIGxpc3RlZCBmb3IgdXBkYXRlIGRvZXMgbm90IG1hdGNoIGFueSBsb2NrZWQgcGFja2FnZXMuPC93YXJuaW5nPicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhY2thZ2UgIicgLiAkcGF0dGVybiAuICciIGxpc3RlZCBmb3IgdXBkYXRlIGlzIG5vdCBsb2NrZWQuPC93YXJuaW5nPicpOwp9Cn0KfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxvY2tQYWNrYWdlKFJlcXVlc3QgJHJlcXVlc3QsIGFycmF5ICRyZXBvc2l0b3JpZXMsIHN0cmluZyAkbmFtZSk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+c2tpcHBlZExvYWRbJG5hbWVdIGFzICRwYWNrYWdlT3JSZXBsYWNlcikgewoKCmlmICgkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKSAhPT0gJG5hbWUgJiYgaXNzZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpXSkpIHsKJHJlcGxhY2VyTmFtZSA9ICRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpOwppZiAoJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKSB8fCAoISR0aGlzLT5pc1Jvb3RSZXF1aXJlKCRyZXF1ZXN0LCAkbmFtZSkgJiYgISR0aGlzLT5pc1Jvb3RSZXF1aXJlKCRyZXF1ZXN0LCAkcmVwbGFjZXJOYW1lKSkpIHsKJHRoaXMtPnVubG9ja1BhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRyZXBsYWNlck5hbWUpOwoKaWYgKCR0aGlzLT5pc1Jvb3RSZXF1aXJlKCRyZXF1ZXN0LCAkcmVwbGFjZXJOYW1lKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcGxhY2VyTmFtZSwgbmV3IE1hdGNoQWxsQ29uc3RyYWludCk7Cn0gZWxzZSB7CmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlcyBhcyAkbG9hZGVkUGFja2FnZSkgewokcmVxdWlyZXMgPSAkbG9hZGVkUGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKaWYgKGlzc2V0KCRyZXF1aXJlc1skcmVwbGFjZXJOYW1lXSkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRyZXBsYWNlck5hbWUsICRyZXF1aXJlc1skcmVwbGFjZXJOYW1lXS0+Z2V0Q29uc3RyYWludCgpKTsKfQp9Cn0KfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskbmFtZV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICRuYW1lKSB7CiR0aGlzLT5yZW1vdmVMb2FkZWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcGFja2FnZSwgJGluZGV4KTsKfQp9Cn0KCnVuc2V0KCR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0sICR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0sICR0aGlzLT5tYXhFeHRlbmRlZFJlcXNbJG5hbWVdLCAkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskbmFtZV0pOwoKCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRQYWNrYWdlcygpIGFzICRsb2NrZWRQYWNrYWdlKSB7CmlmICghKCRsb2NrZWRQYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSAmJiAkbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpID09PSAkbmFtZSkgewppZiAoZmFsc2UgIT09ICRpbmRleCA9IGFycmF5X3NlYXJjaCgkbG9ja2VkUGFja2FnZSwgJHRoaXMtPnBhY2thZ2VzLCB0cnVlKSkgewokcmVxdWVzdC0+dW5sb2NrUGFja2FnZSgkbG9ja2VkUGFja2FnZSk7CiR0aGlzLT5yZW1vdmVMb2FkZWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkbG9ja2VkUGFja2FnZSwgJGluZGV4KTsKCgoKCgoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkT3JMb2NrZWRQYWNrYWdlcygpIGFzICRmaXhlZE9yTG9ja2VkUGFja2FnZSkgewppZiAoJGZpeGVkT3JMb2NrZWRQYWNrYWdlID09PSAkbG9ja2VkUGFja2FnZSkgewpjb250aW51ZTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5za2lwcGVkTG9hZFskZml4ZWRPckxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRyZXF1aXJlcyA9ICRmaXhlZE9yTG9ja2VkUGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKaWYgKGlzc2V0KCRyZXF1aXJlc1skbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCksICRyZXF1aXJlc1skbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0Q29uc3RyYWludCgpKTsKfQoKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJHJlcGxhY2UpIHsKaWYgKGlzc2V0KCRyZXF1aXJlc1skcmVwbGFjZS0+Z2V0VGFyZ2V0KCldLCAkdGhpcy0+c2tpcHBlZExvYWRbJHJlcGxhY2UtPmdldFRhcmdldCgpXSkpIHsKJHRoaXMtPnVubG9ja1BhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRyZXBsYWNlLT5nZXRUYXJnZXQoKSk7CgokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcGxhY2UtPmdldFRhcmdldCgpLCAkcmVwbGFjZS0+Z2V0Q29uc3RyYWludCgpKTsKfQp9Cn0KfQp9Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmdJZlJlcXVpcmVkKFJlcXVlc3QgJHJlcXVlc3QsIHN0cmluZyAkbmFtZSk6IHZvaWQKewppZiAoJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRuYW1lKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJG5hbWUsICRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpWyRuYW1lXSk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlcyBhcyAkcGFja2FnZSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewppZiAoJG5hbWUgPT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKTsKfQp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW1vdmVMb2FkZWRQYWNrYWdlKFJlcXVlc3QgJHJlcXVlc3QsIGFycmF5ICRyZXBvc2l0b3JpZXMsIEJhc2VQYWNrYWdlICRwYWNrYWdlLCBpbnQgJGluZGV4KTogdm9pZAp7CiRyZXBvSW5kZXggPSBhcnJheV9zZWFyY2goJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSwgJHJlcG9zaXRvcmllcywgdHJ1ZSk7Cgp1bnNldCgkdGhpcy0+bG9hZGVkUGVyUmVwb1skcmVwb0luZGV4XVskcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSk7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1skaW5kZXhdKTsKaWYgKGlzc2V0KCR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldIGFzICRhbGlhc0luZGV4ID0+ICRhbGlhc1BhY2thZ2UpIHsKdW5zZXQoJHRoaXMtPmxvYWRlZFBlclJlcG9bJHJlcG9JbmRleF1bJGFsaWFzUGFja2FnZS0+Z2V0TmFtZSgpXVskYWxpYXNQYWNrYWdlLT5nZXRWZXJzaW9uKCldKTsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzWyRhbGlhc0luZGV4XSk7Cn0KdW5zZXQoJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJ1bk9wdGltaXplcihSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sKTogUG9vbAp7CmlmIChudWxsID09PSAkdGhpcy0+cG9vbE9wdGltaXplcikgewpyZXR1cm4gJHBvb2w7Cn0KCiR0aGlzLT5pby0+ZGVidWcoJ1J1bm5pbmcgcG9vbCBvcHRpbWl6ZXIuJyk7CgokYmVmb3JlID0gbWljcm90aW1lKHRydWUpOwokdG90YWwgPSBcY291bnQoJHBvb2wtPmdldFBhY2thZ2VzKCkpOwoKJHBvb2wgPSAkdGhpcy0+cG9vbE9wdGltaXplci0+b3B0aW1pemUoJHJlcXVlc3QsICRwb29sKTsKCiRmaWx0ZXJlZCA9ICR0b3RhbCAtIFxjb3VudCgkcG9vbC0+Z2V0UGFja2FnZXMoKSk7CgppZiAoMCA9PT0gJGZpbHRlcmVkKSB7CnJldHVybiAkcG9vbDsKfQoKJHRoaXMtPmlvLT53cml0ZShzcHJpbnRmKCdQb29sIG9wdGltaXplciBjb21wbGV0ZWQgaW4gJS4zZiBzZWNvbmRzJywgbWljcm90aW1lKHRydWUpIC0gJGJlZm9yZSksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoCic8aW5mbz5Gb3VuZCAlcyBwYWNrYWdlIHZlcnNpb25zIHJlZmVyZW5jZWQgaW4geW91ciBkZXBlbmRlbmN5IGdyYXBoLiAlcyAoJWQlJSkgd2VyZSBvcHRpbWl6ZWQgYXdheS48L2luZm8+JywKbnVtYmVyX2Zvcm1hdCgkdG90YWwpLApudW1iZXJfZm9ybWF0KCRmaWx0ZXJlZCksCnJvdW5kKDEwMCAvICR0b3RhbCAqICRmaWx0ZXJlZCkKKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CgpyZXR1cm4gJHBvb2w7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CgoKCgoKCmNsYXNzIFBvb2xPcHRpbWl6ZXIKewoKCgpwcml2YXRlICRwb2xpY3k7CgoKCgpwcml2YXRlICRpcnJlbW92YWJsZVBhY2thZ2VzID0gW107CgoKCgpwcml2YXRlICRyZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlID0gW107CgoKCgpwcml2YXRlICRjb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZSA9IFtdOwoKCgoKcHJpdmF0ZSAkcGFja2FnZXNUb1JlbW92ZSA9IFtdOwoKCgoKcHJpdmF0ZSAkYWxpYXNlc1BlclBhY2thZ2UgPSBbXTsKCgoKCnByaXZhdGUgJHJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBvbGljeUludGVyZmFjZSAkcG9saWN5KQp7CiR0aGlzLT5wb2xpY3kgPSAkcG9saWN5Owp9CgpwdWJsaWMgZnVuY3Rpb24gb3B0aW1pemUoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IFBvb2wKewokdGhpcy0+cHJlcGFyZSgkcmVxdWVzdCwgJHBvb2wpOwoKJHRoaXMtPm9wdGltaXplQnlJZGVudGljYWxEZXBlbmRlbmNpZXMoJHJlcXVlc3QsICRwb29sKTsKCiR0aGlzLT5vcHRpbWl6ZUltcG9zc2libGVQYWNrYWdlc0F3YXkoJHJlcXVlc3QsICRwb29sKTsKCiRvcHRpbWl6ZWRQb29sID0gJHRoaXMtPmFwcGx5UmVtb3ZhbHNUb1Bvb2woJHBvb2wpOwoKCgoKCgokdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlcyA9IFtdOwokdGhpcy0+cmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZSA9IFtdOwokdGhpcy0+Y29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2UgPSBbXTsKJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmUgPSBbXTsKJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlID0gW107CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXTsKCnJldHVybiAkb3B0aW1pemVkUG9vbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBwcmVwYXJlKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiB2b2lkCnsKJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRHcm91cHMgPSBbXTsKCgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRPckxvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRHcm91cHNbJHBhY2thZ2UtPmdldE5hbWUoKV1bXSA9IG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwp9CgoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHJlcXVpcmUgPT4gJGNvbnN0cmFpbnQpIHsKJHRoaXMtPmV4dHJhY3RSZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlKCRyZXF1aXJlLCAkY29uc3RyYWludCk7Cn0KCgpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHRoaXMtPmV4dHJhY3RSZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewokdGhpcy0+ZXh0cmFjdENvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KCgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZVskcGFja2FnZS0+Z2V0QWxpYXNPZigpLT5pZF1bXSA9ICRwYWNrYWdlOwp9Cn0KCiRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50cyA9IFtdOwpmb3JlYWNoICgkaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludEdyb3VwcyBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnRzKSB7CiRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50c1skcGFja2FnZU5hbWVdID0gMSA9PT0gXGNvdW50KCRjb25zdHJhaW50cykgPyAkY29uc3RyYWludHNbMF0gOiBuZXcgTXVsdGlDb25zdHJhaW50KCRjb25zdHJhaW50cywgZmFsc2UpOwp9CnVuc2V0KCRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50R3JvdXBzKTsKCgpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoIWlzc2V0KCRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKY29udGludWU7Cn0KCmlmIChDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0sIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkgewokdGhpcy0+bWFya1BhY2thZ2VJcnJlbW92YWJsZSgkcGFja2FnZSk7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtQYWNrYWdlSXJyZW1vdmFibGUoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJHBhY2thZ2UtPmlkXSA9IHRydWU7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewoKCiR0aGlzLT5tYXJrUGFja2FnZUlycmVtb3ZhYmxlKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpOwp9CmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmlkXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0gYXMgJGFsaWFzUGFja2FnZSkgewokdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlc1skYWxpYXNQYWNrYWdlLT5pZF0gPSB0cnVlOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBseVJlbW92YWxzVG9Qb29sKFBvb2wgJHBvb2wpOiBQb29sCnsKJHBhY2thZ2VzID0gW107CiRyZW1vdmVkVmVyc2lvbnMgPSBbXTsKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskcGFja2FnZS0+aWRdKSkgewokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9IGVsc2UgewokcmVtb3ZlZFZlcnNpb25zWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cgokb3B0aW1pemVkUG9vbCA9IG5ldyBQb29sKCRwYWNrYWdlcywgJHBvb2wtPmdldFVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcygpLCAkcmVtb3ZlZFZlcnNpb25zLCAkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlKTsKCnJldHVybiAkb3B0aW1pemVkUG9vbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBvcHRpbWl6ZUJ5SWRlbnRpY2FsRGVwZW5kZW5jaWVzKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiB2b2lkCnsKJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZSA9IFtdOwokcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXAgPSBbXTsKCmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKCmlmIChpc3NldCgkdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlc1skcGFja2FnZS0+aWRdKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPm1hcmtQYWNrYWdlRm9yUmVtb3ZhbCgkcGFja2FnZS0+aWQpOwoKJGRlcGVuZGVuY3lIYXNoID0gJHRoaXMtPmNhbGN1bGF0ZURlcGVuZGVuY3lIYXNoKCRwYWNrYWdlKTsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJHBhY2thZ2VOYW1lKSB7CmlmICghaXNzZXQoJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCR0aGlzLT5yZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0gYXMgJHJlcXVpcmVDb25zdHJhaW50KSB7CiRncm91cEhhc2hQYXJ0cyA9IFtdOwoKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRyZXF1aXJlQ29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSB7CiRncm91cEhhc2hQYXJ0c1tdID0gJ3JlcXVpcmU6JyAuIChzdHJpbmcpICRyZXF1aXJlQ29uc3RyYWludDsKfQoKaWYgKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CmlmIChDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkbGluay0+Z2V0Q29uc3RyYWludCgpLCBDb25zdHJhaW50OjpPUF9FUSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpIHsKCiRncm91cEhhc2hQYXJ0c1tdID0gJ3JlcXVpcmU6JyAuIChzdHJpbmcpICRsaW5rLT5nZXRDb25zdHJhaW50KCk7Cn0KfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZU5hbWVdIGFzICRjb25mbGljdENvbnN0cmFpbnQpIHsKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25mbGljdENvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkgewokZ3JvdXBIYXNoUGFydHNbXSA9ICdjb25mbGljdDonIC4gKHN0cmluZykgJGNvbmZsaWN0Q29uc3RyYWludDsKfQp9Cn0KCmlmICghJGdyb3VwSGFzaFBhcnRzKSB7CmNvbnRpbnVlOwp9CgokZ3JvdXBIYXNoID0gaW1wbG9kZSgnJywgJGdyb3VwSGFzaFBhcnRzKTsKJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskcGFja2FnZU5hbWVdWyRncm91cEhhc2hdWyRkZXBlbmRlbmN5SGFzaF1bXSA9ICRwYWNrYWdlOwokcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJHBhY2thZ2UtPmlkXVskcGFja2FnZU5hbWVdID0gWydncm91cEhhc2gnID0+ICRncm91cEhhc2gsICdkZXBlbmRlbmN5SGFzaCcgPT4gJGRlcGVuZGVuY3lIYXNoXTsKfQp9Cn0KCmZvcmVhY2ggKCRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2UgYXMgJGNvbnN0cmFpbnRHcm91cHMpIHsKZm9yZWFjaCAoJGNvbnN0cmFpbnRHcm91cHMgYXMgJGNvbnN0cmFpbnRHcm91cCkgewpmb3JlYWNoICgkY29uc3RyYWludEdyb3VwIGFzICRwYWNrYWdlcykgewoKaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CiR0aGlzLT5rZWVwUGFja2FnZSgkcGFja2FnZXNbMF0sICRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2UsICRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cCk7CmNvbnRpbnVlOwp9CgoKCiRsaXRlcmFscyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaXRlcmFsc1tdID0gJHBhY2thZ2UtPmlkOwp9Cgpmb3JlYWNoICgkdGhpcy0+cG9saWN5LT5zZWxlY3RQcmVmZXJyZWRQYWNrYWdlcygkcG9vbCwgJGxpdGVyYWxzKSBhcyAkcHJlZmVycmVkTGl0ZXJhbCkgewokdGhpcy0+a2VlcFBhY2thZ2UoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHByZWZlcnJlZExpdGVyYWwpLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwp9Cn0KfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlRGVwZW5kZW5jeUhhc2goQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBzdHJpbmcKewokaGFzaCA9ICcnOwoKJGhhc2hSZWxldmFudExpbmtzID0gWwoncmVxdWlyZXMnID0+ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpLAonY29uZmxpY3RzJyA9PiAkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCksCidyZXBsYWNlcycgPT4gJHBhY2thZ2UtPmdldFJlcGxhY2VzKCksCidwcm92aWRlcycgPT4gJHBhY2thZ2UtPmdldFByb3ZpZGVzKCksCl07Cgpmb3JlYWNoICgkaGFzaFJlbGV2YW50TGlua3MgYXMgJGtleSA9PiAkbGlua3MpIHsKaWYgKDAgPT09IFxjb3VudCgkbGlua3MpKSB7CmNvbnRpbnVlOwp9CgoKJGhhc2ggLj0gJGtleSAuICc6JzsKCiRzdWJoYXNoID0gW107Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKCgoKCiRzdWJoYXNoWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAoc3RyaW5nKSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwp9CgoKa3NvcnQoJHN1Ymhhc2gpOwoKZm9yZWFjaCAoJHN1Ymhhc2ggYXMgJHRhcmdldCA9PiAkY29uc3RyYWludCkgewokaGFzaCAuPSAkdGFyZ2V0IC4gJ0AnIC4gJGNvbnN0cmFpbnQ7Cn0KfQoKcmV0dXJuICRoYXNoOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtQYWNrYWdlRm9yUmVtb3ZhbChpbnQgJGlkKTogdm9pZAp7CgppZiAoaXNzZXQoJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJGlkXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQXR0ZW1wdGVkIHJlbW92aW5nIGEgcGFja2FnZSB3aGljaCB3YXMgcHJldmlvdXNseSBtYXJrZWQgaXJyZW1vdmFibGUnKTsKfQoKJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJGlkXSA9IHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGtlZXBQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBhcnJheSAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCBhcnJheSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOiB2b2lkCnsKCmlmICghaXNzZXQoJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJHBhY2thZ2UtPmlkXSkpIHsKcmV0dXJuOwp9Cgp1bnNldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskcGFja2FnZS0+aWRdKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewoKCiR0aGlzLT5rZWVwUGFja2FnZSgkcGFja2FnZS0+Z2V0QWxpYXNPZigpLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwp9CgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRwYWNrYWdlLT5pZF1bJG5hbWVdKSkgewokcGFja2FnZUdyb3VwUG9pbnRlcnMgPSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJHBhY2thZ2UtPmlkXVskbmFtZV07CiRwYWNrYWdlR3JvdXAgPSAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlWyRuYW1lXVskcGFja2FnZUdyb3VwUG9pbnRlcnNbJ2dyb3VwSGFzaCddXVskcGFja2FnZUdyb3VwUG9pbnRlcnNbJ2RlcGVuZGVuY3lIYXNoJ11dOwpmb3JlYWNoICgkcGFja2FnZUdyb3VwIGFzICRwa2cpIHsKaWYgKCRwa2cgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBrZy0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGtnID0gJHBrZy0+Z2V0QWxpYXNPZigpOwp9CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Vbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV1bJHBrZy0+Z2V0VmVyc2lvbigpXSA9ICRwa2ctPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmlkXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0gYXMgJGFsaWFzUGFja2FnZSkgewp1bnNldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskYWxpYXNQYWNrYWdlLT5pZF0pOwoKCmZvcmVhY2ggKCRhbGlhc1BhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRhbGlhc1BhY2thZ2UtPmlkXVskbmFtZV0pKSB7CiRwYWNrYWdlR3JvdXBQb2ludGVycyA9ICRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cFskYWxpYXNQYWNrYWdlLT5pZF1bJG5hbWVdOwokcGFja2FnZUdyb3VwID0gJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskbmFtZV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydncm91cEhhc2gnXV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydkZXBlbmRlbmN5SGFzaCddXTsKZm9yZWFjaCAoJHBhY2thZ2VHcm91cCBhcyAkcGtnKSB7CmlmICgkcGtnIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwa2ctPmdldFByZXR0eVZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBrZyA9ICRwa2ctPmdldEFsaWFzT2YoKTsKfQokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlW3NwbF9vYmplY3RfaGFzaCgkYWxpYXNQYWNrYWdlKV1bJHBrZy0+Z2V0VmVyc2lvbigpXSA9ICRwa2ctPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cn0KfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcHRpbWl6ZUltcG9zc2libGVQYWNrYWdlc0F3YXkoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IHZvaWQKewppZiAoY291bnQoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkpID09PSAwKSB7CnJldHVybjsKfQoKJHBhY2thZ2VJbmRleCA9IFtdOwoKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGlkID0gJHBhY2thZ2UtPmlkOwoKCmlmIChpc3NldCgkdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlc1skaWRdKSkgewpjb250aW51ZTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZVskaWRdKSB8fCAkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQoKaWYgKCRyZXF1ZXN0LT5pc0ZpeGVkUGFja2FnZSgkcGFja2FnZSkgfHwgJHJlcXVlc3QtPmlzTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKY29udGludWU7Cn0KCiRwYWNrYWdlSW5kZXhbJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmlkXSA9ICRwYWNrYWdlOwp9Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewoKCiRpc1VudXNlZFBhY2thZ2UgPSB0cnVlOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoZmFsc2UpIGFzICRwYWNrYWdlTmFtZSkgewppZiAoaXNzZXQoJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSkpIHsKJGlzVW51c2VkUGFja2FnZSA9IGZhbHNlOwpicmVhazsKfQp9CgppZiAoJGlzVW51c2VkUGFja2FnZSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHJlcXVpcmUgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CmlmICghaXNzZXQoJHBhY2thZ2VJbmRleFskcmVxdWlyZV0pKSB7CmNvbnRpbnVlOwp9CgokbGlua0NvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwpmb3JlYWNoICgkcGFja2FnZUluZGV4WyRyZXF1aXJlXSBhcyAkaWQgPT4gJHJlcXVpcmVkUGtnKSB7CmlmIChmYWxzZSA9PT0gQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGxpbmtDb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJHJlcXVpcmVkUGtnLT5nZXRWZXJzaW9uKCkpKSB7CiR0aGlzLT5tYXJrUGFja2FnZUZvclJlbW92YWwoJGlkKTsKdW5zZXQoJHBhY2thZ2VJbmRleFskcmVxdWlyZV1bJGlkXSk7Cn0KfQp9Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2Uoc3RyaW5nICRwYWNrYWdlLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KQp7CmZvcmVhY2ggKCR0aGlzLT5leHBhbmREaXNqdW5jdGl2ZU11bHRpQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpIGFzICRleHBhbmRlZCkgewokdGhpcy0+cmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZV1bKHN0cmluZykgJGV4cGFuZGVkXSA9ICRleHBhbmRlZDsKfQp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0Q29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2Uoc3RyaW5nICRwYWNrYWdlLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KQp7CmZvcmVhY2ggKCR0aGlzLT5leHBhbmREaXNqdW5jdGl2ZU11bHRpQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpIGFzICRleHBhbmRlZCkgewokdGhpcy0+Y29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VdWyhzdHJpbmcpICRleHBhbmRlZF0gPSAkZXhwYW5kZWQ7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHBhbmREaXNqdW5jdGl2ZU11bHRpQ29uc3RyYWludHMoQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewokY29uc3RyYWludCA9IEludGVydmFsczo6Y29tcGFjdENvbnN0cmFpbnQoJGNvbnN0cmFpbnQpOwoKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgTXVsdGlDb25zdHJhaW50ICYmICRjb25zdHJhaW50LT5pc0Rpc2p1bmN0aXZlKCkpIHsKCgpyZXR1cm4gJGNvbnN0cmFpbnQtPmdldENvbnN0cmFpbnRzKCk7Cn0KCgpyZXR1cm4gWyRjb25zdHJhaW50XTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBQcm9ibGVtCnsKCgoKCnByb3RlY3RlZCAkcmVhc29uU2VlbjsKCgoKCgpwcm90ZWN0ZWQgJHJlYXNvbnMgPSBbXTsKCgpwcm90ZWN0ZWQgJHNlY3Rpb24gPSAwOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUnVsZShSdWxlICRydWxlKTogdm9pZAp7CiR0aGlzLT5hZGRSZWFzb24oc3BsX29iamVjdF9oYXNoKCRydWxlKSwgJHJ1bGUpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWFzb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZWFzb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgYXJyYXkgJGluc3RhbGxlZE1hcCA9IFtdLCBhcnJheSAkbGVhcm5lZFBvb2wgPSBbXSk6IHN0cmluZwp7CgokcmVhc29ucyA9IGFycmF5X21lcmdlKC4uLmFycmF5X3JldmVyc2UoJHRoaXMtPnJlYXNvbnMpKTsKCmlmIChjb3VudCgkcmVhc29ucykgPT09IDEpIHsKcmVzZXQoJHJlYXNvbnMpOwokcnVsZSA9IGN1cnJlbnQoJHJlYXNvbnMpOwoKaWYgKCRydWxlLT5nZXRSZWFzb24oKSAhPT0gUnVsZTo6UlVMRV9ST09UX1JFUVVJUkUpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigiU2luZ2xlIHJlYXNvbiBwcm9ibGVtcyBtdXN0IGNvbnRhaW4gYSByb290IHJlcXVpcmUgcnVsZS4iKTsKfQoKJHJlYXNvbkRhdGEgPSAkcnVsZS0+Z2V0UmVhc29uRGF0YSgpOwokcGFja2FnZU5hbWUgPSAkcmVhc29uRGF0YVsncGFja2FnZU5hbWUnXTsKJGNvbnN0cmFpbnQgPSAkcmVhc29uRGF0YVsnY29uc3RyYWludCddOwoKJHBhY2thZ2VzID0gJHBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKcmV0dXJuICJcbiAgICAiLmltcGxvZGUoc2VsZjo6Z2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpOwp9Cn0KCnJldHVybiBzZWxmOjpmb3JtYXREZWR1cGxpY2F0ZWRSdWxlcygkcmVhc29ucywgJyAgICAnLCAkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlLCAkaW5zdGFsbGVkTWFwLCAkbGVhcm5lZFBvb2wpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdERlZHVwbGljYXRlZFJ1bGVzKGFycmF5ICRydWxlcywgc3RyaW5nICRpbmRlbnQsIFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgYXJyYXkgJGluc3RhbGxlZE1hcCA9IFtdLCBhcnJheSAkbGVhcm5lZFBvb2wgPSBbXSk6IHN0cmluZwp7CiRtZXNzYWdlcyA9IFtdOwokdGVtcGxhdGVzID0gW107CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJGRlZHVwbGljYXRhYmxlUnVsZVR5cGVzID0gW1J1bGU6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUywgUnVsZTo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUXTsKZm9yZWFjaCAoJHJ1bGVzIGFzICRydWxlKSB7CiRtZXNzYWdlID0gJHJ1bGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlLCAkaW5zdGFsbGVkTWFwLCAkbGVhcm5lZFBvb2wpOwppZiAoaW5fYXJyYXkoJHJ1bGUtPmdldFJlYXNvbigpLCAkZGVkdXBsaWNhdGFibGVSdWxlVHlwZXMsIHRydWUpICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD9QPHBhY2thZ2U+XFMrKSAoP1A8dmVyc2lvbj5cUyspICg/UDx0eXBlPnJlcXVpcmVzfGNvbmZsaWN0cyl9JywgJG1lc3NhZ2UsICRtKSkgewokbWVzc2FnZSA9IHN0cl9yZXBsYWNlKCclJywgJyUlJywgJG1lc3NhZ2UpOwokdGVtcGxhdGUgPSBQcmVnOjpyZXBsYWNlKCd7XlxTKyBcUysgfScsICclcyVzICcsICRtZXNzYWdlKTsKJG1lc3NhZ2VzW10gPSAkdGVtcGxhdGU7CiR0ZW1wbGF0ZXNbJHRlbXBsYXRlXVskbVsxXV1bJHBhcnNlci0+bm9ybWFsaXplKCRtWzJdKV0gPSAkbVsyXTsKJHNvdXJjZVBhY2thZ2UgPSAkcnVsZS0+Z2V0U291cmNlUGFja2FnZSgkcG9vbCk7CmZvcmVhY2ggKCRwb29sLT5nZXRSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Uoc3BsX29iamVjdF9oYXNoKCRzb3VyY2VQYWNrYWdlKSkgYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKJHRlbXBsYXRlc1skdGVtcGxhdGVdWyRtWzFdXVskdmVyc2lvbl0gPSAkcHJldHR5VmVyc2lvbjsKfQp9IGVsc2VpZiAoJG1lc3NhZ2UgIT09ICcnKSB7CiRtZXNzYWdlc1tdID0gJG1lc3NhZ2U7Cn0KfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoIChhcnJheV91bmlxdWUoJG1lc3NhZ2VzKSBhcyAkbWVzc2FnZSkgewppZiAoaXNzZXQoJHRlbXBsYXRlc1skbWVzc2FnZV0pKSB7CmZvcmVhY2ggKCR0ZW1wbGF0ZXNbJG1lc3NhZ2VdIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9ucykgewp1a3NvcnQoJHZlcnNpb25zLCAndmVyc2lvbl9jb21wYXJlJyk7CmlmICghJGlzVmVyYm9zZSkgewokdmVyc2lvbnMgPSBzZWxmOjpjb25kZW5zZVZlcnNpb25MaXN0KCR2ZXJzaW9ucywgMSk7Cn0KaWYgKGNvdW50KCR2ZXJzaW9ucykgPiAxKSB7CgokbWVzc2FnZSA9IFByZWc6OnJlcGxhY2UoJ3teKCVzJXMgKD86cmVxdWlyZXxjb25mbGljdCkpc30nLCAnJDEnLCAkbWVzc2FnZSk7CiRyZXN1bHRbXSA9IHNwcmludGYoJG1lc3NhZ2UsICRwYWNrYWdlLCAnWycuaW1wbG9kZSgnLCAnLCAkdmVyc2lvbnMpLiddJyk7Cn0gZWxzZSB7CiRyZXN1bHRbXSA9IHNwcmludGYoJG1lc3NhZ2UsICRwYWNrYWdlLCAnICcucmVzZXQoJHZlcnNpb25zKSk7Cn0KfQp9IGVsc2UgewokcmVzdWx0W10gPSAkbWVzc2FnZTsKfQp9CgpyZXR1cm4gIlxuJGluZGVudC0gIi5pbXBsb2RlKCJcbiRpbmRlbnQtICIsICRyZXN1bHQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNDYXVzZWRCeUxvY2soUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+cmVhc29ucyBhcyAkc2VjdGlvblJ1bGVzKSB7CmZvcmVhY2ggKCRzZWN0aW9uUnVsZXMgYXMgJHJ1bGUpIHsKaWYgKCRydWxlLT5pc0NhdXNlZEJ5TG9jaygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sKSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFJlYXNvbihzdHJpbmcgJGlkLCBSdWxlICRyZWFzb24pOiB2b2lkCnsKCgoKaWYgKCFpc3NldCgkdGhpcy0+cmVhc29uU2VlblskaWRdKSkgewokdGhpcy0+cmVhc29uU2VlblskaWRdID0gdHJ1ZTsKJHRoaXMtPnJlYXNvbnNbJHRoaXMtPnNlY3Rpb25dW10gPSAkcmVhc29uOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBuZXh0U2VjdGlvbigpOiB2b2lkCnsKJHRoaXMtPnNlY3Rpb24rKzsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlTmFtZSkpIHsKCmlmICgwID09PSBzdHJpcG9zKCRwYWNrYWdlTmFtZSwgJ3BocCcpIHx8ICRwYWNrYWdlTmFtZSA9PT0gJ2hodm0nKSB7CiR2ZXJzaW9uID0gc2VsZjo6Z2V0UGxhdGZvcm1QYWNrYWdlVmVyc2lvbigkcG9vbCwgJHBhY2thZ2VOYW1lLCBwaHB2ZXJzaW9uKCkpOwoKJG1zZyA9ICItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnOwoKaWYgKGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpIHx8ICgkcGFja2FnZU5hbWUgPT09ICdoaHZtJyAmJiBjb3VudCgkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSkpID4gMCkpIHsKcmV0dXJuIFskbXNnLCAneW91ciBISFZNIHZlcnNpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGF0IHJlcXVpcmVtZW50LiddOwp9CgppZiAoJHBhY2thZ2VOYW1lID09PSAnaGh2bScpIHsKcmV0dXJuIFskbXNnLCAnSEhWTSB3YXMgbm90IGRldGVjdGVkIG9uIHRoaXMgbWFjaGluZSwgbWFrZSBzdXJlIGl0IGlzIGluIHlvdXIgUEFUSC4nXTsKfQoKaWYgKG51bGwgPT09ICR2ZXJzaW9uKSB7CnJldHVybiBbJG1zZywgJ3RoZSAnLiRwYWNrYWdlTmFtZS4nIHBhY2thZ2UgaXMgZGlzYWJsZWQgYnkgeW91ciBwbGF0Zm9ybSBjb25maWcuIEVuYWJsZSBpdCBhZ2FpbiB3aXRoICJjb21wb3NlciBjb25maWcgcGxhdGZvcm0uJy4kcGFja2FnZU5hbWUuJyAtLXVuc2V0Ii4nXTsKfQoKcmV0dXJuIFskbXNnLCAneW91ciAnLiRwYWNrYWdlTmFtZS4nIHZlcnNpb24gKCcuICR2ZXJzaW9uIC4nKSBkb2VzIG5vdCBzYXRpc2Z5IHRoYXQgcmVxdWlyZW1lbnQuJ107Cn0KCgppZiAoMCA9PT0gc3RyaXBvcygkcGFja2FnZU5hbWUsICdleHQtJykpIHsKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHBhY2thZ2VOYW1lLCAnICcpKSB7CnJldHVybiBbJy0gJywgIlBIUCBleHRlbnNpb24gIi4kcGFja2FnZU5hbWUuJyBzaG91bGQgYmUgcmVxdWlyZWQgYXMgJy5zdHJfcmVwbGFjZSgnICcsICctJywgJHBhY2thZ2VOYW1lKS4nLiddOwp9CgokZXh0ID0gc3Vic3RyKCRwYWNrYWdlTmFtZSwgNCk7CiRtc2cgPSAiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgUEhQIGV4dGVuc2lvbiAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnOwoKJHZlcnNpb24gPSBzZWxmOjpnZXRQbGF0Zm9ybVBhY2thZ2VWZXJzaW9uKCRwb29sLCAkcGFja2FnZU5hbWUsIHBocHZlcnNpb24oJGV4dCkgPzogJzAnKTsKaWYgKG51bGwgPT09ICR2ZXJzaW9uKSB7CmlmIChleHRlbnNpb25fbG9hZGVkKCRleHQpKSB7CnJldHVybiBbCiRtc2csCid0aGUgJy4kcGFja2FnZU5hbWUuJyBwYWNrYWdlIGlzIGRpc2FibGVkIGJ5IHlvdXIgcGxhdGZvcm0gY29uZmlnLiBFbmFibGUgaXQgYWdhaW4gd2l0aCAiY29tcG9zZXIgY29uZmlnIHBsYXRmb3JtLicuJHBhY2thZ2VOYW1lLicgLS11bnNldCIuJywKXTsKfQoKcmV0dXJuIFskbXNnLCAnaXQgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtLiBJbnN0YWxsIG9yIGVuYWJsZSBQSFBcJ3MgJy4kZXh0LicgZXh0ZW5zaW9uLiddOwp9CgpyZXR1cm4gWyRtc2csICdpdCBoYXMgdGhlIHdyb25nIHZlcnNpb24gaW5zdGFsbGVkICgnLiR2ZXJzaW9uLicpLiddOwp9CgoKaWYgKDAgPT09IHN0cmlwb3MoJHBhY2thZ2VOYW1lLCAnbGliLScpKSB7CmlmIChzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSkgPT09ICdsaWItaWN1JykgewokZXJyb3IgPSBleHRlbnNpb25fbG9hZGVkKCdpbnRsJykgPyAnaXQgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIGluc3RhbGxlZCwgdHJ5IHVwZ3JhZGluZyB0aGUgaW50bCBleHRlbnNpb24uJyA6ICdpdCBpcyBtaXNzaW5nIGZyb20geW91ciBzeXN0ZW0sIG1ha2Ugc3VyZSB0aGUgaW50bCBleHRlbnNpb24gaXMgbG9hZGVkLic7CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyBsaW5rZWQgbGlicmFyeSAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnLCAkZXJyb3JdOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyBsaW5rZWQgbGlicmFyeSAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnLCAnaXQgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIGluc3RhbGxlZCBvciBpcyBtaXNzaW5nIGZyb20geW91ciBzeXN0ZW0sIG1ha2Ugc3VyZSB0byBsb2FkIHRoZSBleHRlbnNpb24gcHJvdmlkaW5nIGl0LiddOwp9Cn0KCiRsb2NrZWRQYWNrYWdlID0gbnVsbDsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICRwYWNrYWdlTmFtZSkgewokbG9ja2VkUGFja2FnZSA9ICRwYWNrYWdlOwppZiAoJHBvb2wtPmlzVW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiBbIi0gIiwgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIGZpeGVkIHRvICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIChsb2NrIGZpbGUgdmVyc2lvbikgYnkgYSBwYXJ0aWFsIHVwZGF0ZSBidXQgdGhhdCB2ZXJzaW9uIGlzIHJlamVjdGVkIGJ5IHlvdXIgbWluaW11bS1zdGFiaWxpdHkuIE1ha2Ugc3VyZSB5b3UgbGlzdCBpdCBhcyBhbiBhcmd1bWVudCBmb3IgdGhlIHVwZGF0ZSBjb21tYW5kLiddOwp9CmJyZWFrOwp9Cn0KCgoKaWYgKCRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpIHsKJHJvb3RSZXFzID0gJHJlcG9zaXRvcnlTZXQtPmdldFJvb3RSZXF1aXJlcygpOwppZiAoaXNzZXQoJHJvb3RSZXFzWyRwYWNrYWdlTmFtZV0pKSB7CiRmaWx0ZXJlZCA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHApIHVzZSAoJHJvb3RSZXFzLCAkcGFja2FnZU5hbWUpOiBib29sIHsKcmV0dXJuICRyb290UmVxc1skcGFja2FnZU5hbWVdLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwLT5nZXRWZXJzaW9uKCkpKTsKfSk7CmlmICgwID09PSBjb3VudCgkZmlsdGVyZWQpKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJy4oc2VsZjo6aGFzTXVsdGlwbGVOYW1lcygkcGFja2FnZXMpID8gJ3RoZXNlIGNvbmZsaWN0JyA6ICdpdCBjb25mbGljdHMnKS4nIHdpdGggeW91ciByb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZSAoJy4kcm9vdFJlcXNbJHBhY2thZ2VOYW1lXS0+Z2V0UHJldHR5U3RyaW5nKCkuJykuJ107Cn0KfQoKJHRlbXBSZXFzID0gJHJlcG9zaXRvcnlTZXQtPmdldFRlbXBvcmFyeUNvbnN0cmFpbnRzKCk7CmlmIChpc3NldCgkdGVtcFJlcXNbJHBhY2thZ2VOYW1lXSkpIHsKJGZpbHRlcmVkID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCkgdXNlICgkdGVtcFJlcXMsICRwYWNrYWdlTmFtZSk6IGJvb2wgewpyZXR1cm4gJHRlbXBSZXFzWyRwYWNrYWdlTmFtZV0tPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHAtPmdldFZlcnNpb24oKSkpOwp9KTsKaWYgKDAgPT09IGNvdW50KCRmaWx0ZXJlZCkpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgY29uZmxpY3QnIDogJ2l0IGNvbmZsaWN0cycpLicgd2l0aCB5b3VyIHRlbXBvcmFyeSB1cGRhdGUgY29uc3RyYWludCAoJy4kcGFja2FnZU5hbWUuJzonLiR0ZW1wUmVxc1skcGFja2FnZU5hbWVdLT5nZXRQcmV0dHlTdHJpbmcoKS4nKS4nXTsKfQp9CgppZiAoJGxvY2tlZFBhY2thZ2UpIHsKJGZpeGVkQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9PScsICRsb2NrZWRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwokZmlsdGVyZWQgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwKSB1c2UgKCRmaXhlZENvbnN0cmFpbnQpOiBib29sIHsKcmV0dXJuICRmaXhlZENvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHAtPmdldFZlcnNpb24oKSkpOwp9KTsKaWYgKDAgPT09IGNvdW50KCRmaWx0ZXJlZCkpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGUgcGFja2FnZSBpcyBmaXhlZCB0byAnLiRsb2NrZWRQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyAobG9jayBmaWxlIHZlcnNpb24pIGJ5IGEgcGFydGlhbCB1cGRhdGUgYW5kIHRoYXQgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4gTWFrZSBzdXJlIHlvdSBsaXN0IGl0IGFzIGFuIGFyZ3VtZW50IGZvciB0aGUgdXBkYXRlIGNvbW1hbmQuJ107Cn0KfQoKJG5vbkxvY2tlZFBhY2thZ2VzID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCk6IGJvb2wgewpyZXR1cm4gISRwLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBMb2NrQXJyYXlSZXBvc2l0b3J5Owp9KTsKCmlmICghJG5vbkxvY2tlZFBhY2thZ2VzKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBpbiB0aGUgbG9jayBmaWxlIGJ1dCBub3QgaW4gcmVtb3RlIHJlcG9zaXRvcmllcywgbWFrZSBzdXJlIHlvdSBhdm9pZCB1cGRhdGluZyB0aGlzIHBhY2thZ2UgdG8ga2VlcCB0aGUgb25lIGZyb20gdGhlIGxvY2sgZmlsZS4nXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGVzZSB3ZXJlIG5vdCBsb2FkZWQsIGxpa2VseSBiZWNhdXNlICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGV5IGNvbmZsaWN0JyA6ICdpdCBjb25mbGljdHMnKS4nIHdpdGggYW5vdGhlciByZXF1aXJlLiddOwp9CgoKaWYgKCRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCwgUmVwb3NpdG9yeVNldDo6QUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTKSkgewoKaWYgKCRhbGxSZXBvc1BhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50LCBSZXBvc2l0b3J5U2V0OjpBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMpKSB7CnJldHVybiBzZWxmOjpjb21wdXRlQ2hlY2tGb3JMb3dlclByaW9SZXBvKCRwb29sLCAkaXNWZXJib3NlLCAkcGFja2FnZU5hbWUsICRwYWNrYWdlcywgJGFsbFJlcG9zUGFja2FnZXMsICdtaW5pbXVtLXN0YWJpbGl0eScsICRjb25zdHJhaW50KTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgZG8nIDogJ2l0IGRvZXMnKS4nIG5vdCBtYXRjaCB5b3VyIG1pbmltdW0tc3RhYmlsaXR5LiddOwp9CgoKaWYgKCRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCBudWxsLCBSZXBvc2l0b3J5U2V0OjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpKSB7CgppZiAoJGFsbFJlcG9zUGFja2FnZXMgPSAkcmVwb3NpdG9yeVNldC0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQsIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1NIQURPV0VEX1JFUE9TSVRPUklFUykpIHsKcmV0dXJuIHNlbGY6OmNvbXB1dGVDaGVja0Zvckxvd2VyUHJpb1JlcG8oJHBvb2wsICRpc1ZlcmJvc2UsICRwYWNrYWdlTmFtZSwgJHBhY2thZ2VzLCAkYWxsUmVwb3NQYWNrYWdlcywgJ2NvbnN0cmFpbnQnLCAkY29uc3RyYWludCk7Cn0KCiRzdWZmaXggPSAnJzsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpID09PSAnZGV2LW1hc3RlcicpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRjYW5kaWRhdGUpIHsKaWYgKGluX2FycmF5KCRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgWydkZXYtZGVmYXVsdCcsICdkZXYtbWFpbiddLCB0cnVlKSkgewokc3VmZml4ID0gJyBQZXJoYXBzIGRldi1tYXN0ZXIgd2FzIHJlbmFtZWQgdG8gJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJz8nOwpicmVhazsKfQp9Cn0KCgokYWxsUmVwb3NQYWNrYWdlcyA9ICRwYWNrYWdlczsKJHRvcFBhY2thZ2UgPSByZXNldCgkYWxsUmVwb3NQYWNrYWdlcyk7CmlmICgkdG9wUGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRzdWZmaXggPSAnIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kZXAtb24tcm9vdCBmb3IgZGV0YWlscyBhbmQgYXNzaXN0YW5jZS4nOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0ICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGVzZSBkbycgOiAnaXQgZG9lcycpLicgbm90IG1hdGNoIHRoZSBjb25zdHJhaW50LicgLiAkc3VmZml4XTsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7XltBLVphLXowLTlfLi8tXSskfScsICRwYWNrYWdlTmFtZSkpIHsKJGlsbGVnYWxDaGFycyA9IFByZWc6OnJlcGxhY2UoJ3tbQS1aYS16MC05Xy4vLV0rfScsICcnLCAkcGFja2FnZU5hbWUpOwoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lLCBpdCAiLCAnY291bGQgbm90IGJlIGZvdW5kLCBpdCBsb29rcyBsaWtlIGl0cyBuYW1lIGlzIGludmFsaWQsICInLiRpbGxlZ2FsQ2hhcnMuJyIgaXMgbm90IGFsbG93ZWQgaW4gcGFja2FnZSBuYW1lcy4nXTsKfQoKaWYgKCRwcm92aWRlcnMgPSAkcmVwb3NpdG9yeVNldC0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSkpIHsKJG1heFByb3ZpZGVycyA9IDIwOwokcHJvdmlkZXJzU3RyID0gaW1wbG9kZShhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcCk6IHN0cmluZyB7CiRkZXNjcmlwdGlvbiA9ICRwWydkZXNjcmlwdGlvbiddID8gJyAnLnN1YnN0cigkcFsnZGVzY3JpcHRpb24nXSwgMCwgMTAwKSA6ICcnOwoKcmV0dXJuICcgICAgICAtICcuJHBbJ25hbWUnXS4kZGVzY3JpcHRpb24uIlxuIjsKfSwgY291bnQoJHByb3ZpZGVycykgPiAkbWF4UHJvdmlkZXJzICsgMSA/IGFycmF5X3NsaWNlKCRwcm92aWRlcnMsIDAsICRtYXhQcm92aWRlcnMpIDogJHByb3ZpZGVycykpOwppZiAoY291bnQoJHByb3ZpZGVycykgPiAkbWF4UHJvdmlkZXJzICsgMSkgewokcHJvdmlkZXJzU3RyIC49ICcgICAgICAuLi4gYW5kICcuKGNvdW50KCRwcm92aWRlcnMpIC0gJG1heFByb3ZpZGVycykuJyBtb3JlLicuIlxuIjsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4iLCBpdCAiLCAiY291bGQgbm90IGJlIGZvdW5kIGluIGFueSB2ZXJzaW9uLCBidXQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBwcm92aWRlIGl0OlxuIi4kcHJvdmlkZXJzU3RyLiIgICAgICBDb25zaWRlciByZXF1aXJpbmcgb25lIG9mIHRoZXNlIHRvIHNhdGlzZnkgdGhlICRwYWNrYWdlTmFtZSByZXF1aXJlbWVudC4iXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lLCBpdCAiLCAiY291bGQgbm90IGJlIGZvdW5kIGluIGFueSB2ZXJzaW9uLCB0aGVyZSBtYXkgYmUgYSB0eXBvIGluIHRoZSBwYWNrYWdlIG5hbWUuIl07Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBhY2thZ2VMaXN0KGFycmF5ICRwYWNrYWdlcywgYm9vbCAkaXNWZXJib3NlLCA/UG9vbCAkcG9vbCA9IG51bGwsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgYm9vbCAkdXNlUmVtb3ZlZFZlcnNpb25Hcm91cCA9IGZhbHNlKTogc3RyaW5nCnsKJHByZXBhcmVkID0gW107CiRoYXNEZWZhdWx0QnJhbmNoID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcHJlcGFyZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ25hbWUnXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiRwcmVwYXJlZFskcGFja2FnZS0+Z2V0TmFtZSgpXVsndmVyc2lvbnMnXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlID8gJyAoYWxpYXMgb2YgJy4kcGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyknIDogJycpOwppZiAoJHBvb2wgJiYgJGNvbnN0cmFpbnQpIHsKZm9yZWFjaCAoJHBvb2wtPmdldFJlbW92ZWRWZXJzaW9ucygkcGFja2FnZS0+Z2V0TmFtZSgpLCAkY29uc3RyYWludCkgYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKJHByZXBhcmVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9ucyddWyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KaWYgKCRwb29sICYmICR1c2VSZW1vdmVkVmVyc2lvbkdyb3VwKSB7CmZvcmVhY2ggKCRwb29sLT5nZXRSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Uoc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKSkgYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKJHByZXBhcmVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9ucyddWyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KaWYgKCRwYWNrYWdlLT5pc0RlZmF1bHRCcmFuY2goKSkgewokaGFzRGVmYXVsdEJyYW5jaFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KfQoKJHByZXBhcmVkU3RyaW5ncyA9IFtdOwpmb3JlYWNoICgkcHJlcGFyZWQgYXMgJG5hbWUgPT4gJHBhY2thZ2UpIHsKCmlmIChpc3NldCgkcGFja2FnZVsndmVyc2lvbnMnXVtWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBU10sICRoYXNEZWZhdWx0QnJhbmNoWyRuYW1lXSkpIHsKdW5zZXQoJHBhY2thZ2VbJ3ZlcnNpb25zJ11bVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVNdKTsKfQoKdWtzb3J0KCRwYWNrYWdlWyd2ZXJzaW9ucyddLCAndmVyc2lvbl9jb21wYXJlJyk7CgppZiAoISRpc1ZlcmJvc2UpIHsKJHBhY2thZ2VbJ3ZlcnNpb25zJ10gPSBzZWxmOjpjb25kZW5zZVZlcnNpb25MaXN0KCRwYWNrYWdlWyd2ZXJzaW9ucyddLCA0KTsKfQokcHJlcGFyZWRTdHJpbmdzW10gPSAkcGFja2FnZVsnbmFtZSddLidbJy5pbXBsb2RlKCcsICcsICRwYWNrYWdlWyd2ZXJzaW9ucyddKS4nXSc7Cn0KCnJldHVybiBpbXBsb2RlKCcsICcsICRwcmVwYXJlZFN0cmluZ3MpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1QYWNrYWdlVmVyc2lvbihQb29sICRwb29sLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJHZlcnNpb24pOiA/c3RyaW5nCnsKJGF2YWlsYWJsZSA9ICRwb29sLT53aGF0UHJvdmlkZXMoJHBhY2thZ2VOYW1lKTsKCmlmIChjb3VudCgkYXZhaWxhYmxlKSkgewokc2VsZWN0ZWQgPSBudWxsOwpmb3JlYWNoICgkYXZhaWxhYmxlIGFzICRwa2cpIHsKaWYgKCRwa2ctPmdldFJlcG9zaXRvcnkoKSBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeSkgewokc2VsZWN0ZWQgPSAkcGtnOwpicmVhazsKfQp9CmlmICgkc2VsZWN0ZWQgPT09IG51bGwpIHsKJHNlbGVjdGVkID0gcmVzZXQoJGF2YWlsYWJsZSk7Cn0KCgppZiAoJHNlbGVjdGVkLT5nZXROYW1lKCkgIT09ICRwYWNrYWdlTmFtZSkgewoKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoYXJyYXlfdmFsdWVzKCRzZWxlY3RlZC0+Z2V0UHJvdmlkZXMoKSksIGFycmF5X3ZhbHVlcygkc2VsZWN0ZWQtPmdldFJlcGxhY2VzKCkpKSBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkcGFja2FnZU5hbWUpIHsKcmV0dXJuICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyAnLnN1YnN0cigkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgMCwgLTEpLidkIGJ5ICcuJHNlbGVjdGVkLT5nZXRQcmV0dHlTdHJpbmcoKTsKfQp9Cn0KCiR2ZXJzaW9uID0gJHNlbGVjdGVkLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRleHRyYSA9ICRzZWxlY3RlZC0+Z2V0RXh0cmEoKTsKaWYgKCRzZWxlY3RlZCBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiBpc3NldCgkZXh0cmFbJ2NvbmZpZy5wbGF0Zm9ybSddKSAmJiAkZXh0cmFbJ2NvbmZpZy5wbGF0Zm9ybSddID09PSB0cnVlKSB7CiR2ZXJzaW9uIC49ICc7ICcgLiBzdHJfcmVwbGFjZSgnUGFja2FnZSAnLCAnJywgJHNlbGVjdGVkLT5nZXREZXNjcmlwdGlvbigpKTsKfQp9IGVsc2UgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29uZGVuc2VWZXJzaW9uTGlzdChhcnJheSAkdmVyc2lvbnMsIGludCAkbWF4LCBpbnQgJG1heERldiA9IDE2KTogYXJyYXkKewppZiAoY291bnQoJHZlcnNpb25zKSA8PSAkbWF4KSB7CnJldHVybiBhcnJheV92YWx1ZXMoJHZlcnNpb25zKTsKfQoKJGZpbHRlcmVkID0gW107CiRieU1ham9yID0gW107CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbiA9PiAkcHJldHR5KSB7CmlmICgwID09PSBzdHJpcG9zKChzdHJpbmcpICR2ZXJzaW9uLCAnZGV2LScpKSB7CiRieU1ham9yWydkZXYnXVtdID0gJHByZXR0eTsKfSBlbHNlIHsKJGJ5TWFqb3JbUHJlZzo6cmVwbGFjZSgne14oXGQrKVwuLip9JywgJyQxJywgKHN0cmluZykgJHZlcnNpb24pXVtdID0gJHByZXR0eTsKfQp9CmZvcmVhY2ggKCRieU1ham9yIGFzICRtYWpvclZlcnNpb24gPT4gJHZlcnNpb25zRm9yTWFqb3IpIHsKJG1heFZlcnNpb25zID0gJG1ham9yVmVyc2lvbiA9PT0gJ2RldicgPyAkbWF4RGV2IDogJG1heDsKaWYgKGNvdW50KCR2ZXJzaW9uc0Zvck1ham9yKSA+ICRtYXhWZXJzaW9ucykgewoKJGZpbHRlcmVkW10gPSAkdmVyc2lvbnNGb3JNYWpvclswXTsKJGZpbHRlcmVkW10gPSAnLi4uJzsKJGZpbHRlcmVkW10gPSAkdmVyc2lvbnNGb3JNYWpvcltjb3VudCgkdmVyc2lvbnNGb3JNYWpvcikgLSAxXTsKfSBlbHNlIHsKJGZpbHRlcmVkID0gYXJyYXlfbWVyZ2UoJGZpbHRlcmVkLCAkdmVyc2lvbnNGb3JNYWpvcik7Cn0KfQoKcmV0dXJuICRmaWx0ZXJlZDsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzTXVsdGlwbGVOYW1lcyhhcnJheSAkcGFja2FnZXMpOiBib29sCnsKJG5hbWUgPSBudWxsOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRuYW1lID09PSBudWxsIHx8ICRuYW1lID09PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfSBlbHNlIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbXB1dGVDaGVja0Zvckxvd2VyUHJpb1JlcG8oUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBhcnJheSAkaGlnaGVyUmVwb1BhY2thZ2VzLCBhcnJheSAkYWxsUmVwb3NQYWNrYWdlcywgc3RyaW5nICRyZWFzb24sID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJG5leHRSZXBvUGFja2FnZXMgPSBbXTsKJG5leHRSZXBvID0gbnVsbDsKCmZvcmVhY2ggKCRhbGxSZXBvc1BhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkbmV4dFJlcG8gPT09IG51bGwgfHwgJG5leHRSZXBvID09PSAkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpKSB7CiRuZXh0UmVwb1BhY2thZ2VzW10gPSAkcGFja2FnZTsKJG5leHRSZXBvID0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKTsKfSBlbHNlIHsKYnJlYWs7Cn0KfQoKaWYgKCRoaWdoZXJSZXBvUGFja2FnZXMpIHsKJHRvcFBhY2thZ2UgPSByZXNldCgkaGlnaGVyUmVwb1BhY2thZ2VzKTsKaWYgKCR0b3BQYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKcmV0dXJuIFsKIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJywgaXQgaXMgJywKJ3NhdGlzZmlhYmxlIGJ5ICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJG5leHRSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBmcm9tICcuJG5leHRSZXBvLT5nZXRSZXBvTmFtZSgpLicgYnV0ICcuJHRvcFBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIHRoZSByb290IHBhY2thZ2UgYW5kIGNhbm5vdCBiZSBtb2RpZmllZC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RlcC1vbi1yb290IGZvciBkZXRhaWxzIGFuZCBhc3Npc3RhbmNlLicsCl07Cn0KfQoKaWYgKCRuZXh0UmVwbyBpbnN0YW5jZW9mIExvY2tBcnJheVJlcG9zaXRvcnkpIHsKJHNpbmd1bGFyID0gY291bnQoJGhpZ2hlclJlcG9QYWNrYWdlcykgPT09IDE7Cgokc3VnZ2VzdGlvbiA9ICdNYWtlIHN1cmUgeW91IGVpdGhlciBmaXggdGhlICcuJHJlYXNvbi4nIG9yIGF2b2lkIHVwZGF0aW5nIHRoaXMgcGFja2FnZSB0byBrZWVwIHRoZSBvbmUgcHJlc2VudCBpbiB0aGUgbG9jayBmaWxlICgnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicpLic7CgppZiAoJG5leHRSZXBvUGFja2FnZXNbMF0tPmdldERpc3RUeXBlKCkgPT09ICdwYXRoJykgewokdHJhbnNwb3J0T3B0aW9ucyA9ICRuZXh0UmVwb1BhY2thZ2VzWzBdLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7CmlmICghaXNzZXQoJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSkgfHwgJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSAhPT0gZmFsc2UpIHsKJHN1Z2dlc3Rpb24gPSAnTWFrZSBzdXJlIHlvdSBmaXggdGhlICcuJHJlYXNvbi4nIGFzIHBhY2thZ2VzIGluc3RhbGxlZCBmcm9tIHN5bWxpbmtlZCBwYXRoIHJlcG9zIGFyZSB1cGRhdGVkIGV2ZW4gaW4gcGFydGlhbCB1cGRhdGVzIGFuZCB0aGUgb25lIGZyb20gdGhlIGxvY2sgZmlsZSBjYW4gdGh1cyBub3QgYmUgdXNlZC4nOwp9Cn0KCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLAonZm91bmQgJyAuIHNlbGY6OmdldFBhY2thZ2VMaXN0KCRoaWdoZXJSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJyAuICgkc2luZ3VsYXIgPyAnaXQgZG9lcycgOiAndGhlc2UgZG8nKSAuICcgbm90IG1hdGNoIHlvdXIgJy4kcmVhc29uLicgYW5kICcgLiAoJHNpbmd1bGFyID8gJ2lzJyA6ICdhcmUnKSAuICcgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gJy4kc3VnZ2VzdGlvbiwKXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsIGl0IGlzICcsICdzYXRpc2ZpYWJsZSBieSAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgZnJvbSAnLiRuZXh0UmVwby0+Z2V0UmVwb05hbWUoKS4nIGJ1dCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRoaWdoZXJSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBmcm9tICcucmVzZXQoJGhpZ2hlclJlcG9QYWNrYWdlcyktPmdldFJlcG9zaXRvcnkoKS0+Z2V0UmVwb05hbWUoKS4nIGhhcyBoaWdoZXIgcmVwb3NpdG9yeSBwcmlvcml0eS4gVGhlIHBhY2thZ2VzIGZyb20gdGhlIGhpZ2hlciBwcmlvcml0eSByZXBvc2l0b3J5IGRvIG5vdCBtYXRjaCB5b3VyICcuJHJlYXNvbi4nIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gVGhhdCByZXBvc2l0b3J5IGlzIGNhbm9uaWNhbCBzbyB0aGUgbG93ZXIgcHJpb3JpdHkgcmVwb1wncyBwYWNrYWdlcyBhcmUgbm90IGluc3RhbGxhYmxlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcmVwb3ByaW8gZm9yIGRldGFpbHMgYW5kIGFzc2lzdGFuY2UuJ107Cn0KCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY29uc3RyYWludFRvVGV4dCg/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBzdHJpbmcKewppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50ICYmICRjb25zdHJhaW50LT5nZXRPcGVyYXRvcigpID09PSBDb25zdHJhaW50OjpTVFJfT1BfRVEgJiYgIXN0cl9zdGFydHNfd2l0aCgkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CmlmICghUHJlZzo6aXNNYXRjaCgne15cZCsoPzpcLlxkKykqJH0nLCAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkpKSB7CnJldHVybiAnICcuJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpIC4nIChleGFjdCB2ZXJzaW9uIG1hdGNoKSc7Cn0KCiR2ZXJzaW9ucyA9IFskY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCldOwpmb3IgKCRpID0gMyAtIHN1YnN0cl9jb3VudCgkdmVyc2lvbnNbMF0sICcuJyk7ICRpID4gMDsgJGktLSkgewokdmVyc2lvbnNbXSA9IGVuZCgkdmVyc2lvbnMpIC4gJy4wJzsKfQoKcmV0dXJuICcgJyAuICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSAuICcgKGV4YWN0IHZlcnNpb24gbWF0Y2g6ICcgLiAoY291bnQoJHZlcnNpb25zKSA+IDEgPyBpbXBsb2RlKCcsICcsIGFycmF5X3NsaWNlKCR2ZXJzaW9ucywgMCwgLTEpKSAuICcgb3IgJyAuIGVuZCgkdmVyc2lvbnMpIDogJHZlcnNpb25zWzBdKSAuICcpJzsKfQoKcmV0dXJuICRjb25zdHJhaW50ID8gJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSA6ICcnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKCgoKCmNsYXNzIFJlcXVlc3QKewoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX09OTFlfTElTVEVEID0gMDsKCgoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkUgPSAxOwoKCgoKCnB1YmxpYyBjb25zdCBVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTID0gMjsKCgpwcm90ZWN0ZWQgJGxvY2tlZFJlcG9zaXRvcnk7Cgpwcm90ZWN0ZWQgJHJlcXVpcmVzID0gW107Cgpwcm90ZWN0ZWQgJGZpeGVkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkbG9ja2VkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkZml4ZWRMb2NrZWRQYWNrYWdlcyA9IFtdOwoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd0xpc3QgPSBbXTsKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gZmFsc2U7Cgpwcml2YXRlICRyZXN0cmljdGVkUGFja2FnZXMgPSBudWxsOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbCkKewokdGhpcy0+bG9ja2VkUmVwb3NpdG9yeSA9ICRsb2NrZWRSZXBvc2l0b3J5Owp9CgpwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZU5hbWUoc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogdm9pZAp7CiRwYWNrYWdlTmFtZSA9IHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKTsKCmlmICgkY29uc3RyYWludCA9PT0gbnVsbCkgewokY29uc3RyYWludCA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcXVpcmVzWyRwYWNrYWdlTmFtZV0pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ092ZXJ3cml0aW5nIHJlcXVpcmVzIHNlZW1zIGxpa2UgYSBidWcgKCcuJHBhY2thZ2VOYW1lLicgJy4kdGhpcy0+cmVxdWlyZXNbJHBhY2thZ2VOYW1lXS0+Z2V0UHJldHR5U3RyaW5nKCkuJyA9PiAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKS4nLCBjaGVjayB3aHkgaXQgaXMgaGFwcGVuaW5nLCBtaWdodCBiZSBhIHJvb3QgYWxpYXMnKTsKfQokdGhpcy0+cmVxdWlyZXNbJHBhY2thZ2VOYW1lXSA9ICRjb25zdHJhaW50Owp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZml4UGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+Zml4ZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvY2tQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5sb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpeExvY2tlZFBhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmZpeGVkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKJHRoaXMtPmZpeGVkTG9ja2VkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIHVubG9ja1BhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKdW5zZXQoJHRoaXMtPmxvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGVBbGxvd0xpc3QoYXJyYXkgJHVwZGF0ZUFsbG93TGlzdCwgJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyk6IHZvaWQKewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gJHVwZGF0ZUFsbG93TGlzdDsKJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9ICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcGRhdGVBbGxvd0xpc3QoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnVwZGF0ZUFsbG93TGlzdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygpOiBib29sCnsKcmV0dXJuICR0aGlzLT51cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgIT09IHNlbGY6OlVQREFURV9PTkxZX0xJU1RFRDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID09PSBzZWxmOjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rml4ZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Zml4ZWRQYWNrYWdlczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRml4ZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+Zml4ZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bG9ja2VkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0xvY2tlZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmxvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSB8fCBpc3NldCgkdGhpcy0+Zml4ZWRMb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXhlZE9yTG9ja2VkUGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfbWVyZ2UoJHRoaXMtPmZpeGVkUGFja2FnZXMsICR0aGlzLT5sb2NrZWRQYWNrYWdlcyk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXNlbnRNYXAoYm9vbCAkcGFja2FnZUlkcyA9IGZhbHNlKTogYXJyYXkKewokcHJlc2VudE1hcCA9IFtdOwoKaWYgKCR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwcmVzZW50TWFwWyRwYWNrYWdlSWRzID8gJHBhY2thZ2UtPmdldElkKCkgOiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5maXhlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwcmVzZW50TWFwWyRwYWNrYWdlSWRzID8gJHBhY2thZ2UtPmdldElkKCkgOiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJHByZXNlbnRNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXhlZFBhY2thZ2VzTWFwKCk6IGFycmF5CnsKJGZpeGVkUGFja2FnZXNNYXAgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5maXhlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRmaXhlZFBhY2thZ2VzTWFwWyRwYWNrYWdlLT5nZXRJZCgpXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJGZpeGVkUGFja2FnZXNNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRSZXBvc2l0b3J5KCk6ID9Mb2NrQXJyYXlSZXBvc2l0b3J5CnsKcmV0dXJuICR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXN0cmljdFBhY2thZ2VzKGFycmF5ICRuYW1lcyk6IHZvaWQKewokdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzID0gJG5hbWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdHJpY3RlZFBhY2thZ2VzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIFJ1bGUKewoKcHVibGljIGNvbnN0IFJVTEVfUk9PVF9SRVFVSVJFID0gMjsgCnB1YmxpYyBjb25zdCBSVUxFX0ZJWEVEID0gMzsgCnB1YmxpYyBjb25zdCBSVUxFX1BBQ0tBR0VfQ09ORkxJQ1QgPSA2OyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9SRVFVSVJFUyA9IDc7IApwdWJsaWMgY29uc3QgUlVMRV9QQUNLQUdFX1NBTUVfTkFNRSA9IDEwOyAKcHVibGljIGNvbnN0IFJVTEVfTEVBUk5FRCA9IDEyOyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9BTElBUyA9IDEzOyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTID0gMTQ7IAoKCnByaXZhdGUgY29uc3QgQklURklFTERfVFlQRSA9IDA7CnByaXZhdGUgY29uc3QgQklURklFTERfUkVBU09OID0gODsKcHJpdmF0ZSBjb25zdCBCSVRGSUVMRF9ESVNBQkxFRCA9IDE2OwoKCnByb3RlY3RlZCAkYml0ZmllbGQ7Cgpwcm90ZWN0ZWQgJHJlcXVlc3Q7CgoKCgpwcm90ZWN0ZWQgJHJlYXNvbkRhdGE7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKJHRoaXMtPnJlYXNvbkRhdGEgPSAkcmVhc29uRGF0YTsKCiR0aGlzLT5iaXRmaWVsZCA9ICgwIDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSB8CigkcmVhc29uIDw8IHNlbGY6OkJJVEZJRUxEX1JFQVNPTikgfAooMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXk7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWFzb24oKTogaW50CnsKcmV0dXJuICgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1JFQVNPTikpID4+IHNlbGY6OkJJVEZJRUxEX1JFQVNPTjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlYXNvbkRhdGEoKQp7CnJldHVybiAkdGhpcy0+cmVhc29uRGF0YTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVkUGFja2FnZSgpOiA/c3RyaW5nCnsKc3dpdGNoICgkdGhpcy0+Z2V0UmVhc29uKCkpIHsKY2FzZSBzZWxmOjpSVUxFX1JPT1RfUkVRVUlSRToKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ107CmNhc2Ugc2VsZjo6UlVMRV9GSVhFRDoKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2UnXS0+Z2V0TmFtZSgpOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldFRhcmdldCgpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFR5cGUoJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkID0gKCR0aGlzLT5iaXRmaWVsZCAmIH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpKSB8ICgoMjU1ICYgJHR5cGUpIDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBpbnQKewpyZXR1cm4gKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfVFlQRSkpID4+IHNlbGY6OkJJVEZJRUxEX1RZUEU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlKCk6IHZvaWQKewokdGhpcy0+Yml0ZmllbGQgPSAoJHRoaXMtPmJpdGZpZWxkICYgfigyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSB8ICgxIDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZSgpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkICY9IH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRGlzYWJsZWQoKTogYm9vbAp7CnJldHVybiAoYm9vbCkgKCgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSkgPj4gc2VsZjo6QklURklFTERfRElTQUJMRUQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNFbmFibGVkKCk6IGJvb2wKewpyZXR1cm4gISgoJHRoaXMtPmJpdGZpZWxkICYgKDI1NSA8PCBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCkpID4+IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGlzQXNzZXJ0aW9uKCk6IGJvb2w7CgpwdWJsaWMgZnVuY3Rpb24gaXNDYXVzZWRCeUxvY2soUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IGJvb2wKewppZiAoJHRoaXMtPmdldFJlYXNvbigpID09PSBzZWxmOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVMpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHRoaXMtPmdldFJlYXNvbkRhdGEoKS0+Z2V0VGFyZ2V0KCkpKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKSkgewpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpLT5nZXRUYXJnZXQoKSkgewppZiAoJHBvb2wtPmlzVW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiB0cnVlOwp9CmlmICghJHRoaXMtPmdldFJlYXNvbkRhdGEoKS0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoISRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiB0cnVlOwp9CmJyZWFrOwp9Cn0KfQp9CgppZiAoJHRoaXMtPmdldFJlYXNvbigpID09PSBzZWxmOjpSVUxFX1JPT1RfUkVRVUlSRSkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkdGhpcy0+Z2V0UmVhc29uRGF0YSgpWydwYWNrYWdlTmFtZSddKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCkpIHsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZU5hbWUnXSkgewppZiAoJHBvb2wtPmlzVW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiB0cnVlOwp9CmlmICghJHRoaXMtPmdldFJlYXNvbkRhdGEoKVsnY29uc3RyYWludCddLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpKSB7CnJldHVybiB0cnVlOwp9CmJyZWFrOwp9Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VQYWNrYWdlKFBvb2wgJHBvb2wpOiBCYXNlUGFja2FnZQp7CiRsaXRlcmFscyA9ICR0aGlzLT5nZXRMaXRlcmFscygpOwoKc3dpdGNoICgkdGhpcy0+Z2V0UmVhc29uKCkpIHsKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1Q6CiRwYWNrYWdlMSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pKTsKJHBhY2thZ2UyID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSkpOwoKJHJlYXNvbkRhdGEgPSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpOwoKaWYgKCRyZWFzb25EYXRhLT5nZXRTb3VyY2UoKSA9PT0gJHBhY2thZ2UxLT5nZXROYW1lKCkpIHsKWyRwYWNrYWdlMiwgJHBhY2thZ2UxXSA9IFskcGFja2FnZTEsICRwYWNrYWdlMl07Cn0KCnJldHVybiAkcGFja2FnZTI7CgpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKJHNvdXJjZUxpdGVyYWwgPSBhcnJheV9zaGlmdCgkbGl0ZXJhbHMpOwokc291cmNlUGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkc291cmNlTGl0ZXJhbCkpOwoKcmV0dXJuICRzb3VyY2VQYWNrYWdlOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm90IGltcGxlbWVudGVkJyk7Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBhcnJheSAkaW5zdGFsbGVkTWFwID0gW10sIGFycmF5ICRsZWFybmVkUG9vbCA9IFtdKTogc3RyaW5nCnsKJGxpdGVyYWxzID0gJHRoaXMtPmdldExpdGVyYWxzKCk7Cgpzd2l0Y2ggKCR0aGlzLT5nZXRSZWFzb24oKSkgewpjYXNlIHNlbGY6OlJVTEVfUk9PVF9SRVFVSVJFOgokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CiRwYWNrYWdlTmFtZSA9ICRyZWFzb25EYXRhWydwYWNrYWdlTmFtZSddOwokY29uc3RyYWludCA9ICRyZWFzb25EYXRhWydjb25zdHJhaW50J107CgokcGFja2FnZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoISRwYWNrYWdlcykgewpyZXR1cm4gJ05vIHBhY2thZ2UgZm91bmQgdG8gc2F0aXNmeSByb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZSAnLiRwYWNrYWdlTmFtZS4nICcuJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpOwp9CgokcGFja2FnZXNOb25BbGlhcyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwKTogYm9vbCB7CnJldHVybiAhKCRwIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKTsKfSkpOwppZiAoY291bnQoJHBhY2thZ2VzTm9uQWxpYXMpID09PSAxKSB7CiRwYWNrYWdlID0gJHBhY2thZ2VzTm9uQWxpYXNbMF07CmlmICgkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIGxvY2tlZCB0byB2ZXJzaW9uICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4iIGFuZCBhbiB1cGRhdGUgb2YgdGhpcyBwYWNrYWdlIHdhcyBub3QgcmVxdWVzdGVkLiI7Cn0KfQoKcmV0dXJuICdSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJy4kcGFja2FnZU5hbWUuJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKS4nIC0+IHNhdGlzZmlhYmxlIGJ5ICcuJHRoaXMtPmZvcm1hdFBhY2thZ2VzVW5pcXVlKCRwb29sLCAkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRjb25zdHJhaW50KS4nLic7CgpjYXNlIHNlbGY6OlJVTEVfRklYRUQ6CiRwYWNrYWdlID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2UnXSk7CgppZiAoJHJlcXVlc3QtPmlzTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBpcyBsb2NrZWQgdG8gdmVyc2lvbiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBhbmQgYW4gdXBkYXRlIG9mIHRoaXMgcGFja2FnZSB3YXMgbm90IHJlcXVlc3RlZC4nOwp9CgpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIHByZXNlbnQgYXQgdmVyc2lvbiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgQ29tcG9zZXInOwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1Q6CiRwYWNrYWdlMSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pKTsKJHBhY2thZ2UyID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSkpOwoKJGNvbmZsaWN0VGFyZ2V0ID0gJHBhY2thZ2UxLT5nZXRQcmV0dHlTdHJpbmcoKTsKJHJlYXNvbkRhdGEgPSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpOwoKCmlmICgkcmVhc29uRGF0YS0+Z2V0U291cmNlKCkgPT09ICRwYWNrYWdlMS0+Z2V0TmFtZSgpKSB7ClskcGFja2FnZTIsICRwYWNrYWdlMV0gPSBbJHBhY2thZ2UxLCAkcGFja2FnZTJdOwokY29uZmxpY3RUYXJnZXQgPSAkcGFja2FnZTEtPmdldFByZXR0eU5hbWUoKS4nICcuJHJlYXNvbkRhdGEtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKfQoKCgppZiAoJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpICE9PSAkcGFja2FnZTEtPmdldE5hbWUoKSkgewokcHJvdmlkZVR5cGUgPSBudWxsOwokcHJvdmlkZWQgPSBudWxsOwpmb3JlYWNoICgkcGFja2FnZTEtPmdldFByb3ZpZGVzKCkgYXMgJHByb3ZpZGUpIHsKaWYgKCRwcm92aWRlLT5nZXRUYXJnZXQoKSA9PT0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpKSB7CiRwcm92aWRlVHlwZSA9ICdwcm92aWRlcyc7CiRwcm92aWRlZCA9ICRwcm92aWRlLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CmJyZWFrOwp9Cn0KZm9yZWFjaCAoJHBhY2thZ2UxLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CmlmICgkcmVwbGFjZS0+Z2V0VGFyZ2V0KCkgPT09ICRyZWFzb25EYXRhLT5nZXRUYXJnZXQoKSkgewokcHJvdmlkZVR5cGUgPSAncmVwbGFjZXMnOwokcHJvdmlkZWQgPSAkcmVwbGFjZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwpicmVhazsKfQp9CmlmIChudWxsICE9PSAkcHJvdmlkZVR5cGUpIHsKJGNvbmZsaWN0VGFyZ2V0ID0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpLicgJy4kcmVhc29uRGF0YS0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgKCcuJHBhY2thZ2UxLT5nZXRQcmV0dHlTdHJpbmcoKS4nICcuJHByb3ZpZGVUeXBlLicgJy4kcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkuJyAnLiRwcm92aWRlZC4nKSc7Cn0KfQoKcmV0dXJuICRwYWNrYWdlMi0+Z2V0UHJldHR5U3RyaW5nKCkuJyBjb25mbGljdHMgd2l0aCAnLiRjb25mbGljdFRhcmdldC4nLic7CgpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKJHNvdXJjZUxpdGVyYWwgPSBhcnJheV9zaGlmdCgkbGl0ZXJhbHMpOwokc291cmNlUGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkc291cmNlTGl0ZXJhbCkpOwokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgokcmVxdWlyZXMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRyZXF1aXJlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9CgokdGV4dCA9ICRyZWFzb25EYXRhLT5nZXRQcmV0dHlTdHJpbmcoJHNvdXJjZVBhY2thZ2UpOwppZiAoJHJlcXVpcmVzKSB7CiR0ZXh0IC49ICcgLT4gc2F0aXNmaWFibGUgYnkgJyAuICR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJHJlcXVpcmVzLCAkaXNWZXJib3NlLCAkcmVhc29uRGF0YS0+Z2V0Q29uc3RyYWludCgpKSAuICcuJzsKfSBlbHNlIHsKJHRhcmdldE5hbWUgPSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCk7CgokcmVhc29uID0gUHJvYmxlbTo6Z2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJHRhcmdldE5hbWUsICRyZWFzb25EYXRhLT5nZXRDb25zdHJhaW50KCkpOwoKcmV0dXJuICR0ZXh0IC4gJyAtPiAnIC4gJHJlYXNvblsxXTsKfQoKcmV0dXJuICR0ZXh0OwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FOgokcGFja2FnZU5hbWVzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKJHBhY2thZ2VOYW1lc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KJHJlcGxhY2VkTmFtZSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgppZiAoY291bnQoJHBhY2thZ2VOYW1lcykgPiAxKSB7CiRyZWFzb24gPSBudWxsOwoKaWYgKCFpc3NldCgkcGFja2FnZU5hbWVzWyRyZXBsYWNlZE5hbWVdKSkgewokcmVhc29uID0gJ1RoZXkgJy4oY291bnQoJGxpdGVyYWxzKSA9PT0gMiA/ICdib3RoJyA6ICdhbGwnKS4nIHJlcGxhY2UgJy4kcmVwbGFjZWROYW1lLicgYW5kIHRodXMgY2Fubm90IGNvZXhpc3QuJzsKfSBlbHNlIHsKJHJlcGxhY2VyTmFtZXMgPSAkcGFja2FnZU5hbWVzOwp1bnNldCgkcmVwbGFjZXJOYW1lc1skcmVwbGFjZWROYW1lXSk7CiRyZXBsYWNlck5hbWVzID0gYXJyYXlfa2V5cygkcmVwbGFjZXJOYW1lcyk7CgppZiAoY291bnQoJHJlcGxhY2VyTmFtZXMpID09PSAxKSB7CiRyZWFzb24gPSAkcmVwbGFjZXJOYW1lc1swXSAuICcgcmVwbGFjZXMgJzsKfSBlbHNlIHsKJHJlYXNvbiA9ICdbJy5pbXBsb2RlKCcsICcsICRyZXBsYWNlck5hbWVzKS4nXSByZXBsYWNlICc7Cn0KJHJlYXNvbiAuPSAkcmVwbGFjZWROYW1lLicgYW5kIHRodXMgY2Fubm90IGNvZXhpc3Qgd2l0aCBpdC4nOwp9CgokaW5zdGFsbGVkUGFja2FnZXMgPSBbXTsKJHJlbW92YWJsZVBhY2thZ2VzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFthYnMoJGxpdGVyYWwpXSkpIHsKJGluc3RhbGxlZFBhY2thZ2VzW10gPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7Cn0gZWxzZSB7CiRyZW1vdmFibGVQYWNrYWdlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9Cn0KCmlmICgkaW5zdGFsbGVkUGFja2FnZXMgJiYgJHJlbW92YWJsZVBhY2thZ2VzKSB7CnJldHVybiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRyZW1vdmFibGVQYWNrYWdlcywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJyBjYW5ub3QgYmUgaW5zdGFsbGVkIGFzIHRoYXQgd291bGQgcmVxdWlyZSByZW1vdmluZyAnLiR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJGluc3RhbGxlZFBhY2thZ2VzLCAkaXNWZXJib3NlLCBudWxsLCB0cnVlKS4nLiAnLiRyZWFzb247Cn0KCnJldHVybiAnT25seSBvbmUgb2YgdGhlc2UgY2FuIGJlIGluc3RhbGxlZDogJy4kdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRsaXRlcmFscywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJy4gJy4kcmVhc29uOwp9CgpyZXR1cm4gJ1lvdSBjYW4gb25seSBpbnN0YWxsIG9uZSB2ZXJzaW9uIG9mIGEgcGFja2FnZSwgc28gb25seSBvbmUgb2YgdGhlc2UgY2FuIGJlIGluc3RhbGxlZDogJyAuICR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJGxpdGVyYWxzLCAkaXNWZXJib3NlLCBudWxsLCB0cnVlKSAuICcuJzsKY2FzZSBzZWxmOjpSVUxFX0xFQVJORUQ6CgoKCgoKCgokbGVhcm5lZFN0cmluZyA9ICcgKGNvbmZsaWN0IGFuYWx5c2lzIHJlc3VsdCknOwoKaWYgKGNvdW50KCRsaXRlcmFscykgPT09IDEpIHsKJHJ1bGVUZXh0ID0gJHBvb2wtPmxpdGVyYWxUb1ByZXR0eVN0cmluZygkbGl0ZXJhbHNbMF0sICRpbnN0YWxsZWRNYXApOwp9IGVsc2UgewokZ3JvdXBzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKaWYgKGlzc2V0KCRpbnN0YWxsZWRNYXBbJHBhY2thZ2UtPmlkXSkpIHsKJGdyb3VwID0gJGxpdGVyYWwgPiAwID8gJ2tlZXAnIDogJ3JlbW92ZSc7Cn0gZWxzZSB7CiRncm91cCA9ICRsaXRlcmFsID4gMCA/ICdpbnN0YWxsJyA6ICdkb25cJ3QgaW5zdGFsbCc7Cn0KCiRncm91cHNbJGdyb3VwXVtdID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwYWNrYWdlKTsKfQokcnVsZVRleHRzID0gW107CmZvcmVhY2ggKCRncm91cHMgYXMgJGdyb3VwID0+ICRwYWNrYWdlcykgewokcnVsZVRleHRzW10gPSAkZ3JvdXAgLiAoY291bnQoJHBhY2thZ2VzKSA+IDEgPyAnIG9uZSBvZicgOiAnJykuJyAnIC4gJHRoaXMtPmZvcm1hdFBhY2thZ2VzVW5pcXVlKCRwb29sLCAkcGFja2FnZXMsICRpc1ZlcmJvc2UpOwp9CgokcnVsZVRleHQgPSBpbXBsb2RlKCcgfCAnLCAkcnVsZVRleHRzKTsKfQoKcmV0dXJuICdDb25jbHVzaW9uOiAnLiRydWxlVGV4dC4kbGVhcm5lZFN0cmluZzsKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfQUxJQVM6CiRhbGlhc1BhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pOwoKCmlmICgkYWxpYXNQYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CnJldHVybiAnJzsKfQokcGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMV0pKTsKCnJldHVybiAkYWxpYXNQYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKSAuJyBpcyBhbiBhbGlhcyBvZiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nIGFuZCB0aHVzIHJlcXVpcmVzIGl0IHRvIGJlIGluc3RhbGxlZCB0b28uJzsKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfSU5WRVJTRV9BTElBUzoKCiRhbGlhc1BhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMV0pOwoKCmlmICgkYWxpYXNQYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CnJldHVybiAnJzsKfQokcGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pKTsKCnJldHVybiAkYWxpYXNQYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKSAuJyBpcyBhbiBhbGlhcyBvZiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nIGFuZCBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIGl0Lic7CmRlZmF1bHQ6CiRydWxlVGV4dCA9ICcnOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGkgPT4gJGxpdGVyYWwpIHsKaWYgKCRpICE9PSAwKSB7CiRydWxlVGV4dCAuPSAnfCc7Cn0KJHJ1bGVUZXh0IC49ICRwb29sLT5saXRlcmFsVG9QcmV0dHlTdHJpbmcoJGxpdGVyYWwsICRpbnN0YWxsZWRNYXApOwp9CgpyZXR1cm4gJygnLiRydWxlVGV4dC4nKSc7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VzVW5pcXVlKFBvb2wgJHBvb2wsIGFycmF5ICRwYWNrYWdlcywgYm9vbCAkaXNWZXJib3NlLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwsIGJvb2wgJHVzZVJlbW92ZWRWZXJzaW9uR3JvdXAgPSBmYWxzZSk6IHN0cmluZwp7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKaWYgKCFcaXNfb2JqZWN0KCRwYWNrYWdlKSkgewokcGFja2FnZXNbJGluZGV4XSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwYWNrYWdlKTsKfQp9CgpyZXR1cm4gUHJvYmxlbTo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQsICR1c2VSZW1vdmVkVmVyc2lvbkdyb3VwKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcyhCYXNlUGFja2FnZSAkcGFja2FnZSk6IEJhc2VQYWNrYWdlCnsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgpjbGFzcyBSdWxlMkxpdGVyYWxzIGV4dGVuZHMgUnVsZQp7Cgpwcm90ZWN0ZWQgJGxpdGVyYWwxOwoKcHJvdGVjdGVkICRsaXRlcmFsMjsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGxpdGVyYWwxLCBpbnQgJGxpdGVyYWwyLCAkcmVhc29uLCAkcmVhc29uRGF0YSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRyZWFzb24sICRyZWFzb25EYXRhKTsKCmlmICgkbGl0ZXJhbDEgPCAkbGl0ZXJhbDIpIHsKJHRoaXMtPmxpdGVyYWwxID0gJGxpdGVyYWwxOwokdGhpcy0+bGl0ZXJhbDIgPSAkbGl0ZXJhbDI7Cn0gZWxzZSB7CiR0aGlzLT5saXRlcmFsMSA9ICRsaXRlcmFsMjsKJHRoaXMtPmxpdGVyYWwyID0gJGxpdGVyYWwxOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaXRlcmFscygpOiBhcnJheQp7CnJldHVybiBbJHRoaXMtPmxpdGVyYWwxLCAkdGhpcy0+bGl0ZXJhbDJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpCnsKcmV0dXJuICR0aGlzLT5saXRlcmFsMS4nLCcuJHRoaXMtPmxpdGVyYWwyOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoUnVsZSAkcnVsZSk6IGJvb2wKewoKaWYgKCRydWxlIGluc3RhbmNlb2Ygc2VsZikgewppZiAoJHRoaXMtPmxpdGVyYWwxICE9PSAkcnVsZS0+bGl0ZXJhbDEpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmxpdGVyYWwyICE9PSAkcnVsZS0+bGl0ZXJhbDIpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKJGxpdGVyYWxzID0gJHJ1bGUtPmdldExpdGVyYWxzKCk7CmlmICgyICE9PSBcY291bnQoJGxpdGVyYWxzKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+bGl0ZXJhbDEgIT09ICRsaXRlcmFsc1swXSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+bGl0ZXJhbDIgIT09ICRsaXRlcmFsc1sxXSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKcHVibGljIGZ1bmN0aW9uIGlzQXNzZXJ0aW9uKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CiRyZXN1bHQgPSAkdGhpcy0+aXNEaXNhYmxlZCgpID8gJ2Rpc2FibGVkKCcgOiAnKCc7CgokcmVzdWx0IC49ICR0aGlzLT5saXRlcmFsMSAuICd8JyAuICR0aGlzLT5saXRlcmFsMiAuICcpJzsKCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CgoKCgoKCgpjbGFzcyBSdWxlU2V0IGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlLCBcQ291bnRhYmxlCnsKCnB1YmxpYyBjb25zdCBUWVBFX1BBQ0tBR0UgPSAwOwpwdWJsaWMgY29uc3QgVFlQRV9SRVFVRVNUID0gMTsKcHVibGljIGNvbnN0IFRZUEVfTEVBUk5FRCA9IDQ7CgoKCgoKCnB1YmxpYyAkcnVsZUJ5SWQgPSBbXTsKCmNvbnN0IFRZUEVTID0gWwpzZWxmOjpUWVBFX1BBQ0tBR0UgPT4gJ1BBQ0tBR0UnLApzZWxmOjpUWVBFX1JFUVVFU1QgPT4gJ1JFUVVFU1QnLApzZWxmOjpUWVBFX0xFQVJORUQgPT4gJ0xFQVJORUQnLApdOwoKCnByb3RlY3RlZCAkcnVsZXM7CgoKcHJvdGVjdGVkICRuZXh0UnVsZUlkID0gMDsKCgpwcm90ZWN0ZWQgJHJ1bGVzQnlIYXNoID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CmZvcmVhY2ggKCR0aGlzLT5nZXRUeXBlcygpIGFzICR0eXBlKSB7CiR0aGlzLT5ydWxlc1skdHlwZV0gPSBbXTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKFJ1bGUgJHJ1bGUsICR0eXBlKTogdm9pZAp7CmlmICghaXNzZXQoc2VsZjo6VFlQRVNbJHR5cGVdKSkgewp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdVbmtub3duIHJ1bGUgdHlwZTogJyAuICR0eXBlKTsKfQoKJGhhc2ggPSAkcnVsZS0+Z2V0SGFzaCgpOwoKCmlmIChpc3NldCgkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdKSkgewokcG90ZW50aWFsRHVwbGljYXRlcyA9ICR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF07CmlmIChcaXNfYXJyYXkoJHBvdGVudGlhbER1cGxpY2F0ZXMpKSB7CmZvcmVhY2ggKCRwb3RlbnRpYWxEdXBsaWNhdGVzIGFzICRwb3RlbnRpYWxEdXBsaWNhdGUpIHsKaWYgKCRydWxlLT5lcXVhbHMoJHBvdGVudGlhbER1cGxpY2F0ZSkpIHsKcmV0dXJuOwp9Cn0KfSBlbHNlIHsKaWYgKCRydWxlLT5lcXVhbHMoJHBvdGVudGlhbER1cGxpY2F0ZXMpKSB7CnJldHVybjsKfQp9Cn0KCmlmICghaXNzZXQoJHRoaXMtPnJ1bGVzWyR0eXBlXSkpIHsKJHRoaXMtPnJ1bGVzWyR0eXBlXSA9IFtdOwp9CgokdGhpcy0+cnVsZXNbJHR5cGVdW10gPSAkcnVsZTsKJHRoaXMtPnJ1bGVCeUlkWyR0aGlzLT5uZXh0UnVsZUlkXSA9ICRydWxlOwokcnVsZS0+c2V0VHlwZSgkdHlwZSk7CgokdGhpcy0+bmV4dFJ1bGVJZCsrOwoKaWYgKCFpc3NldCgkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdKSkgewokdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdID0gJHJ1bGU7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXSkpIHsKJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXVtdID0gJHJ1bGU7Cn0gZWxzZSB7CiRvcmlnaW5hbFJ1bGUgPSAkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdOwokdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdID0gWyRvcmlnaW5hbFJ1bGUsICRydWxlXTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuICR0aGlzLT5uZXh0UnVsZUlkOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVsZUJ5SWQoaW50ICRpZCk6IFJ1bGUKewpyZXR1cm4gJHRoaXMtPnJ1bGVCeUlkWyRpZF07Cn0KCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJ1bGVzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogUnVsZVNldEl0ZXJhdG9yCnsKcmV0dXJuIG5ldyBSdWxlU2V0SXRlcmF0b3IoJHRoaXMtPmdldFJ1bGVzKCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGb3IoJHR5cGVzKTogUnVsZVNldEl0ZXJhdG9yCnsKaWYgKCFcaXNfYXJyYXkoJHR5cGVzKSkgewokdHlwZXMgPSBbJHR5cGVzXTsKfQoKJGFsbFJ1bGVzID0gJHRoaXMtPmdldFJ1bGVzKCk7CgoKJHJ1bGVzID0gW107Cgpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKJHJ1bGVzWyR0eXBlXSA9ICRhbGxSdWxlc1skdHlwZV07Cn0KCnJldHVybiBuZXcgUnVsZVNldEl0ZXJhdG9yKCRydWxlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcldpdGhvdXQoJHR5cGVzKTogUnVsZVNldEl0ZXJhdG9yCnsKaWYgKCFcaXNfYXJyYXkoJHR5cGVzKSkgewokdHlwZXMgPSBbJHR5cGVzXTsKfQoKJHJ1bGVzID0gJHRoaXMtPmdldFJ1bGVzKCk7Cgpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKdW5zZXQoJHJ1bGVzWyR0eXBlXSk7Cn0KCnJldHVybiBuZXcgUnVsZVNldEl0ZXJhdG9yKCRydWxlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlcygpOiBhcnJheQp7CiR0eXBlcyA9IHNlbGY6OlRZUEVTOwoKcmV0dXJuIGFycmF5X2tleXMoJHR5cGVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyg/UmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCA9IG51bGwsID9SZXF1ZXN0ICRyZXF1ZXN0ID0gbnVsbCwgP1Bvb2wgJHBvb2wgPSBudWxsLCBib29sICRpc1ZlcmJvc2UgPSBmYWxzZSk6IHN0cmluZwp7CiRzdHJpbmcgPSAiXG4iOwpmb3JlYWNoICgkdGhpcy0+cnVsZXMgYXMgJHR5cGUgPT4gJHJ1bGVzKSB7CiRzdHJpbmcgLj0gc3RyX3BhZChzZWxmOjpUWVBFU1skdHlwZV0sIDgsICcgJykgLiAiOiAiOwpmb3JlYWNoICgkcnVsZXMgYXMgJHJ1bGUpIHsKJHN0cmluZyAuPSAoJHJlcG9zaXRvcnlTZXQgJiYgJHJlcXVlc3QgJiYgJHBvb2wgPyAkcnVsZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UpIDogJHJ1bGUpLiJcbiI7Cn0KJHN0cmluZyAuPSAiXG5cbiI7Cn0KCnJldHVybiAkc3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVN0cmluZygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKCgoKCgpjbGFzcyBSdWxlU2V0R2VuZXJhdG9yCnsKCnByb3RlY3RlZCAkcG9saWN5OwoKcHJvdGVjdGVkICRwb29sOwoKcHJvdGVjdGVkICRydWxlczsKCnByb3RlY3RlZCAkYWRkZWRNYXAgPSBbXTsKCnByb3RlY3RlZCAkYWRkZWRQYWNrYWdlc0J5TmFtZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSwgUG9vbCAkcG9vbCkKewokdGhpcy0+cG9saWN5ID0gJHBvbGljeTsKJHRoaXMtPnBvb2wgPSAkcG9vbDsKJHRoaXMtPnJ1bGVzID0gbmV3IFJ1bGVTZXQ7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZVJlcXVpcmVSdWxlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBhcnJheSAkcHJvdmlkZXJzLCAkcmVhc29uLCAkcmVhc29uRGF0YSA9IG51bGwpOiA/UnVsZQp7CiRsaXRlcmFscyA9IFstJHBhY2thZ2UtPmlkXTsKCmZvcmVhY2ggKCRwcm92aWRlcnMgYXMgJHByb3ZpZGVyKSB7CgppZiAoJHByb3ZpZGVyID09PSAkcGFja2FnZSkgewpyZXR1cm4gbnVsbDsKfQokbGl0ZXJhbHNbXSA9ICRwcm92aWRlci0+aWQ7Cn0KCnJldHVybiBuZXcgR2VuZXJpY1J1bGUoJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbGxPbmVPZlJ1bGUoYXJyYXkgJHBhY2thZ2VzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk6IFJ1bGUKewokbGl0ZXJhbHMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaXRlcmFsc1tdID0gJHBhY2thZ2UtPmlkOwp9CgpyZXR1cm4gbmV3IEdlbmVyaWNSdWxlKCRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVSdWxlMkxpdGVyYWxzKEJhc2VQYWNrYWdlICRpc3N1ZXIsIEJhc2VQYWNrYWdlICRwcm92aWRlciwgJHJlYXNvbiwgJHJlYXNvbkRhdGEgPSBudWxsKTogP1J1bGUKewoKaWYgKCRpc3N1ZXIgPT09ICRwcm92aWRlcikgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBSdWxlMkxpdGVyYWxzKC0kaXNzdWVyLT5pZCwgLSRwcm92aWRlci0+aWQsICRyZWFzb24sICRyZWFzb25EYXRhKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVNdWx0aUNvbmZsaWN0UnVsZShhcnJheSAkcGFja2FnZXMsICRyZWFzb24sICRyZWFzb25EYXRhKTogUnVsZQp7CiRsaXRlcmFscyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpdGVyYWxzW10gPSAtJHBhY2thZ2UtPmlkOwp9CgppZiAoXGNvdW50KCRsaXRlcmFscykgPT09IDIpIHsKcmV0dXJuIG5ldyBSdWxlMkxpdGVyYWxzKCRsaXRlcmFsc1swXSwgJGxpdGVyYWxzWzFdLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCnJldHVybiBuZXcgTXVsdGlDb25mbGljdFJ1bGUoJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkUnVsZSgkdHlwZSwgP1J1bGUgJG5ld1J1bGUgPSBudWxsKTogdm9pZAp7CmlmICghJG5ld1J1bGUpIHsKcmV0dXJuOwp9CgokdGhpcy0+cnVsZXMtPmFkZCgkbmV3UnVsZSwgJHR5cGUpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkUnVsZXNGb3JQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7Cgokd29ya1F1ZXVlID0gbmV3IFxTcGxRdWV1ZTsKJHdvcmtRdWV1ZS0+ZW5xdWV1ZSgkcGFja2FnZSk7Cgp3aGlsZSAoISR3b3JrUXVldWUtPmlzRW1wdHkoKSkgewokcGFja2FnZSA9ICR3b3JrUXVldWUtPmRlcXVldWUoKTsKaWYgKGlzc2V0KCR0aGlzLT5hZGRlZE1hcFskcGFja2FnZS0+aWRdKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5pZF0gPSAkcGFja2FnZTsKCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewokdGhpcy0+YWRkZWRQYWNrYWdlc0J5TmFtZXNbJG5hbWVdW10gPSAkcGFja2FnZTsKfQp9IGVsc2Ugewokd29ya1F1ZXVlLT5lbnF1ZXVlKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpOwokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVSZXF1aXJlUnVsZSgkcGFja2FnZSwgWyRwYWNrYWdlLT5nZXRBbGlhc09mKCldLCBSdWxlOjpSVUxFX1BBQ0tBR0VfQUxJQVMsICRwYWNrYWdlKSk7CgoKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlUmVxdWlyZVJ1bGUoJHBhY2thZ2UtPmdldEFsaWFzT2YoKSwgWyRwYWNrYWdlXSwgUnVsZTo6UlVMRV9QQUNLQUdFX0lOVkVSU0VfQUxJQVMsICRwYWNrYWdlLT5nZXRBbGlhc09mKCkpKTsKCgoKaWYgKCEkcGFja2FnZS0+aGFzU2VsZlZlcnNpb25SZXF1aXJlcygpKSB7CmNvbnRpbnVlOwp9Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50KTsKfQoKJHBvc3NpYmxlUmVxdWlyZXMgPSAkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQpOwoKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlUmVxdWlyZVJ1bGUoJHBhY2thZ2UsICRwb3NzaWJsZVJlcXVpcmVzLCBSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVMsICRsaW5rKSk7Cgpmb3JlYWNoICgkcG9zc2libGVSZXF1aXJlcyBhcyAkcmVxdWlyZSkgewokd29ya1F1ZXVlLT5lbnF1ZXVlKCRyZXF1aXJlKTsKfQp9Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZENvbmZsaWN0UnVsZXMoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewoKZm9yZWFjaCAoJHRoaXMtPmFkZGVkTWFwIGFzICRwYWNrYWdlKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewoKaWYgKCFpc3NldCgkdGhpcy0+YWRkZWRQYWNrYWdlc0J5TmFtZXNbJGxpbmstPmdldFRhcmdldCgpXSkpIHsKY29udGludWU7Cn0KCiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50LCBmYWxzZSk7Cn0KCiRjb25mbGljdHMgPSAkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQpOwoKZm9yZWFjaCAoJGNvbmZsaWN0cyBhcyAkY29uZmxpY3QpIHsKCgoKaWYgKCEkY29uZmxpY3QgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgfHwgJGNvbmZsaWN0LT5nZXROYW1lKCkgPT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVSdWxlMkxpdGVyYWxzKCRwYWNrYWdlLCAkY29uZmxpY3QsIFJ1bGU6OlJVTEVfUEFDS0FHRV9DT05GTElDVCwgJGxpbmspKTsKfQp9Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmFkZGVkUGFja2FnZXNCeU5hbWVzIGFzICRuYW1lID0+ICRwYWNrYWdlcykgewppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAxKSB7CiRyZWFzb24gPSBSdWxlOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FOwokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVNdWx0aUNvbmZsaWN0UnVsZSgkcGFja2FnZXMsICRyZWFzb24sICRuYW1lKSk7Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkUnVsZXNGb3JSZXF1ZXN0KFJlcXVlc3QgJHJlcXVlc3QsIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmlkID09PSAtMSkgewoKaWYgKCR0aGlzLT5wb29sLT5pc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpjb250aW51ZTsKfQoKCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIkZpeGVkIHBhY2thZ2UgIi4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCkuIiB3YXMgbm90IGFkZGVkIHRvIHNvbHZlciBwb29sLiIpOwp9CgokdGhpcy0+YWRkUnVsZXNGb3JQYWNrYWdlKCRwYWNrYWdlLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CgokcnVsZSA9ICR0aGlzLT5jcmVhdGVJbnN0YWxsT25lT2ZSdWxlKFskcGFja2FnZV0sIFJ1bGU6OlJVTEVfRklYRUQsIFsKJ3BhY2thZ2UnID0+ICRwYWNrYWdlLApdKTsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9SRVFVRVNULCAkcnVsZSk7Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkcGFja2FnZU5hbWUpKSB7CmNvbnRpbnVlOwp9IGVsc2VpZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokY29uc3RyYWludCA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwp9CgokcGFja2FnZXMgPSAkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoJHBhY2thZ2VzKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdGhpcy0+YWRkUnVsZXNGb3JQYWNrYWdlKCRwYWNrYWdlLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7Cn0KCiRydWxlID0gJHRoaXMtPmNyZWF0ZUluc3RhbGxPbmVPZlJ1bGUoJHBhY2thZ2VzLCBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSwgWwoncGFja2FnZU5hbWUnID0+ICRwYWNrYWdlTmFtZSwKJ2NvbnN0cmFpbnQnID0+ICRjb25zdHJhaW50LApdKTsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9SRVFVRVNULCAkcnVsZSk7Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkUnVsZXNGb3JSb290QWxpYXNlcyhQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5wb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKCmlmICghaXNzZXQoJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5pZF0pICYmCiRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmCigkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkgfHwgaXNzZXQoJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5nZXRBbGlhc09mKCktPmlkXSkpCikgewokdGhpcy0+YWRkUnVsZXNGb3JQYWNrYWdlKCRwYWNrYWdlLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7Cn0KfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZXNGb3IoUmVxdWVzdCAkcmVxdWVzdCwgP1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBudWxsKTogUnVsZVNldAp7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPzogUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKCiR0aGlzLT5hZGRSdWxlc0ZvclJlcXVlc3QoJHJlcXVlc3QsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCiR0aGlzLT5hZGRSdWxlc0ZvclJvb3RBbGlhc2VzKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCiR0aGlzLT5hZGRDb25mbGljdFJ1bGVzKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCgokdGhpcy0+YWRkZWRNYXAgPSAkdGhpcy0+YWRkZWRQYWNrYWdlc0J5TmFtZXMgPSBbXTsKCiRydWxlcyA9ICR0aGlzLT5ydWxlczsKCiR0aGlzLT5ydWxlcyA9IG5ldyBSdWxlU2V0OwoKcmV0dXJuICRydWxlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKY2xhc3MgUnVsZVNldEl0ZXJhdG9yIGltcGxlbWVudHMgXEl0ZXJhdG9yCnsKCnByb3RlY3RlZCAkcnVsZXM7Cgpwcm90ZWN0ZWQgJHR5cGVzOwoKCnByb3RlY3RlZCAkY3VycmVudE9mZnNldDsKCnByb3RlY3RlZCAkY3VycmVudFR5cGU7Cgpwcm90ZWN0ZWQgJGN1cnJlbnRUeXBlT2Zmc2V0OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRydWxlcykKewokdGhpcy0+cnVsZXMgPSAkcnVsZXM7CiR0aGlzLT50eXBlcyA9IGFycmF5X2tleXMoJHJ1bGVzKTsKc29ydCgkdGhpcy0+dHlwZXMpOwoKJHRoaXMtPnJld2luZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3VycmVudCgpOiBSdWxlCnsKcmV0dXJuICR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdWyR0aGlzLT5jdXJyZW50T2Zmc2V0XTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGtleSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmN1cnJlbnRUeXBlOwp9CgpwdWJsaWMgZnVuY3Rpb24gbmV4dCgpOiB2b2lkCnsKJHRoaXMtPmN1cnJlbnRPZmZzZXQrKzsKCmlmICghaXNzZXQoJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV0pKSB7CnJldHVybjsKfQoKaWYgKCR0aGlzLT5jdXJyZW50T2Zmc2V0ID49IFxjb3VudCgkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXSkpIHsKJHRoaXMtPmN1cnJlbnRPZmZzZXQgPSAwOwoKZG8gewokdGhpcy0+Y3VycmVudFR5cGVPZmZzZXQrKzsKCmlmICghaXNzZXQoJHRoaXMtPnR5cGVzWyR0aGlzLT5jdXJyZW50VHlwZU9mZnNldF0pKSB7CiR0aGlzLT5jdXJyZW50VHlwZSA9IC0xOwpicmVhazsKfQoKJHRoaXMtPmN1cnJlbnRUeXBlID0gJHRoaXMtPnR5cGVzWyR0aGlzLT5jdXJyZW50VHlwZU9mZnNldF07Cn0gd2hpbGUgKDAgPT09IFxjb3VudCgkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXSkpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKTogdm9pZAp7CiR0aGlzLT5jdXJyZW50T2Zmc2V0ID0gMDsKCiR0aGlzLT5jdXJyZW50VHlwZU9mZnNldCA9IC0xOwokdGhpcy0+Y3VycmVudFR5cGUgPSAtMTsKCmRvIHsKJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0Kys7CgppZiAoIWlzc2V0KCR0aGlzLT50eXBlc1skdGhpcy0+Y3VycmVudFR5cGVPZmZzZXRdKSkgewokdGhpcy0+Y3VycmVudFR5cGUgPSAtMTsKYnJlYWs7Cn0KCiR0aGlzLT5jdXJyZW50VHlwZSA9ICR0aGlzLT50eXBlc1skdGhpcy0+Y3VycmVudFR5cGVPZmZzZXRdOwp9IHdoaWxlICgwID09PSBcY291bnQoJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV0pKTsKfQoKcHVibGljIGZ1bmN0aW9uIHZhbGlkKCk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV0sICR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdWyR0aGlzLT5jdXJyZW50T2Zmc2V0XSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgoKCgoKY2xhc3MgUnVsZVdhdGNoQ2hhaW4gZXh0ZW5kcyBcU3BsRG91Ymx5TGlua2VkTGlzdAp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlZWsoaW50ICRvZmZzZXQpOiB2b2lkCnsKJHRoaXMtPnJld2luZCgpOwpmb3IgKCRpID0gMDsgJGkgPCAkb2Zmc2V0OyAkaSsrLCAkdGhpcy0+bmV4dCgpKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCk6IHZvaWQKewokb2Zmc2V0ID0gJHRoaXMtPmtleSgpOwokdGhpcy0+b2Zmc2V0VW5zZXQoJG9mZnNldCk7CiR0aGlzLT5zZWVrKCRvZmZzZXQpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgoKCgoKCgpjbGFzcyBSdWxlV2F0Y2hHcmFwaAp7Cgpwcm90ZWN0ZWQgJHdhdGNoQ2hhaW5zID0gW107CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0KFJ1bGVXYXRjaE5vZGUgJG5vZGUpOiB2b2lkCnsKaWYgKCRub2RlLT5nZXRSdWxlKCktPmlzQXNzZXJ0aW9uKCkpIHsKcmV0dXJuOwp9CgppZiAoISRub2RlLT5nZXRSdWxlKCkgaW5zdGFuY2VvZiBNdWx0aUNvbmZsaWN0UnVsZSkgewpmb3JlYWNoIChbJG5vZGUtPndhdGNoMSwgJG5vZGUtPndhdGNoMl0gYXMgJGxpdGVyYWwpIHsKaWYgKCFpc3NldCgkdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdKSkgewokdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdID0gbmV3IFJ1bGVXYXRjaENoYWluOwp9CgokdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdLT51bnNoaWZ0KCRub2RlKTsKfQp9IGVsc2Ugewpmb3JlYWNoICgkbm9kZS0+Z2V0UnVsZSgpLT5nZXRMaXRlcmFscygpIGFzICRsaXRlcmFsKSB7CmlmICghaXNzZXQoJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXSkpIHsKJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXSA9IG5ldyBSdWxlV2F0Y2hDaGFpbjsKfQoKJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXS0+dW5zaGlmdCgkbm9kZSk7Cn0KfQp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9wYWdhdGVMaXRlcmFsKGludCAkZGVjaWRlZExpdGVyYWwsIGludCAkbGV2ZWwsIERlY2lzaW9ucyAkZGVjaXNpb25zKTogP1J1bGUKewoKCgokbGl0ZXJhbCA9IC0kZGVjaWRlZExpdGVyYWw7CgppZiAoIWlzc2V0KCR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0pKSB7CnJldHVybiBudWxsOwp9CgokY2hhaW4gPSAkdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdOwoKJGNoYWluLT5yZXdpbmQoKTsKd2hpbGUgKCRjaGFpbi0+dmFsaWQoKSkgewokbm9kZSA9ICRjaGFpbi0+Y3VycmVudCgpOwppZiAoISRub2RlLT5nZXRSdWxlKCkgaW5zdGFuY2VvZiBNdWx0aUNvbmZsaWN0UnVsZSkgewokb3RoZXJXYXRjaCA9ICRub2RlLT5nZXRPdGhlcldhdGNoKCRsaXRlcmFsKTsKCmlmICghJG5vZGUtPmdldFJ1bGUoKS0+aXNEaXNhYmxlZCgpICYmICEkZGVjaXNpb25zLT5zYXRpc2Z5KCRvdGhlcldhdGNoKSkgewokcnVsZUxpdGVyYWxzID0gJG5vZGUtPmdldFJ1bGUoKS0+Z2V0TGl0ZXJhbHMoKTsKCiRhbHRlcm5hdGl2ZUxpdGVyYWxzID0gYXJyYXlfZmlsdGVyKCRydWxlTGl0ZXJhbHMsIHN0YXRpYyBmdW5jdGlvbiAoJHJ1bGVMaXRlcmFsKSB1c2UgKCRsaXRlcmFsLCAkb3RoZXJXYXRjaCwgJGRlY2lzaW9ucyk6IGJvb2wgewpyZXR1cm4gJGxpdGVyYWwgIT09ICRydWxlTGl0ZXJhbCAmJgokb3RoZXJXYXRjaCAhPT0gJHJ1bGVMaXRlcmFsICYmCiEkZGVjaXNpb25zLT5jb25mbGljdCgkcnVsZUxpdGVyYWwpOwp9KTsKCmlmIChcY291bnQoJGFsdGVybmF0aXZlTGl0ZXJhbHMpID4gMCkgewpyZXNldCgkYWx0ZXJuYXRpdmVMaXRlcmFscyk7CiR0aGlzLT5tb3ZlV2F0Y2goJGxpdGVyYWwsIGN1cnJlbnQoJGFsdGVybmF0aXZlTGl0ZXJhbHMpLCAkbm9kZSk7CmNvbnRpbnVlOwp9CgppZiAoJGRlY2lzaW9ucy0+Y29uZmxpY3QoJG90aGVyV2F0Y2gpKSB7CnJldHVybiAkbm9kZS0+Z2V0UnVsZSgpOwp9CgokZGVjaXNpb25zLT5kZWNpZGUoJG90aGVyV2F0Y2gsICRsZXZlbCwgJG5vZGUtPmdldFJ1bGUoKSk7Cn0KfSBlbHNlIHsKZm9yZWFjaCAoJG5vZGUtPmdldFJ1bGUoKS0+Z2V0TGl0ZXJhbHMoKSBhcyAkb3RoZXJMaXRlcmFsKSB7CmlmICgkbGl0ZXJhbCAhPT0gJG90aGVyTGl0ZXJhbCAmJiAhJGRlY2lzaW9ucy0+c2F0aXNmeSgkb3RoZXJMaXRlcmFsKSkgewppZiAoJGRlY2lzaW9ucy0+Y29uZmxpY3QoJG90aGVyTGl0ZXJhbCkpIHsKcmV0dXJuICRub2RlLT5nZXRSdWxlKCk7Cn0KCiRkZWNpc2lvbnMtPmRlY2lkZSgkb3RoZXJMaXRlcmFsLCAkbGV2ZWwsICRub2RlLT5nZXRSdWxlKCkpOwp9Cn0KfQoKJGNoYWluLT5uZXh0KCk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbW92ZVdhdGNoKGludCAkZnJvbUxpdGVyYWwsIGludCAkdG9MaXRlcmFsLCBSdWxlV2F0Y2hOb2RlICRub2RlKTogdm9pZAp7CmlmICghaXNzZXQoJHRoaXMtPndhdGNoQ2hhaW5zWyR0b0xpdGVyYWxdKSkgewokdGhpcy0+d2F0Y2hDaGFpbnNbJHRvTGl0ZXJhbF0gPSBuZXcgUnVsZVdhdGNoQ2hhaW47Cn0KCiRub2RlLT5tb3ZlV2F0Y2goJGZyb21MaXRlcmFsLCAkdG9MaXRlcmFsKTsKJHRoaXMtPndhdGNoQ2hhaW5zWyRmcm9tTGl0ZXJhbF0tPnJlbW92ZSgpOwokdGhpcy0+d2F0Y2hDaGFpbnNbJHRvTGl0ZXJhbF0tPnVuc2hpZnQoJG5vZGUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgoKCgpjbGFzcyBSdWxlV2F0Y2hOb2RlCnsKCnB1YmxpYyAkd2F0Y2gxOwoKcHVibGljICR3YXRjaDI7CgoKcHJvdGVjdGVkICRydWxlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUnVsZSAkcnVsZSkKewokdGhpcy0+cnVsZSA9ICRydWxlOwoKJGxpdGVyYWxzID0gJHJ1bGUtPmdldExpdGVyYWxzKCk7CgokbGl0ZXJhbENvdW50ID0gXGNvdW50KCRsaXRlcmFscyk7CiR0aGlzLT53YXRjaDEgPSAkbGl0ZXJhbENvdW50ID4gMCA/ICRsaXRlcmFsc1swXSA6IDA7CiR0aGlzLT53YXRjaDIgPSAkbGl0ZXJhbENvdW50ID4gMSA/ICRsaXRlcmFsc1sxXSA6IDA7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhdGNoMk9uSGlnaGVzdChEZWNpc2lvbnMgJGRlY2lzaW9ucyk6IHZvaWQKewokbGl0ZXJhbHMgPSAkdGhpcy0+cnVsZS0+Z2V0TGl0ZXJhbHMoKTsKCgppZiAoXGNvdW50KCRsaXRlcmFscykgPCAzIHx8ICR0aGlzLT5ydWxlIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUpIHsKcmV0dXJuOwp9Cgokd2F0Y2hMZXZlbCA9IDA7Cgpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJGxldmVsID0gJGRlY2lzaW9ucy0+ZGVjaXNpb25MZXZlbCgkbGl0ZXJhbCk7CgppZiAoJGxldmVsID4gJHdhdGNoTGV2ZWwpIHsKJHRoaXMtPndhdGNoMiA9ICRsaXRlcmFsOwokd2F0Y2hMZXZlbCA9ICRsZXZlbDsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSdWxlKCk6IFJ1bGUKewpyZXR1cm4gJHRoaXMtPnJ1bGU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdGhlcldhdGNoKGludCAkbGl0ZXJhbCk6IGludAp7CmlmICgkdGhpcy0+d2F0Y2gxID09PSAkbGl0ZXJhbCkgewpyZXR1cm4gJHRoaXMtPndhdGNoMjsKfQoKcmV0dXJuICR0aGlzLT53YXRjaDE7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlV2F0Y2goaW50ICRmcm9tLCBpbnQgJHRvKTogdm9pZAp7CmlmICgkdGhpcy0+d2F0Y2gxID09PSAkZnJvbSkgewokdGhpcy0+d2F0Y2gxID0gJHRvOwp9IGVsc2UgewokdGhpcy0+d2F0Y2gyID0gJHRvOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwoKCgoKY2xhc3MgU29sdmVyCnsKcHJpdmF0ZSBjb25zdCBCUkFOQ0hfTElURVJBTFMgPSAwOwpwcml2YXRlIGNvbnN0IEJSQU5DSF9MRVZFTCA9IDE7CgoKcHJvdGVjdGVkICRwb2xpY3k7Cgpwcm90ZWN0ZWQgJHBvb2w7CgoKcHJvdGVjdGVkICRydWxlczsKCgpwcm90ZWN0ZWQgJHdhdGNoR3JhcGg7Cgpwcm90ZWN0ZWQgJGRlY2lzaW9uczsKCnByb3RlY3RlZCAkZml4ZWRNYXA7CgoKcHJvdGVjdGVkICRwcm9wYWdhdGVJbmRleDsKCnByb3RlY3RlZCAkYnJhbmNoZXMgPSBbXTsKCnByb3RlY3RlZCAkcHJvYmxlbXMgPSBbXTsKCnByb3RlY3RlZCAkbGVhcm5lZFBvb2wgPSBbXTsKCnByb3RlY3RlZCAkbGVhcm5lZFdoeSA9IFtdOwoKCnB1YmxpYyAkdGVzdEZsYWdMZWFybmVkUG9zaXRpdmVMaXRlcmFsID0gZmFsc2U7CgoKcHJvdGVjdGVkICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSwgUG9vbCAkcG9vbCwgSU9JbnRlcmZhY2UgJGlvKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnBvbGljeSA9ICRwb2xpY3k7CiR0aGlzLT5wb29sID0gJHBvb2w7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSdWxlU2V0U2l6ZSgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5ydWxlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQb29sKCk6IFBvb2wKewpyZXR1cm4gJHRoaXMtPnBvb2w7Cn0KCgoKcHJpdmF0ZSBmdW5jdGlvbiBtYWtlQXNzZXJ0aW9uUnVsZURlY2lzaW9ucygpOiB2b2lkCnsKJGRlY2lzaW9uU3RhcnQgPSBcY291bnQoJHRoaXMtPmRlY2lzaW9ucykgLSAxOwoKJHJ1bGVzQ291bnQgPSBcY291bnQoJHRoaXMtPnJ1bGVzKTsKZm9yICgkcnVsZUluZGV4ID0gMDsgJHJ1bGVJbmRleCA8ICRydWxlc0NvdW50OyAkcnVsZUluZGV4KyspIHsKJHJ1bGUgPSAkdGhpcy0+cnVsZXMtPnJ1bGVCeUlkWyRydWxlSW5kZXhdOwoKaWYgKCEkcnVsZS0+aXNBc3NlcnRpb24oKSB8fCAkcnVsZS0+aXNEaXNhYmxlZCgpKSB7CmNvbnRpbnVlOwp9CgokbGl0ZXJhbHMgPSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKJGxpdGVyYWwgPSAkbGl0ZXJhbHNbMF07CgppZiAoISR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZWQoJGxpdGVyYWwpKSB7CiR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZSgkbGl0ZXJhbCwgMSwgJHJ1bGUpOwpjb250aW51ZTsKfQoKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoJGxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKFJ1bGVTZXQ6OlRZUEVfTEVBUk5FRCA9PT0gJHJ1bGUtPmdldFR5cGUoKSkgewokcnVsZS0+ZGlzYWJsZSgpOwpjb250aW51ZTsKfQoKJGNvbmZsaWN0ID0gJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25SdWxlKCRsaXRlcmFsKTsKCmlmICgkY29uZmxpY3QgJiYgUnVsZVNldDo6VFlQRV9QQUNLQUdFID09PSAkY29uZmxpY3QtPmdldFR5cGUoKSkgewokcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCk7CgokcHJvYmxlbS0+YWRkUnVsZSgkcnVsZSk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdCk7CiRydWxlLT5kaXNhYmxlKCk7CiR0aGlzLT5wcm9ibGVtc1tdID0gJHByb2JsZW07CmNvbnRpbnVlOwp9CgoKJHByb2JsZW0gPSBuZXcgUHJvYmxlbSgpOwokcHJvYmxlbS0+YWRkUnVsZSgkcnVsZSk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdCk7CgoKCmZvcmVhY2ggKCR0aGlzLT5ydWxlcy0+Z2V0SXRlcmF0b3JGb3IoUnVsZVNldDo6VFlQRV9SRVFVRVNUKSBhcyAkYXNzZXJ0UnVsZSkgewppZiAoJGFzc2VydFJ1bGUtPmlzRGlzYWJsZWQoKSB8fCAhJGFzc2VydFJ1bGUtPmlzQXNzZXJ0aW9uKCkpIHsKY29udGludWU7Cn0KCiRhc3NlcnRSdWxlTGl0ZXJhbHMgPSAkYXNzZXJ0UnVsZS0+Z2V0TGl0ZXJhbHMoKTsKJGFzc2VydFJ1bGVMaXRlcmFsID0gJGFzc2VydFJ1bGVMaXRlcmFsc1swXTsKCmlmIChhYnMoJGxpdGVyYWwpICE9PSBhYnMoJGFzc2VydFJ1bGVMaXRlcmFsKSkgewpjb250aW51ZTsKfQokcHJvYmxlbS0+YWRkUnVsZSgkYXNzZXJ0UnVsZSk7CiRhc3NlcnRSdWxlLT5kaXNhYmxlKCk7Cn0KJHRoaXMtPnByb2JsZW1zW10gPSAkcHJvYmxlbTsKCiR0aGlzLT5kZWNpc2lvbnMtPnJlc2V0VG9PZmZzZXQoJGRlY2lzaW9uU3RhcnQpOwokcnVsZUluZGV4ID0gLTE7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwRml4ZWRNYXAoUmVxdWVzdCAkcmVxdWVzdCk6IHZvaWQKewokdGhpcy0+Zml4ZWRNYXAgPSBbXTsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokdGhpcy0+Zml4ZWRNYXBbJHBhY2thZ2UtPmlkXSA9ICRwYWNrYWdlOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0ZvclJvb3RSZXF1aXJlUHJvYmxlbXMoUmVxdWVzdCAkcmVxdWVzdCwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKSBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJHBhY2thZ2VOYW1lKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKfQoKaWYgKCEkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpKSB7CiRwcm9ibGVtID0gbmV3IFByb2JsZW0oKTsKJHByb2JsZW0tPmFkZFJ1bGUobmV3IEdlbmVyaWNSdWxlKFtdLCBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSwgWydwYWNrYWdlTmFtZScgPT4gJHBhY2thZ2VOYW1lLCAnY29uc3RyYWludCcgPT4gJGNvbnN0cmFpbnRdKSk7CiR0aGlzLT5wcm9ibGVtc1tdID0gJHByb2JsZW07Cn0KfQp9CgpwdWJsaWMgZnVuY3Rpb24gc29sdmUoUmVxdWVzdCAkcmVxdWVzdCwgP1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBudWxsKTogTG9ja1RyYW5zYWN0aW9uCnsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA/OiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwoKJHRoaXMtPnNldHVwRml4ZWRNYXAoJHJlcXVlc3QpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdHZW5lcmF0aW5nIHJ1bGVzJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHJ1bGVTZXRHZW5lcmF0b3IgPSBuZXcgUnVsZVNldEdlbmVyYXRvcigkdGhpcy0+cG9saWN5LCAkdGhpcy0+cG9vbCk7CiR0aGlzLT5ydWxlcyA9ICRydWxlU2V0R2VuZXJhdG9yLT5nZXRSdWxlc0ZvcigkcmVxdWVzdCwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwp1bnNldCgkcnVsZVNldEdlbmVyYXRvcik7CiR0aGlzLT5jaGVja0ZvclJvb3RSZXF1aXJlUHJvYmxlbXMoJHJlcXVlc3QsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHRoaXMtPmRlY2lzaW9ucyA9IG5ldyBEZWNpc2lvbnMoJHRoaXMtPnBvb2wpOwokdGhpcy0+d2F0Y2hHcmFwaCA9IG5ldyBSdWxlV2F0Y2hHcmFwaDsKCmZvcmVhY2ggKCR0aGlzLT5ydWxlcyBhcyAkcnVsZSkgewokdGhpcy0+d2F0Y2hHcmFwaC0+aW5zZXJ0KG5ldyBSdWxlV2F0Y2hOb2RlKCRydWxlKSk7Cn0KCgokdGhpcy0+bWFrZUFzc2VydGlvblJ1bGVEZWNpc2lvbnMoKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVzb2x2aW5nIGRlcGVuZGVuY2llcyB0aHJvdWdoIFNBVCcsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRiZWZvcmUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0aGlzLT5ydW5TYXQoKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRGVwZW5kZW5jeSByZXNvbHV0aW9uIGNvbXBsZXRlZCBpbiAlLjNmIHNlY29uZHMnLCBtaWNyb3RpbWUodHJ1ZSkgLSAkYmVmb3JlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKaWYgKCR0aGlzLT5wcm9ibGVtcykgewp0aHJvdyBuZXcgU29sdmVyUHJvYmxlbXNFeGNlcHRpb24oJHRoaXMtPnByb2JsZW1zLCAkdGhpcy0+bGVhcm5lZFBvb2wpOwp9CgpyZXR1cm4gbmV3IExvY2tUcmFuc2FjdGlvbigkdGhpcy0+cG9vbCwgJHJlcXVlc3QtPmdldFByZXNlbnRNYXAoKSwgJHJlcXVlc3QtPmdldEZpeGVkUGFja2FnZXNNYXAoKSwgJHRoaXMtPmRlY2lzaW9ucyk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByb3BhZ2F0ZShpbnQgJGxldmVsKTogP1J1bGUKewp3aGlsZSAoJHRoaXMtPmRlY2lzaW9ucy0+dmFsaWRPZmZzZXQoJHRoaXMtPnByb3BhZ2F0ZUluZGV4KSkgewokZGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25zLT5hdE9mZnNldCgkdGhpcy0+cHJvcGFnYXRlSW5kZXgpOwoKJGNvbmZsaWN0ID0gJHRoaXMtPndhdGNoR3JhcGgtPnByb3BhZ2F0ZUxpdGVyYWwoCiRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX0xJVEVSQUxdLAokbGV2ZWwsCiR0aGlzLT5kZWNpc2lvbnMKKTsKCiR0aGlzLT5wcm9wYWdhdGVJbmRleCsrOwoKaWYgKCRjb25mbGljdCkgewpyZXR1cm4gJGNvbmZsaWN0Owp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJldmVydChpbnQgJGxldmVsKTogdm9pZAp7CndoaWxlICghJHRoaXMtPmRlY2lzaW9ucy0+aXNFbXB0eSgpKSB7CiRsaXRlcmFsID0gJHRoaXMtPmRlY2lzaW9ucy0+bGFzdExpdGVyYWwoKTsKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT51bmRlY2lkZWQoJGxpdGVyYWwpKSB7CmJyZWFrOwp9CgokZGVjaXNpb25MZXZlbCA9ICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJGxpdGVyYWwpOwoKaWYgKCRkZWNpc2lvbkxldmVsIDw9ICRsZXZlbCkgewpicmVhazsKfQoKJHRoaXMtPmRlY2lzaW9ucy0+cmV2ZXJ0TGFzdCgpOwokdGhpcy0+cHJvcGFnYXRlSW5kZXggPSBcY291bnQoJHRoaXMtPmRlY2lzaW9ucyk7Cn0KCndoaWxlICghZW1wdHkoJHRoaXMtPmJyYW5jaGVzKSAmJiAkdGhpcy0+YnJhbmNoZXNbXGNvdW50KCR0aGlzLT5icmFuY2hlcykgLSAxXVtzZWxmOjpCUkFOQ0hfTEVWRUxdID49ICRsZXZlbCkgewphcnJheV9wb3AoJHRoaXMtPmJyYW5jaGVzKTsKfQp9CgoKCgoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFByb3BhZ2F0ZUxlYXJuKGludCAkbGV2ZWwsICRsaXRlcmFsLCBSdWxlICRydWxlKTogaW50CnsKJGxldmVsKys7CgokdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGUoJGxpdGVyYWwsICRsZXZlbCwgJHJ1bGUpOwoKd2hpbGUgKHRydWUpIHsKJHJ1bGUgPSAkdGhpcy0+cHJvcGFnYXRlKCRsZXZlbCk7CgppZiAobnVsbCA9PT0gJHJ1bGUpIHsKYnJlYWs7Cn0KCmlmICgkbGV2ZWwgPT09IDEpIHsKcmV0dXJuICR0aGlzLT5hbmFseXplVW5zb2x2YWJsZSgkcnVsZSk7Cn0KCgpbJGxlYXJuTGl0ZXJhbCwgJG5ld0xldmVsLCAkbmV3UnVsZSwgJHdoeV0gPSAkdGhpcy0+YW5hbHl6ZSgkbGV2ZWwsICRydWxlKTsKCmlmICgkbmV3TGV2ZWwgPD0gMCB8fCAkbmV3TGV2ZWwgPj0gJGxldmVsKSB7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJUcnlpbmcgdG8gcmV2ZXJ0IHRvIGludmFsaWQgbGV2ZWwgIi4kbmV3TGV2ZWwuIiBmcm9tIGxldmVsICIuJGxldmVsLiIuIgopOwp9CgokbGV2ZWwgPSAkbmV3TGV2ZWw7CgokdGhpcy0+cmV2ZXJ0KCRsZXZlbCk7CgokdGhpcy0+cnVsZXMtPmFkZCgkbmV3UnVsZSwgUnVsZVNldDo6VFlQRV9MRUFSTkVEKTsKCiR0aGlzLT5sZWFybmVkV2h5W3NwbF9vYmplY3RfaGFzaCgkbmV3UnVsZSldID0gJHdoeTsKCiRydWxlTm9kZSA9IG5ldyBSdWxlV2F0Y2hOb2RlKCRuZXdSdWxlKTsKJHJ1bGVOb2RlLT53YXRjaDJPbkhpZ2hlc3QoJHRoaXMtPmRlY2lzaW9ucyk7CiR0aGlzLT53YXRjaEdyYXBoLT5pbnNlcnQoJHJ1bGVOb2RlKTsKCiR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZSgkbGVhcm5MaXRlcmFsLCAkbGV2ZWwsICRuZXdSdWxlKTsKfQoKcmV0dXJuICRsZXZlbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZWxlY3RBbmRJbnN0YWxsKGludCAkbGV2ZWwsIGFycmF5ICRkZWNpc2lvblF1ZXVlLCBSdWxlICRydWxlKTogaW50CnsKCiRsaXRlcmFscyA9ICR0aGlzLT5wb2xpY3ktPnNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKCR0aGlzLT5wb29sLCAkZGVjaXNpb25RdWV1ZSwgJHJ1bGUtPmdldFJlcXVpcmVkUGFja2FnZSgpKTsKCiRzZWxlY3RlZExpdGVyYWwgPSBhcnJheV9zaGlmdCgkbGl0ZXJhbHMpOwoKCmlmIChcY291bnQoJGxpdGVyYWxzKSkgewokdGhpcy0+YnJhbmNoZXNbXSA9IFskbGl0ZXJhbHMsICRsZXZlbF07Cn0KCnJldHVybiAkdGhpcy0+c2V0UHJvcGFnYXRlTGVhcm4oJGxldmVsLCAkc2VsZWN0ZWRMaXRlcmFsLCAkcnVsZSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhbmFseXplKGludCAkbGV2ZWwsIFJ1bGUgJHJ1bGUpOiBhcnJheQp7CiRhbmFseXplZFJ1bGUgPSAkcnVsZTsKJHJ1bGVMZXZlbCA9IDE7CiRudW0gPSAwOwokbDFudW0gPSAwOwokc2VlbiA9IFtdOwokbGVhcm5lZExpdGVyYWxzID0gW251bGxdOwoKJGRlY2lzaW9uSWQgPSBcY291bnQoJHRoaXMtPmRlY2lzaW9ucyk7CgokdGhpcy0+bGVhcm5lZFBvb2xbXSA9IFtdOwoKd2hpbGUgKHRydWUpIHsKJHRoaXMtPmxlYXJuZWRQb29sW1xjb3VudCgkdGhpcy0+bGVhcm5lZFBvb2wpIC0gMV1bXSA9ICRydWxlOwoKZm9yZWFjaCAoJHJ1bGUtPmdldExpdGVyYWxzKCkgYXMgJGxpdGVyYWwpIHsKCmlmICgkcnVsZSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlICYmICEkdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGVkKCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQoKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQoKaWYgKGlzc2V0KCRzZWVuW2FicygkbGl0ZXJhbCldKSkgewpjb250aW51ZTsKfQokc2VlblthYnMoJGxpdGVyYWwpXSA9IHRydWU7CgokbCA9ICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJGxpdGVyYWwpOwoKaWYgKDEgPT09ICRsKSB7CiRsMW51bSsrOwp9IGVsc2VpZiAoJGxldmVsID09PSAkbCkgewokbnVtKys7Cn0gZWxzZSB7CgokbGVhcm5lZExpdGVyYWxzW10gPSAkbGl0ZXJhbDsKCmlmICgkbCA+ICRydWxlTGV2ZWwpIHsKJHJ1bGVMZXZlbCA9ICRsOwp9Cn0KfQp1bnNldCgkbGl0ZXJhbCk7CgokbDFyZXRyeSA9IHRydWU7CndoaWxlICgkbDFyZXRyeSkgewokbDFyZXRyeSA9IGZhbHNlOwoKaWYgKDAgPT09ICRudW0gJiYgMCA9PT0gLS0kbDFudW0pIHsKCmJyZWFrIDI7Cn0KCndoaWxlICh0cnVlKSB7CmlmICgkZGVjaXNpb25JZCA8PSAwKSB7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJSZWFjaGVkIGludmFsaWQgZGVjaXNpb24gaWQgJGRlY2lzaW9uSWQgd2hpbGUgbG9va2luZyB0aHJvdWdoICRydWxlIGZvciBhIGxpdGVyYWwgcHJlc2VudCBpbiB0aGUgYW5hbHl6ZWQgcnVsZSAkYW5hbHl6ZWRSdWxlLiIKKTsKfQoKJGRlY2lzaW9uSWQtLTsKCiRkZWNpc2lvbiA9ICR0aGlzLT5kZWNpc2lvbnMtPmF0T2Zmc2V0KCRkZWNpc2lvbklkKTsKJGxpdGVyYWwgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9MSVRFUkFMXTsKCmlmIChpc3NldCgkc2VlblthYnMoJGxpdGVyYWwpXSkpIHsKYnJlYWs7Cn0KfQoKdW5zZXQoJHNlZW5bYWJzKCRsaXRlcmFsKV0pOwoKaWYgKDAgIT09ICRudW0gJiYgMCA9PT0gLS0kbnVtKSB7CmlmICgkbGl0ZXJhbCA8IDApIHsKJHRoaXMtPnRlc3RGbGFnTGVhcm5lZFBvc2l0aXZlTGl0ZXJhbCA9IHRydWU7Cn0KJGxlYXJuZWRMaXRlcmFsc1swXSA9IC0kbGl0ZXJhbDsKCmlmICghJGwxbnVtKSB7CmJyZWFrIDI7Cn0KCmZvcmVhY2ggKCRsZWFybmVkTGl0ZXJhbHMgYXMgJGkgPT4gJGxlYXJuZWRMaXRlcmFsKSB7CmlmICgkaSAhPT0gMCkgewp1bnNldCgkc2VlblthYnMoJGxlYXJuZWRMaXRlcmFsKV0pOwp9Cn0KCiRsMW51bSsrOwokbDFyZXRyeSA9IHRydWU7Cn0gZWxzZSB7CiRkZWNpc2lvbiA9ICR0aGlzLT5kZWNpc2lvbnMtPmF0T2Zmc2V0KCRkZWNpc2lvbklkKTsKJHJ1bGUgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9SRUFTT05dOwoKaWYgKCRydWxlIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUpIHsKCmZvcmVhY2ggKCRydWxlLT5nZXRMaXRlcmFscygpIGFzICRsaXRlcmFsKSB7CmlmICghaXNzZXQoJHNlZW5bYWJzKCRsaXRlcmFsKV0pICYmICR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoLSRsaXRlcmFsKSkgewokdGhpcy0+bGVhcm5lZFBvb2xbXGNvdW50KCR0aGlzLT5sZWFybmVkUG9vbCkgLSAxXVtdID0gJHJ1bGU7CiRsID0gJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25MZXZlbCgkbGl0ZXJhbCk7CmlmICgxID09PSAkbCkgewokbDFudW0rKzsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gJGwpIHsKJG51bSsrOwp9IGVsc2UgewoKJGxlYXJuZWRMaXRlcmFsc1tdID0gJGxpdGVyYWw7CgppZiAoJGwgPiAkcnVsZUxldmVsKSB7CiRydWxlTGV2ZWwgPSAkbDsKfQp9CiRzZWVuW2FicygkbGl0ZXJhbCldID0gdHJ1ZTsKYnJlYWs7Cn0KfQoKJGwxcmV0cnkgPSB0cnVlOwp9Cn0KfQoKJGRlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9ucy0+YXRPZmZzZXQoJGRlY2lzaW9uSWQpOwokcnVsZSA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX1JFQVNPTl07Cn0KCiR3aHkgPSBcY291bnQoJHRoaXMtPmxlYXJuZWRQb29sKSAtIDE7CgppZiAobnVsbCA9PT0gJGxlYXJuZWRMaXRlcmFsc1swXSkgewp0aHJvdyBuZXcgU29sdmVyQnVnRXhjZXB0aW9uKAoiRGlkIG5vdCBmaW5kIGEgbGVhcm5hYmxlIGxpdGVyYWwgaW4gYW5hbHl6ZWQgcnVsZSAkYW5hbHl6ZWRSdWxlLiIKKTsKfQoKJG5ld1J1bGUgPSBuZXcgR2VuZXJpY1J1bGUoJGxlYXJuZWRMaXRlcmFscywgUnVsZTo6UlVMRV9MRUFSTkVELCAkd2h5KTsKCnJldHVybiBbJGxlYXJuZWRMaXRlcmFsc1swXSwgJHJ1bGVMZXZlbCwgJG5ld1J1bGUsICR3aHldOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFuYWx5emVVbnNvbHZhYmxlUnVsZShQcm9ibGVtICRwcm9ibGVtLCBSdWxlICRjb25mbGljdFJ1bGUsIGFycmF5ICYkcnVsZVNlZW4pOiB2b2lkCnsKJHdoeSA9IHNwbF9vYmplY3RfaGFzaCgkY29uZmxpY3RSdWxlKTsKJHJ1bGVTZWVuWyR3aHldID0gdHJ1ZTsKCmlmICgkY29uZmxpY3RSdWxlLT5nZXRUeXBlKCkgPT09IFJ1bGVTZXQ6OlRZUEVfTEVBUk5FRCkgewokbGVhcm5lZFdoeSA9ICR0aGlzLT5sZWFybmVkV2h5WyR3aHldOwokcHJvYmxlbVJ1bGVzID0gJHRoaXMtPmxlYXJuZWRQb29sWyRsZWFybmVkV2h5XTsKCmZvcmVhY2ggKCRwcm9ibGVtUnVsZXMgYXMgJHByb2JsZW1SdWxlKSB7CmlmICghaXNzZXQoJHJ1bGVTZWVuW3NwbF9vYmplY3RfaGFzaCgkcHJvYmxlbVJ1bGUpXSkpIHsKJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlUnVsZSgkcHJvYmxlbSwgJHByb2JsZW1SdWxlLCAkcnVsZVNlZW4pOwp9Cn0KCnJldHVybjsKfQoKaWYgKCRjb25mbGljdFJ1bGUtPmdldFR5cGUoKSA9PT0gUnVsZVNldDo6VFlQRV9QQUNLQUdFKSB7CgpyZXR1cm47Cn0KCiRwcm9ibGVtLT5uZXh0U2VjdGlvbigpOwokcHJvYmxlbS0+YWRkUnVsZSgkY29uZmxpY3RSdWxlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBhbmFseXplVW5zb2x2YWJsZShSdWxlICRjb25mbGljdFJ1bGUpOiBpbnQKewokcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCk7CiRwcm9ibGVtLT5hZGRSdWxlKCRjb25mbGljdFJ1bGUpOwoKJHJ1bGVTZWVuID0gW107CgokdGhpcy0+YW5hbHl6ZVVuc29sdmFibGVSdWxlKCRwcm9ibGVtLCAkY29uZmxpY3RSdWxlLCAkcnVsZVNlZW4pOwoKJHRoaXMtPnByb2JsZW1zW10gPSAkcHJvYmxlbTsKCiRzZWVuID0gW107CiRsaXRlcmFscyA9ICRjb25mbGljdFJ1bGUtPmdldExpdGVyYWxzKCk7Cgpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQokc2VlblthYnMoJGxpdGVyYWwpXSA9IHRydWU7Cn0KCmZvcmVhY2ggKCR0aGlzLT5kZWNpc2lvbnMgYXMgJGRlY2lzaW9uKSB7CiRsaXRlcmFsID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fTElURVJBTF07CgoKaWYgKCFpc3NldCgkc2VlblthYnMoJGxpdGVyYWwpXSkpIHsKY29udGludWU7Cn0KCiR3aHkgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9SRUFTT05dOwoKJHByb2JsZW0tPmFkZFJ1bGUoJHdoeSk7CiR0aGlzLT5hbmFseXplVW5zb2x2YWJsZVJ1bGUoJHByb2JsZW0sICR3aHksICRydWxlU2Vlbik7CgokbGl0ZXJhbHMgPSAkd2h5LT5nZXRMaXRlcmFscygpOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CgppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKY29udGludWU7Cn0KJHNlZW5bYWJzKCRsaXRlcmFsKV0gPSB0cnVlOwp9Cn0KCnJldHVybiAwOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJ1blNhdCgpOiB2b2lkCnsKJHRoaXMtPnByb3BhZ2F0ZUluZGV4ID0gMDsKCgoKCgoKCgoKCgokbGV2ZWwgPSAxOwokc3lzdGVtTGV2ZWwgPSAkbGV2ZWwgKyAxOwoKd2hpbGUgKHRydWUpIHsKaWYgKDEgPT09ICRsZXZlbCkgewokY29uZmxpY3RSdWxlID0gJHRoaXMtPnByb3BhZ2F0ZSgkbGV2ZWwpOwppZiAobnVsbCAhPT0gJGNvbmZsaWN0UnVsZSkgewppZiAoJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlKCRjb25mbGljdFJ1bGUpKSB7CmNvbnRpbnVlOwp9CgpyZXR1cm47Cn0KfQoKCmlmICgkbGV2ZWwgPCAkc3lzdGVtTGV2ZWwpIHsKJGl0ZXJhdG9yID0gJHRoaXMtPnJ1bGVzLT5nZXRJdGVyYXRvckZvcihSdWxlU2V0OjpUWVBFX1JFUVVFU1QpOwpmb3JlYWNoICgkaXRlcmF0b3IgYXMgJHJ1bGUpIHsKaWYgKCRydWxlLT5pc0VuYWJsZWQoKSkgewokZGVjaXNpb25RdWV1ZSA9IFtdOwokbm9uZVNhdGlzZmllZCA9IHRydWU7Cgpmb3JlYWNoICgkcnVsZS0+Z2V0TGl0ZXJhbHMoKSBhcyAkbGl0ZXJhbCkgewppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKJG5vbmVTYXRpc2ZpZWQgPSBmYWxzZTsKYnJlYWs7Cn0KaWYgKCRsaXRlcmFsID4gMCAmJiAkdGhpcy0+ZGVjaXNpb25zLT51bmRlY2lkZWQoJGxpdGVyYWwpKSB7CiRkZWNpc2lvblF1ZXVlW10gPSAkbGl0ZXJhbDsKfQp9CgppZiAoJG5vbmVTYXRpc2ZpZWQgJiYgXGNvdW50KCRkZWNpc2lvblF1ZXVlKSkgewoKJHBydW5lZFF1ZXVlID0gW107CmZvcmVhY2ggKCRkZWNpc2lvblF1ZXVlIGFzICRsaXRlcmFsKSB7CmlmIChpc3NldCgkdGhpcy0+Zml4ZWRNYXBbYWJzKCRsaXRlcmFsKV0pKSB7CiRwcnVuZWRRdWV1ZVtdID0gJGxpdGVyYWw7Cn0KfQppZiAoIWVtcHR5KCRwcnVuZWRRdWV1ZSkpIHsKJGRlY2lzaW9uUXVldWUgPSAkcHJ1bmVkUXVldWU7Cn0KfQoKaWYgKCRub25lU2F0aXNmaWVkICYmIFxjb3VudCgkZGVjaXNpb25RdWV1ZSkpIHsKJG9MZXZlbCA9ICRsZXZlbDsKJGxldmVsID0gJHRoaXMtPnNlbGVjdEFuZEluc3RhbGwoJGxldmVsLCAkZGVjaXNpb25RdWV1ZSwgJHJ1bGUpOwoKaWYgKDAgPT09ICRsZXZlbCkgewpyZXR1cm47Cn0KaWYgKCRsZXZlbCA8PSAkb0xldmVsKSB7CmJyZWFrOwp9Cn0KfQp9Cgokc3lzdGVtTGV2ZWwgPSAkbGV2ZWwgKyAxOwoKCiRpdGVyYXRvci0+bmV4dCgpOwppZiAoJGl0ZXJhdG9yLT52YWxpZCgpKSB7CmNvbnRpbnVlOwp9Cn0KCmlmICgkbGV2ZWwgPCAkc3lzdGVtTGV2ZWwpIHsKJHN5c3RlbUxldmVsID0gJGxldmVsOwp9CgokcnVsZXNDb3VudCA9IFxjb3VudCgkdGhpcy0+cnVsZXMpOwokcGFzcyA9IDE7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0xvb2tpbmcgYXQgYWxsIHJ1bGVzLicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CmZvciAoJGkgPSAwLCAkbiA9IDA7ICRuIDwgJHJ1bGVzQ291bnQ7ICRpKyssICRuKyspIHsKaWYgKCRpID09PSAkcnVsZXNDb3VudCkgewppZiAoMSA9PT0gJHBhc3MpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJTb21ldGhpbmcncyBjaGFuZ2VkLCBsb29raW5nIGF0IGFsbCBydWxlcyBhZ2FpbiAocGFzcyAjJHBhc3MpIiwgZmFsc2UsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIlNvbWV0aGluZydzIGNoYW5nZWQsIGxvb2tpbmcgYXQgYWxsIHJ1bGVzIGFnYWluIChwYXNzICMkcGFzcykiLCBmYWxzZSwgbnVsbCwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQoKJGkgPSAwOwokcGFzcysrOwp9CgokcnVsZSA9ICR0aGlzLT5ydWxlcy0+cnVsZUJ5SWRbJGldOwokbGl0ZXJhbHMgPSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKCmlmICgkcnVsZS0+aXNEaXNhYmxlZCgpKSB7CmNvbnRpbnVlOwp9CgokZGVjaXNpb25RdWV1ZSA9IFtdOwoKCgoKCgoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CmlmICgkbGl0ZXJhbCA8PSAwKSB7CmlmICghJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlZEluc3RhbGwoJGxpdGVyYWwpKSB7CmNvbnRpbnVlIDI7IAp9Cn0gZWxzZSB7CmlmICgkdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGVkSW5zdGFsbCgkbGl0ZXJhbCkpIHsKY29udGludWUgMjsgCn0KaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnVuZGVjaWRlZCgkbGl0ZXJhbCkpIHsKJGRlY2lzaW9uUXVldWVbXSA9ICRsaXRlcmFsOwp9Cn0KfQoKCmlmIChcY291bnQoJGRlY2lzaW9uUXVldWUpIDwgMikgewpjb250aW51ZTsKfQoKJGxldmVsID0gJHRoaXMtPnNlbGVjdEFuZEluc3RhbGwoJGxldmVsLCAkZGVjaXNpb25RdWV1ZSwgJHJ1bGUpOwoKaWYgKDAgPT09ICRsZXZlbCkgewpyZXR1cm47Cn0KCgokcnVsZXNDb3VudCA9IFxjb3VudCgkdGhpcy0+cnVsZXMpOwokbiA9IC0xOwp9CgppZiAoJGxldmVsIDwgJHN5c3RlbUxldmVsKSB7CmNvbnRpbnVlOwp9CgoKaWYgKFxjb3VudCgkdGhpcy0+YnJhbmNoZXMpKSB7CiRsYXN0TGl0ZXJhbCA9IG51bGw7CiRsYXN0TGV2ZWwgPSBudWxsOwokbGFzdEJyYW5jaEluZGV4ID0gMDsKJGxhc3RCcmFuY2hPZmZzZXQgPSAwOwoKZm9yICgkaSA9IFxjb3VudCgkdGhpcy0+YnJhbmNoZXMpIC0gMTsgJGkgPj0gMDsgJGktLSkgewpbJGxpdGVyYWxzLCAkbF0gPSAkdGhpcy0+YnJhbmNoZXNbJGldOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRvZmZzZXQgPT4gJGxpdGVyYWwpIHsKaWYgKCRsaXRlcmFsICYmICRsaXRlcmFsID4gMCAmJiAkdGhpcy0+ZGVjaXNpb25zLT5kZWNpc2lvbkxldmVsKCRsaXRlcmFsKSA+ICRsICsgMSkgewokbGFzdExpdGVyYWwgPSAkbGl0ZXJhbDsKJGxhc3RCcmFuY2hJbmRleCA9ICRpOwokbGFzdEJyYW5jaE9mZnNldCA9ICRvZmZzZXQ7CiRsYXN0TGV2ZWwgPSAkbDsKfQp9Cn0KCmlmICgkbGFzdExpdGVyYWwpIHsKdW5zZXQoJHRoaXMtPmJyYW5jaGVzWyRsYXN0QnJhbmNoSW5kZXhdW3NlbGY6OkJSQU5DSF9MSVRFUkFMU11bJGxhc3RCcmFuY2hPZmZzZXRdKTsKCiRsZXZlbCA9ICRsYXN0TGV2ZWw7CiR0aGlzLT5yZXZlcnQoJGxldmVsKTsKCiR3aHkgPSAkdGhpcy0+ZGVjaXNpb25zLT5sYXN0UmVhc29uKCk7CgokbGV2ZWwgPSAkdGhpcy0+c2V0UHJvcGFnYXRlTGVhcm4oJGxldmVsLCAkbGFzdExpdGVyYWwsICR3aHkpOwoKaWYgKCRsZXZlbCA9PT0gMCkgewpyZXR1cm47Cn0KCmNvbnRpbnVlOwp9Cn0KCmJyZWFrOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKY2xhc3MgU29sdmVyQnVnRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoCiRtZXNzYWdlLiJcblRoaXMgZXhjZXB0aW9uIHdhcyBtb3N0IGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gQ29tcG9zZXIuXG4iLgoiUGxlYXNlIHJlcG9ydCB0aGUgY29tbWFuZCB5b3UgcmFuLCB0aGUgZXhhY3QgZXJyb3IgeW91IHJlY2VpdmVkLCBhbmQgeW91ciBjb21wb3Nlci5qc29uIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMgLSB0aGFuayB5b3UhXG4iCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFV0aWxcSW5pSGVscGVyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0OwoKCgoKCgpjbGFzcyBTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKcHVibGljIGNvbnN0IEVSUk9SX0RFUEVOREVOQ1lfUkVTT0xVVElPTl9GQUlMRUQgPSAyOwoKCnByb3RlY3RlZCAkcHJvYmxlbXM7Cgpwcm90ZWN0ZWQgJGxlYXJuZWRQb29sOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcHJvYmxlbXMsIGFycmF5ICRsZWFybmVkUG9vbCkKewokdGhpcy0+cHJvYmxlbXMgPSAkcHJvYmxlbXM7CiR0aGlzLT5sZWFybmVkUG9vbCA9ICRsZWFybmVkUG9vbDsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJ0ZhaWxlZCByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIHdpdGggJy5jb3VudCgkcHJvYmxlbXMpLicgcHJvYmxlbXMsIGNhbGwgZ2V0UHJldHR5U3RyaW5nIHRvIGdldCBmb3JtYXR0ZWQgZGV0YWlscycsIHNlbGY6OkVSUk9SX0RFUEVOREVOQ1lfUkVTT0xVVElPTl9GQUlMRUQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgYm9vbCAkaXNEZXZFeHRyYWN0aW9uID0gZmFsc2UpOiBzdHJpbmcKewokaW5zdGFsbGVkTWFwID0gJHJlcXVlc3QtPmdldFByZXNlbnRNYXAodHJ1ZSk7CiRtaXNzaW5nRXh0ZW5zaW9ucyA9IFtdOwokaXNDYXVzZWRCeUxvY2sgPSBmYWxzZTsKCiRwcm9ibGVtcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cHJvYmxlbXMgYXMgJHByb2JsZW0pIHsKJHByb2JsZW1zW10gPSAkcHJvYmxlbS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UsICRpbnN0YWxsZWRNYXAsICR0aGlzLT5sZWFybmVkUG9vbCkuIlxuIjsKCiRtaXNzaW5nRXh0ZW5zaW9ucyA9IGFycmF5X21lcmdlKCRtaXNzaW5nRXh0ZW5zaW9ucywgJHRoaXMtPmdldEV4dGVuc2lvblByb2JsZW1zKCRwcm9ibGVtLT5nZXRSZWFzb25zKCkpKTsKCiRpc0NhdXNlZEJ5TG9jayA9ICRpc0NhdXNlZEJ5TG9jayB8fCAkcHJvYmxlbS0+aXNDYXVzZWRCeUxvY2soJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCk7Cn0KCiRpID0gMTsKJHRleHQgPSAiXG4iOwpmb3JlYWNoIChhcnJheV91bmlxdWUoJHByb2JsZW1zKSBhcyAkcHJvYmxlbSkgewokdGV4dCAuPSAiICBQcm9ibGVtICIuKCRpKyspLiRwcm9ibGVtOwp9CgokaGludHMgPSBbXTsKaWYgKCEkaXNEZXZFeHRyYWN0aW9uICYmIChzdHJwb3MoJHRleHQsICdjb3VsZCBub3QgYmUgZm91bmQnKSB8fCBzdHJwb3MoJHRleHQsICdubyBtYXRjaGluZyBwYWNrYWdlIGZvdW5kJykpKSB7CiRoaW50c1tdID0gIlBvdGVudGlhbCBjYXVzZXM6XG4gLSBBIHR5cG8gaW4gdGhlIHBhY2thZ2UgbmFtZVxuIC0gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiBhIHN0YWJsZS1lbm91Z2ggdmVyc2lvbiBhY2NvcmRpbmcgdG8geW91ciBtaW5pbXVtLXN0YWJpbGl0eSBzZXR0aW5nXG4gICBzZWUgPGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNC1zY2hlbWEubWQjbWluaW11bS1zdGFiaWxpdHk+IGZvciBtb3JlIGRldGFpbHMuXG4gLSBJdCdzIGEgcHJpdmF0ZSBwYWNrYWdlIGFuZCB5b3UgZm9yZ290IHRvIGFkZCBhIGN1c3RvbSByZXBvc2l0b3J5IHRvIGZpbmQgaXRcblxuUmVhZCA8aHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZD4gZm9yIGZ1cnRoZXIgY29tbW9uIHByb2JsZW1zLiI7Cn0KCmlmICghZW1wdHkoJG1pc3NpbmdFeHRlbnNpb25zKSkgewokaGludHNbXSA9ICR0aGlzLT5jcmVhdGVFeHRlbnNpb25IaW50KCRtaXNzaW5nRXh0ZW5zaW9ucyk7Cn0KCmlmICgkaXNDYXVzZWRCeUxvY2sgJiYgISRpc0RldkV4dHJhY3Rpb24gJiYgISRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCkpIHsKJGhpbnRzW10gPSAiVXNlIHRoZSBvcHRpb24gLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMgKC1XKSB0byBhbGxvdyB1cGdyYWRlcywgZG93bmdyYWRlcyBhbmQgcmVtb3ZhbHMgZm9yIHBhY2thZ2VzIGN1cnJlbnRseSBsb2NrZWQgdG8gc3BlY2lmaWMgdmVyc2lvbnMuIjsKfQoKaWYgKHN0cnBvcygkdGV4dCwgJ2ZvdW5kIGNvbXBvc2VyLXBsdWdpbi1hcGlbMi4wLjBdIGJ1dCBpdCBkb2VzIG5vdCBtYXRjaCcpICYmIHN0cnBvcygkdGV4dCwgJy0gb2NyYW1pdXMvcGFja2FnZS12ZXJzaW9ucycpKSB7CiRoaW50c1tdID0gIjx3YXJuaW5nPm9jcmFtaXVzL3BhY2thZ2UtdmVyc2lvbnMgb25seSBwcm92aWRlcyBzdXBwb3J0IGZvciBDb21wb3NlciAyIGluIDEuOCssIHdoaWNoIHJlcXVpcmVzIFBIUCA3LjQuPC93YXJuaW5nPlxuSWYgeW91IGNhbiBub3QgdXBncmFkZSBQSFAgeW91IGNhbiByZXF1aXJlIDxpbmZvPmNvbXBvc2VyL3BhY2thZ2UtdmVyc2lvbnMtZGVwcmVjYXRlZDwvaW5mbz4gdG8gcmVzb2x2ZSB0aGlzIHdpdGggUEhQIDcuMCsuIjsKfQoKaWYgKCFjbGFzc19leGlzdHMoJ1BIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlJywgZmFsc2UpKSB7CmlmIChzdHJwb3MoJHRleHQsICdmb3VuZCBjb21wb3Nlci1wbHVnaW4tYXBpWzIuMC4wXSBidXQgaXQgZG9lcyBub3QgbWF0Y2gnKSkgewokaGludHNbXSA9ICJZb3UgYXJlIHVzaW5nIENvbXBvc2VyIDIsIHdoaWNoIHNvbWUgb2YgeW91ciBwbHVnaW5zIHNlZW0gdG8gYmUgaW5jb21wYXRpYmxlIHdpdGguIE1ha2Ugc3VyZSB5b3UgdXBkYXRlIHlvdXIgcGx1Z2lucyBvciByZXBvcnQgYSBwbHVnaW4taXNzdWUgdG8gYXNrIHRoZW0gdG8gc3VwcG9ydCBDb21wb3NlciAyLiI7Cn0KfQoKaWYgKCRoaW50cykgewokdGV4dCAuPSAiXG4iIC4gaW1wbG9kZSgiXG5cbiIsICRoaW50cyk7Cn0KCnJldHVybiAkdGV4dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb2JsZW1zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wcm9ibGVtczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVFeHRlbnNpb25IaW50KGFycmF5ICRtaXNzaW5nRXh0ZW5zaW9ucyk6IHN0cmluZwp7CiRwYXRocyA9IEluaUhlbHBlcjo6Z2V0QWxsKCk7CgppZiAoJycgPT09ICRwYXRoc1swXSkgewppZiAoY291bnQoJHBhdGhzKSA9PT0gMSkgewpyZXR1cm4gJyc7Cn0KCmFycmF5X3NoaWZ0KCRwYXRocyk7Cn0KCiRpZ25vcmVFeHRlbnNpb25zQXJndW1lbnRzID0gaW1wbG9kZSgiICIsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRleHRlbnNpb24pIHsKcmV0dXJuICItLWlnbm9yZS1wbGF0Zm9ybS1yZXE9JGV4dGVuc2lvbiI7Cn0sIGFycmF5X3VuaXF1ZSgkbWlzc2luZ0V4dGVuc2lvbnMpKSk7CgokdGV4dCA9ICJUbyBlbmFibGUgZXh0ZW5zaW9ucywgdmVyaWZ5IHRoYXQgdGhleSBhcmUgZW5hYmxlZCBpbiB5b3VyIC5pbmkgZmlsZXM6XG4gICAgLSAiOwokdGV4dCAuPSBpbXBsb2RlKCJcbiAgICAtICIsICRwYXRocyk7CiR0ZXh0IC49ICJcbllvdSBjYW4gYWxzbyBydW4gYHBocCAtLWluaWAgaW4gYSB0ZXJtaW5hbCB0byBzZWUgd2hpY2ggZmlsZXMgYXJlIHVzZWQgYnkgUEhQIGluIENMSSBtb2RlLiI7CiR0ZXh0IC49ICJcbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gcnVuIENvbXBvc2VyIHdpdGggYCRpZ25vcmVFeHRlbnNpb25zQXJndW1lbnRzYCB0byB0ZW1wb3JhcmlseSBpZ25vcmUgdGhlc2UgcmVxdWlyZWQgZXh0ZW5zaW9ucy4iOwoKcmV0dXJuICR0ZXh0Owp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRFeHRlbnNpb25Qcm9ibGVtcyhhcnJheSAkcmVhc29uU2V0cyk6IGFycmF5CnsKJG1pc3NpbmdFeHRlbnNpb25zID0gW107CmZvcmVhY2ggKCRyZWFzb25TZXRzIGFzICRyZWFzb25TZXQpIHsKZm9yZWFjaCAoJHJlYXNvblNldCBhcyAkcnVsZSkgewokcmVxdWlyZWQgPSAkcnVsZS0+Z2V0UmVxdWlyZWRQYWNrYWdlKCk7CmlmIChudWxsICE9PSAkcmVxdWlyZWQgJiYgMCA9PT0gc3RycG9zKCRyZXF1aXJlZCwgJ2V4dC0nKSkgewokbWlzc2luZ0V4dGVuc2lvbnNbJHJlcXVpcmVkXSA9IDE7Cn0KfQp9CgpyZXR1cm4gYXJyYXlfa2V5cygkbWlzc2luZ0V4dGVuc2lvbnMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxPcGVyYXRpb25JbnRlcmZhY2U7CgoKCgoKY2xhc3MgVHJhbnNhY3Rpb24KewoKCgpwcm90ZWN0ZWQgJG9wZXJhdGlvbnM7CgoKCgoKcHJvdGVjdGVkICRwcmVzZW50UGFja2FnZXM7CgoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlTWFwOwoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlc0J5TmFtZSA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcHJlc2VudFBhY2thZ2VzLCBhcnJheSAkcmVzdWx0UGFja2FnZXMpCnsKJHRoaXMtPnByZXNlbnRQYWNrYWdlcyA9ICRwcmVzZW50UGFja2FnZXM7CiR0aGlzLT5zZXRSZXN1bHRQYWNrYWdlTWFwcygkcmVzdWx0UGFja2FnZXMpOwokdGhpcy0+b3BlcmF0aW9ucyA9ICR0aGlzLT5jYWxjdWxhdGVPcGVyYXRpb25zKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5vcGVyYXRpb25zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFJlc3VsdFBhY2thZ2VNYXBzKGFycmF5ICRyZXN1bHRQYWNrYWdlcyk6IHZvaWQKewokcGFja2FnZVNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIpOiBpbnQgewoKaWYgKCRhLT5nZXROYW1lKCkgPT09ICRiLT5nZXROYW1lKCkpIHsKaWYgKCRhIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICE9PSAkYiBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpyZXR1cm4gJGEgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgPyAtMSA6IDE7Cn0KCnJldHVybiBzdHJjbXAoJGItPmdldFZlcnNpb24oKSwgJGEtPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiBzdHJjbXAoJGItPmdldE5hbWUoKSwgJGEtPmdldE5hbWUoKSk7Cn07CgokdGhpcy0+cmVzdWx0UGFja2FnZU1hcCA9IFtdOwpmb3JlYWNoICgkcmVzdWx0UGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lWyRuYW1lXVtdID0gJHBhY2thZ2U7Cn0KfQoKdWFzb3J0KCR0aGlzLT5yZXN1bHRQYWNrYWdlTWFwLCAkcGFja2FnZVNvcnQpOwpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWUgYXMgJG5hbWUgPT4gJHBhY2thZ2VzKSB7CnVhc29ydCgkdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWVbJG5hbWVdLCAkcGFja2FnZVNvcnQpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjYWxjdWxhdGVPcGVyYXRpb25zKCk6IGFycmF5CnsKJG9wZXJhdGlvbnMgPSBbXTsKCiRwcmVzZW50UGFja2FnZU1hcCA9IFtdOwokcmVtb3ZlTWFwID0gW107CiRwcmVzZW50QWxpYXNNYXAgPSBbXTsKJHJlbW92ZUFsaWFzTWFwID0gW107CmZvcmVhY2ggKCR0aGlzLT5wcmVzZW50UGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwcmVzZW50QWxpYXNNYXBbJHBhY2thZ2UtPmdldE5hbWUoKS4nOjonLiRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2U7CiRyZW1vdmVBbGlhc01hcFskcGFja2FnZS0+Z2V0TmFtZSgpLic6OicuJHBhY2thZ2UtPmdldFZlcnNpb24oKV0gPSAkcGFja2FnZTsKfSBlbHNlIHsKJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7CiRyZW1vdmVNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQp9Cgokc3RhY2sgPSAkdGhpcy0+Z2V0Um9vdFBhY2thZ2VzKCk7CgokdmlzaXRlZCA9IFtdOwokcHJvY2Vzc2VkID0gW107Cgp3aGlsZSAoIWVtcHR5KCRzdGFjaykpIHsKJHBhY2thZ2UgPSBhcnJheV9wb3AoJHN0YWNrKTsKCmlmIChpc3NldCgkcHJvY2Vzc2VkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkdmlzaXRlZFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKJHZpc2l0ZWRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSB0cnVlOwoKJHN0YWNrW10gPSAkcGFja2FnZTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRzdGFja1tdID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHBvc3NpYmxlUmVxdWlyZXMgPSAkdGhpcy0+Z2V0UHJvdmlkZXJzSW5SZXN1bHQoJGxpbmspOwoKZm9yZWFjaCAoJHBvc3NpYmxlUmVxdWlyZXMgYXMgJHJlcXVpcmUpIHsKJHN0YWNrW10gPSAkcmVxdWlyZTsKfQp9Cn0KfSBlbHNlaWYgKCFpc3NldCgkcHJvY2Vzc2VkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewokcHJvY2Vzc2VkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gdHJ1ZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYWxpYXNLZXkgPSAkcGFja2FnZS0+Z2V0TmFtZSgpLic6OicuJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKGlzc2V0KCRwcmVzZW50QWxpYXNNYXBbJGFsaWFzS2V5XSkpIHsKdW5zZXQoJHJlbW92ZUFsaWFzTWFwWyRhbGlhc0tleV0pOwp9IGVsc2Ugewokb3BlcmF0aW9uc1tdID0gbmV3IE9wZXJhdGlvblxNYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24oJHBhY2thZ2UpOwp9Cn0gZWxzZSB7CmlmIChpc3NldCgkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRzb3VyY2UgPSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV07CgoKCmlmICgkcGFja2FnZS0+Z2V0VmVyc2lvbigpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldFZlcnNpb24oKSB8fAokcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldERpc3RSZWZlcmVuY2UoKSB8fAokcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgIT09ICRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0U291cmNlUmVmZXJlbmNlKCkKKSB7CiRvcGVyYXRpb25zW10gPSBuZXcgT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbigkc291cmNlLCAkcGFja2FnZSk7Cn0KdW5zZXQoJHJlbW92ZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0gZWxzZSB7CiRvcGVyYXRpb25zW10gPSBuZXcgT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpOwp1bnNldCgkcmVtb3ZlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQp9Cn0KfQoKZm9yZWFjaCAoJHJlbW92ZU1hcCBhcyAkbmFtZSA9PiAkcGFja2FnZSkgewphcnJheV91bnNoaWZ0KCRvcGVyYXRpb25zLCBuZXcgT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbigkcGFja2FnZSkpOwp9CmZvcmVhY2ggKCRyZW1vdmVBbGlhc01hcCBhcyAkbmFtZVZlcnNpb24gPT4gJHBhY2thZ2UpIHsKJG9wZXJhdGlvbnNbXSA9IG5ldyBPcGVyYXRpb25cTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24oJHBhY2thZ2UpOwp9Cgokb3BlcmF0aW9ucyA9ICR0aGlzLT5tb3ZlUGx1Z2luc1RvRnJvbnQoJG9wZXJhdGlvbnMpOwoKCiRvcGVyYXRpb25zID0gJHRoaXMtPm1vdmVVbmluc3RhbGxzVG9Gcm9udCgkb3BlcmF0aW9ucyk7CgoKCgoKCgoKCgoKCgoKCgoKCgpyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbnMgPSAkb3BlcmF0aW9uczsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Um9vdFBhY2thZ2VzKCk6IGFycmF5CnsKJHJvb3RzID0gJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXA7Cgpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZU1hcCBhcyAkcGFja2FnZUhhc2ggPT4gJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkcm9vdHNbJHBhY2thZ2VIYXNoXSkpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRwb3NzaWJsZVJlcXVpcmVzID0gJHRoaXMtPmdldFByb3ZpZGVyc0luUmVzdWx0KCRsaW5rKTsKCmZvcmVhY2ggKCRwb3NzaWJsZVJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CmlmICgkcmVxdWlyZSAhPT0gJHBhY2thZ2UpIHsKdW5zZXQoJHJvb3RzW3NwbF9vYmplY3RfaGFzaCgkcmVxdWlyZSldKTsKfQp9Cn0KfQoKcmV0dXJuICRyb290czsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFByb3ZpZGVyc0luUmVzdWx0KExpbmsgJGxpbmspOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lWyRsaW5rLT5nZXRUYXJnZXQoKV0pKSB7CnJldHVybiBbXTsKfQoKcmV0dXJuICR0aGlzLT5yZXN1bHRQYWNrYWdlc0J5TmFtZVskbGluay0+Z2V0VGFyZ2V0KCldOwp9CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtb3ZlUGx1Z2luc1RvRnJvbnQoYXJyYXkgJG9wZXJhdGlvbnMpOiBhcnJheQp7CiRkbE1vZGlmeWluZ1BsdWdpbnNOb0RlcHMgPSBbXTsKJGRsTW9kaWZ5aW5nUGx1Z2luc1dpdGhEZXBzID0gW107CiRkbE1vZGlmeWluZ1BsdWdpblJlcXVpcmVzID0gW107CiRwbHVnaW5zTm9EZXBzID0gW107CiRwbHVnaW5zV2l0aERlcHMgPSBbXTsKJHBsdWdpblJlcXVpcmVzID0gW107Cgpmb3JlYWNoIChhcnJheV9yZXZlcnNlKCRvcGVyYXRpb25zLCB0cnVlKSBhcyAkaWR4ID0+ICRvcCkgewppZiAoJG9wIGluc3RhbmNlb2YgT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb24pIHsKJHBhY2thZ2UgPSAkb3AtPmdldFBhY2thZ2UoKTsKfSBlbHNlaWYgKCRvcCBpbnN0YW5jZW9mIE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb24pIHsKJHBhY2thZ2UgPSAkb3AtPmdldFRhcmdldFBhY2thZ2UoKTsKfSBlbHNlIHsKY29udGludWU7Cn0KCiRpc0Rvd25sb2Fkc01vZGlmeWluZ1BsdWdpbiA9ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nICYmICgkZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKSkgJiYgaXNzZXQoJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtZG93bmxvYWRzJ10pICYmICRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddID09PSB0cnVlOwoKCmlmICgkaXNEb3dubG9hZHNNb2RpZnlpbmdQbHVnaW4gfHwgY291bnQoYXJyYXlfaW50ZXJzZWN0KCRwYWNrYWdlLT5nZXROYW1lcygpLCAkZGxNb2RpZnlpbmdQbHVnaW5SZXF1aXJlcykpKSB7CgokcmVxdWlyZXMgPSBhcnJheV9maWx0ZXIoYXJyYXlfa2V5cygkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSksIHN0YXRpYyBmdW5jdGlvbiAoJHJlcSk6IGJvb2wgewpyZXR1cm4gIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSk7Cn0pOwoKCmlmICgkaXNEb3dubG9hZHNNb2RpZnlpbmdQbHVnaW4gJiYgIWNvdW50KCRyZXF1aXJlcykpIHsKCmFycmF5X3Vuc2hpZnQoJGRsTW9kaWZ5aW5nUGx1Z2luc05vRGVwcywgJG9wKTsKfSBlbHNlIHsKCiRkbE1vZGlmeWluZ1BsdWdpblJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJGRsTW9kaWZ5aW5nUGx1Z2luUmVxdWlyZXMsICRyZXF1aXJlcyk7CgphcnJheV91bnNoaWZ0KCRkbE1vZGlmeWluZ1BsdWdpbnNXaXRoRGVwcywgJG9wKTsKfQoKdW5zZXQoJG9wZXJhdGlvbnNbJGlkeF0pOwpjb250aW51ZTsKfQoKCiRpc1BsdWdpbiA9ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nIHx8ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInOwoKCmlmICgkaXNQbHVnaW4gfHwgY291bnQoYXJyYXlfaW50ZXJzZWN0KCRwYWNrYWdlLT5nZXROYW1lcygpLCAkcGx1Z2luUmVxdWlyZXMpKSkgewoKJHJlcXVpcmVzID0gYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkpLCBzdGF0aWMgZnVuY3Rpb24gKCRyZXEpOiBib29sIHsKcmV0dXJuICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpOwp9KTsKCgppZiAoJGlzUGx1Z2luICYmICFjb3VudCgkcmVxdWlyZXMpKSB7CgphcnJheV91bnNoaWZ0KCRwbHVnaW5zTm9EZXBzLCAkb3ApOwp9IGVsc2UgewoKJHBsdWdpblJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJHBsdWdpblJlcXVpcmVzLCAkcmVxdWlyZXMpOwoKYXJyYXlfdW5zaGlmdCgkcGx1Z2luc1dpdGhEZXBzLCAkb3ApOwp9Cgp1bnNldCgkb3BlcmF0aW9uc1skaWR4XSk7Cn0KfQoKcmV0dXJuIGFycmF5X21lcmdlKCRkbE1vZGlmeWluZ1BsdWdpbnNOb0RlcHMsICRkbE1vZGlmeWluZ1BsdWdpbnNXaXRoRGVwcywgJHBsdWdpbnNOb0RlcHMsICRwbHVnaW5zV2l0aERlcHMsICRvcGVyYXRpb25zKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbW92ZVVuaW5zdGFsbHNUb0Zyb250KGFycmF5ICRvcGVyYXRpb25zKTogYXJyYXkKewokdW5pbnN0T3BzID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpZHggPT4gJG9wKSB7CmlmICgkb3AgaW5zdGFuY2VvZiBPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uIHx8ICRvcCBpbnN0YW5jZW9mIE9wZXJhdGlvblxNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbikgewokdW5pbnN0T3BzW10gPSAkb3A7CnVuc2V0KCRvcGVyYXRpb25zWyRpZHhdKTsKfQp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJHVuaW5zdE9wcywgJG9wZXJhdGlvbnMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQXJjaGl2ZURvd25sb2FkZXIgZXh0ZW5kcyBGaWxlRG93bmxvYWRlcgp7CgoKCnByb3RlY3RlZCAkY2xlYW51cEV4ZWN1dGVkID0gW107CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewp1bnNldCgkdGhpcy0+Y2xlYW51cEV4ZWN1dGVkWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKCnJldHVybiBwYXJlbnQ6OnByZXBhcmUoJHR5cGUsICRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRoaXMtPmNsZWFudXBFeGVjdXRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7CgpyZXR1cm4gcGFyZW50OjpjbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSAuICR0aGlzLT5nZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoJHBhY2thZ2UsICRwYXRoKSk7Cn0KCiR2ZW5kb3JEaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKCgoKCmlmIChmYWxzZSA9PT0gc3RycG9zKCR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR2ZW5kb3JEaXIpLCAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkcGF0aC5ESVJFQ1RPUllfU0VQQVJBVE9SKSkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVtcHR5RGlyZWN0b3J5KCRwYXRoKTsKfQoKZG8gewokdGVtcG9yYXJ5RGlyID0gJHZlbmRvckRpci4nL2NvbXBvc2VyLycuc3Vic3RyKG1kNSh1bmlxaWQoJycsIHRydWUpKSwgMCwgOCk7Cn0gd2hpbGUgKGlzX2RpcigkdGVtcG9yYXJ5RGlyKSk7CgokdGhpcy0+YWRkQ2xlYW51cFBhdGgoJHBhY2thZ2UsICR0ZW1wb3JhcnlEaXIpOwoKCmlmICghaXNfZGlyKCRwYXRoKSB8fCByZWFscGF0aCgkcGF0aCkgIT09IFBsYXRmb3JtOjpnZXRDd2QoKSkgewokdGhpcy0+YWRkQ2xlYW51cFBhdGgoJHBhY2thZ2UsICRwYXRoKTsKfQoKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGVtcG9yYXJ5RGlyKTsKJGZpbGVOYW1lID0gJHRoaXMtPmdldEZpbGVOYW1lKCRwYWNrYWdlLCAkcGF0aCk7CgokZmlsZXN5c3RlbSA9ICR0aGlzLT5maWxlc3lzdGVtOwoKJGNsZWFudXAgPSBmdW5jdGlvbiAoKSB1c2UgKCRwYXRoLCAkZmlsZXN5c3RlbSwgJHRlbXBvcmFyeURpciwgJHBhY2thZ2UpIHsKCiR0aGlzLT5jbGVhckxhc3RDYWNoZVdyaXRlKCRwYWNrYWdlKTsKCgokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCR0ZW1wb3JhcnlEaXIpOwppZiAoaXNfZGlyKCRwYXRoKSAmJiByZWFscGF0aCgkcGF0aCkgIT09IFBsYXRmb3JtOjpnZXRDd2QoKSkgewokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRwYXRoKTsKfQokdGhpcy0+cmVtb3ZlQ2xlYW51cFBhdGgoJHBhY2thZ2UsICR0ZW1wb3JhcnlEaXIpOwokcmVhbHBhdGggPSByZWFscGF0aCgkcGF0aCk7CmlmICgkcmVhbHBhdGggIT09IGZhbHNlKSB7CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHJlYWxwYXRoKTsKfQp9OwoKdHJ5IHsKJHByb21pc2UgPSAkdGhpcy0+ZXh0cmFjdCgkcGFja2FnZSwgJGZpbGVOYW1lLCAkdGVtcG9yYXJ5RGlyKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokY2xlYW51cCgpOwp0aHJvdyAkZTsKfQoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHBhY2thZ2UsICRmaWxlc3lzdGVtLCAkZmlsZU5hbWUsICR0ZW1wb3JhcnlEaXIsICRwYXRoKTogXFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CiRmaWxlc3lzdGVtLT51bmxpbmsoJGZpbGVOYW1lKTsKfQoKCgoKCgoKJGdldEZvbGRlckNvbnRlbnQgPSBzdGF0aWMgZnVuY3Rpb24gKCRkaXIpOiBhcnJheSB7CiRmaW5kZXIgPSBGaW5kZXI6OmNyZWF0ZSgpCi0+aWdub3JlVkNTKGZhbHNlKQotPmlnbm9yZURvdEZpbGVzKGZhbHNlKQotPm5vdE5hbWUoJy5EU19TdG9yZScpCi0+ZGVwdGgoMCkKLT5pbigkZGlyKTsKCnJldHVybiBpdGVyYXRvcl90b19hcnJheSgkZmluZGVyKTsKfTsKJHJlbmFtZVJlY3Vyc2l2ZWx5ID0gbnVsbDsKCgoKCgoKCgoKCgokcmVuYW1lUmVjdXJzaXZlbHkgPSBzdGF0aWMgZnVuY3Rpb24gKCRmcm9tLCAkdG8pIHVzZSAoJGZpbGVzeXN0ZW0sICRnZXRGb2xkZXJDb250ZW50LCAkcGFja2FnZSwgJiRyZW5hbWVSZWN1cnNpdmVseSkgewokY29udGVudERpciA9ICRnZXRGb2xkZXJDb250ZW50KCRmcm9tKTsKCgpmb3JlYWNoICgkY29udGVudERpciBhcyAkZmlsZSkgewokZmlsZSA9IChzdHJpbmcpICRmaWxlOwppZiAoaXNfZGlyKCR0byAuICcvJyAuIGJhc2VuYW1lKCRmaWxlKSkpIHsKaWYgKCFpc19kaXIoJGZpbGUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW5zdGFsbGluZyAnLiRwYWNrYWdlLicgd291bGQgbGVhZCB0byBvdmVyd3JpdGluZyB0aGUgJy4kdG8uJy8nLmJhc2VuYW1lKCRmaWxlKS4nIGRpcmVjdG9yeSB3aXRoIGEgZmlsZSBmcm9tIHRoZSBwYWNrYWdlLCBpbnZhbGlkIG9wZXJhdGlvbi4nKTsKfQokcmVuYW1lUmVjdXJzaXZlbHkoJGZpbGUsICR0byAuICcvJyAuIGJhc2VuYW1lKCRmaWxlKSk7Cn0gZWxzZSB7CiRmaWxlc3lzdGVtLT5yZW5hbWUoJGZpbGUsICR0byAuICcvJyAuIGJhc2VuYW1lKCRmaWxlKSk7Cn0KfQp9OwoKJHJlbmFtZUFzT25lID0gZmFsc2U7CmlmICghZmlsZV9leGlzdHMoJHBhdGgpKSB7CiRyZW5hbWVBc09uZSA9IHRydWU7Cn0gZWxzZWlmICgkZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkcGF0aCkpIHsKdHJ5IHsKaWYgKCRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlQaHAoJHBhdGgpKSB7CiRyZW5hbWVBc09uZSA9IHRydWU7Cn0KfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKCn0KfQoKJGNvbnRlbnREaXIgPSAkZ2V0Rm9sZGVyQ29udGVudCgkdGVtcG9yYXJ5RGlyKTsKJHNpbmdsZURpckF0VG9wTGV2ZWwgPSAxID09PSBjb3VudCgkY29udGVudERpcikgJiYgaXNfZGlyKChzdHJpbmcpIHJlc2V0KCRjb250ZW50RGlyKSk7CgppZiAoJHJlbmFtZUFzT25lKSB7CgppZiAoJHNpbmdsZURpckF0VG9wTGV2ZWwpIHsKJGV4dHJhY3RlZERpciA9IChzdHJpbmcpIHJlc2V0KCRjb250ZW50RGlyKTsKfSBlbHNlIHsKJGV4dHJhY3RlZERpciA9ICR0ZW1wb3JhcnlEaXI7Cn0KJGZpbGVzeXN0ZW0tPnJlbmFtZSgkZXh0cmFjdGVkRGlyLCAkcGF0aCk7Cn0gZWxzZSB7CgokZnJvbSA9ICR0ZW1wb3JhcnlEaXI7CmlmICgkc2luZ2xlRGlyQXRUb3BMZXZlbCkgewokZnJvbSA9IChzdHJpbmcpIHJlc2V0KCRjb250ZW50RGlyKTsKfQoKJHJlbmFtZVJlY3Vyc2l2ZWx5KCRmcm9tLCAkcGF0aCk7Cn0KCiRwcm9taXNlID0gJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeUFzeW5jKCR0ZW1wb3JhcnlEaXIpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHBhY2thZ2UsICRwYXRoLCAkdGVtcG9yYXJ5RGlyKSB7CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHRlbXBvcmFyeURpcik7CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHBhdGgpOwp9KTsKfSwgc3RhdGljIGZ1bmN0aW9uICgkZSkgdXNlICgkY2xlYW51cCkgewokY2xlYW51cCgpOwoKdGhyb3cgJGU7Cn0pOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiAnOiBFeHRyYWN0aW5nIGFyY2hpdmUnOwp9CgoKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2U7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIERvd25sb2FkTWFuYWdlcgp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJHByZWZlckRpc3QgPSBmYWxzZTsKCnByaXZhdGUgJHByZWZlclNvdXJjZTsKCnByaXZhdGUgJHBhY2thZ2VQcmVmZXJlbmNlcyA9IFtdOwoKcHJpdmF0ZSAkZmlsZXN5c3RlbTsKCnByaXZhdGUgJGRvd25sb2FkZXJzID0gW107CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgYm9vbCAkcHJlZmVyU291cmNlID0gZmFsc2UsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAkcHJlZmVyU291cmNlOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtKCk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJTb3VyY2UoYm9vbCAkcHJlZmVyU291cmNlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAkcHJlZmVyU291cmNlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyRGlzdChib29sICRwcmVmZXJEaXN0KTogc2VsZgp7CiR0aGlzLT5wcmVmZXJEaXN0ID0gJHByZWZlckRpc3Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyZW5jZXMoYXJyYXkgJHByZWZlcmVuY2VzKTogc2VsZgp7CiR0aGlzLT5wYWNrYWdlUHJlZmVyZW5jZXMgPSAkcHJlZmVyZW5jZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RG93bmxvYWRlcihzdHJpbmcgJHR5cGUsIERvd25sb2FkZXJJbnRlcmZhY2UgJGRvd25sb2FkZXIpOiBzZWxmCnsKJHR5cGUgPSBzdHJ0b2xvd2VyKCR0eXBlKTsKJHRoaXMtPmRvd25sb2FkZXJzWyR0eXBlXSA9ICRkb3dubG9hZGVyOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RG93bmxvYWRlcihzdHJpbmcgJHR5cGUpOiBEb3dubG9hZGVySW50ZXJmYWNlCnsKJHR5cGUgPSBzdHJ0b2xvd2VyKCR0eXBlKTsKaWYgKCFpc3NldCgkdGhpcy0+ZG93bmxvYWRlcnNbJHR5cGVdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbmtub3duIGRvd25sb2FkZXIgdHlwZTogJXMuIEF2YWlsYWJsZSB0eXBlczogJXMuJywgJHR5cGUsIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkdGhpcy0+ZG93bmxvYWRlcnMpKSkpOwp9CgpyZXR1cm4gJHRoaXMtPmRvd25sb2FkZXJzWyR0eXBlXTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RG93bmxvYWRlckZvclBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9Eb3dubG9hZGVySW50ZXJmYWNlCnsKJGluc3RhbGxhdGlvblNvdXJjZSA9ICRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTsKCmlmICgnbWV0YXBhY2thZ2UnID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CnJldHVybiBudWxsOwp9CgppZiAoJ2Rpc3QnID09PSAkaW5zdGFsbGF0aW9uU291cmNlKSB7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXIoJHBhY2thZ2UtPmdldERpc3RUeXBlKCkpOwp9IGVsc2VpZiAoJ3NvdXJjZScgPT09ICRpbnN0YWxsYXRpb25Tb3VyY2UpIHsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlcigkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCidQYWNrYWdlICcuJHBhY2thZ2UuJyBkb2VzIG5vdCBoYXZlIGFuIGluc3RhbGxhdGlvbiBzb3VyY2Ugc2V0JwopOwp9CgppZiAoJGluc3RhbGxhdGlvblNvdXJjZSAhPT0gJGRvd25sb2FkZXItPmdldEluc3RhbGxhdGlvblNvdXJjZSgpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZigKJ0Rvd25sb2FkZXIgIiVzIiBpcyBhICVzIHR5cGUgZG93bmxvYWRlciBhbmQgY2FuIG5vdCBiZSB1c2VkIHRvIGRvd25sb2FkICVzIGZvciBwYWNrYWdlICVzJywKZ2V0X2NsYXNzKCRkb3dubG9hZGVyKSwKJGRvd25sb2FkZXItPmdldEluc3RhbGxhdGlvblNvdXJjZSgpLAokaW5zdGFsbGF0aW9uU291cmNlLAokcGFja2FnZQopKTsKfQoKcmV0dXJuICRkb3dubG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RG93bmxvYWRlclR5cGUoRG93bmxvYWRlckludGVyZmFjZSAkZG93bmxvYWRlcik6IHN0cmluZwp7CnJldHVybiBhcnJheV9zZWFyY2goJGRvd25sb2FkZXIsICR0aGlzLT5kb3dubG9hZGVycyk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKGRpcm5hbWUoJHRhcmdldERpcikpOwoKJHNvdXJjZXMgPSAkdGhpcy0+Z2V0QXZhaWxhYmxlU291cmNlcygkcGFja2FnZSwgJHByZXZQYWNrYWdlKTsKCiRpbyA9ICR0aGlzLT5pbzsKCiRkb3dubG9hZCA9IGZ1bmN0aW9uICgkcmV0cnkgPSBmYWxzZSkgdXNlICgmJHNvdXJjZXMsICRpbywgJHBhY2thZ2UsICR0YXJnZXREaXIsICYkZG93bmxvYWQsICRwcmV2UGFja2FnZSkgewokc291cmNlID0gYXJyYXlfc2hpZnQoJHNvdXJjZXMpOwppZiAoJHJldHJ5KSB7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPk5vdyB0cnlpbmcgdG8gZG93bmxvYWQgZnJvbSAnIC4gJHNvdXJjZSAuICc8L3dhcm5pbmc+Jyk7Cn0KJHBhY2thZ2UtPnNldEluc3RhbGxhdGlvblNvdXJjZSgkc291cmNlKTsKCiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCEkZG93bmxvYWRlcikgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJGhhbmRsZUVycm9yID0gc3RhdGljIGZ1bmN0aW9uICgkZSkgdXNlICgkc291cmNlcywgJHNvdXJjZSwgJHBhY2thZ2UsICRpbywgJGRvd25sb2FkKSB7CmlmICgkZSBpbnN0YW5jZW9mIFxSdW50aW1lRXhjZXB0aW9uICYmICEkZSBpbnN0YW5jZW9mIElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbikgewppZiAoISRzb3VyY2VzKSB7CnRocm93ICRlOwp9CgokaW8tPndyaXRlRXJyb3IoCicgICAgPHdhcm5pbmc+RmFpbGVkIHRvIGRvd25sb2FkICcuCiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuCicgZnJvbSAnIC4gJHNvdXJjZSAuICc6ICcuCiRlLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nCik7CgpyZXR1cm4gJGRvd25sb2FkKHRydWUpOwp9Cgp0aHJvdyAkZTsKfTsKCnRyeSB7CiRyZXN1bHQgPSAkZG93bmxvYWRlci0+ZG93bmxvYWQoJHBhY2thZ2UsICR0YXJnZXREaXIsICRwcmV2UGFja2FnZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKcmV0dXJuICRoYW5kbGVFcnJvcigkZSk7Cn0KCiRyZXMgPSAkcmVzdWx0LT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoJHJlcykgewpyZXR1cm4gJHJlczsKfSwgJGhhbmRsZUVycm9yKTsKCnJldHVybiAkcmVzOwp9OwoKcmV0dXJuICRkb3dubG9hZCgpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICgkZG93bmxvYWRlcikgewpyZXR1cm4gJGRvd25sb2FkZXItPnByZXBhcmUoJHR5cGUsICRwYWNrYWdlLCAkdGFyZ2V0RGlyLCAkcHJldlBhY2thZ2UpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICgkZG93bmxvYWRlcikgewpyZXR1cm4gJGRvd25sb2FkZXItPmluc3RhbGwoJHBhY2thZ2UsICR0YXJnZXREaXIpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHRhcmdldERpcik6IFByb21pc2VJbnRlcmZhY2UKewokdGFyZ2V0RGlyID0gJHRoaXMtPm5vcm1hbGl6ZVRhcmdldERpcigkdGFyZ2V0RGlyKTsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHRhcmdldCk7CiRpbml0aWFsRG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkaW5pdGlhbCk7CgoKaWYgKCEkaW5pdGlhbERvd25sb2FkZXIgJiYgISRkb3dubG9hZGVyKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKaWYgKCEkZG93bmxvYWRlcikgewpyZXR1cm4gJGluaXRpYWxEb3dubG9hZGVyLT5yZW1vdmUoJGluaXRpYWwsICR0YXJnZXREaXIpOwp9CgokaW5pdGlhbFR5cGUgPSAkdGhpcy0+Z2V0RG93bmxvYWRlclR5cGUoJGluaXRpYWxEb3dubG9hZGVyKTsKJHRhcmdldFR5cGUgPSAkdGhpcy0+Z2V0RG93bmxvYWRlclR5cGUoJGRvd25sb2FkZXIpOwppZiAoJGluaXRpYWxUeXBlID09PSAkdGFyZ2V0VHlwZSkgewp0cnkgewpyZXR1cm4gJGRvd25sb2FkZXItPnVwZGF0ZSgkaW5pdGlhbCwgJHRhcmdldCwgJHRhcmdldERpcik7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKdGhyb3cgJGU7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+ICAgIFVwZGF0ZSBmYWlsZWQgKCcuJGUtPmdldE1lc3NhZ2UoKS4nKTwvZXJyb3I+Jyk7CmlmICghJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJyAgICBXb3VsZCB5b3UgbGlrZSB0byB0cnkgcmVpbnN0YWxsaW5nIHRoZSBwYWNrYWdlIGluc3RlYWQgWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnKSkgewp0aHJvdyAkZTsKfQp9Cn0KCgoKJHByb21pc2UgPSAkaW5pdGlhbERvd25sb2FkZXItPnJlbW92ZSgkaW5pdGlhbCwgJHRhcmdldERpcik7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCRyZXMpIHVzZSAoJHRhcmdldCwgJHRhcmdldERpcik6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gJHRoaXMtPmluc3RhbGwoJHRhcmdldCwgJHRhcmdldERpcik7Cn0pOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHRhcmdldERpcik6IFByb21pc2VJbnRlcmZhY2UKewokdGFyZ2V0RGlyID0gJHRoaXMtPm5vcm1hbGl6ZVRhcmdldERpcigkdGFyZ2V0RGlyKTsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwppZiAoJGRvd25sb2FkZXIpIHsKcmV0dXJuICRkb3dubG9hZGVyLT5yZW1vdmUoJHBhY2thZ2UsICR0YXJnZXREaXIpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHRhcmdldERpciwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewokdGFyZ2V0RGlyID0gJHRoaXMtPm5vcm1hbGl6ZVRhcmdldERpcigkdGFyZ2V0RGlyKTsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwppZiAoJGRvd25sb2FkZXIpIHsKcmV0dXJuICRkb3dubG9hZGVyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHRhcmdldERpciwgJHByZXZQYWNrYWdlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlSW5zdGFsbFByZWZlcmVuY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlUHJlZmVyZW5jZXMgYXMgJHBhdHRlcm4gPT4gJHByZWZlcmVuY2UpIHsKJHBhdHRlcm4gPSAne14nLnN0cl9yZXBsYWNlKCdcXConLCAnLionLCBwcmVnX3F1b3RlKCRwYXR0ZXJuKSkuJyR9aSc7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewppZiAoJ2Rpc3QnID09PSAkcHJlZmVyZW5jZSB8fCAoISRwYWNrYWdlLT5pc0RldigpICYmICdhdXRvJyA9PT0gJHByZWZlcmVuY2UpKSB7CnJldHVybiAnZGlzdCc7Cn0KCnJldHVybiAnc291cmNlJzsKfQp9CgpyZXR1cm4gJHBhY2thZ2UtPmlzRGV2KCkgPyAnc291cmNlJyA6ICdkaXN0JzsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlU291cmNlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogYXJyYXkKewokc291cmNlVHlwZSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCk7CiRkaXN0VHlwZSA9ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwoKCiRzb3VyY2VzID0gW107CmlmICgkc291cmNlVHlwZSkgewokc291cmNlc1tdID0gJ3NvdXJjZSc7Cn0KaWYgKCRkaXN0VHlwZSkgewokc291cmNlc1tdID0gJ2Rpc3QnOwp9CgppZiAoZW1wdHkoJHNvdXJjZXMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlICcuJHBhY2thZ2UuJyBtdXN0IGhhdmUgYSBzb3VyY2Ugb3IgZGlzdCBzcGVjaWZpZWQnKTsKfQoKaWYgKAokcHJldlBhY2thZ2UKCiYmIGluX2FycmF5KCRwcmV2UGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCksICRzb3VyY2VzLCB0cnVlKQoKJiYgISghJHByZXZQYWNrYWdlLT5pc0RldigpICYmICRwcmV2UGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCkgPT09ICdkaXN0JyAmJiAkcGFja2FnZS0+aXNEZXYoKSkKKSB7CiRwcmV2U291cmNlID0gJHByZXZQYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTsKdXNvcnQoJHNvdXJjZXMsIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKSB1c2UgKCRwcmV2U291cmNlKTogaW50IHsKcmV0dXJuICRhID09PSAkcHJldlNvdXJjZSA/IC0xIDogMTsKfSk7CgpyZXR1cm4gJHNvdXJjZXM7Cn0KCgppZiAoISR0aGlzLT5wcmVmZXJTb3VyY2UgJiYgKCR0aGlzLT5wcmVmZXJEaXN0IHx8ICdkaXN0JyA9PT0gJHRoaXMtPnJlc29sdmVQYWNrYWdlSW5zdGFsbFByZWZlcmVuY2UoJHBhY2thZ2UpKSkgewokc291cmNlcyA9IGFycmF5X3JldmVyc2UoJHNvdXJjZXMpOwp9CgpyZXR1cm4gJHNvdXJjZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVUYXJnZXREaXIoc3RyaW5nICRkaXIpOiBzdHJpbmcKewppZiAoJGRpciA9PT0gJ1xcJyB8fCAkZGlyID09PSAnLycpIHsKcmV0dXJuICRkaXI7Cn0KCnJldHVybiBydHJpbSgkZGlyLCAnXFwvJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgppbnRlcmZhY2UgRG93bmxvYWRlckludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvblNvdXJjZSgpOiBzdHJpbmc7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgRHZjc0Rvd25sb2FkZXJJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVucHVzaGVkQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xOdWxsSU87CnVzZSBDb21wb3NlclxFeGNlcHRpb25cSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wYXJlclxDb21wYXJlcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBvc3RGaWxlRG93bmxvYWRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVGaWxlRG93bmxvYWRFdmVudDsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFVybCBhcyBVcmxVdGlsOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCmNsYXNzIEZpbGVEb3dubG9hZGVyIGltcGxlbWVudHMgRG93bmxvYWRlckludGVyZmFjZSwgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcm90ZWN0ZWQgJGNhY2hlOwoKcHJvdGVjdGVkICRldmVudERpc3BhdGNoZXI7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7CgoKCgoKcHVibGljIHN0YXRpYyAkZG93bmxvYWRNZXRhZGF0YSA9IFtdOwoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgJHJlc3BvbnNlSGVhZGVycyA9IFtdOwoKCgoKcHJpdmF0ZSAkbGFzdENhY2hlV3JpdGVzID0gW107Cgpwcml2YXRlICRhZGRpdGlvbmFsQ2xlYW51cFBhdGhzID0gW107CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP0NhY2hlICRjYWNoZSA9IG51bGwsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmNhY2hlID0gJGNhY2hlOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZmlsZXN5c3RlbSA/OiBuZXcgRmlsZXN5c3RlbSgkdGhpcy0+cHJvY2Vzcyk7CgppZiAoJHRoaXMtPmNhY2hlICYmICR0aGlzLT5jYWNoZS0+Z2NJc05lY2Vzc2FyeSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUnVubmluZyBjYWNoZSBnYXJiYWdlIGNvbGxlY3Rpb24nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKJHRoaXMtPmNhY2hlLT5nYygkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLXR0bCcpLCAkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLW1heHNpemUnKSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvblNvdXJjZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2Rpc3QnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHBhY2thZ2UtPmdldERpc3RVcmwoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGdpdmVuIHBhY2thZ2UgaXMgbWlzc2luZyB1cmwgaW5mb3JtYXRpb24nKTsKfQoKJGNhY2hlS2V5R2VuZXJhdG9yID0gc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCAka2V5KTogc3RyaW5nIHsKJGNhY2hlS2V5ID0gc2hhMSgka2V5KTsKCnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpLicvJy4kY2FjaGVLZXkuJy4nLiRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwp9OwoKJHJldHJpZXMgPSAzOwokZGlzdFVybHMgPSAkcGFja2FnZS0+Z2V0RGlzdFVybHMoKTsKCiR1cmxzID0gW107CmZvcmVhY2ggKCRkaXN0VXJscyBhcyAkaW5kZXggPT4gJHVybCkgewokcHJvY2Vzc2VkVXJsID0gJHRoaXMtPnByb2Nlc3NVcmwoJHBhY2thZ2UsICR1cmwpOwokdXJsc1skaW5kZXhdID0gWwonYmFzZScgPT4gJHVybCwKJ3Byb2Nlc3NlZCcgPT4gJHByb2Nlc3NlZFVybCwKCgoKCidjYWNoZUtleScgPT4gJGNhY2hlS2V5R2VuZXJhdG9yKCRwYWNrYWdlLCAkcHJvY2Vzc2VkVXJsKSwKXTsKfQphc3NlcnQoY291bnQoJHVybHMpID4gMCk7CgokZmlsZU5hbWUgPSAkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkcGF0aCk7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkZmlsZU5hbWUpKTsKCiRpbyA9ICR0aGlzLT5pbzsKJGNhY2hlID0gJHRoaXMtPmNhY2hlOwokaHR0cERvd25sb2FkZXIgPSAkdGhpcy0+aHR0cERvd25sb2FkZXI7CiRldmVudERpc3BhdGNoZXIgPSAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyOwokZmlsZXN5c3RlbSA9ICR0aGlzLT5maWxlc3lzdGVtOwoKJGFjY2VwdCA9IG51bGw7CiRyZWplY3QgPSBudWxsOwokZG93bmxvYWQgPSBmdW5jdGlvbiAoKSB1c2UgKCRpbywgJG91dHB1dCwgJGh0dHBEb3dubG9hZGVyLCAkY2FjaGUsICRjYWNoZUtleUdlbmVyYXRvciwgJGV2ZW50RGlzcGF0Y2hlciwgJHBhY2thZ2UsICRmaWxlTmFtZSwgJiR1cmxzLCAmJGFjY2VwdCwgJiRyZWplY3QpIHsKJHVybCA9IHJlc2V0KCR1cmxzKTsKJGluZGV4ID0ga2V5KCR1cmxzKTsKCmlmICgkZXZlbnREaXNwYXRjaGVyKSB7CiRwcmVGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQcmVGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBSRV9GSUxFX0RPV05MT0FELCAkaHR0cERvd25sb2FkZXIsICR1cmxbJ3Byb2Nlc3NlZCddLCAncGFja2FnZScsICRwYWNrYWdlKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwcmVGaWxlRG93bmxvYWRFdmVudCk7CmlmICgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldEN1c3RvbUNhY2hlS2V5KCkgIT09IG51bGwpIHsKJHVybFsnY2FjaGVLZXknXSA9ICRjYWNoZUtleUdlbmVyYXRvcigkcGFja2FnZSwgJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRDdXN0b21DYWNoZUtleSgpKTsKfSBlbHNlaWYgKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCkgIT09ICR1cmxbJ3Byb2Nlc3NlZCddKSB7CiR1cmxbJ2NhY2hlS2V5J10gPSAkY2FjaGVLZXlHZW5lcmF0b3IoJHBhY2thZ2UsICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCkpOwp9CiR1cmxbJ3Byb2Nlc3NlZCddID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRQcm9jZXNzZWRVcmwoKTsKfQoKJHVybHNbJGluZGV4XSA9ICR1cmw7CgokY2hlY2tzdW0gPSAkcGFja2FnZS0+Z2V0RGlzdFNoYTFDaGVja3N1bSgpOwokY2FjaGVLZXkgPSAkdXJsWydjYWNoZUtleSddOwoKCmlmICgkY2FjaGUgJiYgKCEkY2hlY2tzdW0gfHwgJGNoZWNrc3VtID09PSAkY2FjaGUtPnNoYTEoJGNhY2hlS2V5KSkgJiYgJGNhY2hlLT5jb3B5VG8oJGNhY2hlS2V5LCAkZmlsZU5hbWUpKSB7CmlmICgkb3V0cHV0KSB7CiRpby0+d3JpdGVFcnJvcigiICAtIExvYWRpbmcgPGluZm8+IiAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAiPC9pbmZvPiAoPGNvbW1lbnQ+IiAuICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpIC4gIjwvY29tbWVudD4pIGZyb20gY2FjaGUiLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKfQoKCgppZiAoISRjYWNoZS0+aXNSZWFkT25seSgpKSB7CiR0aGlzLT5sYXN0Q2FjaGVXcml0ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkY2FjaGVLZXk7Cn0KJHJlc3VsdCA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUoJGZpbGVOYW1lKTsKfSBlbHNlIHsKaWYgKCRvdXRwdXQpIHsKJGlvLT53cml0ZUVycm9yKCIgIC0gRG93bmxvYWRpbmcgPGluZm8+IiAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAiPC9pbmZvPiAoPGNvbW1lbnQ+IiAuICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpIC4gIjwvY29tbWVudD4pIik7Cn0KCiRyZXN1bHQgPSAkaHR0cERvd25sb2FkZXItPmFkZENvcHkoJHVybFsncHJvY2Vzc2VkJ10sICRmaWxlTmFtZSwgJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKSkKLT50aGVuKCRhY2NlcHQsICRyZWplY3QpOwp9CgpyZXR1cm4gJHJlc3VsdC0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCRyZXN1bHQpIHVzZSAoJGZpbGVOYW1lLCAkY2hlY2tzdW0sICR1cmwsICRwYWNrYWdlLCAkZXZlbnREaXNwYXRjaGVyKTogc3RyaW5nIHsKCgoKaWYgKG51bGwgPT09ICRyZXN1bHQpIHsKcmV0dXJuICRmaWxlTmFtZTsKfQoKaWYgKCFmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCR1cmxbJ2Jhc2UnXS4nIGNvdWxkIG5vdCBiZSBzYXZlZCB0byAnLiRmaWxlTmFtZS4nLCBtYWtlIHN1cmUgdGhlJwouJyBkaXJlY3RvcnkgaXMgd3JpdGFibGUgYW5kIHlvdSBoYXZlIGludGVybmV0IGNvbm5lY3Rpdml0eScpOwp9CgppZiAoJGNoZWNrc3VtICYmIGhhc2hfZmlsZSgnc2hhMScsICRmaWxlTmFtZSkgIT09ICRjaGVja3N1bSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVGhlIGNoZWNrc3VtIHZlcmlmaWNhdGlvbiBvZiB0aGUgZmlsZSBmYWlsZWQgKGRvd25sb2FkZWQgZnJvbSAnLiR1cmxbJ2Jhc2UnXS4nKScpOwp9CgppZiAoJGV2ZW50RGlzcGF0Y2hlcikgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgJGZpbGVOYW1lLCAkY2hlY2tzdW0sICR1cmxbJ3Byb2Nlc3NlZCddLCAncGFja2FnZScsICRwYWNrYWdlKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHBvc3RGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcG9zdEZpbGVEb3dubG9hZEV2ZW50KTsKfQoKcmV0dXJuICRmaWxlTmFtZTsKfSk7Cn07CgokYWNjZXB0ID0gZnVuY3Rpb24gKCRyZXNwb25zZSkgdXNlICgkY2FjaGUsICRwYWNrYWdlLCAkZmlsZU5hbWUsICYkdXJscyk6IHN0cmluZyB7CiR1cmwgPSByZXNldCgkdXJscyk7CiRjYWNoZUtleSA9ICR1cmxbJ2NhY2hlS2V5J107CkZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IEBmaWxlc2l6ZSgkZmlsZU5hbWUpID86ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcpID86ICc/JzsKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICE9PSBmYWxzZSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpID09PSBmYWxzZSkgewpGaWxlRG93bmxvYWRlcjo6JHJlc3BvbnNlSGVhZGVyc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVycygpOwp9CgppZiAoJGNhY2hlICYmICEkY2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGNhY2hlS2V5OwokY2FjaGUtPmNvcHlGcm9tKCRjYWNoZUtleSwgJGZpbGVOYW1lKTsKfQoKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CgpyZXR1cm4gJGZpbGVOYW1lOwp9OwoKJHJlamVjdCA9IGZ1bmN0aW9uICgkZSkgdXNlICgkaW8sICYkdXJscywgJGRvd25sb2FkLCAkZmlsZU5hbWUsICRwYWNrYWdlLCAmJHJldHJpZXMsICRmaWxlc3lzdGVtKSB7CgppZiAoZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkgewokZmlsZXN5c3RlbS0+dW5saW5rKCRmaWxlTmFtZSk7Cn0KJHRoaXMtPmNsZWFyTGFzdENhY2hlV3JpdGUoJHBhY2thZ2UpOwoKaWYgKCRlIGluc3RhbmNlb2YgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKCmlmICgoMCAhPT0gJGUtPmdldENvZGUoKSAmJiAhaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzUwMCwgNTAyLCA1MDMsIDUwNF0pKSB8fCAhJHJldHJpZXMpIHsKJHJldHJpZXMgPSAwOwp9Cn0KCgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDk5KSB7CiRyZXRyaWVzID0gMDsKJHVybHMgPSBbXTsKfQoKaWYgKCRyZXRyaWVzKSB7CnVzbGVlcCg1MDAwMDApOwokcmV0cmllcy0tOwoKcmV0dXJuICRkb3dubG9hZCgpOwp9CgphcnJheV9zaGlmdCgkdXJscyk7CmlmICgkdXJscykgewppZiAoJGlvLT5pc0RlYnVnKCkpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkIGRvd25sb2FkaW5nICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldENvZGUoKS4nOiAnLiRlLT5nZXRNZXNzYWdlKCkpOwokaW8tPndyaXRlRXJyb3IoJyAgICBUcnlpbmcgdGhlIG5leHQgVVJMIGZvciAnLiRwYWNrYWdlLT5nZXROYW1lKCkpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJyAgICBGYWlsZWQgZG93bmxvYWRpbmcgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLicsIHRyeWluZyB0aGUgbmV4dCBVUkwgKCcuJGUtPmdldENvZGUoKS4nOiAnLiRlLT5nZXRNZXNzYWdlKCkuJyknKTsKfQoKJHJldHJpZXMgPSAzOwp1c2xlZXAoMTAwMDAwKTsKCnJldHVybiAkZG93bmxvYWQoKTsKfQoKdGhyb3cgJGU7Cn07CgpyZXR1cm4gJGRvd25sb2FkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewokZmlsZU5hbWUgPSAkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKTsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlTmFtZSkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZU5hbWUpOwp9CgokZGlyc1RvQ2xlYW5VcCA9IFsKJHBhdGgsCiR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpLicvJy5leHBsb2RlKCcvJywgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSlbMF0sCiR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpLicvY29tcG9zZXIvJywKJHRoaXMtPmNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyksCl07CgppZiAoaXNzZXQoJHRoaXMtPmFkZGl0aW9uYWxDbGVhbnVwUGF0aHNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldIGFzICRwYXRoKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmUoJHBhdGgpOwp9Cn0KCmZvcmVhY2ggKCRkaXJzVG9DbGVhblVwIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkZGlyKSAmJiByZWFscGF0aCgkZGlyKSAhPT0gUGxhdGZvcm06OmdldEN3ZCgpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcik7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7Cn0KCiR0aGlzLT5maWxlc3lzdGVtLT5lbXB0eURpcmVjdG9yeSgkcGF0aCk7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHBhdGgpOwokdGhpcy0+ZmlsZXN5c3RlbS0+cmVuYW1lKCR0aGlzLT5nZXRGaWxlTmFtZSgkcGFja2FnZSwgJHBhdGgpLCAkcGF0aCAuICcvJyAuICR0aGlzLT5nZXREaXN0UGF0aCgkcGFja2FnZSwgUEFUSElORk9fQkFTRU5BTUUpKTsKCmlmICgkcGFja2FnZS0+Z2V0QmluYXJpZXMoKSkgewoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRCaW5hcmllcygpIGFzICRiaW4pIHsKaWYgKGZpbGVfZXhpc3RzKCRwYXRoIC4gJy8nIC4gJGJpbikgJiYgIWlzX2V4ZWN1dGFibGUoJHBhdGggLiAnLycgLiAkYmluKSkgewpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkcGF0aCAuICcvJyAuICRiaW4sIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERpc3RQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGludCAkY29tcG9uZW50KTogc3RyaW5nCnsKcmV0dXJuIHBhdGhpbmZvKChzdHJpbmcpIHBhcnNlX3VybChzdHJ0cigoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpLCAnXFwnLCAnLycpLCBQSFBfVVJMX1BBVEgpLCAkY29tcG9uZW50KTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFyTGFzdENhY2hlV3JpdGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoJHRoaXMtPmNhY2hlICYmIGlzc2V0KCR0aGlzLT5sYXN0Q2FjaGVXcml0ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiR0aGlzLT5jYWNoZS0+cmVtb3ZlKCR0aGlzLT5sYXN0Q2FjaGVXcml0ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp1bnNldCgkdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkQ2xlYW51cFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSAkcGF0aDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZUNsZWFudXBQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHZvaWQKewppZiAoaXNzZXQoJHRoaXMtPmFkZGl0aW9uYWxDbGVhbnVwUGF0aHNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRpZHggPSBhcnJheV9zZWFyY2goJHBhdGgsICR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKaWYgKGZhbHNlICE9PSAkaWR4KSB7CnVuc2V0KCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldWyRpZHhdKTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVwZGF0ZU9wZXJhdGlvbjo6Zm9ybWF0KCRpbml0aWFsLCAkdGFyZ2V0KSAuICR0aGlzLT5nZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoJHRhcmdldCwgJHBhdGgpKTsKCiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZSgkaW5pdGlhbCwgJHBhdGgsIGZhbHNlKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR0YXJnZXQsICRwYXRoKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiAkdGhpcy0+aW5zdGFsbCgkdGFyZ2V0LCAkcGF0aCwgZmFsc2UpOwp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVuaW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7Cn0KJHByb21pc2UgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5QXN5bmMoJHBhdGgpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoJHJlc3VsdCkgdXNlICgkcGF0aCk6IHZvaWQgewppZiAoISRyZXN1bHQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY29tcGxldGVseSBkZWxldGUgJy4kcGF0aC4nLCBhYm9ydGluZy4nKTsKfQp9KTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRGaWxlTmFtZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokZXh0ZW5zaW9uID0gJHRoaXMtPmdldERpc3RQYXRoKCRwYWNrYWdlLCBQQVRISU5GT19FWFRFTlNJT04pOwppZiAoJGV4dGVuc2lvbiA9PT0gJycpIHsKJGV4dGVuc2lvbiA9ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwp9CgpyZXR1cm4gcnRyaW0oJHRoaXMtPmNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykgLiAnL2NvbXBvc2VyL3RtcC0nIC4gbWQ1KCRwYWNrYWdlIC4gc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKSkgLiAnLicgLiAkZXh0ZW5zaW9uLCAnLicpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiAnJzsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc1VybChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHVybCk6IHN0cmluZwp7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIDAgPT09IHN0cnBvcygkdXJsLCAnaHR0cHM6JykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIGRvd25sb2FkIGZpbGVzIHZpYSBodHRwcycpOwp9CgppZiAoJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSkgewokdXJsID0gVXJsVXRpbDo6dXBkYXRlRGlzdFJlZmVyZW5jZSgkdGhpcy0+Y29uZmlnLCAkdXJsLCAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpKTsKfQoKcmV0dXJuICR1cmw7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcHJldklPID0gJHRoaXMtPmlvOwoKJHRoaXMtPmlvID0gbmV3IE51bGxJTzsKJHRoaXMtPmlvLT5sb2FkQ29uZmlndXJhdGlvbigkdGhpcy0+Y29uZmlnKTsKJGUgPSBudWxsOwokb3V0cHV0ID0gJyc7CgokdGFyZ2V0RGlyID0gRmlsZXN5c3RlbTo6dHJpbVRyYWlsaW5nU2xhc2goJHBhdGgpOwp0cnkgewppZiAoaXNfZGlyKCR0YXJnZXREaXIuJ19jb21wYXJlJykpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkdGFyZ2V0RGlyLidfY29tcGFyZScpOwp9CgokdGhpcy0+ZG93bmxvYWQoJHBhY2thZ2UsICR0YXJnZXREaXIuJ19jb21wYXJlJywgbnVsbCwgZmFsc2UpOwokdGhpcy0+aHR0cERvd25sb2FkZXItPndhaXQoKTsKJHRoaXMtPmluc3RhbGwoJHBhY2thZ2UsICR0YXJnZXREaXIuJ19jb21wYXJlJywgZmFsc2UpOwokdGhpcy0+cHJvY2Vzcy0+d2FpdCgpOwoKJGNvbXBhcmVyID0gbmV3IENvbXBhcmVyKCk7CiRjb21wYXJlci0+c2V0U291cmNlKCR0YXJnZXREaXIuJ19jb21wYXJlJyk7CiRjb21wYXJlci0+c2V0VXBkYXRlKCR0YXJnZXREaXIpOwokY29tcGFyZXItPmRvQ29tcGFyZSgpOwokb3V0cHV0ID0gJGNvbXBhcmVyLT5nZXRDaGFuZ2VkQXNTdHJpbmcodHJ1ZSk7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHRhcmdldERpci4nX2NvbXBhcmUnKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgokdGhpcy0+aW8gPSAkcHJldklPOwoKaWYgKCRlKSB7CnRocm93ICRlOwp9Cgokb3V0cHV0ID0gdHJpbSgkb3V0cHV0KTsKCnJldHVybiBzdHJsZW4oJG91dHB1dCkgPiAwID8gJG91dHB1dCA6IG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCgoKCgoKY2xhc3MgRmlsZXN5c3RlbUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlID0gJycsIGludCAkY29kZSA9IDAsID9cRXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgiRmlsZXN5c3RlbSBleGNlcHRpb246IFxuIi4kbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCmNsYXNzIEZvc3NpbERvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CgokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR1cmwsICR0aGlzLT5pbyk7CgokdXJsID0gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHVybCk7CiRyZWYgPSBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpOwokcmVwb0ZpbGUgPSAkcGF0aCAuICcuZm9zc2lsJzsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJDbG9uaW5nICIuJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKTsKJGNvbW1hbmQgPSBzcHJpbnRmKCdmb3NzaWwgY2xvbmUgLS0gJXMgJXMnLCAkdXJsLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcmVwb0ZpbGUpKTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KJGNvbW1hbmQgPSBzcHJpbnRmKCdmb3NzaWwgb3BlbiAtLW5lc3RlZCAtLSAlcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRyZXBvRmlsZSkpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCByZWFscGF0aCgkcGF0aCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CiRjb21tYW5kID0gc3ByaW50ZignZm9zc2lsIHVwZGF0ZSAtLSAlcycsICRyZWYpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCByZWFscGF0aCgkcGF0aCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKJHJlZiA9IFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgVXBkYXRpbmcgdG8gIi4kdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CgppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5mc2xja291dCBmaWxlIGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokY29tbWFuZCA9IHNwcmludGYoJ2Zvc3NpbCBwdWxsICYmIGZvc3NpbCB1cCAlcycsICRyZWYpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCByZWFscGF0aCgkcGF0aCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2Zvc3NpbCBjaGFuZ2VzJywgJG91dHB1dCwgcmVhbHBhdGgoJHBhdGgpKTsKCiRvdXRwdXQgPSB0cmltKCRvdXRwdXQpOwoKcmV0dXJuIHN0cmxlbigkb3V0cHV0KSA+IDAgPyAkb3V0cHV0IDogbnVsbDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokY29tbWFuZCA9IHNwcmludGYoJ2Zvc3NpbCB0aW1lbGluZSAtdCBjaSAtVyAwIC1uIDAgYmVmb3JlICVzJywgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHRvUmVmZXJlbmNlKSk7CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCiRsb2cgPSAnJzsKJG1hdGNoID0gJy9cZFxkOlxkXGQ6XGRcZFxzK1xbJyAuICR0b1JlZmVyZW5jZSAuICdcXS8nOwoKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGxpbmUpIHsKaWYgKFByZWc6OmlzTWF0Y2goJG1hdGNoLCAkbGluZSkpIHsKYnJlYWs7Cn0KJGxvZyAuPSAkbGluZTsKfQoKcmV0dXJuICRsb2c7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiBpc19maWxlKCRwYXRoIC4gJy8uZnNsY2tvdXQnKSB8fCBpc19maWxlKCRwYXRoIC4gJy9fRk9TU0lMXycpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXEdpdCBhcyBHaXRVdGlsOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCmNsYXNzIEdpdERvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyIGltcGxlbWVudHMgRHZjc0Rvd25sb2FkZXJJbnRlcmZhY2UKewoKCgoKcHJpdmF0ZSAkaGFzU3Rhc2hlZENoYW5nZXMgPSBbXTsKCgoKCnByaXZhdGUgJGhhc0Rpc2NhcmRlZENoYW5nZXMgPSBbXTsKCgoKcHJpdmF0ZSAkZ2l0VXRpbDsKCgoKCnByaXZhdGUgJGNhY2hlZFBhY2thZ2VzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9GaWxlc3lzdGVtICRmcyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpOwokdGhpcy0+Z2l0VXRpbCA9IG5ldyBHaXRVdGlsKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5maWxlc3lzdGVtKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewoKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR1cmwpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpHaXRVdGlsOjpjbGVhbkVudigpOwoKJGNhY2hlUGF0aCA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCAkdXJsKS4nLyc7CiRnaXRWZXJzaW9uID0gR2l0VXRpbDo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2Vzcyk7CgoKaWYgKCRnaXRWZXJzaW9uICYmIHZlcnNpb25fY29tcGFyZSgkZ2l0VmVyc2lvbiwgJzIuMy4wLXJjMCcsICc+PScpICYmIENhY2hlOjppc1VzYWJsZSgkY2FjaGVQYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSBTeW5jaW5nIDxpbmZvPiIgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gIjwvaW5mbz4gKDxjb21tZW50PiIgLiAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSAuICI8L2NvbW1lbnQ+KSBpbnRvIGNhY2hlIik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCcgICAgQ2xvbmluZyB0byBjYWNoZSBhdCAlcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRjYWNoZVBhdGgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKaWYgKCR0aGlzLT5naXRVdGlsLT5mZXRjaFJlZk9yU3luY01pcnJvcigkdXJsLCAkY2FjaGVQYXRoLCAkcmVmLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKSAmJiBpc19kaXIoJGNhY2hlUGF0aCkpIHsKJHRoaXMtPmNhY2hlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRJZCgpXVskcmVmXSA9IHRydWU7Cn0KfSBlbHNlaWYgKG51bGwgPT09ICRnaXRWZXJzaW9uKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignZ2l0IHdhcyBub3QgZm91bmQgaW4geW91ciBQQVRILCBza2lwcGluZyBzb3VyY2UgZG93bmxvYWQnKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpHaXRVdGlsOjpjbGVhbkVudigpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKJGNhY2hlUGF0aCA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCAkdXJsKS4nLyc7CiRyZWYgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CiRmbGFnID0gUGxhdGZvcm06OmlzV2luZG93cygpID8gJy9EICcgOiAnJzsKCmlmICghZW1wdHkoJHRoaXMtPmNhY2hlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRJZCgpXVskcmVmXSkpIHsKJG1zZyA9ICJDbG9uaW5nICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKS4nIGZyb20gY2FjaGUnOwoKJGNsb25lRmxhZ3MgPSAnLS1kaXNzb2NpYXRlIC0tcmVmZXJlbmNlICVjYWNoZVBhdGglICc7CiR0cmFuc3BvcnRPcHRpb25zID0gJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKaWYgKGlzc2V0KCR0cmFuc3BvcnRPcHRpb25zWydnaXQnXVsnc2luZ2xlX3VzZV9jbG9uZSddKSAmJiAkdHJhbnNwb3J0T3B0aW9uc1snZ2l0J11bJ3NpbmdsZV91c2VfY2xvbmUnXSkgewokY2xvbmVGbGFncyA9ICcnOwp9CgokY29tbWFuZCA9CidnaXQgY2xvbmUgLS1uby1jaGVja291dCAlY2FjaGVQYXRoJSAlcGF0aCUgJyAuICRjbG9uZUZsYWdzCi4gJyYmIGNkICcuJGZsYWcuJyVwYXRoJSAnCi4gJyYmIGdpdCByZW1vdGUgc2V0LXVybCBvcmlnaW4gLS0gJXNhbml0aXplZFVybCUgJiYgZ2l0IHJlbW90ZSBhZGQgY29tcG9zZXIgLS0gJXNhbml0aXplZFVybCUnOwp9IGVsc2UgewokbXNnID0gIkNsb25pbmcgIi4kdGhpcy0+Z2V0U2hvcnRIYXNoKCRyZWYpOwokY29tbWFuZCA9ICdnaXQgY2xvbmUgLS1uby1jaGVja291dCAtLSAldXJsJSAlcGF0aCUgJiYgY2QgJy4kZmxhZy4nJXBhdGglICYmIGdpdCByZW1vdGUgYWRkIGNvbXBvc2VyIC0tICV1cmwlICYmIGdpdCBmZXRjaCBjb21wb3NlciAmJiBnaXQgcmVtb3RlIHNldC11cmwgb3JpZ2luIC0tICVzYW5pdGl6ZWRVcmwlICYmIGdpdCByZW1vdGUgc2V0LXVybCBjb21wb3NlciAtLSAlc2FuaXRpemVkVXJsJSc7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSByZXF1aXJlZCBnaXQgcmVmZXJlbmNlIGZvciAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJyBpcyBub3QgaW4gY2FjaGUgYW5kIG5ldHdvcmsgaXMgZGlzYWJsZWQsIGFib3J0aW5nJyk7Cn0KfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtc2cpOwoKJGNvbW1hbmRDYWxsYWJsZSA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICR1cmwpIHVzZSAoJHBhdGgsICRjb21tYW5kLCAkY2FjaGVQYXRoKTogc3RyaW5nIHsKcmV0dXJuIHN0cl9yZXBsYWNlKApbJyV1cmwlJywgJyVwYXRoJScsICclY2FjaGVQYXRoJScsICclc2FuaXRpemVkVXJsJSddLApbClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR1cmwpLApQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGF0aCksClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRjYWNoZVBhdGgpLApQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShQcmVnOjpyZXBsYWNlKCd7Oi8vKFteQF0rPyk6KC4rPylAfScsICc6Ly8nLCAkdXJsKSksCl0sCiRjb21tYW5kCik7Cn07CgokdGhpcy0+Z2l0VXRpbC0+cnVuQ29tbWFuZCgkY29tbWFuZENhbGxhYmxlLCAkdXJsLCAkcGF0aCwgdHJ1ZSk7CiRzb3VyY2VVcmwgPSAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCk7CmlmICgkdXJsICE9PSAkc291cmNlVXJsICYmICRzb3VyY2VVcmwgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZU9yaWdpblVybCgkcGF0aCwgJHNvdXJjZVVybCk7Cn0gZWxzZSB7CiR0aGlzLT5zZXRQdXNoVXJsKCRwYXRoLCAkdXJsKTsKfQoKaWYgKCRuZXdSZWYgPSAkdGhpcy0+dXBkYXRlVG9Db21taXQoJHBhY2thZ2UsICRwYXRoLCAoc3RyaW5nKSAkcmVmLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKSkgewppZiAoJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSA9PT0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CiRwYWNrYWdlLT5zZXREaXN0UmVmZXJlbmNlKCRuZXdSZWYpOwp9CiRwYWNrYWdlLT5zZXRTb3VyY2VSZWZlcmVuY2UoJG5ld1JlZik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CkdpdFV0aWw6OmNsZWFuRW52KCk7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5naXQgZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokY2FjaGVQYXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykuJy8nLlByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsICR1cmwpLicvJzsKJHJlZiA9ICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwoKaWYgKCFlbXB0eSgkdGhpcy0+Y2FjaGVkUGFja2FnZXNbJHRhcmdldC0+Z2V0SWQoKV1bJHJlZl0pKSB7CiRtc2cgPSAiQ2hlY2tpbmcgb3V0ICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKS4nIGZyb20gY2FjaGUnOwokY29tbWFuZCA9ICcoZ2l0IHJldi1wYXJzZSAtLXF1aWV0IC0tdmVyaWZ5ICVyZWYlIHx8IChnaXQgcmVtb3RlIHNldC11cmwgY29tcG9zZXIgLS0gJWNhY2hlUGF0aCUgJiYgZ2l0IGZldGNoIGNvbXBvc2VyICYmIGdpdCBmZXRjaCAtLXRhZ3MgY29tcG9zZXIpKSAmJiBnaXQgcmVtb3RlIHNldC11cmwgY29tcG9zZXIgLS0gJXNhbml0aXplZFVybCUnOwp9IGVsc2UgewokbXNnID0gIkNoZWNraW5nIG91dCAiLiR0aGlzLT5nZXRTaG9ydEhhc2goJHJlZik7CiRjb21tYW5kID0gJyhnaXQgcmVtb3RlIHNldC11cmwgY29tcG9zZXIgLS0gJXVybCUgJiYgZ2l0IHJldi1wYXJzZSAtLXF1aWV0IC0tdmVyaWZ5ICVyZWYlIHx8IChnaXQgZmV0Y2ggY29tcG9zZXIgJiYgZ2l0IGZldGNoIC0tdGFncyBjb21wb3NlcikpICYmIGdpdCByZW1vdGUgc2V0LXVybCBjb21wb3NlciAtLSAlc2FuaXRpemVkVXJsJSc7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSByZXF1aXJlZCBnaXQgcmVmZXJlbmNlIGZvciAnLiR0YXJnZXQtPmdldE5hbWUoKS4nIGlzIG5vdCBpbiBjYWNoZSBhbmQgbmV0d29yayBpcyBkaXNhYmxlZCwgYWJvcnRpbmcnKTsKfQp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7CgokY29tbWFuZENhbGxhYmxlID0gc3RhdGljIGZ1bmN0aW9uICgkdXJsKSB1c2UgKCRyZWYsICRjb21tYW5kLCAkY2FjaGVQYXRoKTogc3RyaW5nIHsKcmV0dXJuIHN0cl9yZXBsYWNlKApbJyV1cmwlJywgJyVyZWYlJywgJyVjYWNoZVBhdGglJywgJyVzYW5pdGl6ZWRVcmwlJ10sClsKUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHVybCksClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRyZWYuJ157Y29tbWl0fScpLApQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkY2FjaGVQYXRoKSwKUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoUHJlZzo6cmVwbGFjZSgnezovLyhbXkBdKz8pOiguKz8pQH0nLCAnOi8vJywgJHVybCkpLApdLAokY29tbWFuZAopOwp9OwoKJHRoaXMtPmdpdFV0aWwtPnJ1bkNvbW1hbmQoJGNvbW1hbmRDYWxsYWJsZSwgJHVybCwgJHBhdGgpOwppZiAoJG5ld1JlZiA9ICR0aGlzLT51cGRhdGVUb0NvbW1pdCgkdGFyZ2V0LCAkcGF0aCwgKHN0cmluZykgJHJlZiwgJHRhcmdldC0+Z2V0UHJldHR5VmVyc2lvbigpKSkgewppZiAoJHRhcmdldC0+Z2V0RGlzdFJlZmVyZW5jZSgpID09PSAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkgewokdGFyZ2V0LT5zZXREaXN0UmVmZXJlbmNlKCRuZXdSZWYpOwp9CiR0YXJnZXQtPnNldFNvdXJjZVJlZmVyZW5jZSgkbmV3UmVmKTsKfQoKJHVwZGF0ZU9yaWdpblVybCA9IGZhbHNlOwppZiAoCjAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgcmVtb3RlIC12JywgJG91dHB1dCwgJHBhdGgpCiYmIFByZWc6OmlzTWF0Y2goJ3teb3JpZ2luXHMrKD9QPHVybD5cUyspfW0nLCAkb3V0cHV0LCAkb3JpZ2luTWF0Y2gpCiYmIFByZWc6OmlzTWF0Y2goJ3teY29tcG9zZXJccysoP1A8dXJsPlxTKyl9bScsICRvdXRwdXQsICRjb21wb3Nlck1hdGNoKQopIHsKaWYgKCRvcmlnaW5NYXRjaFsndXJsJ10gPT09ICRjb21wb3Nlck1hdGNoWyd1cmwnXSAmJiAkY29tcG9zZXJNYXRjaFsndXJsJ10gIT09ICR0YXJnZXQtPmdldFNvdXJjZVVybCgpKSB7CiR1cGRhdGVPcmlnaW5VcmwgPSB0cnVlOwp9Cn0KaWYgKCR1cGRhdGVPcmlnaW5VcmwgJiYgJHRhcmdldC0+Z2V0U291cmNlVXJsKCkgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZU9yaWdpblVybCgkcGF0aCwgJHRhcmdldC0+Z2V0U291cmNlVXJsKCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSAnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1ubyc7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cgokb3V0cHV0ID0gdHJpbSgkb3V0cHV0KTsKCnJldHVybiBzdHJsZW4oJG91dHB1dCkgPiAwID8gJG91dHB1dCA6IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVbnB1c2hlZENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CkdpdFV0aWw6OmNsZWFuRW52KCk7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgokY29tbWFuZCA9ICdnaXQgc2hvdy1yZWYgLS1oZWFkIC1kJzsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCiRyZWZzID0gdHJpbSgkb3V0cHV0KTsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihbYS1mMC05XSspIEhFQUQkfW1pJywgJHJlZnMsICRtYXRjaCkpIHsKCnJldHVybiBudWxsOwp9CgokaGVhZFJlZiA9ICRtYXRjaFsxXTsKaWYgKCFQcmVnOjppc01hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XicuJGhlYWRSZWYuJyByZWZzL2hlYWRzLyguKykkfW1pJywgJHJlZnMsICRtYXRjaGVzKSkgewoKcmV0dXJuIG51bGw7Cn0KCiRjYW5kaWRhdGVCcmFuY2hlcyA9ICRtYXRjaGVzWzFdOwoKJGJyYW5jaCA9ICRjYW5kaWRhdGVCcmFuY2hlc1swXTsKJHVucHVzaGVkQ2hhbmdlcyA9IG51bGw7CiRicmFuY2hOb3RGb3VuZEVycm9yID0gZmFsc2U7CgoKZm9yICgkaSA9IDA7ICRpIDw9IDE7ICRpKyspIHsKJHJlbW90ZUJyYW5jaGVzID0gW107CgoKZm9yZWFjaCAoJGNhbmRpZGF0ZUJyYW5jaGVzIGFzICRjYW5kaWRhdGUpIHsKaWYgKFByZWc6OmlzTWF0Y2hBbGxTdHJpY3RHcm91cHMoJ3teW2EtZjAtOV0rIHJlZnMvcmVtb3Rlcy8oKD86W14vXSspLycucHJlZ19xdW90ZSgkY2FuZGlkYXRlKS4nKSR9bWknLCAkcmVmcywgJG1hdGNoZXMpKSB7CmZvcmVhY2ggKCRtYXRjaGVzWzFdIGFzICRtYXRjaCkgewokYnJhbmNoID0gJGNhbmRpZGF0ZTsKJHJlbW90ZUJyYW5jaGVzW10gPSAkbWF0Y2g7Cn0KYnJlYWs7Cn0KfQoKCgoKaWYgKGNvdW50KCRyZW1vdGVCcmFuY2hlcykgPT09IDApIHsKJHVucHVzaGVkQ2hhbmdlcyA9ICdCcmFuY2ggJyAuICRicmFuY2ggLiAnIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiBhbnkgcmVtb3RlIGFuZCBhcHBlYXJzIHRvIGJlIHVucHVzaGVkJzsKJGJyYW5jaE5vdEZvdW5kRXJyb3IgPSB0cnVlOwp9IGVsc2UgewoKCmlmICgkYnJhbmNoTm90Rm91bmRFcnJvcikgewokdW5wdXNoZWRDaGFuZ2VzID0gbnVsbDsKfQpmb3JlYWNoICgkcmVtb3RlQnJhbmNoZXMgYXMgJHJlbW90ZUJyYW5jaCkgewokY29tbWFuZCA9IHNwcmludGYoJ2dpdCBkaWZmIC0tbmFtZS1zdGF0dXMgJXMuLi4lcyAtLScsICRyZW1vdGVCcmFuY2gsICRicmFuY2gpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiAkY29tbWFuZCAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgppZiAoJHVucHVzaGVkQ2hhbmdlcyA9PT0gbnVsbCB8fCBzdHJsZW4oJG91dHB1dCkgPCBzdHJsZW4oJHVucHVzaGVkQ2hhbmdlcykpIHsKJHVucHVzaGVkQ2hhbmdlcyA9ICRvdXRwdXQ7Cn0KfQp9CgoKCmlmICgkdW5wdXNoZWRDaGFuZ2VzICYmICRpID09PSAwKSB7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgZmV0Y2ggLS1hbGwnLCAkb3V0cHV0LCAkcGF0aCk7CgoKJGNvbW1hbmQgPSAnZ2l0IHNob3ctcmVmIC0taGVhZCAtZCc7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CiRyZWZzID0gdHJpbSgkb3V0cHV0KTsKfQoKCmlmICghJHVucHVzaGVkQ2hhbmdlcykgewpicmVhazsKfQp9CgpyZXR1cm4gJHVucHVzaGVkQ2hhbmdlczsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFuQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJHVwZGF0ZSk6IFByb21pc2VJbnRlcmZhY2UKewpHaXRVdGlsOjpjbGVhbkVudigpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKCiR1bnB1c2hlZCA9ICR0aGlzLT5nZXRVbnB1c2hlZENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKTsKaWYgKCR1bnB1c2hlZCAmJiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKSAhPT0gdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTb3VyY2UgZGlyZWN0b3J5ICcgLiAkcGF0aCAuICcgaGFzIHVucHVzaGVkIGNoYW5nZXMgb24gdGhlIGN1cnJlbnQgYnJhbmNoOiAnLiJcbiIuJHVucHVzaGVkKTsKfQoKaWYgKG51bGwgPT09ICgkY2hhbmdlcyA9ICR0aGlzLT5nZXRMb2NhbENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKSkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGRpc2NhcmRDaGFuZ2VzID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKTsKaWYgKHRydWUgPT09ICRkaXNjYXJkQ2hhbmdlcykgewpyZXR1cm4gJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKfQppZiAoJ3N0YXNoJyA9PT0gJGRpc2NhcmRDaGFuZ2VzKSB7CmlmICghJHVwZGF0ZSkgewpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKcmV0dXJuICR0aGlzLT5zdGFzaENoYW5nZXMoJHBhdGgpOwp9CgpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKJGNoYW5nZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZWxlbSk6IHN0cmluZyB7CnJldHVybiAnICAgICcuJGVsZW07Cn0sIFByZWc6OnNwbGl0KCd7XHMqXHI/XG5ccyp9JywgJGNoYW5nZXMpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGVycm9yPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGhhcyBtb2RpZmllZCBmaWxlczo8L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoYXJyYXlfc2xpY2UoJGNoYW5nZXMsIDAsIDEwKSk7CmlmIChjb3VudCgkY2hhbmdlcykgPiAxMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8aW5mbz4nIC4gKGNvdW50KCRjaGFuZ2VzKSAtIDEwKSAuICcgbW9yZSBmaWxlcyBtb2RpZmllZCwgY2hvb3NlICJ2IiB0byB2aWV3IHRoZSBmdWxsIGxpc3Q8L2luZm8+Jyk7Cn0KCndoaWxlICh0cnVlKSB7CnN3aXRjaCAoJHRoaXMtPmlvLT5hc2soJyAgICA8aW5mbz5EaXNjYXJkIGNoYW5nZXMgW3ksbix2LGQsJy4oJHVwZGF0ZSA/ICdzLCcgOiAnJykuJz9dPzwvaW5mbz4gJywgJz8nKSkgewpjYXNlICd5JzoKJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ3MnOgppZiAoISR1cGRhdGUpIHsKZ290byBoZWxwOwp9CgokdGhpcy0+c3Rhc2hDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ24nOgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VwZGF0ZSBhYm9ydGVkJyk7CgpjYXNlICd2JzoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRjaGFuZ2VzKTsKYnJlYWs7CgpjYXNlICdkJzoKJHRoaXMtPnZpZXdEaWZmKCRwYXRoKTsKYnJlYWs7CgpjYXNlICc/JzoKZGVmYXVsdDoKaGVscCA6CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicgICAgeSAtIGRpc2NhcmQgY2hhbmdlcyBhbmQgYXBwbHkgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKSwKJyAgICBuIC0gYWJvcnQgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKS4nIGFuZCBsZXQgeW91IG1hbnVhbGx5IGNsZWFuIHRoaW5ncyB1cCcsCicgICAgdiAtIHZpZXcgbW9kaWZpZWQgZmlsZXMnLAonICAgIGQgLSB2aWV3IGxvY2FsIG1vZGlmaWNhdGlvbnMgKGRpZmYpJywKXSk7CmlmICgkdXBkYXRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIHMgLSBzdGFzaCBjaGFuZ2VzIGFuZCB0cnkgdG8gcmVhcHBseSB0aGVtIGFmdGVyIHRoZSB1cGRhdGUnKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA/IC0gcHJpbnQgaGVscCcpOwpicmVhazsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlYXBwbHlDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IHZvaWQKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKCFlbXB0eSgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKSkgewp1bnNldCgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGluZm8+UmUtYXBwbHlpbmcgc3Rhc2hlZCBjaGFuZ2VzPC9pbmZvPicpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBzdGFzaCBwb3AnLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gYXBwbHkgc3Rhc2hlZCBjaGFuZ2VzOlxuXG4iLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9Cgp1bnNldCgkdGhpcy0+aGFzRGlzY2FyZGVkQ2hhbmdlc1skcGF0aF0pOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlVG9Db21taXQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHJlZmVyZW5jZSwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKTogP3N0cmluZwp7CiRmb3JjZSA9ICFlbXB0eSgkdGhpcy0+aGFzRGlzY2FyZGVkQ2hhbmdlc1skcGF0aF0pIHx8ICFlbXB0eSgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKSA/ICctZiAnIDogJyc7CgoKCgoKCiR0ZW1wbGF0ZSA9ICdnaXQgY2hlY2tvdXQgJy4kZm9yY2UuJyVzIC0tICYmIGdpdCByZXNldCAtLWhhcmQgJTEkcyAtLSc7CiRicmFuY2ggPSBQcmVnOjpyZXBsYWNlKCd7KD86XmRldi18KD86XC54KT8tZGV2JCl9aScsICcnLCAkcHJldHR5VmVyc2lvbik7CgokYnJhbmNoZXMgPSBudWxsOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBicmFuY2ggLXInLCAkb3V0cHV0LCAkcGF0aCkpIHsKJGJyYW5jaGVzID0gJG91dHB1dDsKfQoKCiRnaXRSZWYgPSAkcmVmZXJlbmNlOwppZiAoIVByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkcmVmZXJlbmNlKQomJiBudWxsICE9PSAkYnJhbmNoZXMKJiYgUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci8nLnByZWdfcXVvdGUoJHJlZmVyZW5jZSkuJyR9bScsICRicmFuY2hlcykKKSB7CiRjb21tYW5kID0gc3ByaW50ZignZ2l0IGNoZWNrb3V0ICcuJGZvcmNlLictQiAlcyAlcyAtLSAmJiBnaXQgcmVzZXQgLS1oYXJkICUyJHMgLS0nLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkYnJhbmNoKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJ2NvbXBvc2VyLycuJHJlZmVyZW5jZSkpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkcmVmZXJlbmNlKSkgewoKaWYgKG51bGwgIT09ICRicmFuY2hlcyAmJiAhUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci8nLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICRicmFuY2hlcykgJiYgUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci92Jy5wcmVnX3F1b3RlKCRicmFuY2gpLickfW0nLCAkYnJhbmNoZXMpKSB7CiRicmFuY2ggPSAndicgLiAkYnJhbmNoOwp9CgokY29tbWFuZCA9IHNwcmludGYoJ2dpdCBjaGVja291dCAlcyAtLScsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRicmFuY2gpKTsKJGZhbGxiYWNrQ29tbWFuZCA9IHNwcmludGYoJ2dpdCBjaGVja291dCAnLiRmb3JjZS4nLUIgJXMgJXMgLS0nLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkYnJhbmNoKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJ2NvbXBvc2VyLycuJGJyYW5jaCkpOwokcmVzZXRDb21tYW5kID0gc3ByaW50ZignZ2l0IHJlc2V0IC0taGFyZCAlcyAtLScsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRyZWZlcmVuY2UpKTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgiKCRjb21tYW5kIHx8ICRmYWxsYmFja0NvbW1hbmQpICYmICRyZXNldENvbW1hbmQiLCAkb3V0cHV0LCAkcGF0aCkpIHsKcmV0dXJuIG51bGw7Cn0KfQoKJGNvbW1hbmQgPSBzcHJpbnRmKCR0ZW1wbGF0ZSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGdpdFJlZikpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJGV4Y2VwdGlvbkV4dHJhID0gJyc7CgoKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICRyZWZlcmVuY2UpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPicuJHJlZmVyZW5jZS4nIGlzIGdvbmUgKGhpc3Rvcnkgd2FzIHJld3JpdHRlbj8pPC93YXJuaW5nPicpOwokZXhjZXB0aW9uRXh0cmEgPSAiXG5JdCBsb29rcyBsaWtlIHRoZSBjb21taXQgaGFzaCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5LCBtYXliZSAiLigkcGFja2FnZS0+aXNEZXYoKSA/ICd0aGUgY29tbWl0IHdhcyByZW1vdmVkIGZyb20gdGhlIGJyYW5jaCcgOiAndGhlIHRhZyB3YXMgcmVjcmVhdGVkJykuJz8gUnVuICJjb21wb3NlciB1cGRhdGUgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLiciIHRvIHJlc29sdmUgdGhpcy4nOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oVXJsOjpzYW5pdGl6ZSgnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkgLiAkZXhjZXB0aW9uRXh0cmEpKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZU9yaWdpblVybChzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKHNwcmludGYoJ2dpdCByZW1vdGUgc2V0LXVybCBvcmlnaW4gLS0gJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdXJsKSksICRvdXRwdXQsICRwYXRoKTsKJHRoaXMtPnNldFB1c2hVcmwoJHBhdGgsICR1cmwpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0UHVzaFVybChzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CgppZiAoUHJlZzo6aXNNYXRjaCgne14oPzpodHRwcz98Z2l0KTovLycuR2l0VXRpbDo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpLicvKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0KT8kfScsICR1cmwsICRtYXRjaCkpIHsKJHByb3RvY29scyA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0aHViLXByb3RvY29scycpOwokcHVzaFVybCA9ICdnaXRAJy4kbWF0Y2hbMV0uJzonLiRtYXRjaFsyXS4nLycuJG1hdGNoWzNdLicuZ2l0JzsKaWYgKCFpbl9hcnJheSgnc3NoJywgJHByb3RvY29scywgdHJ1ZSkpIHsKJHB1c2hVcmwgPSAnaHR0cHM6Ly8nIC4gJG1hdGNoWzFdIC4gJy8nLiRtYXRjaFsyXS4nLycuJG1hdGNoWzNdLicuZ2l0JzsKfQokY21kID0gc3ByaW50ZignZ2l0IHJlbW90ZSBzZXQtdXJsIC0tcHVzaCBvcmlnaW4gLS0gJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcHVzaFVybCkpOwokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY21kLCAkaWdub3JlZE91dHB1dCwgJHBhdGgpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21taXRMb2dzKHN0cmluZyAkZnJvbVJlZmVyZW5jZSwgc3RyaW5nICR0b1JlZmVyZW5jZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CiRjb21tYW5kID0gc3ByaW50ZignZ2l0IGxvZyAlcy4uJXMgLS1wcmV0dHk9Zm9ybWF0OiIlJWggLSAlJWFuOiAlJXMiJy5HaXRVdGlsOjpnZXROb1Nob3dTaWduYXR1cmVGbGFnKCR0aGlzLT5wcm9jZXNzKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGZyb21SZWZlcmVuY2UpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdG9SZWZlcmVuY2UpKTsKCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpyZXR1cm4gJG91dHB1dDsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXNjYXJkQ2hhbmdlcyhzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IGNsZWFuIC1kZiAmJiBnaXQgcmVzZXQgLS1oYXJkJywgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHJlc2V0IGNoYW5nZXNcblxuOiIuJG91dHB1dCk7Cn0KCiR0aGlzLT5oYXNEaXNjYXJkZWRDaGFuZ2VzWyRwYXRoXSA9IHRydWU7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzdGFzaENoYW5nZXMoc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBzdGFzaCAtLWluY2x1ZGUtdW50cmFja2VkJywgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHN0YXNoIGNoYW5nZXNcblxuOiIuJG91dHB1dCk7Cn0KCiR0aGlzLT5oYXNTdGFzaGVkQ2hhbmdlc1skcGF0aF0gPSB0cnVlOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2aWV3RGlmZihzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IGRpZmYgSEVBRCcsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCB2aWV3IGRpZmZcblxuOiIuJG91dHB1dCk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkb3V0cHV0KTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBzdHJsZW4oJHBhdGgpID4gMCkgewokYmFzZVBhdGggPSAkcGF0aDsKJHJlbW92ZWQgPSBbXTsKCndoaWxlICghaXNfZGlyKCRiYXNlUGF0aCkgJiYgJGJhc2VQYXRoICE9PSAnXFwnKSB7CmFycmF5X3Vuc2hpZnQoJHJlbW92ZWQsIGJhc2VuYW1lKCRiYXNlUGF0aCkpOwokYmFzZVBhdGggPSBkaXJuYW1lKCRiYXNlUGF0aCk7Cn0KCmlmICgkYmFzZVBhdGggPT09ICdcXCcpIHsKcmV0dXJuICRwYXRoOwp9CgokcGF0aCA9IHJ0cmltKHJlYWxwYXRoKCRiYXNlUGF0aCkgLiAnLycgLiBpbXBsb2RlKCcvJywgJHJlbW92ZWQpLCAnLycpOwp9CgpyZXR1cm4gJHBhdGg7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwoKcmV0dXJuIGlzX2RpcigkcGF0aC4nLy5naXQnKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNob3J0SGFzaChzdHJpbmcgJHJlZmVyZW5jZSk6IHN0cmluZwp7CmlmICghJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSAmJiBQcmVnOjppc01hdGNoKCd7XlswLTlhLWZdezQwfSR9JywgJHJlZmVyZW5jZSkpIHsKcmV0dXJuIHN1YnN0cigkcmVmZXJlbmNlLCAwLCAxMCk7Cn0KCnJldHVybiAkcmVmZXJlbmNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwoKCgoKCgpjbGFzcyBHemlwRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGZpbGVuYW1lID0gcGF0aGluZm8ocGFyc2VfdXJsKHN0cnRyKChzdHJpbmcpICRwYWNrYWdlLT5nZXREaXN0VXJsKCksICdcXCcsICcvJyksIFBIUF9VUkxfUEFUSCksIFBBVEhJTkZPX0ZJTEVOQU1FKTsKJHRhcmdldEZpbGVwYXRoID0gJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lOwoKCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRjb21tYW5kID0gJ2d6aXAgLWNkIC0tICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkZmlsZSkgLiAnID4gJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0YXJnZXRGaWxlcGF0aCk7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewoKJHRoaXMtPmV4dHJhY3RVc2luZ0V4dCgkZmlsZSwgJHRhcmdldEZpbGVwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokcHJvY2Vzc0Vycm9yID0gJ0ZhaWxlZCB0byBleGVjdXRlICcgLiAkY29tbWFuZCAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHByb2Nlc3NFcnJvcik7Cn0KCgokdGhpcy0+ZXh0cmFjdFVzaW5nRXh0KCRmaWxlLCAkdGFyZ2V0RmlsZXBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFVzaW5nRXh0KHN0cmluZyAkZmlsZSwgc3RyaW5nICR0YXJnZXRGaWxlcGF0aCk6IHZvaWQKewokYXJjaGl2ZUZpbGUgPSBnem9wZW4oJGZpbGUsICdyYicpOwokdGFyZ2V0RmlsZSA9IGZvcGVuKCR0YXJnZXRGaWxlcGF0aCwgJ3diJyk7CndoaWxlICgkc3RyaW5nID0gZ3pyZWFkKCRhcmNoaXZlRmlsZSwgNDA5NikpIHsKZndyaXRlKCR0YXJnZXRGaWxlLCAkc3RyaW5nLCBQbGF0Zm9ybTo6c3RybGVuKCRzdHJpbmcpKTsKfQpnemNsb3NlKCRhcmNoaXZlRmlsZSk7CmZjbG9zZSgkdGFyZ2V0RmlsZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSGcgYXMgSGdVdGlsczsKCgoKCmNsYXNzIEhnRG93bmxvYWRlciBleHRlbmRzIFZjc0Rvd25sb2FkZXIKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Eb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSBIZ1V0aWxzOjpnZXRWZXJzaW9uKCR0aGlzLT5wcm9jZXNzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ2hnIHdhcyBub3QgZm91bmQgaW4geW91ciBQQVRILCBza2lwcGluZyBzb3VyY2UgZG93bmxvYWQnKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewokaGdVdGlscyA9IG5ldyBIZ1V0aWxzKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwoKJGNsb25lQ29tbWFuZCA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICR1cmwpIHVzZSAoJHBhdGgpOiBzdHJpbmcgewpyZXR1cm4gc3ByaW50ZignaGcgY2xvbmUgLS0gJXMgJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdXJsKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBhdGgpKTsKfTsKCiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjbG9uZUNvbW1hbmQsICR1cmwsICRwYXRoKTsKCiRyZWYgPSBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpOwokY29tbWFuZCA9IHNwcmludGYoJ2hnIHVwIC0tICVzJywgJHJlZik7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CiRoZ1V0aWxzID0gbmV3IEhnVXRpbHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CgokcmVmID0gJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIFVwZGF0aW5nIHRvICIuJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpOwoKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAuaGcgZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokY29tbWFuZCA9IHN0YXRpYyBmdW5jdGlvbiAoJHVybCkgdXNlICgkcmVmKTogc3RyaW5nIHsKcmV0dXJuIHNwcmludGYoJ2hnIHB1bGwgLS0gJXMgJiYgaGcgdXAgLS0gJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdXJsKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHJlZikpOwp9OwoKJGhnVXRpbHMtPnJ1bkNvbW1hbmQoJGNvbW1hbmQsICR1cmwsICRwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewppZiAoIWlzX2RpcigkcGF0aC4nLy5oZycpKSB7CnJldHVybiBudWxsOwp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnaGcgc3QnLCAkb3V0cHV0LCByZWFscGF0aCgkcGF0aCkpOwoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRjb21tYW5kID0gc3ByaW50ZignaGcgbG9nIC1yICVzOiVzIC0tc3R5bGUgY29tcGFjdCcsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRmcm9tUmVmZXJlbmNlKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHRvUmVmZXJlbmNlKSk7CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiAkb3V0cHV0Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gaXNfZGlyKCRwYXRoIC4gJy8uaGcnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKY2xhc3MgTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbiBleHRlbmRzIFRyYW5zcG9ydEV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlclxBcmNoaXZhYmxlRmlsZXNGaW5kZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXElPRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxGaWxlc3lzdGVtIGFzIFN5bWZvbnlGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgoKCgpjbGFzcyBQYXRoRG93bmxvYWRlciBleHRlbmRzIEZpbGVEb3dubG9hZGVyIGltcGxlbWVudHMgVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UKewpwcml2YXRlIGNvbnN0IFNUUkFURUdZX1NZTUxJTksgPSAxMDsKcHJpdmF0ZSBjb25zdCBTVFJBVEVHWV9NSVJST1IgPSAyMDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSBGaWxlc3lzdGVtOjp0cmltVHJhaWxpbmdTbGFzaCgkcGF0aCk7CiR1cmwgPSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpOwokcmVhbFVybCA9IHJlYWxwYXRoKCR1cmwpOwppZiAoZmFsc2UgPT09ICRyZWFsVXJsIHx8ICFmaWxlX2V4aXN0cygkcmVhbFVybCkgfHwgIWlzX2RpcigkcmVhbFVybCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCidTb3VyY2UgcGF0aCAiJXMiIGlzIG5vdCBmb3VuZCBmb3IgcGFja2FnZSAlcycsCiR1cmwsCiRwYWNrYWdlLT5nZXROYW1lKCkKKSk7Cn0KCmlmIChyZWFscGF0aCgkcGF0aCkgPT09ICRyZWFsVXJsKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoc3RycG9zKHJlYWxwYXRoKCRwYXRoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IsICRyZWFsVXJsIC4gRElSRUNUT1JZX1NFUEFSQVRPUikgPT09IDApIHsKCgoKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAlcyBjYW5ub3QgaW5zdGFsbCB0byAiJXMiIGluc2lkZSBpdHMgc291cmNlIGF0ICIlcyInLAokcGFja2FnZS0+Z2V0TmFtZSgpLApyZWFscGF0aCgkcGF0aCksCiRyZWFsVXJsCikpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CiRwYXRoID0gRmlsZXN5c3RlbTo6dHJpbVRyYWlsaW5nU2xhc2goJHBhdGgpOwokdXJsID0gJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKJHJlYWxVcmwgPSByZWFscGF0aCgkdXJsKTsKCmlmIChyZWFscGF0aCgkcGF0aCkgPT09ICRyZWFsVXJsKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBJbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpIC4gJHRoaXMtPmdldEluc3RhbGxPcGVyYXRpb25BcHBlbmRpeCgkcGFja2FnZSwgJHBhdGgpKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgokdHJhbnNwb3J0T3B0aW9ucyA9ICRwYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCkgKyBbJ3JlbGF0aXZlJyA9PiB0cnVlXTsKClskY3VycmVudFN0cmF0ZWd5LCAkYWxsb3dlZFN0cmF0ZWdpZXNdID0gJHRoaXMtPmNvbXB1dGVBbGxvd2VkU3RyYXRlZ2llcygkdHJhbnNwb3J0T3B0aW9ucyk7Cgokc3ltZm9ueUZpbGVzeXN0ZW0gPSBuZXcgU3ltZm9ueUZpbGVzeXN0ZW0oKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkcGF0aCk7CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKS4nOiAnLCBmYWxzZSk7Cn0KCiRpc0ZhbGxiYWNrID0gZmFsc2U7CmlmIChzZWxmOjpTVFJBVEVHWV9TWU1MSU5LID09PSAkY3VycmVudFN0cmF0ZWd5KSB7CnRyeSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdKdW5jdGlvbmluZyBmcm9tICVzJywgJHVybCksIGZhbHNlKTsKfQokdGhpcy0+ZmlsZXN5c3RlbS0+anVuY3Rpb24oJHJlYWxVcmwsICRwYXRoKTsKfSBlbHNlIHsKJGFic29sdXRlUGF0aCA9ICRwYXRoOwppZiAoISR0aGlzLT5maWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkYWJzb2x1dGVQYXRoKSkgewokYWJzb2x1dGVQYXRoID0gUGxhdGZvcm06OmdldEN3ZCgpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRwYXRoOwp9CiRzaG9ydGVzdFBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkYWJzb2x1dGVQYXRoLCAkcmVhbFVybCk7CiRwYXRoID0gcnRyaW0oJHBhdGgsICIvIik7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdTeW1saW5raW5nIGZyb20gJXMnLCAkdXJsKSwgZmFsc2UpOwp9CmlmICgkdHJhbnNwb3J0T3B0aW9uc1sncmVsYXRpdmUnXSkgewokc3ltZm9ueUZpbGVzeXN0ZW0tPnN5bWxpbmsoJHNob3J0ZXN0UGF0aC4nLycsICRwYXRoKTsKfSBlbHNlIHsKJHN5bWZvbnlGaWxlc3lzdGVtLT5zeW1saW5rKCRyZWFsVXJsLicvJywgJHBhdGgpOwp9Cn0KfSBjYXRjaCAoSU9FeGNlcHRpb24gJGUpIHsKaWYgKGluX2FycmF5KHNlbGY6OlNUUkFURUdZX01JUlJPUiwgJGFsbG93ZWRTdHJhdGVnaWVzLCB0cnVlKSkgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8ZXJyb3I+U3ltbGluayBmYWlsZWQsIGZhbGxiYWNrIHRvIHVzZSBtaXJyb3JpbmchPC9lcnJvcj4nKTsKfQokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwokaXNGYWxsYmFjayA9IHRydWU7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdTeW1saW5rIGZyb20gIiVzIiB0byAiJXMiIGZhaWxlZCEnLCAkcmVhbFVybCwgJHBhdGgpKTsKfQp9Cn0KCgppZiAoc2VsZjo6U1RSQVRFR1lfTUlSUk9SID09PSAkY3VycmVudFN0cmF0ZWd5KSB7CiRyZWFsVXJsID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHJlYWxVcmwpOwoKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJyVzTWlycm9yaW5nIGZyb20gJXMnLCAkaXNGYWxsYmFjayA/ICcgICAgJyA6ICcnLCAkdXJsKSwgZmFsc2UpOwp9CiRpdGVyYXRvciA9IG5ldyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIoJHJlYWxVcmwsIFtdKTsKJHN5bWZvbnlGaWxlc3lzdGVtLT5taXJyb3IoJHJlYWxVcmwsICRwYXRoLCAkaXRlcmF0b3IpOwp9CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSBGaWxlc3lzdGVtOjp0cmltVHJhaWxpbmdTbGFzaCgkcGF0aCk7CgoKCgoKCgoKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJHRoaXMtPmZpbGVzeXN0ZW0tPmlzSnVuY3Rpb24oJHBhdGgpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuIiwgc291cmNlIGlzIHN0aWxsIHByZXNlbnQgaW4gJHBhdGgiKTsKfQppZiAoISR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVKdW5jdGlvbigkcGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgICAgPHdhcm5pbmc+Q291bGQgbm90IHJlbW92ZSBqdW5jdGlvbiBhdCAiIC4gJHBhdGggLiAiIC0gaXMgYW5vdGhlciBwcm9jZXNzIGxvY2tpbmcgaXQ/PC93YXJuaW5nPiIpOwp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWxpYWJseSByZW1vdmUganVuY3Rpb24gZm9yIHBhY2thZ2UgJyAuICRwYWNrYWdlLT5nZXROYW1lKCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCiRmcyA9IG5ldyBGaWxlc3lzdGVtOwokYWJzUGF0aCA9ICRmcy0+aXNBYnNvbHV0ZVBhdGgoJHBhdGgpID8gJHBhdGggOiBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiAnLycgLiAkcGF0aDsKJGFic0Rpc3RVcmwgPSAkZnMtPmlzQWJzb2x1dGVQYXRoKCRwYWNrYWdlLT5nZXREaXN0VXJsKCkpID8gJHBhY2thZ2UtPmdldERpc3RVcmwoKSA6IFBsYXRmb3JtOjpnZXRDd2QoKSAuICcvJyAuICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmICgkZnMtPm5vcm1hbGl6ZVBhdGgoJGFic1BhdGgpID09PSAkZnMtPm5vcm1hbGl6ZVBhdGgoJGFic0Rpc3RVcmwpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuIiwgc291cmNlIGlzIHN0aWxsIHByZXNlbnQgaW4gJHBhdGgiKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiBwYXJlbnQ6OnJlbW92ZSgkcGFja2FnZSwgJHBhdGgsICRvdXRwdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmNzUmVmZXJlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHBhcnNlcik7CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXI7CgokcGFja2FnZUNvbmZpZyA9ICRkdW1wZXItPmR1bXAoJHBhY2thZ2UpOwppZiAoJHBhY2thZ2VWZXJzaW9uID0gJGd1ZXNzZXItPmd1ZXNzVmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHBhdGgpKSB7CnJldHVybiAkcGFja2FnZVZlcnNpb25bJ2NvbW1pdCddOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluc3RhbGxPcGVyYXRpb25BcHBlbmRpeChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokcmVhbFVybCA9IHJlYWxwYXRoKCRwYWNrYWdlLT5nZXREaXN0VXJsKCkpOwoKaWYgKHJlYWxwYXRoKCRwYXRoKSA9PT0gJHJlYWxVcmwpIHsKcmV0dXJuICc6IFNvdXJjZSBhbHJlYWR5IHByZXNlbnQnOwp9CgpbJGN1cnJlbnRTdHJhdGVneV0gPSAkdGhpcy0+Y29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKCRwYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCkpOwoKaWYgKCRjdXJyZW50U3RyYXRlZ3kgPT09IHNlbGY6OlNUUkFURUdZX1NZTUxJTkspIHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gJzogSnVuY3Rpb25pbmcgZnJvbSAnLiRwYWNrYWdlLT5nZXREaXN0VXJsKCk7Cn0KCnJldHVybiAnOiBTeW1saW5raW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgpyZXR1cm4gJzogTWlycm9yaW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKGFycmF5ICR0cmFuc3BvcnRPcHRpb25zKTogYXJyYXkKewoKJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX1NZTUxJTks7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9TWU1MSU5LLCBzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwoKJG1pcnJvclBhdGhSZXBvcyA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX01JUlJPUl9QQVRIX1JFUE9TJyk7CmlmICgkbWlycm9yUGF0aFJlcG9zKSB7CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7Cn0KCiRzeW1saW5rT3B0aW9uID0gJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSA/PyBudWxsOwoKaWYgKHRydWUgPT09ICRzeW1saW5rT3B0aW9uKSB7CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LOwokYWxsb3dlZFN0cmF0ZWdpZXMgPSBbc2VsZjo6U1RSQVRFR1lfU1lNTElOS107Cn0gZWxzZWlmIChmYWxzZSA9PT0gJHN5bWxpbmtPcHRpb24pIHsKJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX01JUlJPUjsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX01JUlJPUl07Cn0KCgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIHNlbGY6OlNUUkFURUdZX1NZTUxJTksgPT09ICRjdXJyZW50U3RyYXRlZ3kgJiYgISR0aGlzLT5zYWZlSnVuY3Rpb25zKCkpIHsKaWYgKCFpbl9hcnJheShzZWxmOjpTVFJBVEVHWV9NSVJST1IsICRhbGxvd2VkU3RyYXRlZ2llcywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgYXJlIG9uIGFuIG9sZCBXaW5kb3dzIC8gb2xkIFBIUCBjb21ibyB3aGljaCBkb2VzIG5vdCBhbGxvdyBDb21wb3NlciB0byB1c2UganVuY3Rpb25zL3N5bWxpbmtzIGFuZCB0aGlzIHBhdGggcmVwb3NpdG9yeSBoYXMgc3ltbGluazp0cnVlIGluIGl0cyBvcHRpb25zIHNvIGNvcHlpbmcgaXMgbm90IGFsbG93ZWQnKTsKfQokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwokYWxsb3dlZFN0cmF0ZWdpZXMgPSBbc2VsZjo6U1RSQVRFR1lfTUlSUk9SXTsKfQoKCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpICYmIHNlbGY6OlNUUkFURUdZX1NZTUxJTksgPT09ICRjdXJyZW50U3RyYXRlZ3kgJiYgIWZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpKSB7CmlmICghaW5fYXJyYXkoc2VsZjo6U1RSQVRFR1lfTUlSUk9SLCAkYWxsb3dlZFN0cmF0ZWdpZXMsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91ciBQSFAgaGFzIHRoZSBzeW1saW5rKCkgZnVuY3Rpb24gZGlzYWJsZWQgd2hpY2ggZG9lcyBub3QgYWxsb3cgQ29tcG9zZXIgdG8gdXNlIHN5bWxpbmtzIGFuZCB0aGlzIHBhdGggcmVwb3NpdG9yeSBoYXMgc3ltbGluazp0cnVlIGluIGl0cyBvcHRpb25zIHNvIGNvcHlpbmcgaXMgbm90IGFsbG93ZWQnKTsKfQokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwokYWxsb3dlZFN0cmF0ZWdpZXMgPSBbc2VsZjo6U1RSQVRFR1lfTUlSUk9SXTsKfQoKcmV0dXJuIFskY3VycmVudFN0cmF0ZWd5LCAkYWxsb3dlZFN0cmF0ZWdpZXNdOwp9CgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2FmZUp1bmN0aW9ucygpOiBib29sCnsKCnJldHVybiBmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpICYmCihQSFBfV0lORE9XU19WRVJTSU9OX01BSk9SID4gNiB8fAooUEhQX1dJTkRPV1NfVkVSU0lPTl9NQUpPUiA9PT0gNiAmJiBQSFBfV0lORE9XU19WRVJTSU9OX01JTk9SID49IDEpKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcUGVyZm9yY2U7CgoKCgpjbGFzcyBQZXJmb3JjZURvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCnByb3RlY3RlZCAkcGVyZm9yY2U7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Eb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKJGxhYmVsID0gJHRoaXMtPmdldExhYmVsRnJvbVNvdXJjZVJlZmVyZW5jZSgoc3RyaW5nKSAkcmVmKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignQ2xvbmluZyAnIC4gJHJlZik7CiR0aGlzLT5pbml0UGVyZm9yY2UoJHBhY2thZ2UsICRwYXRoLCAkdXJsKTsKJHRoaXMtPnBlcmZvcmNlLT5zZXRTdHJlYW0oJHJlZik7CiR0aGlzLT5wZXJmb3JjZS0+cDRMb2dpbigpOwokdGhpcy0+cGVyZm9yY2UtPndyaXRlUDRDbGllbnRTcGVjKCk7CiR0aGlzLT5wZXJmb3JjZS0+Y29ubmVjdENsaWVudCgpOwokdGhpcy0+cGVyZm9yY2UtPnN5bmNDb2RlQmFzZSgkbGFiZWwpOwokdGhpcy0+cGVyZm9yY2UtPmNsZWFudXBDbGllbnRTcGVjKCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRMYWJlbEZyb21Tb3VyY2VSZWZlcmVuY2Uoc3RyaW5nICRyZWYpOiA/c3RyaW5nCnsKJHBvcyA9IHN0cnBvcygkcmVmLCAnQCcpOwppZiAoZmFsc2UgIT09ICRwb3MpIHsKcmV0dXJuIHN1YnN0cigkcmVmLCAkcG9zICsgMSk7Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5pdFBlcmZvcmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiB2b2lkCnsKaWYgKCFlbXB0eSgkdGhpcy0+cGVyZm9yY2UpKSB7CiR0aGlzLT5wZXJmb3JjZS0+aW5pdGlhbGl6ZVBhdGgoJHBhdGgpOwoKcmV0dXJuOwp9CgokcmVwb3NpdG9yeSA9ICRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCk7CiRyZXBvQ29uZmlnID0gbnVsbDsKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2YgVmNzUmVwb3NpdG9yeSkgewokcmVwb0NvbmZpZyA9ICR0aGlzLT5nZXRSZXBvQ29uZmlnKCRyZXBvc2l0b3J5KTsKfQokdGhpcy0+cGVyZm9yY2UgPSBQZXJmb3JjZTo6Y3JlYXRlKCRyZXBvQ29uZmlnLCAkdXJsLCAkcGF0aCwgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5pbyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZyhWY3NSZXBvc2l0b3J5ICRyZXBvc2l0b3J5KTogYXJyYXkKewpyZXR1cm4gJHJlcG9zaXRvcnktPmdldFJlcG9Db25maWcoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmRvSW5zdGFsbCgkdGFyZ2V0LCAkcGF0aCwgJHVybCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUGVyZm9yY2UgZHJpdmVyIGRvZXMgbm90IGNoZWNrIGZvciBsb2NhbCBjaGFuZ2VzIGJlZm9yZSBvdmVycmlkaW5nJyk7CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBlcmZvcmNlLT5nZXRDb21taXRMb2dzKCRmcm9tUmVmZXJlbmNlLCAkdG9SZWZlcmVuY2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UGVyZm9yY2UoUGVyZm9yY2UgJHBlcmZvcmNlKTogdm9pZAp7CiR0aGlzLT5wZXJmb3JjZSA9ICRwZXJmb3JjZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFBoYXJEb3dubG9hZGVyIGV4dGVuZHMgQXJjaGl2ZURvd25sb2FkZXIKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewoKJGFyY2hpdmUgPSBuZXcgXFBoYXIoJGZpbGUpOwokYXJjaGl2ZS0+ZXh0cmFjdFRvKCRwYXRoLCBudWxsLCB0cnVlKTsKCgoKCgoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXEluaUhlbHBlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJhckFyY2hpdmU7CgoKCgoKCgoKY2xhc3MgUmFyRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHByb2Nlc3NFcnJvciA9IG51bGw7CgoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGNvbW1hbmQgPSAndW5yYXIgeCAtLSAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGZpbGUpIC4gJyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBhdGgpIC4gJyA+L2Rldi9udWxsICYmIGNobW9kIC1SIHUrdyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBhdGgpOwoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KCmlmICghY2xhc3NfZXhpc3RzKCdSYXJBcmNoaXZlJykpIHsKCiRpbmlNZXNzYWdlID0gSW5pSGVscGVyOjpnZXRNZXNzYWdlKCk7CgokZXJyb3IgPSAiQ291bGQgbm90IGRlY29tcHJlc3MgdGhlIGFyY2hpdmUsIGVuYWJsZSB0aGUgUEhQIHJhciBleHRlbnNpb24gb3IgaW5zdGFsbCB1bnJhci5cbiIKLiAkaW5pTWVzc2FnZSAuICJcbiIgLiAkcHJvY2Vzc0Vycm9yOwoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGVycm9yID0gIkNvdWxkIG5vdCBkZWNvbXByZXNzIHRoZSBhcmNoaXZlLCBlbmFibGUgdGhlIFBIUCByYXIgZXh0ZW5zaW9uLlxuIiAuICRpbmlNZXNzYWdlOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKJHJhckFyY2hpdmUgPSBSYXJBcmNoaXZlOjpvcGVuKCRmaWxlKTsKCmlmIChmYWxzZSA9PT0gJHJhckFyY2hpdmUpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBvcGVuIFJBUiBhcmNoaXZlOiAnIC4gJGZpbGUpOwp9CgokZW50cmllcyA9ICRyYXJBcmNoaXZlLT5nZXRFbnRyaWVzKCk7CgppZiAoZmFsc2UgPT09ICRlbnRyaWVzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJldHJpZXZlIFJBUiBhcmNoaXZlIGVudHJpZXMnKTsKfQoKZm9yZWFjaCAoJGVudHJpZXMgYXMgJGVudHJ5KSB7CmlmIChmYWxzZSA9PT0gJGVudHJ5LT5leHRyYWN0KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBleHRyYWN0IGVudHJ5Jyk7Cn0KfQoKJHJhckFyY2hpdmUtPmNsb3NlKCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgpjbGFzcyBTdm5Eb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlcgp7Cgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpTdm5VdGlsOjpjbGVhbkVudigpOwokdXRpbCA9IG5ldyBTdm5VdGlsKCR1cmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwppZiAobnVsbCA9PT0gJHV0aWwtPmJpbmFyeVZlcnNpb24oKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3N2biB3YXMgbm90IGZvdW5kIGluIHlvdXIgUEFUSCwgc2tpcHBpbmcgc291cmNlIGRvd25sb2FkJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKCiRyZXBvID0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKTsKaWYgKCRyZXBvIGluc3RhbmNlb2YgVmNzUmVwb3NpdG9yeSkgewokcmVwb0NvbmZpZyA9ICRyZXBvLT5nZXRSZXBvQ29uZmlnKCk7CmlmIChhcnJheV9rZXlfZXhpc3RzKCdzdm4tY2FjaGUtY3JlZGVudGlhbHMnLCAkcmVwb0NvbmZpZykpIHsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAoYm9vbCkgJHJlcG9Db25maWdbJ3N2bi1jYWNoZS1jcmVkZW50aWFscyddOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIENoZWNraW5nIG91dCAiLiRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CiR0aGlzLT5leGVjdXRlKCRwYWNrYWdlLCAkdXJsLCAic3ZuIGNvIiwgc3ByaW50ZigiJXMvJXMiLCAkdXJsLCAkcmVmKSwgbnVsbCwgJHBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKJHJlZiA9ICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwoKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAuc3ZuIGRpcmVjdG9yeSBpcyBtaXNzaW5nIGZyb20gJy4kcGF0aC4nLCBzZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvY29tbWl0LWRlcHMgZm9yIG1vcmUgaW5mb3JtYXRpb24nKTsKfQoKJHV0aWwgPSBuZXcgU3ZuVXRpbCgkdXJsLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJGZsYWdzID0gIiI7CmlmICh2ZXJzaW9uX2NvbXBhcmUoJHV0aWwtPmJpbmFyeVZlcnNpb24oKSwgJzEuNy4wJywgJz49JykpIHsKJGZsYWdzIC49ICcgLS1pZ25vcmUtYW5jZXN0cnknOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiBDaGVja2luZyBvdXQgIiAuICRyZWYpOwokdGhpcy0+ZXhlY3V0ZSgkdGFyZ2V0LCAkdXJsLCAic3ZuIHN3aXRjaCIgLiAkZmxhZ3MsIHNwcmludGYoIiVzLyVzIiwgJHVybCwgJHJlZiksICRwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnc3ZuIHN0YXR1cyAtLWlnbm9yZS1leHRlcm5hbHMnLCAkb3V0cHV0LCAkcGF0aCk7CgpyZXR1cm4gUHJlZzo6aXNNYXRjaCgne14gKlteWCBdICt9bScsICRvdXRwdXQpID8gJG91dHB1dCA6IG51bGw7Cn0KCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRiYXNlVXJsLCBzdHJpbmcgJGNvbW1hbmQsIHN0cmluZyAkdXJsLCA/c3RyaW5nICRjd2QgPSBudWxsLCA/c3RyaW5nICRwYXRoID0gbnVsbCk6IHN0cmluZwp7CiR1dGlsID0gbmV3IFN2blV0aWwoJGJhc2VVcmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokdXRpbC0+c2V0Q2FjaGVDcmVkZW50aWFscygkdGhpcy0+Y2FjaGVDcmVkZW50aWFscyk7CnRyeSB7CnJldHVybiAkdXRpbC0+ZXhlY3V0ZSgkY29tbWFuZCwgJHVybCwgJGN3ZCwgJHBhdGgsICR0aGlzLT5pby0+aXNWZXJib3NlKCkpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCwgJy4kZS0+Z2V0TWVzc2FnZSgpCik7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFuQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJHVwZGF0ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gKCRjaGFuZ2VzID0gJHRoaXMtPmdldExvY2FsQ2hhbmdlcygkcGFja2FnZSwgJHBhdGgpKSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAodHJ1ZSA9PT0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKSkgewpyZXR1cm4gJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKfQoKcmV0dXJuIHBhcmVudDo6Y2xlYW5DaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCwgJHVwZGF0ZSk7Cn0KCiRjaGFuZ2VzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVsZW0pOiBzdHJpbmcgewpyZXR1cm4gJyAgICAnLiRlbGVtOwp9LCBQcmVnOjpzcGxpdCgne1xzKlxyP1xuXHMqfScsICRjaGFuZ2VzKSk7CiRjb3VudENoYW5nZXMgPSBjb3VudCgkY2hhbmdlcyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCcgICAgPGVycm9yPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGhhcyBtb2RpZmllZCBmaWxlJXM6PC9lcnJvcj4nLCAkY291bnRDaGFuZ2VzID09PSAxID8gJycgOiAncycpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKGFycmF5X3NsaWNlKCRjaGFuZ2VzLCAwLCAxMCkpOwppZiAoJGNvdW50Q2hhbmdlcyA+IDEwKSB7CiRyZW1haW5pbmdDaGFuZ2VzID0gJGNvdW50Q2hhbmdlcyAtIDEwOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoCnNwcmludGYoCicgICAgPGluZm8+Jy4kcmVtYWluaW5nQ2hhbmdlcy4nIG1vcmUgZmlsZSVzIG1vZGlmaWVkLCBjaG9vc2UgInYiIHRvIHZpZXcgdGhlIGZ1bGwgbGlzdDwvaW5mbz4nLAokcmVtYWluaW5nQ2hhbmdlcyA9PT0gMSA/ICcnIDogJ3MnCikKKTsKfQoKd2hpbGUgKHRydWUpIHsKc3dpdGNoICgkdGhpcy0+aW8tPmFzaygnICAgIDxpbmZvPkRpc2NhcmQgY2hhbmdlcyBbeSxuLHYsP10/PC9pbmZvPiAnLCAnPycpKSB7CmNhc2UgJ3knOgokdGhpcy0+ZGlzY2FyZENoYW5nZXMoJHBhdGgpOwpicmVhayAyOwoKY2FzZSAnbic6CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVXBkYXRlIGFib3J0ZWQnKTsKCmNhc2UgJ3YnOgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJGNoYW5nZXMpOwpicmVhazsKCmNhc2UgJz8nOgpkZWZhdWx0OgokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwonICAgIHkgLSBkaXNjYXJkIGNoYW5nZXMgYW5kIGFwcGx5IHRoZSAnLigkdXBkYXRlID8gJ3VwZGF0ZScgOiAndW5pbnN0YWxsJyksCicgICAgbiAtIGFib3J0IHRoZSAnLigkdXBkYXRlID8gJ3VwZGF0ZScgOiAndW5pbnN0YWxsJykuJyBhbmQgbGV0IHlvdSBtYW51YWxseSBjbGVhbiB0aGluZ3MgdXAnLAonICAgIHYgLSB2aWV3IG1vZGlmaWVkIGZpbGVzJywKJyAgICA/IC0gcHJpbnQgaGVscCcsCl0pOwpicmVhazsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaCgne0AoXGQrKSR9JywgJGZyb21SZWZlcmVuY2UpICYmIFByZWc6OmlzTWF0Y2goJ3tAKFxkKykkfScsICR0b1JlZmVyZW5jZSkpIHsKCiRjb21tYW5kID0gc3ByaW50Zignc3ZuIGluZm8gLS1ub24taW50ZXJhY3RpdmUgLS14bWwgLS0gJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGF0aCkpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKQopOwp9CgokdXJsUGF0dGVybiA9ICcjPHVybD4oLiopPC91cmw+Iyc7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCR1cmxQYXR0ZXJuLCAkb3V0cHV0LCAkbWF0Y2hlcykpIHsKJGJhc2VVcmwgPSAkbWF0Y2hlc1sxXTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonVW5hYmxlIHRvIGRldGVybWluZSBzdm4gdXJsIGZvciBwYXRoICcuICRwYXRoCik7Cn0KCgokZnJvbVJldmlzaW9uID0gUHJlZzo6cmVwbGFjZSgney4qQChcZCspJH0nLCAnJDEnLCAkZnJvbVJlZmVyZW5jZSk7CiR0b1JldmlzaW9uID0gUHJlZzo6cmVwbGFjZSgney4qQChcZCspJH0nLCAnJDEnLCAkdG9SZWZlcmVuY2UpOwoKJGNvbW1hbmQgPSBzcHJpbnRmKCdzdm4gbG9nIC1yJXM6JXMgLS1pbmNyZW1lbnRhbCcsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRmcm9tUmV2aXNpb24pLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdG9SZXZpc2lvbikpOwoKJHV0aWwgPSBuZXcgU3ZuVXRpbCgkYmFzZVVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiR1dGlsLT5zZXRDYWNoZUNyZWRlbnRpYWxzKCR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzKTsKdHJ5IHsKcmV0dXJuICR1dGlsLT5leGVjdXRlTG9jYWwoJGNvbW1hbmQsICRwYXRoLCBudWxsLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iLiRlLT5nZXRNZXNzYWdlKCkKKTsKfQp9CgpyZXR1cm4gIkNvdWxkIG5vdCByZXRyaWV2ZSBjaGFuZ2VzIGJldHdlZW4gJGZyb21SZWZlcmVuY2UgYW5kICR0b1JlZmVyZW5jZSBkdWUgdG8gbWlzc2luZyByZXZpc2lvbiBpbmZvcm1hdGlvbiI7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXNjYXJkQ2hhbmdlcyhzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdzdm4gcmV2ZXJ0IC1SIC4nLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzZXQgY2hhbmdlc1xuXG46Ii4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gaXNfZGlyKCRwYXRoLicvLnN2bicpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBUYXJEb3dubG9hZGVyIGV4dGVuZHMgQXJjaGl2ZURvd25sb2FkZXIKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewoKJGFyY2hpdmUgPSBuZXcgXFBoYXJEYXRhKCRmaWxlKTsKJGFyY2hpdmUtPmV4dHJhY3RUbygkcGF0aCwgbnVsbCwgdHJ1ZSk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKCgoKY2xhc3MgVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24KewoKcHJvdGVjdGVkICRoZWFkZXJzOwoKcHJvdGVjdGVkICRyZXNwb25zZTsKCnByb3RlY3RlZCAkc3RhdHVzQ29kZTsKCnByb3RlY3RlZCAkcmVzcG9uc2VJbmZvID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVycyhhcnJheSAkaGVhZGVycyk6IHZvaWQKewokdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmhlYWRlcnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXNwb25zZSg/c3RyaW5nICRyZXNwb25zZSk6IHZvaWQKewokdGhpcy0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXNwb25zZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5yZXNwb25zZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YXR1c0NvZGUoJHN0YXR1c0NvZGUpOiB2b2lkCnsKJHRoaXMtPnN0YXR1c0NvZGUgPSAkc3RhdHVzQ29kZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoKTogP2ludAp7CnJldHVybiAkdGhpcy0+c3RhdHVzQ29kZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlc3BvbnNlSW5mbygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVzcG9uc2VJbmZvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVzcG9uc2VJbmZvKGFycmF5ICRyZXNwb25zZUluZm8pOiB2b2lkCnsKJHRoaXMtPnJlc3BvbnNlSW5mbyA9ICRyZXNwb25zZUluZm87Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmNzUmVmZXJlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkd1ZXNzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uOwoKCgoKYWJzdHJhY3QgY2xhc3MgVmNzRG93bmxvYWRlciBpbXBsZW1lbnRzIERvd25sb2FkZXJJbnRlcmZhY2UsIENoYW5nZVJlcG9ydEludGVyZmFjZSwgVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICRmaWxlc3lzdGVtOwoKcHJvdGVjdGVkICRoYXNDbGVhbmVkQ2hhbmdlcyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsLCA/RmlsZXN5c3RlbSAkZnMgPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmcyA/PyBuZXcgRmlsZXN5c3RlbSgkdGhpcy0+cHJvY2Vzcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogc3RyaW5nCnsKcmV0dXJuICdzb3VyY2UnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIG1pc3NpbmcgcmVmZXJlbmNlIGluZm9ybWF0aW9uJyk7Cn0KCiR1cmxzID0gJHRoaXMtPnByZXBhcmVVcmxzKCRwYWNrYWdlLT5nZXRTb3VyY2VVcmxzKCkpOwoKd2hpbGUgKCR1cmwgPSBhcnJheV9zaGlmdCgkdXJscykpIHsKdHJ5IHsKcmV0dXJuICR0aGlzLT5kb0Rvd25sb2FkKCRwYWNrYWdlLCAkcGF0aCwgJHVybCwgJHByZXZQYWNrYWdlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKaWYgKCRlIGluc3RhbmNlb2YgXFBIUFVuaXRcRnJhbWV3b3JrXEV4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQppZiAoJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGYWlsZWQ6IFsnLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpKTsKfSBlbHNlaWYgKGNvdW50KCR1cmxzKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBGYWlsZWQsIHRyeWluZyB0aGUgbmV4dCBVUkwnKTsKfQppZiAoIWNvdW50KCR1cmxzKSkgewp0aHJvdyAkZTsKfQp9Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJHR5cGUgPT09ICd1cGRhdGUnKSB7CiR0aGlzLT5jbGVhbkNoYW5nZXMoJHByZXZQYWNrYWdlLCAkcGF0aCwgdHJ1ZSk7CiR0aGlzLT5oYXNDbGVhbmVkQ2hhbmdlc1skcHJldlBhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKV0gPSB0cnVlOwp9IGVsc2VpZiAoJHR5cGUgPT09ICdpbnN0YWxsJykgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW1wdHlEaXJlY3RvcnkoJHBhdGgpOwp9IGVsc2VpZiAoJHR5cGUgPT09ICd1bmluc3RhbGwnKSB7CiR0aGlzLT5jbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCBmYWxzZSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJHR5cGUgPT09ICd1cGRhdGUnICYmIGlzc2V0KCR0aGlzLT5oYXNDbGVhbmVkQ2hhbmdlc1skcHJldlBhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKV0pKSB7CiR0aGlzLT5yZWFwcGx5Q2hhbmdlcygkcGF0aCk7CnVuc2V0KCR0aGlzLT5oYXNDbGVhbmVkQ2hhbmdlc1skcHJldlBhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKV0pOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIG1pc3NpbmcgcmVmZXJlbmNlIGluZm9ybWF0aW9uJyk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBJbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpLic6ICcsIGZhbHNlKTsKCiR1cmxzID0gJHRoaXMtPnByZXBhcmVVcmxzKCRwYWNrYWdlLT5nZXRTb3VyY2VVcmxzKCkpOwp3aGlsZSAoJHVybCA9IGFycmF5X3NoaWZ0KCR1cmxzKSkgewp0cnkgewokdGhpcy0+ZG9JbnN0YWxsKCRwYWNrYWdlLCAkcGF0aCwgJHVybCk7CmJyZWFrOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CgppZiAoJGUgaW5zdGFuY2VvZiBcUEhQVW5pdFxGcmFtZXdvcmtcRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZhaWxlZDogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCkpOwp9IGVsc2VpZiAoY291bnQoJHVybHMpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEZhaWxlZCwgdHJ5aW5nIHRoZSBuZXh0IFVSTCcpOwp9CmlmICghY291bnQoJHVybHMpKSB7CnRocm93ICRlOwp9Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCEkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAnLiR0YXJnZXQtPmdldFByZXR0eU5hbWUoKS4nIGlzIG1pc3NpbmcgcmVmZXJlbmNlIGluZm9ybWF0aW9uJyk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVcGRhdGVPcGVyYXRpb246OmZvcm1hdCgkaW5pdGlhbCwgJHRhcmdldCkuJzogJywgZmFsc2UpOwoKJHVybHMgPSAkdGhpcy0+cHJlcGFyZVVybHMoJHRhcmdldC0+Z2V0U291cmNlVXJscygpKTsKCiRleGNlcHRpb24gPSBudWxsOwp3aGlsZSAoJHVybCA9IGFycmF5X3NoaWZ0KCR1cmxzKSkgewp0cnkgewokdGhpcy0+ZG9VcGRhdGUoJGluaXRpYWwsICR0YXJnZXQsICRwYXRoLCAkdXJsKTsKCiRleGNlcHRpb24gPSBudWxsOwpicmVhazsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZXhjZXB0aW9uKSB7CgppZiAoJGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFxQSFBVbml0XEZyYW1ld29ya1xFeGNlcHRpb24pIHsKdGhyb3cgJGV4Y2VwdGlvbjsKfQppZiAoJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGYWlsZWQ6IFsnLmdldF9jbGFzcygkZXhjZXB0aW9uKS4nXSAnLiRleGNlcHRpb24tPmdldE1lc3NhZ2UoKSk7Cn0gZWxzZWlmIChjb3VudCgkdXJscykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkLCB0cnlpbmcgdGhlIG5leHQgVVJMJyk7Cn0KfQp9CgoKCmlmICghJGV4Y2VwdGlvbiAmJiAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpICYmICR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CiRtZXNzYWdlID0gJ1B1bGxpbmcgaW4gY2hhbmdlczonOwokbG9ncyA9ICR0aGlzLT5nZXRDb21taXRMb2dzKCRpbml0aWFsLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwgJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCksICRwYXRoKTsKCmlmICgnJyA9PT0gdHJpbSgkbG9ncykpIHsKJG1lc3NhZ2UgPSAnUm9sbGluZyBiYWNrIGNoYW5nZXM6JzsKJGxvZ3MgPSAkdGhpcy0+Z2V0Q29tbWl0TG9ncygkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwgJGluaXRpYWwtPmdldFNvdXJjZVJlZmVyZW5jZSgpLCAkcGF0aCk7Cn0KCmlmICgnJyAhPT0gdHJpbSgkbG9ncykpIHsKJGxvZ3MgPSBpbXBsb2RlKCJcbiIsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRsaW5lKTogc3RyaW5nIHsKcmV0dXJuICcgICAgICAnIC4gJGxpbmU7Cn0sIGV4cGxvZGUoIlxuIiwgJGxvZ3MpKSk7CgoKJGxvZ3MgPSBzdHJfcmVwbGFjZSgnPCcsICdcPCcsICRsb2dzKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgICcuJG1lc3NhZ2UpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJGxvZ3MpOwp9Cn0KCmlmICghJHVybHMgJiYgJGV4Y2VwdGlvbikgewp0aHJvdyAkZXhjZXB0aW9uOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVuaW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7CgokcHJvbWlzZSA9ICR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlBc3luYygkcGF0aCk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oc3RhdGljIGZ1bmN0aW9uIChib29sICRyZXN1bHQpIHVzZSAoJHBhdGgpIHsKaWYgKCEkcmVzdWx0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGNvbXBsZXRlbHkgZGVsZXRlICcuJHBhdGguJywgYWJvcnRpbmcuJyk7Cn0KfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWY3NSZWZlcmVuY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJGd1ZXNzZXIgPSBuZXcgVmVyc2lvbkd1ZXNzZXIoJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICRwYXJzZXIpOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyOwoKJHBhY2thZ2VDb25maWcgPSAkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKTsKaWYgKCRwYWNrYWdlVmVyc2lvbiA9ICRndWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKSkgewpyZXR1cm4gJHBhY2thZ2VWZXJzaW9uWydjb21taXQnXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhbkNoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICR1cGRhdGUpOiBQcm9taXNlSW50ZXJmYWNlCnsKCmlmIChudWxsICE9PSAkdGhpcy0+Z2V0TG9jYWxDaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTb3VyY2UgZGlyZWN0b3J5ICcgLiAkcGF0aCAuICcgaGFzIHVuY29tbWl0dGVkIGNoYW5nZXMuJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZWFwcGx5Q2hhbmdlcyhzdHJpbmcgJHBhdGgpOiB2b2lkCnsKfQoKCgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZzsKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2w7CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZVVybHMoYXJyYXkgJHVybHMpOiBhcnJheQp7CmZvcmVhY2ggKCR1cmxzIGFzICRpbmRleCA9PiAkdXJsKSB7CmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewoKCiRmaWxlUHJvdG9jb2wgPSAnZmlsZTovLyc7CiRpc0ZpbGVQcm90b2NvbCA9IGZhbHNlOwppZiAoMCA9PT0gc3RycG9zKCR1cmwsICRmaWxlUHJvdG9jb2wpKSB7CiR1cmwgPSBzdWJzdHIoJHVybCwgc3RybGVuKCRmaWxlUHJvdG9jb2wpKTsKJGlzRmlsZVByb3RvY29sID0gdHJ1ZTsKfQoKCmlmIChmYWxzZSAhPT0gc3RycG9zKCR1cmwsICclJykpIHsKJHVybCA9IHJhd3VybGRlY29kZSgkdXJsKTsKfQoKJHVybHNbJGluZGV4XSA9IHJlYWxwYXRoKCR1cmwpOwoKaWYgKCRpc0ZpbGVQcm90b2NvbCkgewokdXJsc1skaW5kZXhdID0gJGZpbGVQcm90b2NvbCAuICR1cmxzWyRpbmRleF07Cn0KfQp9CgpyZXR1cm4gJHVybHM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgoKCmNsYXNzIFh6RG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGNvbW1hbmQgPSAndGFyIC14SmYgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRmaWxlKSAuICcgLUMgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwYXRoKTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokcHJvY2Vzc0Vycm9yID0gJ0ZhaWxlZCB0byBleGVjdXRlICcgLiAkY29tbWFuZCAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRwcm9jZXNzRXJyb3IpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxJbmlIZWxwZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBaaXBBcmNoaXZlOwoKCgoKY2xhc3MgWmlwRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKCnByaXZhdGUgc3RhdGljICR1bnppcENvbW1hbmRzOwoKcHJpdmF0ZSBzdGF0aWMgJGhhc1ppcEFyY2hpdmU7Cgpwcml2YXRlIHN0YXRpYyAkaXNXaW5kb3dzOwoKCnByaXZhdGUgJHppcEFyY2hpdmVPYmplY3Q7IAoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gc2VsZjo6JHVuemlwQ29tbWFuZHMpIHsKc2VsZjo6JHVuemlwQ29tbWFuZHMgPSBbXTsKJGZpbmRlciA9IG5ldyBFeGVjdXRhYmxlRmluZGVyOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmICgkY21kID0gJGZpbmRlci0+ZmluZCgnN3onLCBudWxsLCBbJ0M6XFByb2dyYW0gRmlsZXNcNy1aaXAnXSkpKSB7CnNlbGY6OiR1bnppcENvbW1hbmRzW10gPSBbJzd6JywgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGNtZCkuJyB4IC1iYjAgLXkgJXMgLW8lcyddOwp9CmlmICgkY21kID0gJGZpbmRlci0+ZmluZCgndW56aXAnKSkgewpzZWxmOjokdW56aXBDb21tYW5kc1tdID0gWyd1bnppcCcsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRjbWQpLicgLXFxICVzIC1kICVzJ107Cn0KaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgKCRjbWQgPSAkZmluZGVyLT5maW5kKCc3eicpKSkgeyAKc2VsZjo6JHVuemlwQ29tbWFuZHNbXSA9IFsnN3onLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkY21kKS4nIHggLWJiMCAteSAlcyAtbyVzJ107Cn0KaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgKCRjbWQgPSAkZmluZGVyLT5maW5kKCc3enonKSkpIHsgCnNlbGY6OiR1bnppcENvbW1hbmRzW10gPSBbJzd6eicsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRjbWQpLicgeCAtYmIwIC15ICVzIC1vJXMnXTsKfQp9CgokcHJvY09wZW5NaXNzaW5nID0gZmFsc2U7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpzZWxmOjokdW56aXBDb21tYW5kcyA9IFtdOwokcHJvY09wZW5NaXNzaW5nID0gdHJ1ZTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRoYXNaaXBBcmNoaXZlKSB7CnNlbGY6OiRoYXNaaXBBcmNoaXZlID0gY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJyk7Cn0KCmlmICghc2VsZjo6JGhhc1ppcEFyY2hpdmUgJiYgIXNlbGY6OiR1bnppcENvbW1hbmRzKSB7CgokaW5pTWVzc2FnZSA9IEluaUhlbHBlcjo6Z2V0TWVzc2FnZSgpOwppZiAoJHByb2NPcGVuTWlzc2luZykgewokZXJyb3IgPSAiVGhlIHppcCBleHRlbnNpb24gaXMgbWlzc2luZyBhbmQgdW56aXAvN3ogY29tbWFuZHMgY2Fubm90IGJlIGNhbGxlZCBhcyBwcm9jX29wZW4gaXMgZGlzYWJsZWQsIHNraXBwaW5nLlxuIiAuICRpbmlNZXNzYWdlOwp9IGVsc2UgewokZXJyb3IgPSAiVGhlIHppcCBleHRlbnNpb24gYW5kIHVuemlwLzd6IGNvbW1hbmRzIGFyZSBib3RoIG1pc3NpbmcsIHNraXBwaW5nLlxuIiAuICRpbmlNZXNzYWdlOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRpc1dpbmRvd3MpIHsKc2VsZjo6JGlzV2luZG93cyA9IFBsYXRmb3JtOjppc1dpbmRvd3MoKTsKCmlmICghc2VsZjo6JGlzV2luZG93cyAmJiAhc2VsZjo6JHVuemlwQ29tbWFuZHMpIHsKaWYgKCRwcm9jT3Blbk1pc3NpbmcpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz5wcm9jX29wZW4gaXMgZGlzYWJsZWQgc28gJ3VuemlwJyBhbmQgJzd6JyBjb21tYW5kcyBjYW5ub3QgYmUgdXNlZCwgemlwIGZpbGVzIGFyZSBiZWluZyB1bnBhY2tlZCB1c2luZyB0aGUgUEhQIHppcCBleHRlbnNpb24uPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPlRoaXMgbWF5IGNhdXNlIGludmFsaWQgcmVwb3J0cyBvZiBjb3JydXB0ZWQgYXJjaGl2ZXMuIEJlc2lkZXMsIGFueSBVTklYIHBlcm1pc3Npb25zIChlLmcuIGV4ZWN1dGFibGUpIGRlZmluZWQgaW4gdGhlIGFyY2hpdmVzIHdpbGwgYmUgbG9zdC48L3dhcm5pbmc+Iik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+RW5hYmxpbmcgcHJvY19vcGVuIGFuZCBpbnN0YWxsaW5nICd1bnppcCcgb3IgJzd6JyAoMjEuMDErKSBtYXkgcmVtZWRpYXRlIHRoZW0uPC93YXJuaW5nPiIpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPkFzIHRoZXJlIGlzIG5vICd1bnppcCcgbm9yICc3eicgY29tbWFuZCBpbnN0YWxsZWQgemlwIGZpbGVzIGFyZSBiZWluZyB1bnBhY2tlZCB1c2luZyB0aGUgUEhQIHppcCBleHRlbnNpb24uPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPlRoaXMgbWF5IGNhdXNlIGludmFsaWQgcmVwb3J0cyBvZiBjb3JydXB0ZWQgYXJjaGl2ZXMuIEJlc2lkZXMsIGFueSBVTklYIHBlcm1pc3Npb25zIChlLmcuIGV4ZWN1dGFibGUpIGRlZmluZWQgaW4gdGhlIGFyY2hpdmVzIHdpbGwgYmUgbG9zdC48L3dhcm5pbmc+Iik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+SW5zdGFsbGluZyAndW56aXAnIG9yICc3eicgKDIxLjAxKykgbWF5IHJlbWVkaWF0ZSB0aGVtLjwvd2FybmluZz4iKTsKfQp9Cn0KCnJldHVybiBwYXJlbnQ6OmRvd25sb2FkKCRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlLCAkb3V0cHV0KTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFdpdGhTeXN0ZW1VbnppcChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewpzdGF0aWMgJHdhcm5lZDdaaXBMaW51eCA9IGZhbHNlOwoKCiRpc0xhc3RDaGFuY2UgPSAhc2VsZjo6JGhhc1ppcEFyY2hpdmU7CgppZiAoIXNlbGY6OiR1bnppcENvbW1hbmRzKSB7CgoKcmV0dXJuICR0aGlzLT5leHRyYWN0V2l0aFppcEFyY2hpdmUoJHBhY2thZ2UsICRmaWxlLCAkcGF0aCk7Cn0KCiRjb21tYW5kU3BlYyA9IHJlc2V0KHNlbGY6OiR1bnppcENvbW1hbmRzKTsKJGNvbW1hbmQgPSBzcHJpbnRmKCRjb21tYW5kU3BlY1sxXSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGZpbGUpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGF0aCkpOwoKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGNvbW1hbmQgPSBzcHJpbnRmKCRjb21tYW5kU3BlY1sxXSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoc3RydHIoJGZpbGUsICcvJywgJ1xcJykpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShzdHJ0cigkcGF0aCwgJy8nLCAnXFwnKSkpOwp9CgokZXhlY3V0YWJsZSA9ICRjb21tYW5kU3BlY1swXTsKaWYgKCEkd2FybmVkN1ppcExpbnV4ICYmICFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgaW5fYXJyYXkoJGV4ZWN1dGFibGUsIFsnN3onLCAnN3p6J10sIHRydWUpKSB7CiR3YXJuZWQ3WmlwTGludXggPSB0cnVlOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGV4ZWN1dGFibGUsICRvdXRwdXQpKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlxzKjctWmlwKD86IFxbNjRcXSk/IChbMC05Ll0rKX0nLCAkb3V0cHV0LCAkbWF0Y2gpICYmIHZlcnNpb25fY29tcGFyZSgkbWF0Y2hbMV0sICcyMS4wMScsICc8JykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+VW56aXBwaW5nIHVzaW5nICcuJGV4ZWN1dGFibGUuJyAnLiRtYXRjaFsxXS4nIG1heSByZXN1bHQgaW4gaW5jb3JyZWN0IGZpbGUgcGVybWlzc2lvbnMuIEluc3RhbGwgJy4kZXhlY3V0YWJsZS4nIDIxLjAxKyBvciB1bnppcCB0byBlbnN1cmUgeW91IGdldCBjb3JyZWN0IHBlcm1pc3Npb25zLjwvd2FybmluZz4nKTsKfQp9Cn0KCiRpbyA9ICR0aGlzLT5pbzsKJHRyeUZhbGxiYWNrID0gZnVuY3Rpb24gKFxUaHJvd2FibGUgJHByb2Nlc3NFcnJvcikgdXNlICgkaXNMYXN0Q2hhbmNlLCAkaW8sICRmaWxlLCAkcGF0aCwgJHBhY2thZ2UsICRleGVjdXRhYmxlKTogXFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZSB7CmlmICgkaXNMYXN0Q2hhbmNlKSB7CnRocm93ICRwcm9jZXNzRXJyb3I7Cn0KCmlmICghaXNfZmlsZSgkZmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Jy4kcHJvY2Vzc0Vycm9yLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+VGhpcyBtb3N0IGxpa2VseSBpcyBkdWUgdG8gYSBjdXN0b20gaW5zdGFsbGVyIHBsdWdpbiBub3QgaGFuZGxpbmcgdGhlIHJldHVybmVkIFByb21pc2UgZnJvbSB0aGUgZG93bmxvYWRlcjwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+U2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9pbnN0YWxsZXJzL2NvbW1pdC81MDA2ZDBjMjg3MzBhZGUyMzNhOGY0MmVjMzFhYzY4ZmIxYzVjOWJiIGZvciBhbiBleGFtcGxlIGZpeDwvd2FybmluZz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Jy4kcHJvY2Vzc0Vycm9yLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCcgICAgVGhlIGFyY2hpdmUgbWF5IGNvbnRhaW4gaWRlbnRpY2FsIGZpbGUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24gKHdoaWNoIGZhaWxzIG9uIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMpJyk7CiRpby0+d3JpdGVFcnJvcignICAgIFVuemlwIHdpdGggJy4kZXhlY3V0YWJsZS4nIGNvbW1hbmQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gWmlwQXJjaGl2ZSBjbGFzcycpOwoKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICE9PSBmYWxzZSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpID09PSBmYWxzZSkgewokaW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5BZGRpdGlvbmFsIGRlYnVnIGluZm8sIHBsZWFzZSByZXBvcnQgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy8xMTE0OCBpZiB5b3Ugc2VlIHRoaXM6PC93YXJuaW5nPicpOwokaW8tPndyaXRlRXJyb3IoJ0ZpbGUgc2l6ZTogJy5AZmlsZXNpemUoJGZpbGUpKTsKJGlvLT53cml0ZUVycm9yKCdGaWxlIFNIQTE6ICcuaGFzaF9maWxlKCdzaGExJywgJGZpbGUpKTsKJGlvLT53cml0ZUVycm9yKCdGaXJzdCAxMDAgYnl0ZXMgKGhleCk6ICcuYmluMmhleChzdWJzdHIoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCAwLCAxMDApKSk7CiRpby0+d3JpdGVFcnJvcignTGFzdCAxMDAgYnl0ZXMgKGhleCk6ICcuYmluMmhleChzdWJzdHIoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCAtMTAwKSkpOwppZiAoc3RybGVuKChzdHJpbmcpICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJ09yaWdpbiBVUkw6ICcuJHRoaXMtPnByb2Nlc3NVcmwoJHBhY2thZ2UsIChzdHJpbmcpICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpKTsKJGlvLT53cml0ZUVycm9yKCdSZXNwb25zZSBIZWFkZXJzOiAnLmpzb25fZW5jb2RlKEZpbGVEb3dubG9hZGVyOjokcmVzcG9uc2VIZWFkZXJzWyRwYWNrYWdlLT5nZXROYW1lKCldID8/IFtdKSk7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPmV4dHJhY3RXaXRoWmlwQXJjaGl2ZSgkcGFja2FnZSwgJGZpbGUsICRwYXRoKTsKfTsKCnRyeSB7CiRwcm9taXNlID0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGVBc3luYygkY29tbWFuZCk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKFByb2Nlc3MgJHByb2Nlc3MpIHVzZSAoJHRyeUZhbGxiYWNrLCAkY29tbWFuZCwgJHBhY2thZ2UsICRmaWxlKSB7CmlmICghJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSB7CmlmIChpc3NldCgkdGhpcy0+Y2xlYW51cEV4ZWN1dGVkWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleHRyYWN0ICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nIGFzIHRoZSBpbnN0YWxsYXRpb24gd2FzIGFib3J0ZWQgYnkgYW5vdGhlciBwYWNrYWdlIG9wZXJhdGlvbi4nKTsKfQoKJG91dHB1dCA9ICRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwokb3V0cHV0ID0gc3RyX3JlcGxhY2UoJywgJy4kZmlsZS4nLnppcCBvciAnLiRmaWxlLicuWklQJywgJycsICRvdXRwdXQpOwoKcmV0dXJuICR0cnlGYWxsYmFjayhuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleHRyYWN0ICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiAoJy4kcHJvY2Vzcy0+Z2V0RXhpdENvZGUoKS4nKSAnLiRjb21tYW5kLiJcblxuIi4kb3V0cHV0KSk7Cn0KfSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKcmV0dXJuICR0cnlGYWxsYmFjaygkZSk7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFdpdGhaaXBBcmNoaXZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwcm9jZXNzRXJyb3IgPSBudWxsOwokemlwQXJjaGl2ZSA9ICR0aGlzLT56aXBBcmNoaXZlT2JqZWN0ID86IG5ldyBaaXBBcmNoaXZlKCk7Cgp0cnkgewppZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSB8fCAoJGZpbGVzaXplID0gZmlsZXNpemUoJGZpbGUpKSA9PT0gZmFsc2UgfHwgJGZpbGVzaXplID09PSAwKSB7CiRyZXR2YWwgPSAtMTsKfSBlbHNlIHsKJHJldHZhbCA9ICR6aXBBcmNoaXZlLT5vcGVuKCRmaWxlKTsKfQppZiAodHJ1ZSA9PT0gJHJldHZhbCkgewokZXh0cmFjdFJlc3VsdCA9ICR6aXBBcmNoaXZlLT5leHRyYWN0VG8oJHBhdGgpOwoKaWYgKHRydWUgPT09ICRleHRyYWN0UmVzdWx0KSB7CiR6aXBBcmNoaXZlLT5jbG9zZSgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSBuZXcgXFJ1bnRpbWVFeGNlcHRpb24ocnRyaW0oIlRoZXJlIHdhcyBhbiBlcnJvciBleHRyYWN0aW5nIHRoZSBaSVAgZmlsZSwgaXQgaXMgZWl0aGVyIGNvcnJ1cHRlZCBvciB1c2luZyBhbiBpbnZhbGlkIGZvcm1hdC5cbiIpKTsKfSBlbHNlIHsKJHByb2Nlc3NFcnJvciA9IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHJ0cmltKCR0aGlzLT5nZXRFcnJvck1lc3NhZ2UoJHJldHZhbCwgJGZpbGUpLiJcbiIpLCAkcmV0dmFsKTsKfQp9IGNhdGNoIChcRXJyb3JFeGNlcHRpb24gJGUpIHsKJHByb2Nlc3NFcnJvciA9IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGFyY2hpdmUgbWF5IGNvbnRhaW4gaWRlbnRpY2FsIGZpbGUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24gKHdoaWNoIGZhaWxzIG9uIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMpOiAnLiRlLT5nZXRNZXNzYWdlKCksIDAsICRlKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokcHJvY2Vzc0Vycm9yID0gJGU7Cn0KCnRocm93ICRwcm9jZXNzRXJyb3I7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZXh0cmFjdFdpdGhTeXN0ZW1VbnppcCgkcGFja2FnZSwgJGZpbGUsICRwYXRoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShpbnQgJHJldHZhbCwgc3RyaW5nICRmaWxlKTogc3RyaW5nCnsKc3dpdGNoICgkcmV0dmFsKSB7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfRVhJU1RTOgpyZXR1cm4gc3ByaW50ZigiRmlsZSAnJXMnIGFscmVhZHkgZXhpc3RzLiIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9JTkNPTlM6CnJldHVybiBzcHJpbnRmKCJaaXAgYXJjaGl2ZSAnJXMnIGlzIGluY29uc2lzdGVudC4iLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfSU5WQUw6CnJldHVybiBzcHJpbnRmKCJJbnZhbGlkIGFyZ3VtZW50ICglcykiLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfTUVNT1JZOgpyZXR1cm4gc3ByaW50ZigiTWFsbG9jIGZhaWx1cmUgKCVzKSIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9OT0VOVDoKcmV0dXJuIHNwcmludGYoIk5vIHN1Y2ggemlwIGZpbGU6ICclcyciLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfTk9aSVA6CnJldHVybiBzcHJpbnRmKCInJXMnIGlzIG5vdCBhIHppcCBhcmNoaXZlLiIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9PUEVOOgpyZXR1cm4gc3ByaW50ZigiQ2FuJ3Qgb3BlbiB6aXAgZmlsZTogJXMiLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfUkVBRDoKcmV0dXJuIHNwcmludGYoIlppcCByZWFkIGVycm9yICglcykiLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfU0VFSzoKcmV0dXJuIHNwcmludGYoIlppcCBzZWVrIGVycm9yICglcykiLCAkZmlsZSk7CmNhc2UgLTE6CnJldHVybiBzcHJpbnRmKCInJXMnIGlzIGEgY29ycnVwdGVkIHppcCBhcmNoaXZlICgwIGJ5dGVzKSwgdHJ5IGFnYWluLiIsICRmaWxlKTsKZGVmYXVsdDoKcmV0dXJuIHNwcmludGYoIiclcycgaXMgbm90IGEgdmFsaWQgemlwIGFyY2hpdmUsIGdvdCBlcnJvciBjb2RlOiAlcyIsICRmaWxlLCAkcmV0dmFsKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlcjsKCgoKCgoKY2xhc3MgRXZlbnQKewoKCgpwcm90ZWN0ZWQgJG5hbWU7CgoKCgpwcm90ZWN0ZWQgJGFyZ3M7CgoKCgpwcm90ZWN0ZWQgJGZsYWdzOwoKCgoKcHJpdmF0ZSAkcHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgYXJyYXkgJGFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pCnsKJHRoaXMtPm5hbWUgPSAkbmFtZTsKJHRoaXMtPmFyZ3MgPSAkYXJnczsKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+bmFtZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hcmdzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGbGFncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZmxhZ3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJvcGFnYXRpb25TdG9wcGVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnByb3BhZ2F0aW9uU3RvcHBlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkCnsKJHRoaXMtPnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxUcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJFdmVudDsKdXNlIENvbXBvc2VyXElPXEJ1ZmZlcklPOwp1c2UgQ29tcG9zZXJcSU9cQ29uc29sZUlPOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE9wZXJhdGlvbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNjcmlwdDsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxQYWNrYWdlRXZlbnQ7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcQmluYXJ5SW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxTY3JpcHRcRXZlbnQgYXMgU2NyaXB0RXZlbnQ7CnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyaW5nSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaHBFeGVjdXRhYmxlRmluZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwoKCgoKCgoKCgoKCgoKCmNsYXNzIEV2ZW50RGlzcGF0Y2hlcgp7Cgpwcm90ZWN0ZWQgJGNvbXBvc2VyOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkbG9hZGVyOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICRsaXN0ZW5lcnMgPSBbXTsKCnByb3RlY3RlZCAkcnVuU2NyaXB0cyA9IHRydWU7Cgpwcml2YXRlICRldmVudFN0YWNrOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmV2ZW50U3RhY2sgPSBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UnVuU2NyaXB0cyhib29sICRydW5TY3JpcHRzID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cnVuU2NyaXB0cyA9IChib29sKSAkcnVuU2NyaXB0czsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2goP3N0cmluZyAkZXZlbnROYW1lLCA/RXZlbnQgJGV2ZW50ID0gbnVsbCk6IGludAp7CmlmIChudWxsID09PSAkZXZlbnQpIHsKaWYgKG51bGwgPT09ICRldmVudE5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0lmIG5vICRldmVudCBpcyBwYXNzZWQgaW4gdG8gJy5fX01FVEhPRF9fLicgeW91IGhhdmUgdG8gcGFzcyBpbiBhbiAkZXZlbnROYW1lLCBnb3QgbnVsbC4nKTsKfQokZXZlbnQgPSBuZXcgRXZlbnQoJGV2ZW50TmFtZSk7Cn0KCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaCgkZXZlbnQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2hTY3JpcHQoc3RyaW5nICRldmVudE5hbWUsIGJvb2wgJGRldk1vZGUgPSBmYWxzZSwgYXJyYXkgJGFkZGl0aW9uYWxBcmdzID0gW10sIGFycmF5ICRmbGFncyA9IFtdKTogaW50CnsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlcicpKTsKCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaChuZXcgU2NyaXB0XEV2ZW50KCRldmVudE5hbWUsICR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvLCAkZGV2TW9kZSwgJGFkZGl0aW9uYWxBcmdzLCAkZmxhZ3MpKTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc3BhdGNoUGFja2FnZUV2ZW50KHN0cmluZyAkZXZlbnROYW1lLCBib29sICRkZXZNb2RlLCBSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBPcGVyYXRpb25JbnRlcmZhY2UgJG9wZXJhdGlvbik6IGludAp7CmFzc2VydCgkdGhpcy0+Y29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciwgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXInKSk7CgpyZXR1cm4gJHRoaXMtPmRvRGlzcGF0Y2gobmV3IFBhY2thZ2VFdmVudCgkZXZlbnROYW1lLCAkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbywgJGRldk1vZGUsICRsb2NhbFJlcG8sICRvcGVyYXRpb25zLCAkb3BlcmF0aW9uKSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc3BhdGNoSW5zdGFsbGVyRXZlbnQoc3RyaW5nICRldmVudE5hbWUsIGJvb2wgJGRldk1vZGUsIGJvb2wgJGV4ZWN1dGVPcGVyYXRpb25zLCBUcmFuc2FjdGlvbiAkdHJhbnNhY3Rpb24pOiBpbnQKewphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIsIG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hlZCB3aXRoIGEgZnVsbHkgbG9hZGVkIENvbXBvc2VyJykpOwoKcmV0dXJuICR0aGlzLT5kb0Rpc3BhdGNoKG5ldyBJbnN0YWxsZXJFdmVudCgkZXZlbnROYW1lLCAkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbywgJGRldk1vZGUsICRleGVjdXRlT3BlcmF0aW9ucywgJHRyYW5zYWN0aW9uKSk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRGlzcGF0Y2goRXZlbnQgJGV2ZW50KQp7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ERUJVR19FVkVOVFMnKSkgewokZGV0YWlscyA9IG51bGw7CmlmICgkZXZlbnQgaW5zdGFuY2VvZiBQYWNrYWdlRXZlbnQpIHsKJGRldGFpbHMgPSAoc3RyaW5nKSAkZXZlbnQtPmdldE9wZXJhdGlvbigpOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRGlzcGF0Y2hpbmcgPGluZm8+Jy4kZXZlbnQtPmdldE5hbWUoKS4nPC9pbmZvPicuKCRkZXRhaWxzID8gJyAoJy4kZGV0YWlscy4nKScgOiAnJykuJyBldmVudCcpOwp9CgokbGlzdGVuZXJzID0gJHRoaXMtPmdldExpc3RlbmVycygkZXZlbnQpOwoKJHRoaXMtPnB1c2hFdmVudCgkZXZlbnQpOwoKdHJ5IHsKJHJldHVybk1heCA9IDA7CmZvcmVhY2ggKCRsaXN0ZW5lcnMgYXMgJGNhbGxhYmxlKSB7CiRyZXR1cm4gPSAwOwokdGhpcy0+ZW5zdXJlQmluRGlySXNJblBhdGgoKTsKCmlmICghaXNfc3RyaW5nKCRjYWxsYWJsZSkpIHsKaWYgKCFpc19jYWxsYWJsZSgkY2FsbGFibGUpKSB7CiRjbGFzc05hbWUgPSBpc19vYmplY3QoJGNhbGxhYmxlWzBdKSA/IGdldF9jbGFzcygkY2FsbGFibGVbMF0pIDogJGNhbGxhYmxlWzBdOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTdWJzY3JpYmVyICcuJGNsYXNzTmFtZS4nOjonLiRjYWxsYWJsZVsxXS4nIGZvciBldmVudCAnLiRldmVudC0+Z2V0TmFtZSgpLicgaXMgbm90IGNhbGxhYmxlLCBtYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYW5kIHB1YmxpYycpOwp9CmlmIChpc19hcnJheSgkY2FsbGFibGUpICYmIChpc19zdHJpbmcoJGNhbGxhYmxlWzBdKSB8fCBpc19vYmplY3QoJGNhbGxhYmxlWzBdKSkgJiYgaXNfc3RyaW5nKCRjYWxsYWJsZVsxXSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJz4gJXM6ICVzJywgJGV2ZW50LT5nZXROYW1lKCksIChpc19vYmplY3QoJGNhbGxhYmxlWzBdKSA/IGdldF9jbGFzcygkY2FsbGFibGVbMF0pIDogJGNhbGxhYmxlWzBdKS4nLT4nLiRjYWxsYWJsZVsxXSksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQokcmV0dXJuID0gZmFsc2UgPT09ICRjYWxsYWJsZSgkZXZlbnQpID8gMSA6IDA7Cn0gZWxzZWlmICgkdGhpcy0+aXNDb21wb3NlclNjcmlwdCgkY2FsbGFibGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlcycsICRldmVudC0+Z2V0TmFtZSgpLCAkY2FsbGFibGUpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cgokc2NyaXB0ID0gZXhwbG9kZSgnICcsIHN1YnN0cigkY2FsbGFibGUsIDEpKTsKJHNjcmlwdE5hbWUgPSAkc2NyaXB0WzBdOwp1bnNldCgkc2NyaXB0WzBdKTsKCiRhcmdzID0gYXJyYXlfbWVyZ2UoJHNjcmlwdCwgJGV2ZW50LT5nZXRBcmd1bWVudHMoKSk7CiRmbGFncyA9ICRldmVudC0+Z2V0RmxhZ3MoKTsKaWYgKGlzc2V0KCRmbGFnc1snc2NyaXB0LWFsaWFzLWlucHV0J10pKSB7CiRhcmdzU3RyaW5nID0gaW1wbG9kZSgnICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRhcmcpIHsgcmV0dXJuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRhcmcpOyB9LCAkc2NyaXB0KSk7CiRmbGFnc1snc2NyaXB0LWFsaWFzLWlucHV0J10gPSAkYXJnc1N0cmluZyAuICcgJyAuICRmbGFnc1snc2NyaXB0LWFsaWFzLWlucHV0J107CnVuc2V0KCRhcmdzU3RyaW5nKTsKfQppZiAoc3RycG9zKCRjYWxsYWJsZSwgJ0Bjb21wb3NlciAnKSA9PT0gMCkgewokZXhlYyA9ICR0aGlzLT5nZXRQaHBFeGVjQ29tbWFuZCgpIC4gJyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfQklOQVJZJykpIC4gJyAnIC4gaW1wbG9kZSgnICcsICRhcmdzKTsKaWYgKDAgIT09ICgkZXhpdENvZGUgPSAkdGhpcy0+ZXhlY3V0ZVR0eSgkZXhlYykpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8ZXJyb3I+U2NyaXB0ICVzIGhhbmRsaW5nIHRoZSAlcyBldmVudCByZXR1cm5lZCB3aXRoIGVycm9yIGNvZGUgJy4kZXhpdENvZGUuJzwvZXJyb3I+JywgJGNhbGxhYmxlLCAkZXZlbnQtPmdldE5hbWUoKSksIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cgp0aHJvdyBuZXcgU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uKCdFcnJvciBPdXRwdXQ6ICcuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICRleGl0Q29kZSk7Cn0KfSBlbHNlIHsKaWYgKCEkdGhpcy0+Z2V0TGlzdGVuZXJzKG5ldyBFdmVudCgkc2NyaXB0TmFtZSkpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8d2FybmluZz5Zb3UgbWFkZSBhIHJlZmVyZW5jZSB0byBhIG5vbi1leGlzdGVudCBzY3JpcHQgJXM8L3dhcm5pbmc+JywgJGNhbGxhYmxlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKdHJ5IHsKCiRzY3JpcHRFdmVudCA9IG5ldyBTY3JpcHRcRXZlbnQoJHNjcmlwdE5hbWUsICRldmVudC0+Z2V0Q29tcG9zZXIoKSwgJGV2ZW50LT5nZXRJTygpLCAkZXZlbnQtPmlzRGV2TW9kZSgpLCAkYXJncywgJGZsYWdzKTsKJHNjcmlwdEV2ZW50LT5zZXRPcmlnaW5hdGluZ0V2ZW50KCRldmVudCk7CiRyZXR1cm4gPSAkdGhpcy0+ZGlzcGF0Y2goJHNjcmlwdE5hbWUsICRzY3JpcHRFdmVudCk7Cn0gY2F0Y2ggKFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGVycm9yPlNjcmlwdCAlcyB3YXMgY2FsbGVkIHZpYSAlczwvZXJyb3I+JywgJGNhbGxhYmxlLCAkZXZlbnQtPmdldE5hbWUoKSksIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CnRocm93ICRlOwp9Cn0KfSBlbHNlaWYgKCR0aGlzLT5pc1BocFNjcmlwdCgkY2FsbGFibGUpKSB7CiRjbGFzc05hbWUgPSBzdWJzdHIoJGNhbGxhYmxlLCAwLCBzdHJwb3MoJGNhbGxhYmxlLCAnOjonKSk7CiRtZXRob2ROYW1lID0gc3Vic3RyKCRjYWxsYWJsZSwgc3RycG9zKCRjYWxsYWJsZSwgJzo6JykgKyAyKTsKCmlmICghY2xhc3NfZXhpc3RzKCRjbGFzc05hbWUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q2xhc3MgJy4kY2xhc3NOYW1lLicgaXMgbm90IGF1dG9sb2FkYWJsZSwgY2FuIG5vdCBjYWxsICcuJGV2ZW50LT5nZXROYW1lKCkuJyBzY3JpcHQ8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKY29udGludWU7Cn0KaWYgKCFpc19jYWxsYWJsZSgkY2FsbGFibGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+TWV0aG9kICcuJGNhbGxhYmxlLicgaXMgbm90IGNhbGxhYmxlLCBjYW4gbm90IGNhbGwgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHNjcmlwdDwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQoKdHJ5IHsKJHJldHVybiA9IGZhbHNlID09PSAkdGhpcy0+ZXhlY3V0ZUV2ZW50UGhwU2NyaXB0KCRjbGFzc05hbWUsICRtZXRob2ROYW1lLCAkZXZlbnQpID8gMSA6IDA7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJG1lc3NhZ2UgPSAiU2NyaXB0ICVzIGhhbmRsaW5nIHRoZSAlcyBldmVudCB0ZXJtaW5hdGVkIHdpdGggYW4gZXhjZXB0aW9uIjsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy5zcHJpbnRmKCRtZXNzYWdlLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKS4nPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp0aHJvdyAkZTsKfQp9IGVsc2VpZiAoJHRoaXMtPmlzQ29tbWFuZENsYXNzKCRjYWxsYWJsZSkpIHsKJGNsYXNzTmFtZSA9ICRjYWxsYWJsZTsKaWYgKCFjbGFzc19leGlzdHMoJGNsYXNzTmFtZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DbGFzcyAnLiRjbGFzc05hbWUuJyBpcyBub3QgYXV0b2xvYWRhYmxlLCBjYW4gbm90IGNhbGwgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHNjcmlwdDwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQppZiAoIWlzX2EoJGNsYXNzTmFtZSwgQ29tbWFuZDo6Y2xhc3MsIHRydWUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q2xhc3MgJy4kY2xhc3NOYW1lLicgZG9lcyBub3QgZXh0ZW5kICcuQ29tbWFuZDo6Y2xhc3MuJywgY2FuIG5vdCBjYWxsICcuJGV2ZW50LT5nZXROYW1lKCkuJyBzY3JpcHQ8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKY29udGludWU7Cn0KaWYgKGRlZmluZWQoJ0NvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM6Oicuc3RyX3JlcGxhY2UoJy0nLCAnXycsIHN0cnRvdXBwZXIoJGV2ZW50LT5nZXROYW1lKCkpKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgY2Fubm90IGJpbmQgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHRvIGEgQ29tbWFuZCBjbGFzcywgdXNlIGEgbm9uLXJlc2VydmVkIG5hbWU8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKY29udGludWU7Cn0KCiRhcHAgPSBuZXcgQXBwbGljYXRpb24oKTsKJGFwcC0+c2V0Q2F0Y2hFeGNlcHRpb25zKGZhbHNlKTsKaWYgKG1ldGhvZF9leGlzdHMoJGFwcCwgJ3NldENhdGNoRXJyb3JzJykpIHsKJGFwcC0+c2V0Q2F0Y2hFcnJvcnMoZmFsc2UpOwp9CiRhcHAtPnNldEF1dG9FeGl0KGZhbHNlKTsKJGNtZCA9IG5ldyAkY2xhc3NOYW1lKCRldmVudC0+Z2V0TmFtZSgpKTsKJGFwcC0+YWRkKCRjbWQpOwokYXBwLT5zZXREZWZhdWx0Q29tbWFuZCgoc3RyaW5nKSAkY21kLT5nZXROYW1lKCksIHRydWUpOwp0cnkgewokYXJncyA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkYXJnKSB7IHJldHVybiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkYXJnKTsgfSwgJGV2ZW50LT5nZXRBcmd1bWVudHMoKSkpOwoKCmlmICgkdGhpcy0+aW8gaW5zdGFuY2VvZiBDb25zb2xlSU8pIHsKJHJlZmxQcm9wID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJHRoaXMtPmlvLCAnb3V0cHV0Jyk7CmlmIChQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSB7CiRyZWZsUHJvcC0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKfQokb3V0cHV0ID0gJHJlZmxQcm9wLT5nZXRWYWx1ZSgkdGhpcy0+aW8pOwp9IGVsc2Ugewokb3V0cHV0ID0gbmV3IENvbnNvbGVPdXRwdXQoKTsKfQokcmV0dXJuID0gJGFwcC0+cnVuKG5ldyBTdHJpbmdJbnB1dCgkZXZlbnQtPmdldEZsYWdzKClbJ3NjcmlwdC1hbGlhcy1pbnB1dCddID8/ICRhcmdzKSwgJG91dHB1dCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJG1lc3NhZ2UgPSAiU2NyaXB0ICVzIGhhbmRsaW5nIHRoZSAlcyBldmVudCB0ZXJtaW5hdGVkIHdpdGggYW4gZXhjZXB0aW9uIjsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy5zcHJpbnRmKCRtZXNzYWdlLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKS4nPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp0aHJvdyAkZTsKfQp9IGVsc2UgewokYXJncyA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWydDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcicsICdlc2NhcGUnXSwgJGV2ZW50LT5nZXRBcmd1bWVudHMoKSkpOwoKCmlmIChzdHJwb3MoJGNhbGxhYmxlLCAnQHB1dGVudiAnKSA9PT0gMCkgewokZXhlYyA9ICRjYWxsYWJsZTsKfSBlbHNlIHsKJGV4ZWMgPSAkY2FsbGFibGUgLiAoJGFyZ3MgPT09ICcnID8gJycgOiAnICcuJGFyZ3MpOwp9CgppZiAoJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczogJXMnLCAkZXZlbnQtPmdldE5hbWUoKSwgJGV4ZWMpKTsKfSBlbHNlaWYgKCRldmVudC0+Z2V0TmFtZSgpICE9PSAnX19leGVjX2NvbW1hbmQnKSB7CgokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlcycsICRleGVjKSk7Cn0KCiRwb3NzaWJsZUxvY2FsQmluYXJpZXMgPSAkdGhpcy0+Y29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0QmluYXJpZXMoKTsKaWYgKCRwb3NzaWJsZUxvY2FsQmluYXJpZXMpIHsKZm9yZWFjaCAoJHBvc3NpYmxlTG9jYWxCaW5hcmllcyBhcyAkbG9jYWxFeGVjKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XGInLnByZWdfcXVvdGUoJGNhbGxhYmxlKS4nJH0nLCAkbG9jYWxFeGVjKSkgewokY2FsbGVyID0gQmluYXJ5SW5zdGFsbGVyOjpkZXRlcm1pbmVCaW5hcnlDYWxsZXIoJGxvY2FsRXhlYyk7CiRleGVjID0gUHJlZzo6cmVwbGFjZSgne14nLnByZWdfcXVvdGUoJGNhbGxhYmxlKS4nfScsICRjYWxsZXIgLiAnICcgLiAkbG9jYWxFeGVjLCAkZXhlYyk7CmJyZWFrOwp9Cn0KfQoKaWYgKHN0cnBvcygkZXhlYywgJ0BwdXRlbnYgJykgPT09IDApIHsKaWYgKGZhbHNlID09PSBzdHJwb3MoJGV4ZWMsICc9JykpIHsKUGxhdGZvcm06OmNsZWFyRW52KHN1YnN0cigkZXhlYywgOCkpOwp9IGVsc2UgewpbJHZhciwgJHZhbHVlXSA9IGV4cGxvZGUoJz0nLCBzdWJzdHIoJGV4ZWMsIDgpLCAyKTsKUGxhdGZvcm06OnB1dEVudigkdmFyLCAkdmFsdWUpOwp9Cgpjb250aW51ZTsKfQppZiAoc3RycG9zKCRleGVjLCAnQHBocCAnKSA9PT0gMCkgewokcGF0aEFuZEFyZ3MgPSBzdWJzdHIoJGV4ZWMsIDUpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRwYXRoQW5kQXJncyA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygne15cUyt9Jywgc3RhdGljIGZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCAoc3RyaW5nKSAkcGF0aFswXSk7Cn0sICRwYXRoQW5kQXJncyk7Cn0KCgokbWF0Y2hlZCA9IFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teW15cJyJccy9cXFxcXSt9JywgJHBhdGhBbmRBcmdzLCAkbWF0Y2gpOwppZiAoJG1hdGNoZWQgJiYgIWZpbGVfZXhpc3RzKCRtYXRjaFswXSkpIHsKJGZpbmRlciA9IG5ldyBFeGVjdXRhYmxlRmluZGVyOwppZiAoJHBhdGhUb0V4ZWMgPSAkZmluZGVyLT5maW5kKCRtYXRjaFswXSkpIHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokZXhlY1dpdGhvdXRFeHQgPSBQcmVnOjpyZXBsYWNlKCd7XC4oZXhlfGJhdHxjbWR8Y29tKSR9aScsICcnLCAkcGF0aFRvRXhlYyk7CgppZiAoZmlsZV9leGlzdHMoJGV4ZWNXaXRob3V0RXh0KSkgewokcGF0aFRvRXhlYyA9ICRleGVjV2l0aG91dEV4dDsKfQp1bnNldCgkZXhlY1dpdGhvdXRFeHQpOwp9CiRwYXRoQW5kQXJncyA9ICRwYXRoVG9FeGVjIC4gc3Vic3RyKCRwYXRoQW5kQXJncywgc3RybGVuKCRtYXRjaFswXSkpOwp9Cn0KJGV4ZWMgPSAkdGhpcy0+Z2V0UGhwRXhlY0NvbW1hbmQoKSAuICcgJyAuICRwYXRoQW5kQXJnczsKfSBlbHNlIHsKJGZpbmRlciA9IG5ldyBQaHBFeGVjdXRhYmxlRmluZGVyKCk7CiRwaHBQYXRoID0gJGZpbmRlci0+ZmluZChmYWxzZSk7CmlmICgkcGhwUGF0aCkgewpQbGF0Zm9ybTo6cHV0RW52KCdQSFBfQklOQVJZJywgJHBocFBhdGgpOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRleGVjID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7XlxTK30nLCBzdGF0aWMgZnVuY3Rpb24gKCRwYXRoKSB7CmFzc2VydChpc19zdHJpbmcoJHBhdGhbMF0pKTsKCnJldHVybiBzdHJfcmVwbGFjZSgnLycsICdcXCcsICRwYXRoWzBdKTsKfSwgJGV4ZWMpOwp9Cn0KCgoKCmlmIChzdHJwb3MoJGV4ZWMsICdjb21wb3NlciAnKSA9PT0gMCkgewokZXhlYyA9ICR0aGlzLT5nZXRQaHBFeGVjQ29tbWFuZCgpIC4gJyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfQklOQVJZJykpIC4gc3Vic3RyKCRleGVjLCA4KTsKfQoKaWYgKDAgIT09ICgkZXhpdENvZGUgPSAkdGhpcy0+ZXhlY3V0ZVR0eSgkZXhlYykpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8ZXJyb3I+U2NyaXB0ICVzIGhhbmRsaW5nIHRoZSAlcyBldmVudCByZXR1cm5lZCB3aXRoIGVycm9yIGNvZGUgJy4kZXhpdENvZGUuJzwvZXJyb3I+JywgJGNhbGxhYmxlLCAkZXZlbnQtPmdldE5hbWUoKSksIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cgp0aHJvdyBuZXcgU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uKCdFcnJvciBPdXRwdXQ6ICcuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICRleGl0Q29kZSk7Cn0KfQoKJHJldHVybk1heCA9IG1heCgkcmV0dXJuTWF4LCAkcmV0dXJuKTsKCmlmICgkZXZlbnQtPmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsKYnJlYWs7Cn0KfQp9IGZpbmFsbHkgewokdGhpcy0+cG9wRXZlbnQoKTsKfQoKcmV0dXJuICRyZXR1cm5NYXg7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlVHR5KHN0cmluZyAkZXhlYyk6IGludAp7CmlmICgkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGVUdHkoJGV4ZWMpOwp9CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGV4ZWMpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGhwRXhlY0NvbW1hbmQoKTogc3RyaW5nCnsKJGZpbmRlciA9IG5ldyBQaHBFeGVjdXRhYmxlRmluZGVyKCk7CiRwaHBQYXRoID0gJGZpbmRlci0+ZmluZChmYWxzZSk7CmlmICghJHBocFBhdGgpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gbG9jYXRlIFBIUCBiaW5hcnkgdG8gZXhlY3V0ZSAnLiRwaHBQYXRoKTsKfQokcGhwQXJncyA9ICRmaW5kZXItPmZpbmRBcmd1bWVudHMoKTsKJHBocEFyZ3MgPSAkcGhwQXJncyA/ICcgJyAuIGltcGxvZGUoJyAnLCAkcGhwQXJncykgOiAnJzsKJGFsbG93VXJsRk9wZW5GbGFnID0gJyAtZCBhbGxvd191cmxfZm9wZW49JyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKGluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpKTsKJGRpc2FibGVGdW5jdGlvbnNGbGFnID0gJyAtZCBkaXNhYmxlX2Z1bmN0aW9ucz0nIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSk7CiRtZW1vcnlMaW1pdEZsYWcgPSAnIC1kIG1lbW9yeV9saW1pdD0nIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoaW5pX2dldCgnbWVtb3J5X2xpbWl0JykpOwoKcmV0dXJuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwaHBQYXRoKSAuICRwaHBBcmdzIC4gJGFsbG93VXJsRk9wZW5GbGFnIC4gJGRpc2FibGVGdW5jdGlvbnNGbGFnIC4gJG1lbW9yeUxpbWl0RmxhZzsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZUV2ZW50UGhwU2NyaXB0KHN0cmluZyAkY2xhc3NOYW1lLCBzdHJpbmcgJG1ldGhvZE5hbWUsIEV2ZW50ICRldmVudCkKewppZiAoJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczogJXM6OiVzJywgJGV2ZW50LT5nZXROYW1lKCksICRjbGFzc05hbWUsICRtZXRob2ROYW1lKSk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOjolcycsICRjbGFzc05hbWUsICRtZXRob2ROYW1lKSk7Cn0KCnJldHVybiAkY2xhc3NOYW1lOjokbWV0aG9kTmFtZSgkZXZlbnQpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZExpc3RlbmVyKHN0cmluZyAkZXZlbnROYW1lLCAkbGlzdGVuZXIsIGludCAkcHJpb3JpdHkgPSAwKTogdm9pZAp7CiR0aGlzLT5saXN0ZW5lcnNbJGV2ZW50TmFtZV1bJHByaW9yaXR5XVtdID0gJGxpc3RlbmVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoJGxpc3RlbmVyKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5saXN0ZW5lcnMgYXMgJGV2ZW50TmFtZSA9PiAkcHJpb3JpdGllcykgewpmb3JlYWNoICgkcHJpb3JpdGllcyBhcyAkcHJpb3JpdHkgPT4gJGxpc3RlbmVycykgewpmb3JlYWNoICgkbGlzdGVuZXJzIGFzICRpbmRleCA9PiAkY2FuZGlkYXRlKSB7CmlmICgkbGlzdGVuZXIgPT09ICRjYW5kaWRhdGUgfHwgKGlzX2FycmF5KCRjYW5kaWRhdGUpICYmIGlzX29iamVjdCgkbGlzdGVuZXIpICYmICRjYW5kaWRhdGVbMF0gPT09ICRsaXN0ZW5lcikpIHsKdW5zZXQoJHRoaXMtPmxpc3RlbmVyc1skZXZlbnROYW1lXVskcHJpb3JpdHldWyRpbmRleF0pOwp9Cn0KfQp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFN1YnNjcmliZXIoRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlICRzdWJzY3JpYmVyKTogdm9pZAp7CmZvcmVhY2ggKCRzdWJzY3JpYmVyLT5nZXRTdWJzY3JpYmVkRXZlbnRzKCkgYXMgJGV2ZW50TmFtZSA9PiAkcGFyYW1zKSB7CmlmIChpc19zdHJpbmcoJHBhcmFtcykpIHsKJHRoaXMtPmFkZExpc3RlbmVyKCRldmVudE5hbWUsIFskc3Vic2NyaWJlciwgJHBhcmFtc10pOwp9IGVsc2VpZiAoaXNfc3RyaW5nKCRwYXJhbXNbMF0pKSB7CiR0aGlzLT5hZGRMaXN0ZW5lcigkZXZlbnROYW1lLCBbJHN1YnNjcmliZXIsICRwYXJhbXNbMF1dLCAkcGFyYW1zWzFdID8/IDApOwp9IGVsc2Ugewpmb3JlYWNoICgkcGFyYW1zIGFzICRsaXN0ZW5lcikgewokdGhpcy0+YWRkTGlzdGVuZXIoJGV2ZW50TmFtZSwgWyRzdWJzY3JpYmVyLCAkbGlzdGVuZXJbMF1dLCAkbGlzdGVuZXJbMV0gPz8gMCk7Cn0KfQp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldExpc3RlbmVycyhFdmVudCAkZXZlbnQpOiBhcnJheQp7CiRzY3JpcHRMaXN0ZW5lcnMgPSAkdGhpcy0+cnVuU2NyaXB0cyA/ICR0aGlzLT5nZXRTY3JpcHRMaXN0ZW5lcnMoJGV2ZW50KSA6IFtdOwoKaWYgKCFpc3NldCgkdGhpcy0+bGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXVswXSkpIHsKJHRoaXMtPmxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV1bMF0gPSBbXTsKfQprcnNvcnQoJHRoaXMtPmxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV0pOwoKJGxpc3RlbmVycyA9ICR0aGlzLT5saXN0ZW5lcnM7CiRsaXN0ZW5lcnNbJGV2ZW50LT5nZXROYW1lKCldWzBdID0gYXJyYXlfbWVyZ2UoJGxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV1bMF0sICRzY3JpcHRMaXN0ZW5lcnMpOwoKcmV0dXJuIGFycmF5X21lcmdlKC4uLiRsaXN0ZW5lcnNbJGV2ZW50LT5nZXROYW1lKCldKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0V2ZW50TGlzdGVuZXJzKEV2ZW50ICRldmVudCk6IGJvb2wKewokbGlzdGVuZXJzID0gJHRoaXMtPmdldExpc3RlbmVycygkZXZlbnQpOwoKcmV0dXJuIGNvdW50KCRsaXN0ZW5lcnMpID4gMDsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNjcmlwdExpc3RlbmVycyhFdmVudCAkZXZlbnQpOiBhcnJheQp7CiRwYWNrYWdlID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRzY3JpcHRzID0gJHBhY2thZ2UtPmdldFNjcmlwdHMoKTsKCmlmIChlbXB0eSgkc2NyaXB0c1skZXZlbnQtPmdldE5hbWUoKV0pKSB7CnJldHVybiBbXTsKfQoKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlcicpKTsKCmlmICgkdGhpcy0+bG9hZGVyKSB7CiR0aGlzLT5sb2FkZXItPnVucmVnaXN0ZXIoKTsKfQoKJGdlbmVyYXRvciA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0QXV0b2xvYWRHZW5lcmF0b3IoKTsKaWYgKCRldmVudCBpbnN0YW5jZW9mIFNjcmlwdEV2ZW50KSB7CiRnZW5lcmF0b3ItPnNldERldk1vZGUoJGV2ZW50LT5pc0Rldk1vZGUoKSk7Cn0KCiRwYWNrYWdlcyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCktPmdldENhbm9uaWNhbFBhY2thZ2VzKCk7CiRwYWNrYWdlTWFwID0gJGdlbmVyYXRvci0+YnVpbGRQYWNrYWdlTWFwKCR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLCAkcGFja2FnZSwgJHBhY2thZ2VzKTsKJG1hcCA9ICRnZW5lcmF0b3ItPnBhcnNlQXV0b2xvYWRzKCRwYWNrYWdlTWFwLCAkcGFja2FnZSk7CiR0aGlzLT5sb2FkZXIgPSAkZ2VuZXJhdG9yLT5jcmVhdGVMb2FkZXIoJG1hcCwgJHRoaXMtPmNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCd2ZW5kb3ItZGlyJykpOwokdGhpcy0+bG9hZGVyLT5yZWdpc3RlcihmYWxzZSk7CgpyZXR1cm4gJHNjcmlwdHNbJGV2ZW50LT5nZXROYW1lKCldOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNQaHBTY3JpcHQoc3RyaW5nICRjYWxsYWJsZSk6IGJvb2wKewpyZXR1cm4gZmFsc2UgPT09IHN0cnBvcygkY2FsbGFibGUsICcgJykgJiYgZmFsc2UgIT09IHN0cnBvcygkY2FsbGFibGUsICc6OicpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNDb21tYW5kQ2xhc3Moc3RyaW5nICRjYWxsYWJsZSk6IGJvb2wKewpyZXR1cm4gc3RyX2NvbnRhaW5zKCRjYWxsYWJsZSwgJ1xcJykgJiYgIXN0cl9jb250YWlucygkY2FsbGFibGUsICcgJykgJiYgc3RyX2VuZHNfd2l0aCgkY2FsbGFibGUsICdDb21tYW5kJyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc0NvbXBvc2VyU2NyaXB0KHN0cmluZyAkY2FsbGFibGUpOiBib29sCnsKcmV0dXJuIHN0cnBvcygkY2FsbGFibGUsICdAJykgPT09IDAgJiYgc3RycG9zKCRjYWxsYWJsZSwgJ0BwaHAgJykgIT09IDAgJiYgc3RycG9zKCRjYWxsYWJsZSwgJ0BwdXRlbnYgJykgIT09IDA7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hFdmVudChFdmVudCAkZXZlbnQpOiBpbnQKewokZXZlbnROYW1lID0gJGV2ZW50LT5nZXROYW1lKCk7CmlmIChpbl9hcnJheSgkZXZlbnROYW1lLCAkdGhpcy0+ZXZlbnRTdGFjaykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoIkNpcmN1bGFyIGNhbGwgdG8gc2NyaXB0IGhhbmRsZXIgJyVzJyBkZXRlY3RlZCIsICRldmVudE5hbWUpKTsKfQoKcmV0dXJuIGFycmF5X3B1c2goJHRoaXMtPmV2ZW50U3RhY2ssICRldmVudE5hbWUpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcG9wRXZlbnQoKTogP3N0cmluZwp7CnJldHVybiBhcnJheV9wb3AoJHRoaXMtPmV2ZW50U3RhY2spOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGVuc3VyZUJpbkRpcklzSW5QYXRoKCk6IHZvaWQKewokcGF0aEVudiA9ICdQQVRIJzsKCgoKCmlmICghaXNzZXQoJF9TRVJWRVJbJHBhdGhFbnZdKSAmJiBpc3NldCgkX1NFUlZFUlsnUGF0aCddKSkgewokcGF0aEVudiA9ICdQYXRoJzsKfQoKCiRiaW5EaXIgPSAkdGhpcy0+Y29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1kaXInKTsKaWYgKGlzX2RpcigkYmluRGlyKSkgewokYmluRGlyID0gcmVhbHBhdGgoJGJpbkRpcik7CiRwYXRoVmFsdWUgPSAoc3RyaW5nKSBQbGF0Zm9ybTo6Z2V0RW52KCRwYXRoRW52KTsKaWYgKCFQcmVnOjppc01hdGNoKCd7KF58Jy5QQVRIX1NFUEFSQVRPUi4nKScucHJlZ19xdW90ZSgkYmluRGlyKS4nKCR8Jy5QQVRIX1NFUEFSQVRPUi4nKX0nLCAkcGF0aFZhbHVlKSkgewpQbGF0Zm9ybTo6cHV0RW52KCRwYXRoRW52LCAkYmluRGlyLlBBVEhfU0VQQVJBVE9SLiRwYXRoVmFsdWUpOwp9Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXI7CgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdWJzY3JpYmVkRXZlbnRzKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlcjsKCgoKCgoKY2xhc3MgU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxFeGNlcHRpb247CgoKCgpjbGFzcyBJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgTm9Tc2xFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXENvbmZpZ1xKc29uQ29uZmlnU291cmNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIFBoYXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJTdHlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcQXV0b2xvYWRcQXV0b2xvYWRHZW5lcmF0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKdXNlIFppcEFyY2hpdmU7CgoKCgoKCgoKCmNsYXNzIEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldEhvbWVEaXIoKTogc3RyaW5nCnsKJGhvbWUgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9IT01FJyk7CmlmICgkaG9tZSkgewpyZXR1cm4gJGhvbWU7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKaWYgKCFQbGF0Zm9ybTo6Z2V0RW52KCdBUFBEQVRBJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgQVBQREFUQSBvciBDT01QT1NFUl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmUgc2V0IGZvciBjb21wb3NlciB0byBydW4gY29ycmVjdGx5Jyk7Cn0KCnJldHVybiBydHJpbShzdHJ0cihQbGF0Zm9ybTo6Z2V0RW52KCdBUFBEQVRBJyksICdcXCcsICcvJyksICcvJykgLiAnL0NvbXBvc2VyJzsKfQoKJHVzZXJEaXIgPSBzZWxmOjpnZXRVc2VyRGlyKCk7CiRkaXJzID0gW107CgppZiAoc2VsZjo6dXNlWGRnKCkpIHsKCiR4ZGdDb25maWcgPSBQbGF0Zm9ybTo6Z2V0RW52KCdYREdfQ09ORklHX0hPTUUnKTsKaWYgKCEkeGRnQ29uZmlnKSB7CiR4ZGdDb25maWcgPSAkdXNlckRpciAuICcvLmNvbmZpZyc7Cn0KCiRkaXJzW10gPSAkeGRnQ29uZmlnIC4gJy9jb21wb3Nlcic7Cn0KCiRkaXJzW10gPSAkdXNlckRpciAuICcvLmNvbXBvc2VyJzsKCgpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmIChTaWxlbmNlcjo6Y2FsbCgnaXNfZGlyJywgJGRpcikpIHsKcmV0dXJuICRkaXI7Cn0KfQoKCnJldHVybiAkZGlyc1swXTsKfQoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBnZXRDYWNoZURpcihzdHJpbmcgJGhvbWUpOiBzdHJpbmcKewokY2FjaGVEaXIgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9DQUNIRV9ESVInKTsKaWYgKCRjYWNoZURpcikgewpyZXR1cm4gJGNhY2hlRGlyOwp9CgokaG9tZUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lRW52KSB7CnJldHVybiAkaG9tZUVudiAuICcvY2FjaGUnOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CmlmICgkY2FjaGVEaXIgPSBQbGF0Zm9ybTo6Z2V0RW52KCdMT0NBTEFQUERBVEEnKSkgewokY2FjaGVEaXIgLj0gJy9Db21wb3Nlcic7Cn0gZWxzZSB7CiRjYWNoZURpciA9ICRob21lIC4gJy9jYWNoZSc7Cn0KCnJldHVybiBydHJpbShzdHJ0cigkY2FjaGVEaXIsICdcXCcsICcvJyksICcvJyk7Cn0KCiR1c2VyRGlyID0gc2VsZjo6Z2V0VXNlckRpcigpOwppZiAoUEhQX09TID09PSAnRGFyd2luJykgewoKaWYgKGlzX2RpcigkaG9tZSAuICcvY2FjaGUnKSAmJiAhaXNfZGlyKCR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3NlcicpKSB7ClNpbGVuY2VyOjpjYWxsKCdyZW5hbWUnLCAkaG9tZSAuICcvY2FjaGUnLCAkdXNlckRpciAuICcvTGlicmFyeS9DYWNoZXMvY29tcG9zZXInKTsKfQoKcmV0dXJuICR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3Nlcic7Cn0KCmlmICgkaG9tZSA9PT0gJHVzZXJEaXIgLiAnLy5jb21wb3NlcicgJiYgaXNfZGlyKCRob21lIC4gJy9jYWNoZScpKSB7CnJldHVybiAkaG9tZSAuICcvY2FjaGUnOwp9CgppZiAoc2VsZjo6dXNlWGRnKCkpIHsKJHhkZ0NhY2hlID0gUGxhdGZvcm06OmdldEVudignWERHX0NBQ0hFX0hPTUUnKSA/OiAkdXNlckRpciAuICcvLmNhY2hlJzsKCnJldHVybiAkeGRnQ2FjaGUgLiAnL2NvbXBvc2VyJzsKfQoKcmV0dXJuICRob21lIC4gJy9jYWNoZSc7Cn0KCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0YURpcihzdHJpbmcgJGhvbWUpOiBzdHJpbmcKewokaG9tZUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lRW52KSB7CnJldHVybiAkaG9tZUVudjsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gc3RydHIoJGhvbWUsICdcXCcsICcvJyk7Cn0KCiR1c2VyRGlyID0gc2VsZjo6Z2V0VXNlckRpcigpOwppZiAoJGhvbWUgIT09ICR1c2VyRGlyIC4gJy8uY29tcG9zZXInICYmIHNlbGY6OnVzZVhkZygpKSB7CiR4ZGdEYXRhID0gUGxhdGZvcm06OmdldEVudignWERHX0RBVEFfSE9NRScpID86ICR1c2VyRGlyIC4gJy8ubG9jYWwvc2hhcmUnOwoKcmV0dXJuICR4ZGdEYXRhIC4gJy9jb21wb3Nlcic7Cn0KCnJldHVybiAkaG9tZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVDb25maWcoP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsID9zdHJpbmcgJGN3ZCA9IG51bGwpOiBDb25maWcKewokY3dkID0gJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwoKJGNvbmZpZyA9IG5ldyBDb25maWcodHJ1ZSwgJGN3ZCk7CgoKJGhvbWUgPSBzZWxmOjpnZXRIb21lRGlyKCk7CiRjb25maWctPm1lcmdlKFsKJ2NvbmZpZycgPT4gWwonaG9tZScgPT4gJGhvbWUsCidjYWNoZS1kaXInID0+IHNlbGY6OmdldENhY2hlRGlyKCRob21lKSwKJ2RhdGEtZGlyJyA9PiBzZWxmOjpnZXREYXRhRGlyKCRob21lKSwKXSwKXSwgQ29uZmlnOjpTT1VSQ0VfREVGQVVMVCk7CgoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCdob21lJykuJy9jb25maWcuanNvbicpOwppZiAoJGZpbGUtPmV4aXN0cygpKSB7CmlmICgkaW8gaW5zdGFuY2VvZiBJT0ludGVyZmFjZSkgewokaW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgY29uZmlnIGZpbGUgJyAuICRmaWxlLT5nZXRQYXRoKCksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0Kc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGZpbGUpOwokY29uZmlnLT5tZXJnZSgkZmlsZS0+cmVhZCgpLCAkZmlsZS0+Z2V0UGF0aCgpKTsKfQokY29uZmlnLT5zZXRDb25maWdTb3VyY2UobmV3IEpzb25Db25maWdTb3VyY2UoJGZpbGUpKTsKCiRodGFjY2Vzc1Byb3RlY3QgPSAkY29uZmlnLT5nZXQoJ2h0YWNjZXNzLXByb3RlY3QnKTsKaWYgKCRodGFjY2Vzc1Byb3RlY3QpIHsKCgoKJGRpcnMgPSBbJGNvbmZpZy0+Z2V0KCdob21lJyksICRjb25maWctPmdldCgnY2FjaGUtZGlyJyksICRjb25maWctPmdldCgnZGF0YS1kaXInKV07CmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKCFmaWxlX2V4aXN0cygkZGlyIC4gJy8uaHRhY2Nlc3MnKSkgewppZiAoIWlzX2RpcigkZGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgnbWtkaXInLCAkZGlyLCAwNzc3LCB0cnVlKTsKfQpTaWxlbmNlcjo6Y2FsbCgnZmlsZV9wdXRfY29udGVudHMnLCAkZGlyIC4gJy8uaHRhY2Nlc3MnLCAnRGVueSBmcm9tIGFsbCcpOwp9Cn0KfQoKCiRmaWxlID0gbmV3IEpzb25GaWxlKCRjb25maWctPmdldCgnaG9tZScpLicvYXV0aC5qc29uJyk7CmlmICgkZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGZpbGUtPmdldFBhdGgoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQpzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJGlvLCAkZmlsZSwgSnNvbkZpbGU6OkFVVEhfU0NIRU1BKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICRmaWxlLT5yZWFkKCldLCAkZmlsZS0+Z2V0UGF0aCgpKTsKfQokY29uZmlnLT5zZXRBdXRoQ29uZmlnU291cmNlKG5ldyBKc29uQ29uZmlnU291cmNlKCRmaWxlLCB0cnVlKSk7CgoKaWYgKCRjb21wb3NlckF1dGhFbnYgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9BVVRIJykpIHsKJGF1dGhEYXRhID0ganNvbl9kZWNvZGUoJGNvbXBvc2VyQXV0aEVudik7CmlmIChudWxsID09PSAkYXV0aERhdGEpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NPTVBPU0VSX0FVVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWFsZm9ybWVkLCBzaG91bGQgYmUgYSB2YWxpZCBKU09OIG9iamVjdCcpOwp9IGVsc2UgewppZiAoJGlvIGluc3RhbmNlb2YgSU9JbnRlcmZhY2UpIHsKJGlvLT53cml0ZUVycm9yKCdMb2FkaW5nIGF1dGggY29uZmlnIGZyb20gQ09NUE9TRVJfQVVUSCcsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0Kc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGF1dGhEYXRhLCBKc29uRmlsZTo6QVVUSF9TQ0hFTUEsICdDT01QT1NFUl9BVVRIJyk7CiRhdXRoRGF0YSA9IGpzb25fZGVjb2RlKCRjb21wb3NlckF1dGhFbnYsIHRydWUpOwppZiAobnVsbCAhPT0gJGF1dGhEYXRhKSB7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkYXV0aERhdGFdLCAnQ09NUE9TRVJfQVVUSCcpOwp9Cn0KfQoKcmV0dXJuICRjb25maWc7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJGaWxlKCk6IHN0cmluZwp7CnJldHVybiB0cmltKChzdHJpbmcpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSJykpID86ICcuL2NvbXBvc2VyLmpzb24nOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvY2tGaWxlKHN0cmluZyAkY29tcG9zZXJGaWxlKTogc3RyaW5nCnsKcmV0dXJuICJqc29uIiA9PT0gcGF0aGluZm8oJGNvbXBvc2VyRmlsZSwgUEFUSElORk9fRVhURU5TSU9OKQo/IHN1YnN0cigkY29tcG9zZXJGaWxlLCAwLCAtNCkuJ2xvY2snCjogJGNvbXBvc2VyRmlsZSAuICcubG9jayc7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlQWRkaXRpb25hbFN0eWxlcygpOiBhcnJheQp7CnJldHVybiBbCidoaWdobGlnaHQnID0+IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgncmVkJyksCid3YXJuaW5nJyA9PiBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2JsYWNrJywgJ3llbGxvdycpLApdOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZU91dHB1dCgpOiBDb25zb2xlT3V0cHV0CnsKJHN0eWxlcyA9IHNlbGY6OmNyZWF0ZUFkZGl0aW9uYWxTdHlsZXMoKTsKJGZvcm1hdHRlciA9IG5ldyBPdXRwdXRGb3JtYXR0ZXIoZmFsc2UsICRzdHlsZXMpOwoKcmV0dXJuIG5ldyBDb25zb2xlT3V0cHV0KENvbnNvbGVPdXRwdXQ6OlZFUkJPU0lUWV9OT1JNQUwsIG51bGwsICRmb3JtYXR0ZXIpOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVDb21wb3NlcihJT0ludGVyZmFjZSAkaW8sICRsb2NhbENvbmZpZyA9IG51bGwsICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlLCA/c3RyaW5nICRjd2QgPSBudWxsLCBib29sICRmdWxsTG9hZCA9IHRydWUsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UpCnsKCmlmIChpc19zdHJpbmcoJGxvY2FsQ29uZmlnKSAmJiBpc19maWxlKCRsb2NhbENvbmZpZykgJiYgbnVsbCA9PT0gJGN3ZCkgewokY3dkID0gZGlybmFtZSgkbG9jYWxDb25maWcpOwp9CgokY3dkID0gJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwoKCmlmIChudWxsID09PSAkbG9jYWxDb25maWcpIHsKJGxvY2FsQ29uZmlnID0gc3RhdGljOjpnZXRDb21wb3NlckZpbGUoKTsKfQoKJGxvY2FsQ29uZmlnU291cmNlID0gQ29uZmlnOjpTT1VSQ0VfVU5LTk9XTjsKaWYgKGlzX3N0cmluZygkbG9jYWxDb25maWcpKSB7CiRjb21wb3NlckZpbGUgPSAkbG9jYWxDb25maWc7CgokZmlsZSA9IG5ldyBKc29uRmlsZSgkbG9jYWxDb25maWcsIG51bGwsICRpbyk7CgppZiAoISRmaWxlLT5leGlzdHMoKSkgewppZiAoJGxvY2FsQ29uZmlnID09PSAnLi9jb21wb3Nlci5qc29uJyB8fCAkbG9jYWxDb25maWcgPT09ICdjb21wb3Nlci5qc29uJykgewokbWVzc2FnZSA9ICdDb21wb3NlciBjb3VsZCBub3QgZmluZCBhIGNvbXBvc2VyLmpzb24gZmlsZSBpbiAnLiRjd2Q7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJ0NvbXBvc2VyIGNvdWxkIG5vdCBmaW5kIHRoZSBjb25maWcgZmlsZTogJy4kbG9jYWxDb25maWc7Cn0KJGluc3RydWN0aW9ucyA9ICRmdWxsTG9hZCA/ICdUbyBpbml0aWFsaXplIGEgcHJvamVjdCwgcGxlYXNlIGNyZWF0ZSBhIGNvbXBvc2VyLmpzb24gZmlsZS4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2Jhc2ljLXVzYWdlJyA6ICcnOwp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbWVzc2FnZS5QSFBfRU9MLiRpbnN0cnVjdGlvbnMpOwp9CgppZiAoIVBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewp0cnkgewokZmlsZS0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxBWF9TQ0hFTUEpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokZXJyb3JzID0gJyAtICcgLiBpbXBsb2RlKFBIUF9FT0wgLiAnIC0gJywgJGUtPmdldEVycm9ycygpKTsKJG1lc3NhZ2UgPSAkZS0+Z2V0TWVzc2FnZSgpIC4gJzonIC4gUEhQX0VPTCAuICRlcnJvcnM7CnRocm93IG5ldyBKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKJGxvY2FsQ29uZmlnID0gJGZpbGUtPnJlYWQoKTsKJGxvY2FsQ29uZmlnU291cmNlID0gJGZpbGUtPmdldFBhdGgoKTsKfQoKCiRjb25maWcgPSBzdGF0aWM6OmNyZWF0ZUNvbmZpZygkaW8sICRjd2QpOwokY29uZmlnLT5tZXJnZSgkbG9jYWxDb25maWcsICRsb2NhbENvbmZpZ1NvdXJjZSk7CmlmIChpc3NldCgkY29tcG9zZXJGaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgY29uZmlnIGZpbGUgJyAuICRjb21wb3NlckZpbGUgLicgKCcucmVhbHBhdGgoJGNvbXBvc2VyRmlsZSkuJyknLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokY29uZmlnLT5zZXRDb25maWdTb3VyY2UobmV3IEpzb25Db25maWdTb3VyY2UobmV3IEpzb25GaWxlKHJlYWxwYXRoKCRjb21wb3NlckZpbGUpLCBudWxsLCAkaW8pKSk7CgokbG9jYWxBdXRoRmlsZSA9IG5ldyBKc29uRmlsZShkaXJuYW1lKHJlYWxwYXRoKCRjb21wb3NlckZpbGUpKSAuICcvYXV0aC5qc29uJywgbnVsbCwgJGlvKTsKaWYgKCRsb2NhbEF1dGhGaWxlLT5leGlzdHMoKSkgewokaW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgY29uZmlnIGZpbGUgJyAuICRsb2NhbEF1dGhGaWxlLT5nZXRQYXRoKCksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CnNlbGY6OnZhbGlkYXRlSnNvblNjaGVtYSgkaW8sICRsb2NhbEF1dGhGaWxlLCBKc29uRmlsZTo6QVVUSF9TQ0hFTUEpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gJGxvY2FsQXV0aEZpbGUtPnJlYWQoKV0sICRsb2NhbEF1dGhGaWxlLT5nZXRQYXRoKCkpOwokY29uZmlnLT5zZXRMb2NhbEF1dGhDb25maWdTb3VyY2UobmV3IEpzb25Db25maWdTb3VyY2UoJGxvY2FsQXV0aEZpbGUsIHRydWUpKTsKfQp9CgokdmVuZG9yRGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyk7CgoKJGNvbXBvc2VyID0gJGZ1bGxMb2FkID8gbmV3IENvbXBvc2VyKCkgOiBuZXcgUGFydGlhbENvbXBvc2VyKCk7CiRjb21wb3Nlci0+c2V0Q29uZmlnKCRjb25maWcpOwoKaWYgKCRmdWxsTG9hZCkgewoKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKCgppZiAoIWNsYXNzX2V4aXN0cygnQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnMnLCBmYWxzZSkgJiYgZmlsZV9leGlzdHMoJGluc3RhbGxlZFZlcnNpb25zUGF0aCA9ICRjb25maWctPmdldCgndmVuZG9yLWRpcicpLicvY29tcG9zZXIvSW5zdGFsbGVkVmVyc2lvbnMucGhwJykpIHsKaW5jbHVkZSAkaW5zdGFsbGVkVmVyc2lvbnNQYXRoOwp9Cn0KCiRodHRwRG93bmxvYWRlciA9IHNlbGY6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokbG9vcCA9IG5ldyBMb29wKCRodHRwRG93bmxvYWRlciwgJHByb2Nlc3MpOwokY29tcG9zZXItPnNldExvb3AoJGxvb3ApOwoKCiRkaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigkY29tcG9zZXIsICRpbywgJHByb2Nlc3MpOwokZGlzcGF0Y2hlci0+c2V0UnVuU2NyaXB0cyghJGRpc2FibGVTY3JpcHRzKTsKJGNvbXBvc2VyLT5zZXRFdmVudERpc3BhdGNoZXIoJGRpc3BhdGNoZXIpOwoKCiRybSA9IFJlcG9zaXRvcnlGYWN0b3J5OjptYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZGlzcGF0Y2hlciwgJHByb2Nlc3MpOwokY29tcG9zZXItPnNldFJlcG9zaXRvcnlNYW5hZ2VyKCRybSk7CgoKCmlmICghJGZ1bGxMb2FkICYmICFpc3NldCgkbG9jYWxDb25maWdbJ3ZlcnNpb24nXSkpIHsKJGxvY2FsQ29uZmlnWyd2ZXJzaW9uJ10gPSAnMS4wLjAnOwp9CgoKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkY29uZmlnLCAkcHJvY2VzcywgJHBhcnNlcik7CiRsb2FkZXIgPSAkdGhpcy0+bG9hZFJvb3RQYWNrYWdlKCRybSwgJGNvbmZpZywgJHBhcnNlciwgJGd1ZXNzZXIsICRpbyk7CiRwYWNrYWdlID0gJGxvYWRlci0+bG9hZCgkbG9jYWxDb25maWcsICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJywgJGN3ZCk7CiRjb21wb3Nlci0+c2V0UGFja2FnZSgkcGFja2FnZSk7CgoKJHRoaXMtPmFkZExvY2FsUmVwb3NpdG9yeSgkaW8sICRybSwgJHZlbmRvckRpciwgJHBhY2thZ2UsICRwcm9jZXNzKTsKCgokaW0gPSAkdGhpcy0+Y3JlYXRlSW5zdGFsbGF0aW9uTWFuYWdlcigkbG9vcCwgJGlvLCAkZGlzcGF0Y2hlcik7CiRjb21wb3Nlci0+c2V0SW5zdGFsbGF0aW9uTWFuYWdlcigkaW0pOwoKaWYgKCRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CgokZG0gPSAkdGhpcy0+Y3JlYXRlRG93bmxvYWRNYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkcHJvY2VzcywgJGRpc3BhdGNoZXIpOwokY29tcG9zZXItPnNldERvd25sb2FkTWFuYWdlcigkZG0pOwoKCiRnZW5lcmF0b3IgPSBuZXcgQXV0b2xvYWRHZW5lcmF0b3IoJGRpc3BhdGNoZXIsICRpbyk7CiRjb21wb3Nlci0+c2V0QXV0b2xvYWRHZW5lcmF0b3IoJGdlbmVyYXRvcik7CgoKJGFtID0gJHRoaXMtPmNyZWF0ZUFyY2hpdmVNYW5hZ2VyKCRjb25maWcsICRkbSwgJGxvb3ApOwokY29tcG9zZXItPnNldEFyY2hpdmVNYW5hZ2VyKCRhbSk7Cn0KCgokdGhpcy0+Y3JlYXRlRGVmYXVsdEluc3RhbGxlcnMoJGltLCAkY29tcG9zZXIsICRpbywgJHByb2Nlc3MpOwoKCmlmICgkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciAmJiBpc3NldCgkY29tcG9zZXJGaWxlKSkgewokbG9ja0ZpbGUgPSBzZWxmOjpnZXRMb2NrRmlsZSgkY29tcG9zZXJGaWxlKTsKaWYgKCEkY29uZmlnLT5nZXQoJ2xvY2snKSAmJiBmaWxlX2V4aXN0cygkbG9ja0ZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kbG9ja0ZpbGUuJyBpcyBwcmVzZW50IGJ1dCBpZ25vcmVkIGFzIHRoZSAibG9jayIgY29uZmlnIG9wdGlvbiBpcyBkaXNhYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRsb2NrZXIgPSBuZXcgUGFja2FnZVxMb2NrZXIoJGlvLCBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCdsb2NrJykgPyAkbG9ja0ZpbGUgOiBQbGF0Zm9ybTo6Z2V0RGV2TnVsbCgpLCBudWxsLCAkaW8pLCAkaW0sIGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wb3NlckZpbGUpLCAkcHJvY2Vzcyk7CiRjb21wb3Nlci0+c2V0TG9ja2VyKCRsb2NrZXIpOwp9IGVsc2VpZiAoJGNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIpIHsKJGxvY2tlciA9IG5ldyBQYWNrYWdlXExvY2tlcigkaW8sIG5ldyBKc29uRmlsZShQbGF0Zm9ybTo6Z2V0RGV2TnVsbCgpLCBudWxsLCAkaW8pLCAkaW0sIEpzb25GaWxlOjplbmNvZGUoJGxvY2FsQ29uZmlnKSwgJHByb2Nlc3MpOwokY29tcG9zZXItPnNldExvY2tlcigkbG9ja2VyKTsKfQoKaWYgKCRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CiRnbG9iYWxDb21wb3NlciA9IG51bGw7CmlmIChyZWFscGF0aCgkY29uZmlnLT5nZXQoJ2hvbWUnKSkgIT09ICRjd2QpIHsKJGdsb2JhbENvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUdsb2JhbENvbXBvc2VyKCRpbywgJGNvbmZpZywgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgokcG0gPSAkdGhpcy0+Y3JlYXRlUGx1Z2luTWFuYWdlcigkaW8sICRjb21wb3NlciwgJGdsb2JhbENvbXBvc2VyLCAkZGlzYWJsZVBsdWdpbnMpOwokY29tcG9zZXItPnNldFBsdWdpbk1hbmFnZXIoJHBtKTsKCmlmIChyZWFscGF0aCgkY29uZmlnLT5nZXQoJ2hvbWUnKSkgPT09ICRjd2QpIHsKJHBtLT5zZXRSdW5uaW5nSW5HbG9iYWxEaXIodHJ1ZSk7Cn0KCiRwbS0+bG9hZEluc3RhbGxlZFBsdWdpbnMoKTsKfQoKaWYgKCRmdWxsTG9hZCkgewokaW5pdEV2ZW50ID0gbmV3IEV2ZW50KFBsdWdpbkV2ZW50czo6SU5JVCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRpbml0RXZlbnQtPmdldE5hbWUoKSwgJGluaXRFdmVudCk7CgoKCiR0aGlzLT5wdXJnZVBhY2thZ2VzKCRybS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCksICRpbSk7Cn0KCnJldHVybiAkY29tcG9zZXI7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUdsb2JhbChJT0ludGVyZmFjZSAkaW8sIGJvb2wgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UpOiA/Q29tcG9zZXIKewokZmFjdG9yeSA9IG5ldyBzdGF0aWMoKTsKCnJldHVybiAkZmFjdG9yeS0+Y3JlYXRlR2xvYmFsQ29tcG9zZXIoJGlvLCBzdGF0aWM6OmNyZWF0ZUNvbmZpZygkaW8pLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cywgdHJ1ZSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRMb2NhbFJlcG9zaXRvcnkoSU9JbnRlcmZhY2UgJGlvLCBSZXBvc2l0b3J5TWFuYWdlciAkcm0sIHN0cmluZyAkdmVuZG9yRGlyLCBSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKTogdm9pZAp7CiRmcyA9IG51bGw7CmlmICgkcHJvY2VzcykgewokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7Cn0KCiRybS0+c2V0TG9jYWxSZXBvc2l0b3J5KG5ldyBSZXBvc2l0b3J5XEluc3RhbGxlZEZpbGVzeXN0ZW1SZXBvc2l0b3J5KG5ldyBKc29uRmlsZSgkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLmpzb24nLCBudWxsLCAkaW8pLCB0cnVlLCAkcm9vdFBhY2thZ2UsICRmcykpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVHbG9iYWxDb21wb3NlcihJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCAkZGlzYWJsZVBsdWdpbnMsIGJvb2wgJGRpc2FibGVTY3JpcHRzLCBib29sICRmdWxsTG9hZCA9IGZhbHNlKTogP1BhcnRpYWxDb21wb3Nlcgp7CgokZGlzYWJsZVBsdWdpbnMgPSAkZGlzYWJsZVBsdWdpbnMgPT09ICdnbG9iYWwnIHx8ICRkaXNhYmxlUGx1Z2lucyA9PT0gdHJ1ZTsKCiRjb21wb3NlciA9IG51bGw7CnRyeSB7CiRjb21wb3NlciA9ICR0aGlzLT5jcmVhdGVDb21wb3NlcigkaW8sICRjb25maWctPmdldCgnaG9tZScpIC4gJy9jb21wb3Nlci5qc29uJywgJGRpc2FibGVQbHVnaW5zLCAkY29uZmlnLT5nZXQoJ2hvbWUnKSwgJGZ1bGxMb2FkLCAkZGlzYWJsZVNjcmlwdHMpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRpby0+d3JpdGVFcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgZ2xvYmFsIGNvbXBvc2VyOiAnLiRlLT5nZXRNZXNzYWdlKCksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KCnJldHVybiAkY29tcG9zZXI7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlRG93bmxvYWRNYW5hZ2VyKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsKTogRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXIKewokY2FjaGUgPSBudWxsOwppZiAoJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy10dGwnKSA+IDApIHsKJGNhY2hlID0gbmV3IENhY2hlKCRpbywgJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy1kaXInKSwgJ2EtejAtOV8uLycpOwokY2FjaGUtPnNldFJlYWRPbmx5KCRjb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwp9CgokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7CgokZG0gPSBuZXcgRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXIoJGlvLCBmYWxzZSwgJGZzKTsKc3dpdGNoICgkcHJlZmVycmVkID0gJGNvbmZpZy0+Z2V0KCdwcmVmZXJyZWQtaW5zdGFsbCcpKSB7CmNhc2UgJ2Rpc3QnOgokZG0tPnNldFByZWZlckRpc3QodHJ1ZSk7CmJyZWFrOwpjYXNlICdzb3VyY2UnOgokZG0tPnNldFByZWZlclNvdXJjZSh0cnVlKTsKYnJlYWs7CmNhc2UgJ2F1dG8nOgpkZWZhdWx0OgoKYnJlYWs7Cn0KCmlmIChpc19hcnJheSgkcHJlZmVycmVkKSkgewokZG0tPnNldFByZWZlcmVuY2VzKCRwcmVmZXJyZWQpOwp9CgokZG0tPnNldERvd25sb2FkZXIoJ2dpdCcsIG5ldyBEb3dubG9hZGVyXEdpdERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignc3ZuJywgbmV3IERvd25sb2FkZXJcU3ZuRG93bmxvYWRlcigkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdmb3NzaWwnLCBuZXcgRG93bmxvYWRlclxGb3NzaWxEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ2hnJywgbmV3IERvd25sb2FkZXJcSGdEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3BlcmZvcmNlJywgbmV3IERvd25sb2FkZXJcUGVyZm9yY2VEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3ppcCcsIG5ldyBEb3dubG9hZGVyXFppcERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3JhcicsIG5ldyBEb3dubG9hZGVyXFJhckRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3RhcicsIG5ldyBEb3dubG9hZGVyXFRhckRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ2d6aXAnLCBuZXcgRG93bmxvYWRlclxHemlwRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigneHonLCBuZXcgRG93bmxvYWRlclxYekRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3BoYXInLCBuZXcgRG93bmxvYWRlclxQaGFyRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignZmlsZScsIG5ldyBEb3dubG9hZGVyXEZpbGVEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdwYXRoJywgbmV3IERvd25sb2FkZXJcUGF0aERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwoKcmV0dXJuICRkbTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZU1hbmFnZXIoQ29uZmlnICRjb25maWcsIERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyICRkbSwgTG9vcCAkbG9vcCkKewokYW0gPSBuZXcgQXJjaGl2ZXJcQXJjaGl2ZU1hbmFnZXIoJGRtLCAkbG9vcCk7CmlmIChjbGFzc19leGlzdHMoWmlwQXJjaGl2ZTo6Y2xhc3MpKSB7CiRhbS0+YWRkQXJjaGl2ZXIobmV3IEFyY2hpdmVyXFppcEFyY2hpdmVyKTsKfQppZiAoY2xhc3NfZXhpc3RzKFBoYXI6OmNsYXNzKSkgewokYW0tPmFkZEFyY2hpdmVyKG5ldyBBcmNoaXZlclxQaGFyQXJjaGl2ZXIpOwp9CgpyZXR1cm4gJGFtOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luTWFuYWdlcihJT0ludGVyZmFjZSAkaW8sIENvbXBvc2VyICRjb21wb3NlciwgP1BhcnRpYWxDb21wb3NlciAkZ2xvYmFsQ29tcG9zZXIgPSBudWxsLCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSk6IFBsdWdpblxQbHVnaW5NYW5hZ2VyCnsKcmV0dXJuIG5ldyBQbHVnaW5cUGx1Z2luTWFuYWdlcigkaW8sICRjb21wb3NlciwgJGdsb2JhbENvbXBvc2VyLCAkZGlzYWJsZVBsdWdpbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW5zdGFsbGF0aW9uTWFuYWdlcihMb29wICRsb29wLCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpOiBJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcgp7CnJldHVybiBuZXcgSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXIoJGxvb3AsICRpbywgJGV2ZW50RGlzcGF0Y2hlcik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0SW5zdGFsbGVycyhJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlciAkaW0sIFBhcnRpYWxDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpOiB2b2lkCnsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oJHByb2Nlc3MpOwokYmluYXJ5SW5zdGFsbGVyID0gbmV3IEluc3RhbGxlclxCaW5hcnlJbnN0YWxsZXIoJGlvLCBydHJpbSgkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1kaXInKSwgJy8nKSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tY29tcGF0JyksICRmcywgcnRyaW0oJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCd2ZW5kb3ItZGlyJyksICcvJykpOwoKJGltLT5hZGRJbnN0YWxsZXIobmV3IEluc3RhbGxlclxMaWJyYXJ5SW5zdGFsbGVyKCRpbywgJGNvbXBvc2VyLCBudWxsLCAkZnMsICRiaW5hcnlJbnN0YWxsZXIpKTsKJGltLT5hZGRJbnN0YWxsZXIobmV3IEluc3RhbGxlclxQbHVnaW5JbnN0YWxsZXIoJGlvLCAkY29tcG9zZXIsICRmcywgJGJpbmFyeUluc3RhbGxlcikpOwokaW0tPmFkZEluc3RhbGxlcihuZXcgSW5zdGFsbGVyXE1ldGFwYWNrYWdlSW5zdGFsbGVyKCRpbykpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHB1cmdlUGFja2FnZXMoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXIgJGltKTogdm9pZAp7CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICghJGltLT5pc1BhY2thZ2VJbnN0YWxsZWQoJHJlcG8sICRwYWNrYWdlKSkgewokcmVwby0+cmVtb3ZlUGFja2FnZSgkcGFja2FnZSk7Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gbG9hZFJvb3RQYWNrYWdlKFJlcG9zaXRvcnlNYW5hZ2VyICRybSwgQ29uZmlnICRjb25maWcsIFZlcnNpb25QYXJzZXIgJHBhcnNlciwgVmVyc2lvbkd1ZXNzZXIgJGd1ZXNzZXIsIElPSW50ZXJmYWNlICRpbyk6IFBhY2thZ2VcTG9hZGVyXFJvb3RQYWNrYWdlTG9hZGVyCnsKcmV0dXJuIG5ldyBQYWNrYWdlXExvYWRlclxSb290UGFja2FnZUxvYWRlcigkcm0sICRjb25maWcsICRwYXJzZXIsICRndWVzc2VyLCAkaW8pOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoSU9JbnRlcmZhY2UgJGlvLCAkY29uZmlnID0gbnVsbCwgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UpOiBDb21wb3Nlcgp7CiRmYWN0b3J5ID0gbmV3IHN0YXRpYygpOwoKCgoKCmlmICgkY29uZmlnICE9PSBudWxsICYmICRjb25maWcgIT09IHNlbGY6OmdldENvbXBvc2VyRmlsZSgpICYmICRkaXNhYmxlUGx1Z2lucyA9PT0gZmFsc2UpIHsKJGRpc2FibGVQbHVnaW5zID0gJ2xvY2FsJzsKfQoKcmV0dXJuICRmYWN0b3J5LT5jcmVhdGVDb21wb3NlcigkaW8sICRjb25maWcsICRkaXNhYmxlUGx1Z2lucywgbnVsbCwgdHJ1ZSwgJGRpc2FibGVTY3JpcHRzKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlSHR0cERvd25sb2FkZXIoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJG9wdGlvbnMgPSBbXSk6IEh0dHBEb3dubG9hZGVyCnsKc3RhdGljICR3YXJuZWQgPSBmYWxzZTsKJGRpc2FibGVUbHMgPSBmYWxzZTsKCmlmIChpc3NldCgkX1NFUlZFUlsnYXJndiddKSAmJiBpbl9hcnJheSgnZGlzYWJsZS10bHMnLCAkX1NFUlZFUlsnYXJndiddKSAmJiAoaW5fYXJyYXkoJ2NvbmYnLCAkX1NFUlZFUlsnYXJndiddKSB8fCBpbl9hcnJheSgnY29uZmlnJywgJF9TRVJWRVJbJ2FyZ3YnXSkpKSB7CiR3YXJuZWQgPSB0cnVlOwokZGlzYWJsZVRscyA9ICFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJyk7Cn0gZWxzZWlmICgkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKaWYgKCEkd2FybmVkKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSBydW5uaW5nIENvbXBvc2VyIHdpdGggU1NML1RMUyBwcm90ZWN0aW9uIGRpc2FibGVkLjwvd2FybmluZz4nKTsKfQokd2FybmVkID0gdHJ1ZTsKJGRpc2FibGVUbHMgPSB0cnVlOwp9IGVsc2VpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgRXhjZXB0aW9uXE5vU3NsRXhjZXB0aW9uKCdUaGUgb3BlbnNzbCBleHRlbnNpb24gaXMgcmVxdWlyZWQgZm9yIFNTTC9UTFMgcHJvdGVjdGlvbiBidXQgaXMgbm90IGF2YWlsYWJsZS4gJwouICdJZiB5b3UgY2FuIG5vdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uLCB5b3UgY2FuIGRpc2FibGUgdGhpcyBlcnJvciwgYXQgeW91ciBvd24gcmlzaywgYnkgc2V0dGluZyB0aGUgXCdkaXNhYmxlLXRsc1wnIG9wdGlvbiB0byB0cnVlLicpOwp9CiRodHRwRG93bmxvYWRlck9wdGlvbnMgPSBbXTsKaWYgKCRkaXNhYmxlVGxzID09PSBmYWxzZSkgewppZiAoJycgIT09ICRjb25maWctPmdldCgnY2FmaWxlJykpIHsKJGh0dHBEb3dubG9hZGVyT3B0aW9uc1snc3NsJ11bJ2NhZmlsZSddID0gJGNvbmZpZy0+Z2V0KCdjYWZpbGUnKTsKfQppZiAoJycgIT09ICRjb25maWctPmdldCgnY2FwYXRoJykpIHsKJGh0dHBEb3dubG9hZGVyT3B0aW9uc1snc3NsJ11bJ2NhcGF0aCddID0gJGNvbmZpZy0+Z2V0KCdjYXBhdGgnKTsKfQokaHR0cERvd25sb2FkZXJPcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJGh0dHBEb3dubG9hZGVyT3B0aW9ucywgJG9wdGlvbnMpOwp9CnRyeSB7CiRodHRwRG93bmxvYWRlciA9IG5ldyBIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlck9wdGlvbnMsICRkaXNhYmxlVGxzKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmIChmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdjYWZpbGUnKSkgewokaW8tPndyaXRlKCc8ZXJyb3I+VW5hYmxlIHRvIGxvY2F0ZSBhIHZhbGlkIENBIGNlcnRpZmljYXRlIGZpbGUuIFlvdSBtdXN0IHNldCBhIHZhbGlkIFwnY2FmaWxlXCcgb3B0aW9uLjwvZXJyb3I+Jyk7CiRpby0+d3JpdGUoJzxlcnJvcj5BIHZhbGlkIENBIGNlcnRpZmljYXRlIGZpbGUgaXMgcmVxdWlyZWQgZm9yIFNTTC9UTFMgcHJvdGVjdGlvbi48L2Vycm9yPicpOwokaW8tPndyaXRlKCc8ZXJyb3I+WW91IGNhbiBkaXNhYmxlIHRoaXMgZXJyb3IsIGF0IHlvdXIgb3duIHJpc2ssIGJ5IHNldHRpbmcgdGhlIFwnZGlzYWJsZS10bHNcJyBvcHRpb24gdG8gdHJ1ZS48L2Vycm9yPicpOwp9CnRocm93ICRlOwp9CgpyZXR1cm4gJGh0dHBEb3dubG9hZGVyOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB1c2VYZGcoKTogYm9vbAp7CmZvcmVhY2ggKGFycmF5X2tleXMoJF9TRVJWRVIpIGFzICRrZXkpIHsKaWYgKHN0cnBvcygka2V5LCAnWERHXycpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCmlmIChTaWxlbmNlcjo6Y2FsbCgnaXNfZGlyJywgJy9ldGMveGRnJykpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0VXNlckRpcigpOiBzdHJpbmcKewokaG9tZSA9IFBsYXRmb3JtOjpnZXRFbnYoJ0hPTUUnKTsKaWYgKCEkaG9tZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBIT01FIG9yIENPTVBPU0VSX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQgZm9yIGNvbXBvc2VyIHRvIHJ1biBjb3JyZWN0bHknKTsKfQoKcmV0dXJuIHJ0cmltKHN0cnRyKCRob21lLCAnXFwnLCAnLycpLCAnLycpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVKc29uU2NoZW1hKD9JT0ludGVyZmFjZSAkaW8sICRmaWxlT3JEYXRhLCBpbnQgJHNjaGVtYSA9IEpzb25GaWxlOjpMQVhfU0NIRU1BLCA/c3RyaW5nICRzb3VyY2UgPSBudWxsKTogdm9pZAp7CmlmIChQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKcmV0dXJuOwp9Cgp0cnkgewppZiAoJGZpbGVPckRhdGEgaW5zdGFuY2VvZiBKc29uRmlsZSkgewokZmlsZU9yRGF0YS0+dmFsaWRhdGVTY2hlbWEoJHNjaGVtYSk7Cn0gZWxzZSB7CmlmIChudWxsID09PSAkc291cmNlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckc291cmNlIGlzIHJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGlmICRmaWxlT3JEYXRhIGlzIGFyYml0cmFyeSBkYXRhJyk7Cn0KSnNvbkZpbGU6OnZhbGlkYXRlSnNvblNjaGVtYSgkc291cmNlLCAkZmlsZU9yRGF0YSwgJHNjaGVtYSk7Cn0KfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJG1zZyA9ICRlLT5nZXRNZXNzYWdlKCkuJywgdGhpcyBtYXkgcmVzdWx0IGluIGVycm9ycyBhbmQgc2hvdWxkIGJlIHJlc29sdmVkOicuUEhQX0VPTC4nIC0gJy5pbXBsb2RlKFBIUF9FT0wuJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CmlmICgkaW8gaW5zdGFuY2VvZiBJT0ludGVyZmFjZSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1zZy4nPC8+Jyk7Cn0gZWxzZSB7CnRocm93IG5ldyBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJG1zZyk7Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5OwoKZmluYWwgY2xhc3MgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbXBsZW1lbnRzIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CnJldHVybiBQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsOwp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKCmZpbmFsIGNsYXNzIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGltcGxlbWVudHMgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CgoKCnByaXZhdGUgJGlnbm9yZVJlZ2V4OwoKCgoKcHJpdmF0ZSAkaWdub3JlVXBwZXJCb3VuZFJlZ2V4OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXFMaXN0KQp7CiRpZ25vcmVBbGwgPSAkaWdub3JlVXBwZXJCb3VuZCA9IFtdOwpmb3JlYWNoICgkcmVxTGlzdCBhcyAkcmVxKSB7CmlmIChzdWJzdHIoJHJlcSwgLTEpID09PSAnKycpIHsKJGlnbm9yZVVwcGVyQm91bmRbXSA9IHN1YnN0cigkcmVxLCAwLCAtMSk7Cn0gZWxzZSB7CiRpZ25vcmVBbGxbXSA9ICRyZXE7Cn0KfQokdGhpcy0+aWdub3JlUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJGlnbm9yZUFsbCk7CiR0aGlzLT5pZ25vcmVVcHBlckJvdW5kUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJGlnbm9yZVVwcGVyQm91bmQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBQcmVnOjppc01hdGNoKCR0aGlzLT5pZ25vcmVSZWdleCwgJHJlcSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXJDb25zdHJhaW50KHN0cmluZyAkcmVxLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50LCBib29sICRhbGxvd1VwcGVyQm91bmRPdmVycmlkZSA9IHRydWUpOiBDb25zdHJhaW50SW50ZXJmYWNlCnsKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpKSB7CnJldHVybiAkY29uc3RyYWludDsKfQoKaWYgKCEkYWxsb3dVcHBlckJvdW5kT3ZlcnJpZGUgfHwgIVByZWc6OmlzTWF0Y2goJHRoaXMtPmlnbm9yZVVwcGVyQm91bmRSZWdleCwgJHJlcSkpIHsKcmV0dXJuICRjb25zdHJhaW50Owp9CgppZiAoUHJlZzo6aXNNYXRjaCgkdGhpcy0+aWdub3JlUmVnZXgsICRyZXEpKSB7CnJldHVybiBuZXcgTWF0Y2hBbGxDb25zdHJhaW50Owp9CgokaW50ZXJ2YWxzID0gSW50ZXJ2YWxzOjpnZXQoJGNvbnN0cmFpbnQpOwokbGFzdCA9IGVuZCgkaW50ZXJ2YWxzWydudW1lcmljJ10pOwppZiAoJGxhc3QgIT09IGZhbHNlICYmIChzdHJpbmcpICRsYXN0LT5nZXRFbmQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiRjb25zdHJhaW50ID0gbmV3IE11bHRpQ29uc3RyYWludChbJGNvbnN0cmFpbnQsIG5ldyBDb25zdHJhaW50KCc+PScsICRsYXN0LT5nZXRFbmQoKS0+Z2V0VmVyc2lvbigpKV0sIGZhbHNlKTsKfQoKcmV0dXJuICRjb25zdHJhaW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKZmluYWwgY2xhc3MgSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgpmaW5hbCBjbGFzcyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeQp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUJvb2xPckxpc3QoJGJvb2xPckxpc3QpOiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKaWYgKGlzX2Jvb2woJGJvb2xPckxpc3QpKSB7CnJldHVybiAkYm9vbE9yTGlzdCA/IHNlbGY6Omlnbm9yZUFsbCgpIDogc2VsZjo6aWdub3JlTm90aGluZygpOwp9CgppZiAoaXNfYXJyYXkoJGJvb2xPckxpc3QpKSB7CnJldHVybiBuZXcgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGJvb2xPckxpc3QpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKc3ByaW50ZigKJ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI6IFVua25vd24gJGJvb2xPckxpc3QgcGFyYW1ldGVyICVzLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LicsCmdldHR5cGUoJGJvb2xPckxpc3QpCikKKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpZ25vcmVBbGwoKTogUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnJldHVybiBuZXcgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlnbm9yZU5vdGhpbmcoKTogUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnJldHVybiBuZXcgSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCmludGVyZmFjZSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2w7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXElPOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgUHNyXExvZ1xMb2dMZXZlbDsKCmFic3RyYWN0IGNsYXNzIEJhc2VJTyBpbXBsZW1lbnRzIElPSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkYXV0aGVudGljYXRpb25zID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb25zKCkKewpyZXR1cm4gJHRoaXMtPmF1dGhlbnRpY2F0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0QXV0aGVudGljYXRpb25zKCkKewokdGhpcy0+YXV0aGVudGljYXRpb25zID0gW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUpCnsKaWYgKGlzc2V0KCR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXSkpIHsKcmV0dXJuICR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXTsKfQoKcmV0dXJuIFsndXNlcm5hbWUnID0+IG51bGwsICdwYXNzd29yZCcgPT4gbnVsbF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUsICR1c2VybmFtZSwgJHBhc3N3b3JkID0gbnVsbCkKewokdGhpcy0+YXV0aGVudGljYXRpb25zWyRyZXBvc2l0b3J5TmFtZV0gPSBbJ3VzZXJuYW1lJyA9PiAkdXNlcm5hbWUsICdwYXNzd29yZCcgPT4gJHBhc3N3b3JkXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT53cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3JSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPndyaXRlRXJyb3IoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUsIHN0cmluZyAkdXNlcm5hbWUsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCkKewppZiAoJHRoaXMtPmhhc0F1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSkpIHsKJGF1dGggPSAkdGhpcy0+Z2V0QXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lKTsKaWYgKCRhdXRoWyd1c2VybmFtZSddID09PSAkdXNlcm5hbWUgJiYgJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICRwYXNzd29yZCkgewpyZXR1cm47Cn0KCiR0aGlzLT53cml0ZUVycm9yKApzcHJpbnRmKAoiPHdhcm5pbmc+V2FybmluZzogWW91IHNob3VsZCBhdm9pZCBvdmVyd3JpdGluZyBhbHJlYWR5IGRlZmluZWQgYXV0aCBzZXR0aW5ncyBmb3IgJXMuPC93YXJuaW5nPiIsCiRyZXBvc2l0b3J5TmFtZQopCik7Cn0KJHRoaXMtPnNldEF1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSwgJHVzZXJuYW1lLCAkcGFzc3dvcmQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZENvbmZpZ3VyYXRpb24oQ29uZmlnICRjb25maWcpCnsKJGJpdGJ1Y2tldE9hdXRoID0gJGNvbmZpZy0+Z2V0KCdiaXRidWNrZXQtb2F1dGgnKTsKJGdpdGh1Yk9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRodWItb2F1dGgnKTsKJGdpdGxhYk9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRsYWItb2F1dGgnKTsKJGdpdGxhYlRva2VuID0gJGNvbmZpZy0+Z2V0KCdnaXRsYWItdG9rZW4nKTsKJGh0dHBCYXNpYyA9ICRjb25maWctPmdldCgnaHR0cC1iYXNpYycpOwokYmVhcmVyVG9rZW4gPSAkY29uZmlnLT5nZXQoJ2JlYXJlcicpOwoKCgpmb3JlYWNoICgkYml0YnVja2V0T2F1dGggYXMgJGRvbWFpbiA9PiAkY3JlZCkgewokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkY3JlZFsnY29uc3VtZXIta2V5J10sICRjcmVkWydjb25zdW1lci1zZWNyZXQnXSk7Cn0KCmZvcmVhY2ggKCRnaXRodWJPYXV0aCBhcyAkZG9tYWluID0+ICR0b2tlbikgewppZiAoJGRvbWFpbiAhPT0gJ2dpdGh1Yi5jb20nICYmICFpbl9hcnJheSgkZG9tYWluLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiR0aGlzLT5kZWJ1ZygkZG9tYWluLicgaXMgbm90IGluIHRoZSBjb25maWd1cmVkIGdpdGh1Yi1kb21haW5zLCBhZGRpbmcgaXQgaW1wbGljaXRseSBhcyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIGZvciB0aGlzIGRvbWFpbicpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydnaXRodWItZG9tYWlucycgPT4gYXJyYXlfbWVyZ2UoJGNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpLCBbJGRvbWFpbl0pXV0sICdpbXBsaWNpdC1kdWUtdG8tYXV0aCcpOwp9CgoKCmlmICghUHJlZzo6aXNNYXRjaCgne15bLkEtWmEtejAtOV9dKyR9JywgJHRva2VuKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignWW91ciBnaXRodWIgb2F1dGggdG9rZW4gZm9yICcuJGRvbWFpbi4nIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogIicuJHRva2VuLiciJyk7Cn0KJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp9Cgpmb3JlYWNoICgkZ2l0bGFiT2F1dGggYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKaWYgKCRkb21haW4gIT09ICdnaXRsYWIuY29tJyAmJiAhaW5fYXJyYXkoJGRvbWFpbiwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdGhpcy0+ZGVidWcoJGRvbWFpbi4nIGlzIG5vdCBpbiB0aGUgY29uZmlndXJlZCBnaXRsYWItZG9tYWlucywgYWRkaW5nIGl0IGltcGxpY2l0bHkgYXMgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCBmb3IgdGhpcyBkb21haW4nKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnZ2l0bGFiLWRvbWFpbnMnID0+IGFycmF5X21lcmdlKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgWyRkb21haW5dKV1dLCAnaW1wbGljaXQtZHVlLXRvLWF1dGgnKTsKfQoKJHRva2VuID0gaXNfYXJyYXkoJHRva2VuKSA/ICR0b2tlblsidG9rZW4iXSA6ICR0b2tlbjsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAnb2F1dGgyJyk7Cn0KCmZvcmVhY2ggKCRnaXRsYWJUb2tlbiBhcyAkZG9tYWluID0+ICR0b2tlbikgewppZiAoJGRvbWFpbiAhPT0gJ2dpdGxhYi5jb20nICYmICFpbl9hcnJheSgkZG9tYWluLCAkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpKSB7CiR0aGlzLT5kZWJ1ZygkZG9tYWluLicgaXMgbm90IGluIHRoZSBjb25maWd1cmVkIGdpdGxhYi1kb21haW5zLCBhZGRpbmcgaXQgaW1wbGljaXRseSBhcyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIGZvciB0aGlzIGRvbWFpbicpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydnaXRsYWItZG9tYWlucycgPT4gYXJyYXlfbWVyZ2UoJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCBbJGRvbWFpbl0pXV0sICdpbXBsaWNpdC1kdWUtdG8tYXV0aCcpOwp9CgokdXNlcm5hbWUgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ1c2VybmFtZSJdIDogJHRva2VuOwokcGFzc3dvcmQgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ0b2tlbiJdIDogJ3ByaXZhdGUtdG9rZW4nOwokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7Cn0KCgpmb3JlYWNoICgkaHR0cEJhc2ljIGFzICRkb21haW4gPT4gJGNyZWQpIHsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJGNyZWRbJ3VzZXJuYW1lJ10sICRjcmVkWydwYXNzd29yZCddKTsKfQoKZm9yZWFjaCAoJGJlYXJlclRva2VuIGFzICRkb21haW4gPT4gJHRva2VuKSB7CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ2JlYXJlcicpOwp9CgoKUHJvY2Vzc0V4ZWN1dG9yOjpzZXRUaW1lb3V0KCRjb25maWctPmdldCgncHJvY2Vzcy10aW1lb3V0JykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGFsZXJ0KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkFMRVJULCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JpdGljYWwoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Q1JJVElDQUwsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFUlJPUiwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6V0FSTklORywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpOT1RJQ0UsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OklORk8sICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpERUJVRywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiRtZXNzYWdlID0gKHN0cmluZykgJG1lc3NhZ2U7CgppZiAoaW5fYXJyYXkoJGxldmVsLCBbTG9nTGV2ZWw6OkVNRVJHRU5DWSwgTG9nTGV2ZWw6OkFMRVJULCBMb2dMZXZlbDo6Q1JJVElDQUwsIExvZ0xldmVsOjpFUlJPUl0pKSB7CiR0aGlzLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kbWVzc2FnZS4nPC9lcnJvcj4nKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6OldBUk5JTkcpIHsKJHRoaXMtPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1lc3NhZ2UuJzwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6Ok5PVElDRSkgewokdGhpcy0+d3JpdGVFcnJvcignPGluZm8+Jy4kbWVzc2FnZS4nPC9pbmZvPicsIHRydWUsIHNlbGY6OlZFUkJPU0UpOwp9IGVsc2VpZiAoJGxldmVsID09PSBMb2dMZXZlbDo6SU5GTykgewokdGhpcy0+d3JpdGVFcnJvcignPGluZm8+Jy4kbWVzc2FnZS4nPC9pbmZvPicsIHRydWUsIHNlbGY6OlZFUllfVkVSQk9TRSk7Cn0gZWxzZSB7CiR0aGlzLT53cml0ZUVycm9yKCRtZXNzYWdlLCB0cnVlLCBzZWxmOjpERUJVRyk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XFN0cmVhbU91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxTdHJpbmdJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKCgoKCmNsYXNzIEJ1ZmZlcklPIGV4dGVuZHMgQ29uc29sZUlPCnsKCnByb3RlY3RlZCAkaW5wdXQ7Cgpwcm90ZWN0ZWQgJG91dHB1dDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGlucHV0ID0gJycsIGludCAkdmVyYm9zaXR5ID0gU3RyZWFtT3V0cHV0OjpWRVJCT1NJVFlfTk9STUFMLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CiRpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dCgkaW5wdXQpOwokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKCiRvdXRwdXQgPSBuZXcgU3RyZWFtT3V0cHV0KGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncncnKSwgJHZlcmJvc2l0eSwgJGZvcm1hdHRlciA/ICRmb3JtYXR0ZXItPmlzRGVjb3JhdGVkKCkgOiBmYWxzZSwgJGZvcm1hdHRlcik7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCwgbmV3IEhlbHBlclNldChbCm5ldyBRdWVzdGlvbkhlbHBlcigpLApdKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKTogc3RyaW5nCnsKZnNlZWsoJHRoaXMtPm91dHB1dC0+Z2V0U3RyZWFtKCksIDApOwoKJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPm91dHB1dC0+Z2V0U3RyZWFtKCkpOwoKJG91dHB1dCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygieyg/PD1efFxufFx4MDgpKC4rPykoXHgwOCspfSIsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpOiBzdHJpbmcgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWzFdKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbMl0pKTsKJHByZSA9IHN0cmlwX3RhZ3MoJG1hdGNoZXNbMV0pOwoKaWYgKHN0cmxlbigkcHJlKSA9PT0gc3RybGVuKCRtYXRjaGVzWzJdKSkgewpyZXR1cm4gJyc7Cn0KCgpyZXR1cm4gcnRyaW0oJG1hdGNoZXNbMV0pLiJcbiI7Cn0sICRvdXRwdXQpOwoKcmV0dXJuICRvdXRwdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVzZXJJbnB1dHMoYXJyYXkgJGlucHV0cyk6IHZvaWQKewppZiAoISR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFN0cmVhbWFibGVJbnB1dEludGVyZmFjZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1NldHRpbmcgdGhlIHVzZXIgaW5wdXRzIHJlcXVpcmVzIGF0IGxlYXN0IHRoZSB2ZXJzaW9uIDMuMiBvZiB0aGUgc3ltZm9ueS9jb25zb2xlIGNvbXBvbmVudC4nKTsKfQoKJHRoaXMtPmlucHV0LT5zZXRTdHJlYW0oJHRoaXMtPmNyZWF0ZVN0cmVhbSgkaW5wdXRzKSk7CiR0aGlzLT5pbnB1dC0+c2V0SW50ZXJhY3RpdmUodHJ1ZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVTdHJlYW0oYXJyYXkgJGlucHV0cykKewokc3RyZWFtID0gZm9wZW4oJ3BocDovL21lbW9yeScsICdyKycpOwoKZm9yZWFjaCAoJGlucHV0cyBhcyAkaW5wdXQpIHsKZndyaXRlKCRzdHJlYW0sICRpbnB1dC5QSFBfRU9MKTsKfQoKcmV3aW5kKCRzdHJlYW0pOwoKcmV0dXJuICRzdHJlYW07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87Cgp1c2UgQ29tcG9zZXJcUXVlc3Rpb25cU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKCgoKCgoKCmNsYXNzIENvbnNvbGVJTyBleHRlbmRzIEJhc2VJTwp7Cgpwcm90ZWN0ZWQgJGlucHV0OwoKcHJvdGVjdGVkICRvdXRwdXQ7Cgpwcm90ZWN0ZWQgJGhlbHBlclNldDsKCnByb3RlY3RlZCAkbGFzdE1lc3NhZ2UgPSAnJzsKCnByb3RlY3RlZCAkbGFzdE1lc3NhZ2VFcnIgPSAnJzsKCgpwcml2YXRlICRzdGFydFRpbWU7Cgpwcml2YXRlICR2ZXJib3NpdHlNYXA7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIEhlbHBlclNldCAkaGVscGVyU2V0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT5oZWxwZXJTZXQgPSAkaGVscGVyU2V0OwokdGhpcy0+dmVyYm9zaXR5TWFwID0gWwpzZWxmOjpRVUlFVCA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCwKc2VsZjo6Tk9STUFMID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKc2VsZjo6VkVSQk9TRSA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFLApzZWxmOjpWRVJZX1ZFUkJPU0UgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFLApzZWxmOjpERUJVRyA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRywKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZURlYnVnZ2luZyhmbG9hdCAkc3RhcnRUaW1lKQp7CiR0aGlzLT5zdGFydFRpbWUgPSAkc3RhcnRUaW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpCnsKcmV0dXJuICR0aGlzLT5pbnB1dC0+aXNJbnRlcmFjdGl2ZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJ5VmVyYm9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVidWcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIGZhbHNlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvV3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgdHJ1ZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZVJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCBmYWxzZSwgJHZlcmJvc2l0eSwgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIHRydWUsICR2ZXJib3NpdHksIHRydWUpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvV3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lLCBib29sICRzdGRlcnIsIGludCAkdmVyYm9zaXR5LCBib29sICRyYXcgPSBmYWxzZSk6IHZvaWQKewokc2ZWZXJib3NpdHkgPSAkdGhpcy0+dmVyYm9zaXR5TWFwWyR2ZXJib3NpdHldOwppZiAoJHNmVmVyYm9zaXR5ID4gJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKcmV0dXJuOwp9CgppZiAoJHJhdykgewokc2ZWZXJib3NpdHkgfD0gT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfUkFXOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPnN0YXJ0VGltZSkgewokbWVtb3J5VXNhZ2UgPSBtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDI0IC8gMTAyNDsKJHRpbWVTcGVudCA9IG1pY3JvdGltZSh0cnVlKSAtICR0aGlzLT5zdGFydFRpbWU7CiRtZXNzYWdlcyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRtZXNzYWdlKSB1c2UgKCRtZW1vcnlVc2FnZSwgJHRpbWVTcGVudCk6IHN0cmluZyB7CnJldHVybiBzcHJpbnRmKCdbJS4xZk1pQi8lLjJmc10gJXMnLCAkbWVtb3J5VXNhZ2UsICR0aW1lU3BlbnQsICRtZXNzYWdlKTsKfSwgKGFycmF5KSAkbWVzc2FnZXMpOwp9CgppZiAodHJ1ZSA9PT0gJHN0ZGVyciAmJiAkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpLT53cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkc2ZWZXJib3NpdHkpOwokdGhpcy0+bGFzdE1lc3NhZ2VFcnIgPSBpbXBsb2RlKCRuZXdsaW5lID8gIlxuIiA6ICcnLCAoYXJyYXkpICRtZXNzYWdlcyk7CgpyZXR1cm47Cn0KCiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzZlZlcmJvc2l0eSk7CiR0aGlzLT5sYXN0TWVzc2FnZSA9IGltcGxvZGUoJG5ld2xpbmUgPyAiXG4iIDogJycsIChhcnJheSkgJG1lc3NhZ2VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvT3ZlcndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzaXplLCBmYWxzZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvT3ZlcndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzaXplLCB0cnVlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb092ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUsID9pbnQgJHNpemUsIGJvb2wgJHN0ZGVyciwgaW50ICR2ZXJib3NpdHkpOiB2b2lkCnsKCiRtZXNzYWdlcyA9IGltcGxvZGUoJG5ld2xpbmUgPyAiXG4iIDogJycsIChhcnJheSkgJG1lc3NhZ2VzKTsKCgppZiAoIWlzc2V0KCRzaXplKSkgewoKJHNpemUgPSBzdHJsZW4oc3RyaXBfdGFncygkc3RkZXJyID8gJHRoaXMtPmxhc3RNZXNzYWdlRXJyIDogJHRoaXMtPmxhc3RNZXNzYWdlKSk7Cn0KCiR0aGlzLT5kb1dyaXRlKHN0cl9yZXBlYXQoIlx4MDgiLCAkc2l6ZSksIGZhbHNlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKCgokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsIGZhbHNlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKCgoKCiRmaWxsID0gJHNpemUgLSBzdHJsZW4oc3RyaXBfdGFncygkbWVzc2FnZXMpKTsKaWYgKCRmaWxsID4gMCkgewoKJHRoaXMtPmRvV3JpdGUoc3RyX3JlcGVhdCgnICcsICRmaWxsKSwgZmFsc2UsICRzdGRlcnIsICR2ZXJib3NpdHkpOwoKJHRoaXMtPmRvV3JpdGUoc3RyX3JlcGVhdCgiXHgwOCIsICRmaWxsKSwgZmFsc2UsICRzdGRlcnIsICR2ZXJib3NpdHkpOwp9CgppZiAoJG5ld2xpbmUpIHsKJHRoaXMtPmRvV3JpdGUoJycsIHRydWUsICRzdGRlcnIsICR2ZXJib3NpdHkpOwp9CgppZiAoJHN0ZGVycikgewokdGhpcy0+bGFzdE1lc3NhZ2VFcnIgPSAkbWVzc2FnZXM7Cn0gZWxzZSB7CiR0aGlzLT5sYXN0TWVzc2FnZSA9ICRtZXNzYWdlczsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NCYXIoaW50ICRtYXggPSAwKQp7CnJldHVybiBuZXcgUHJvZ3Jlc3NCYXIoJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRtYXgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKCRxdWVzdGlvbiwgJGRlZmF1bHQgPSBudWxsKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CgpyZXR1cm4gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IHRydWUpCnsKCiRoZWxwZXIgPSAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBTdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbigkcXVlc3Rpb24sICRkZWZhdWx0KTsKCnJldHVybiAkaGVscGVyLT5hc2soJHRoaXMtPmlucHV0LCAkdGhpcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZFZhbGlkYXRlKCRxdWVzdGlvbiwgJHZhbGlkYXRvciwgJGF0dGVtcHRzID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CiRxdWVzdGlvbi0+c2V0VmFsaWRhdG9yKCR2YWxpZGF0b3IpOwokcXVlc3Rpb24tPnNldE1heEF0dGVtcHRzKCRhdHRlbXB0cyk7CgpyZXR1cm4gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRIaWRlQW5zd2VyKCRxdWVzdGlvbikKewoKJGhlbHBlciA9ICR0aGlzLT5oZWxwZXJTZXQtPmdldCgncXVlc3Rpb24nKTsKJHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKCRxdWVzdGlvbik7CiRxdWVzdGlvbi0+c2V0SGlkZGVuKHRydWUpOwoKcmV0dXJuICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0LCAkYXR0ZW1wdHMgPSBmYWxzZSwgJGVycm9yTWVzc2FnZSA9ICdWYWx1ZSAiJXMiIGlzIGludmFsaWQnLCAkbXVsdGlzZWxlY3QgPSBmYWxzZSkKewoKJGhlbHBlciA9ICR0aGlzLT5oZWxwZXJTZXQtPmdldCgncXVlc3Rpb24nKTsKJHF1ZXN0aW9uID0gbmV3IENob2ljZVF1ZXN0aW9uKCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0KTsKJHF1ZXN0aW9uLT5zZXRNYXhBdHRlbXB0cygkYXR0ZW1wdHMgPzogbnVsbCk7IAokcXVlc3Rpb24tPnNldEVycm9yTWVzc2FnZSgkZXJyb3JNZXNzYWdlKTsKJHF1ZXN0aW9uLT5zZXRNdWx0aXNlbGVjdCgkbXVsdGlzZWxlY3QpOwoKJHJlc3VsdCA9ICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwoKJGlzQXNzb2MgPSAoYm9vbCkgXGNvdW50KGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRjaG9pY2VzKSwgJ2lzX3N0cmluZycpKTsKaWYgKCRpc0Fzc29jKSB7CnJldHVybiAkcmVzdWx0Owp9CgppZiAoIWlzX2FycmF5KCRyZXN1bHQpKSB7CnJldHVybiAoc3RyaW5nKSBhcnJheV9zZWFyY2goJHJlc3VsdCwgJGNob2ljZXMsIHRydWUpOwp9CgokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkY2hvaWNlcyBhcyAkaW5kZXggPT4gJGNob2ljZSkgewppZiAoaW5fYXJyYXkoJGNob2ljZSwgJHJlc3VsdCwgdHJ1ZSkpIHsKJHJlc3VsdHNbXSA9IChzdHJpbmcpICRpbmRleDsKfQp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZSgpOiBUYWJsZQp7CnJldHVybiBuZXcgVGFibGUoJHRoaXMtPm91dHB1dCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKTogT3V0cHV0SW50ZXJmYWNlCnsKaWYgKCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIElPSW50ZXJmYWNlIGV4dGVuZHMgTG9nZ2VySW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IFFVSUVUID0gMTsKcHVibGljIGNvbnN0IE5PUk1BTCA9IDI7CnB1YmxpYyBjb25zdCBWRVJCT1NFID0gNDsKcHVibGljIGNvbnN0IFZFUllfVkVSQk9TRSA9IDg7CnB1YmxpYyBjb25zdCBERUJVRyA9IDE2OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZVJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVFcnJvclJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzayhzdHJpbmcgJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IG51bGwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tDb25maXJtYXRpb24oc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUpOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZFZhbGlkYXRlKHN0cmluZyAkcXVlc3Rpb24sIGNhbGxhYmxlICR2YWxpZGF0b3IsID9pbnQgJGF0dGVtcHRzID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kSGlkZUFuc3dlcihzdHJpbmcgJHF1ZXN0aW9uKTsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3Qoc3RyaW5nICRxdWVzdGlvbiwgYXJyYXkgJGNob2ljZXMsICRkZWZhdWx0LCAkYXR0ZW1wdHMgPSBmYWxzZSwgc3RyaW5nICRlcnJvck1lc3NhZ2UgPSAnVmFsdWUgIiVzIiBpcyBpbnZhbGlkJywgYm9vbCAkbXVsdGlzZWxlY3QgPSBmYWxzZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbnMoKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXV0aGVudGljYXRpb24oc3RyaW5nICRyZXBvc2l0b3J5TmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUsIHN0cmluZyAkdXNlcm5hbWUsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkQ29uZmlndXJhdGlvbihDb25maWcgJGNvbmZpZyk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXElPOwoKCgoKCgpjbGFzcyBOdWxsSU8gZXh0ZW5kcyBCYXNlSU8KewoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk6IHZvaWQKewp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKCRxdWVzdGlvbiwgJGRlZmF1bHQgPSBudWxsKQp7CnJldHVybiAkZGVmYXVsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24sICRkZWZhdWx0ID0gdHJ1ZSk6IGJvb2wKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRWYWxpZGF0ZSgkcXVlc3Rpb24sICR2YWxpZGF0b3IsICRhdHRlbXB0cyA9IG51bGwsICRkZWZhdWx0ID0gbnVsbCkKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRIaWRlQW5zd2VyKCRxdWVzdGlvbik6ID9zdHJpbmcKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlbGVjdCgkcXVlc3Rpb24sICRjaG9pY2VzLCAkZGVmYXVsdCwgJGF0dGVtcHRzID0gZmFsc2UsICRlcnJvck1lc3NhZ2UgPSAnVmFsdWUgIiVzIiBpcyBpbnZhbGlkJywgJG11bHRpc2VsZWN0ID0gZmFsc2UpCnsKcmV0dXJuICRkZWZhdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXEF1dG9sb2FkR2VuZXJhdG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxHaXRodWJBY3Rpb25FcnJvcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxEZWZhdWx0UG9saWN5Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXExvY2FsUmVwb1RyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXExvY2tUcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbE9wdGltaXplcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcU29sdmVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFNvbHZlclByb2JsZW1zRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvbGljeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJFdmVudHM7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XExvY2tBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgoKY2xhc3MgSW5zdGFsbGVyCnsKcHVibGljIGNvbnN0IEVSUk9SX05PTkUgPSAwOyAKcHVibGljIGNvbnN0IEVSUk9SX0dFTkVSSUNfRkFJTFVSRSA9IDE7CnB1YmxpYyBjb25zdCBFUlJPUl9OT19MT0NLX0ZJTEVfRk9SX1BBUlRJQUxfVVBEQVRFID0gMzsKcHVibGljIGNvbnN0IEVSUk9SX0xPQ0tfRklMRV9JTlZBTElEID0gNDsKCnB1YmxpYyBjb25zdCBFUlJPUl9ERVBFTkRFTkNZX1JFU09MVVRJT05fRkFJTEVEID0gMjsKcHVibGljIGNvbnN0IEVSUk9SX0FVRElUX0ZBSUxFRCA9IDU7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCgoKcHJvdGVjdGVkICRjb25maWc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgoKCgoKcHJvdGVjdGVkICRmaXhlZFJvb3RQYWNrYWdlOwoKCgoKcHJvdGVjdGVkICRkb3dubG9hZE1hbmFnZXI7CgoKCgpwcm90ZWN0ZWQgJHJlcG9zaXRvcnlNYW5hZ2VyOwoKCgoKcHJvdGVjdGVkICRsb2NrZXI7CgoKCgpwcm90ZWN0ZWQgJGluc3RhbGxhdGlvbk1hbmFnZXI7CgoKCgpwcm90ZWN0ZWQgJGV2ZW50RGlzcGF0Y2hlcjsKCgoKCnByb3RlY3RlZCAkYXV0b2xvYWRHZW5lcmF0b3I7CgoKcHJvdGVjdGVkICRwcmVmZXJTb3VyY2UgPSBmYWxzZTsKCnByb3RlY3RlZCAkcHJlZmVyRGlzdCA9IGZhbHNlOwoKcHJvdGVjdGVkICRvcHRpbWl6ZUF1dG9sb2FkZXIgPSBmYWxzZTsKCnByb3RlY3RlZCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGFwY3VBdXRvbG9hZGVyID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGFwY3VBdXRvbG9hZGVyUHJlZml4ID0gbnVsbDsKCnByb3RlY3RlZCAkZGV2TW9kZSA9IGZhbHNlOwoKcHJvdGVjdGVkICRkcnlSdW4gPSBmYWxzZTsKCnByb3RlY3RlZCAkZG93bmxvYWRPbmx5ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHZlcmJvc2UgPSBmYWxzZTsKCnByb3RlY3RlZCAkdXBkYXRlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGluc3RhbGwgPSB0cnVlOwoKcHJvdGVjdGVkICRkdW1wQXV0b2xvYWRlciA9IHRydWU7Cgpwcm90ZWN0ZWQgJHJ1blNjcmlwdHMgPSB0cnVlOwoKcHJvdGVjdGVkICRwcmVmZXJTdGFibGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkcHJlZmVyTG93ZXN0ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHdyaXRlTG9jazsKCnByb3RlY3RlZCAkZXhlY3V0ZU9wZXJhdGlvbnMgPSB0cnVlOwoKcHJvdGVjdGVkICRhdWRpdCA9IHRydWU7Cgpwcm90ZWN0ZWQgJGVycm9yT25BdWRpdCA9IGZhbHNlOwoKcHJvdGVjdGVkICRhdWRpdEZvcm1hdCA9IEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZOwoKCnByb3RlY3RlZCAkdXBkYXRlTWlycm9ycyA9IGZhbHNlOwoKCgoKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dMaXN0ID0gbnVsbDsKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX09OTFlfTElTVEVEOwoKCgoKcHJvdGVjdGVkICRzdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOwoKCgoKcHJvdGVjdGVkICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKCgoKcHJvdGVjdGVkICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5OwoKCnByb3RlY3RlZCAkdGVtcG9yYXJ5Q29uc3RyYWludHMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBEb3dubG9hZE1hbmFnZXIgJGRvd25sb2FkTWFuYWdlciwgUmVwb3NpdG9yeU1hbmFnZXIgJHJlcG9zaXRvcnlNYW5hZ2VyLCBMb2NrZXIgJGxvY2tlciwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlciwgRXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIsIEF1dG9sb2FkR2VuZXJhdG9yICRhdXRvbG9hZEdlbmVyYXRvcikKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwokdGhpcy0+ZG93bmxvYWRNYW5hZ2VyID0gJGRvd25sb2FkTWFuYWdlcjsKJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyID0gJHJlcG9zaXRvcnlNYW5hZ2VyOwokdGhpcy0+bG9ja2VyID0gJGxvY2tlcjsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXIgPSAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5hdXRvbG9hZEdlbmVyYXRvciA9ICRhdXRvbG9hZEdlbmVyYXRvcjsKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIgPSBuZXcgU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcigkdGhpcy0+aW8pOwokdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7CgokdGhpcy0+d3JpdGVMb2NrID0gJGNvbmZpZy0+Z2V0KCdsb2NrJyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKCk6IGludAp7CgoKCgpnY19jb2xsZWN0X2N5Y2xlcygpOwpnY19kaXNhYmxlKCk7CgppZiAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCAhPT0gbnVsbCAmJiAkdGhpcy0+dXBkYXRlTWlycm9ycykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBpbnN0YWxsZXIgb3B0aW9ucyB1cGRhdGVNaXJyb3JzIGFuZCB1cGRhdGVBbGxvd0xpc3QgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iKTsKfQoKJGlzRnJlc2hJbnN0YWxsID0gJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+aXNGcmVzaCgpOwoKCmlmICghJHRoaXMtPnVwZGF0ZSAmJiAhJHRoaXMtPmxvY2tlci0+aXNMb2NrZWQoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGNvbXBvc2VyLmxvY2sgZmlsZSBwcmVzZW50LiBVcGRhdGluZyBkZXBlbmRlbmNpZXMgdG8gbGF0ZXN0IGluc3RlYWQgb2YgaW5zdGFsbGluZyBmcm9tIGxvY2sgZmlsZS4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2luc3RhbGwgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC93YXJuaW5nPicpOwokdGhpcy0+dXBkYXRlID0gdHJ1ZTsKfQoKaWYgKCR0aGlzLT5kcnlSdW4pIHsKJHRoaXMtPnZlcmJvc2UgPSB0cnVlOwokdGhpcy0+cnVuU2NyaXB0cyA9IGZhbHNlOwokdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMgPSBmYWxzZTsKJHRoaXMtPndyaXRlTG9jayA9IGZhbHNlOwokdGhpcy0+ZHVtcEF1dG9sb2FkZXIgPSBmYWxzZTsKJHRoaXMtPm1vY2tMb2NhbFJlcG9zaXRvcmllcygkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXIpOwp9CgppZiAoJHRoaXMtPmRvd25sb2FkT25seSkgewokdGhpcy0+ZHVtcEF1dG9sb2FkZXIgPSBmYWxzZTsKfQoKaWYgKCR0aGlzLT51cGRhdGUgJiYgISR0aGlzLT5pbnN0YWxsKSB7CiR0aGlzLT5kdW1wQXV0b2xvYWRlciA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPnJ1blNjcmlwdHMpIHsKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfREVWX01PREUnLCAkdGhpcy0+ZGV2TW9kZSA/ICcxJyA6ICcwJyk7CgoKCiRldmVudE5hbWUgPSAkdGhpcy0+dXBkYXRlID8gU2NyaXB0RXZlbnRzOjpQUkVfVVBEQVRFX0NNRCA6IFNjcmlwdEV2ZW50czo6UFJFX0lOU1RBTExfQ01EOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdCgkZXZlbnROYW1lLCAkdGhpcy0+ZGV2TW9kZSk7Cn0KCiR0aGlzLT5kb3dubG9hZE1hbmFnZXItPnNldFByZWZlclNvdXJjZSgkdGhpcy0+cHJlZmVyU291cmNlKTsKJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+c2V0UHJlZmVyRGlzdCgkdGhpcy0+cHJlZmVyRGlzdCk7CgokbG9jYWxSZXBvID0gJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKCnRyeSB7CmlmICgkdGhpcy0+dXBkYXRlKSB7CiRyZXMgPSAkdGhpcy0+ZG9VcGRhdGUoJGxvY2FsUmVwbywgJHRoaXMtPmluc3RhbGwpOwp9IGVsc2UgewokcmVzID0gJHRoaXMtPmRvSW5zdGFsbCgkbG9jYWxSZXBvKTsKfQppZiAoJHJlcyAhPT0gMCkgewpyZXR1cm4gJHJlczsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMgJiYgJHRoaXMtPmluc3RhbGwgJiYgJHRoaXMtPmNvbmZpZy0+Z2V0KCdub3RpZnktb24taW5zdGFsbCcpKSB7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5ub3RpZnlJbnN0YWxscygkdGhpcy0+aW8pOwp9Cgp0aHJvdyAkZTsKfQppZiAoJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zICYmICR0aGlzLT5pbnN0YWxsICYmICR0aGlzLT5jb25maWctPmdldCgnbm90aWZ5LW9uLWluc3RhbGwnKSkgewokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlci0+bm90aWZ5SW5zdGFsbHMoJHRoaXMtPmlvKTsKfQoKaWYgKCR0aGlzLT51cGRhdGUpIHsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbCiR0aGlzLT5sb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoJHRoaXMtPmRldk1vZGUpLAokdGhpcy0+Y3JlYXRlUGxhdGZvcm1SZXBvKGZhbHNlKSwKbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkdGhpcy0+cGFja2FnZSksCl0pOwppZiAoJGlzRnJlc2hJbnN0YWxsKSB7CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyLT5hZGRTdWdnZXN0aW9uc0Zyb21QYWNrYWdlKCR0aGlzLT5wYWNrYWdlKTsKfQokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlci0+b3V0cHV0TWluaW1hbGlzdGljKCRpbnN0YWxsZWRSZXBvKTsKfQoKCiRsb2NrZWRSZXBvc2l0b3J5ID0gJHRoaXMtPmxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKZm9yZWFjaCAoJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSB8fCAhJHBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKY29udGludWU7Cn0KCiRyZXBsYWNlbWVudCA9IGlzX3N0cmluZygkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkpCj8gJ1VzZSAnIC4gJHBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpIC4gJyBpbnN0ZWFkJwo6ICdObyByZXBsYWNlbWVudCB3YXMgc3VnZ2VzdGVkJzsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigKc3ByaW50ZigKIjx3YXJuaW5nPlBhY2thZ2UgJXMgaXMgYWJhbmRvbmVkLCB5b3Ugc2hvdWxkIGF2b2lkIHVzaW5nIGl0LiAlcy48L3dhcm5pbmc+IiwKJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJHJlcGxhY2VtZW50CikKKTsKfQoKaWYgKCR0aGlzLT5kdW1wQXV0b2xvYWRlcikgewoKaWYgKCR0aGlzLT5vcHRpbWl6ZUF1dG9sb2FkZXIpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5HZW5lcmF0aW5nIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlczwvaW5mbz4nKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5HZW5lcmF0aW5nIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9CgokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlKTsKJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yLT5zZXRBcGN1KCR0aGlzLT5hcGN1QXV0b2xvYWRlciwgJHRoaXMtPmFwY3VBdXRvbG9hZGVyUHJlZml4KTsKJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yLT5zZXRSdW5TY3JpcHRzKCR0aGlzLT5ydW5TY3JpcHRzKTsKJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHRoaXMKLT5hdXRvbG9hZEdlbmVyYXRvcgotPmR1bXAoCiR0aGlzLT5jb25maWcsCiRsb2NhbFJlcG8sCiR0aGlzLT5wYWNrYWdlLAokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlciwKJ2NvbXBvc2VyJywKJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlciwKbnVsbCwKJHRoaXMtPmxvY2tlcgopOwp9CgppZiAoJHRoaXMtPmluc3RhbGwgJiYgJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zKSB7Cgpmb3JlYWNoICgkbG9jYWxSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5lbnN1cmVCaW5hcmllc1ByZXNlbmNlKCRwYWNrYWdlKTsKfQp9CgokZnVuZGluZ0NvdW50ID0gMDsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRGdW5kaW5nKCkpIHsKJGZ1bmRpbmdDb3VudCsrOwp9Cn0KaWYgKCRmdW5kaW5nQ291bnQgPiAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCnNwcmludGYoCiI8aW5mbz4lZCBwYWNrYWdlJXMgeW91IGFyZSB1c2luZyAlcyBsb29raW5nIGZvciBmdW5kaW5nLjwvaW5mbz4iLAokZnVuZGluZ0NvdW50LAoxID09PSAkZnVuZGluZ0NvdW50ID8gJycgOiAncycsCjEgPT09ICRmdW5kaW5nQ291bnQgPyAnaXMnIDogJ2FyZScKKSwKJzxpbmZvPlVzZSB0aGUgYGNvbXBvc2VyIGZ1bmRgIGNvbW1hbmQgdG8gZmluZCBvdXQgbW9yZSE8L2luZm8+JywKXSk7Cn0KCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewoKJGV2ZW50TmFtZSA9ICR0aGlzLT51cGRhdGUgPyBTY3JpcHRFdmVudHM6OlBPU1RfVVBEQVRFX0NNRCA6IFNjcmlwdEV2ZW50czo6UE9TVF9JTlNUQUxMX0NNRDsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoJGV2ZW50TmFtZSwgJHRoaXMtPmRldk1vZGUpOwp9CgoKaWYgKCFkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewpnY19lbmFibGUoKTsKfQoKaWYgKCR0aGlzLT5hdWRpdCkgewppZiAoJHRoaXMtPnVwZGF0ZSAmJiAhJHRoaXMtPmluc3RhbGwpIHsKJHBhY2thZ2VzID0gJGxvY2tlZFJlcG9zaXRvcnktPmdldENhbm9uaWNhbFBhY2thZ2VzKCk7CiR0YXJnZXQgPSAnbG9ja2VkJzsKfSBlbHNlIHsKJHBhY2thZ2VzID0gJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKJHRhcmdldCA9ICdpbnN0YWxsZWQnOwp9CmlmIChjb3VudCgkcGFja2FnZXMpID4gMCkgewp0cnkgewokYXVkaXRvciA9IG5ldyBBdWRpdG9yKCk7CiRyZXBvU2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoKTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewokcmVwb1NldC0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KCiRhdWRpdENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldCgnYXVkaXQnKTsKCnJldHVybiAkYXVkaXRvci0+YXVkaXQoJHRoaXMtPmlvLCAkcmVwb1NldCwgJHBhY2thZ2VzLCAkdGhpcy0+YXVkaXRGb3JtYXQsIHRydWUsICRhdWRpdENvbmZpZ1snaWdub3JlJ10gPz8gW10sICRhdWRpdENvbmZpZ1snYWJhbmRvbmVkJ10gPz8gQXVkaXRvcjo6QUJBTkRPTkVEX1JFUE9SVCkgPiAwICYmICR0aGlzLT5lcnJvck9uQXVkaXQgPyBzZWxmOjpFUlJPUl9BVURJVF9GQUlMRUQgOiAwOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT5lcnJvcignRmFpbGVkIHRvIGF1ZGl0ICcuJHRhcmdldC4nIHBhY2thZ2VzLicpOwppZiAoJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSkgewokdGhpcy0+aW8tPmVycm9yKCdbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSk7Cn0KfQp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ05vICcuJHRhcmdldC4nIHBhY2thZ2VzIC0gc2tpcHBpbmcgYXVkaXQuJyk7Cn0KfQoKcmV0dXJuIDA7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG8sIGJvb2wgJGRvSW5zdGFsbCk6IGludAp7CiRwbGF0Zm9ybVJlcG8gPSAkdGhpcy0+Y3JlYXRlUGxhdGZvcm1SZXBvKHRydWUpOwokYWxpYXNlcyA9ICR0aGlzLT5nZXRSb290QWxpYXNlcyh0cnVlKTsKCiRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbDsKCnRyeSB7CmlmICgkdGhpcy0+bG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRsb2NrZWRSZXBvc2l0b3J5ID0gJHRoaXMtPmxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKfQp9IGNhdGNoIChcU2VsZFxKc29uTGludFxQYXJzaW5nRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsIHx8ICR0aGlzLT51cGRhdGVNaXJyb3JzKSB7Cgp0aHJvdyAkZTsKfQoKCn0KCmlmICgoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCAhPT0gbnVsbCB8fCAkdGhpcy0+dXBkYXRlTWlycm9ycykgJiYgISRsb2NrZWRSZXBvc2l0b3J5KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkNhbm5vdCB1cGRhdGUgJyAuICgkdGhpcy0+dXBkYXRlTWlycm9ycyA/ICdsb2NrIGZpbGUgaW5mb3JtYXRpb24nIDogJ29ubHkgYSBwYXJ0aWFsIHNldCBvZiBwYWNrYWdlcycpIC4gJyB3aXRob3V0IGEgbG9jayBmaWxlIHByZXNlbnQuIFJ1biBgY29tcG9zZXIgdXBkYXRlYCB0byBnZW5lcmF0ZSBhIGxvY2sgZmlsZS48L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CgpyZXR1cm4gc2VsZjo6RVJST1JfTk9fTE9DS19GSUxFX0ZPUl9QQVJUSUFMX1VQREFURTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Mb2FkaW5nIGNvbXBvc2VyIHJlcG9zaXRvcmllcyB3aXRoIHBhY2thZ2UgaW5mb3JtYXRpb248L2luZm8+Jyk7CgoKJHBvbGljeSA9ICR0aGlzLT5jcmVhdGVQb2xpY3kodHJ1ZSk7CiRyZXBvc2l0b3J5U2V0ID0gJHRoaXMtPmNyZWF0ZVJlcG9zaXRvcnlTZXQodHJ1ZSwgJHBsYXRmb3JtUmVwbywgJGFsaWFzZXMpOwokcmVwb3NpdG9yaWVzID0gJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyLT5nZXRSZXBvc2l0b3JpZXMoKTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkcmVwb3NpdG9yeSk7Cn0KaWYgKCRsb2NrZWRSZXBvc2l0b3J5KSB7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRsb2NrZWRSZXBvc2l0b3J5KTsKfQoKJHJlcXVlc3QgPSAkdGhpcy0+Y3JlYXRlUmVxdWVzdCgkdGhpcy0+Zml4ZWRSb290UGFja2FnZSwgJHBsYXRmb3JtUmVwbywgJGxvY2tlZFJlcG9zaXRvcnkpOwokdGhpcy0+cmVxdWlyZVBhY2thZ2VzRm9yVXBkYXRlKCRyZXF1ZXN0LCAkbG9ja2VkUmVwb3NpdG9yeSwgdHJ1ZSk7CgoKaWYgKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgIT09IG51bGwpIHsKJHJlcXVlc3QtPnNldFVwZGF0ZUFsbG93TGlzdCgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0LCAkdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKTsKfQoKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbCgkcmVxdWVzdCwgJHRoaXMtPmlvLCAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyLCAkdGhpcy0+Y3JlYXRlUG9vbE9wdGltaXplcigkcG9saWN5KSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPlVwZGF0aW5nIGRlcGVuZGVuY2llczwvaW5mbz4nKTsKCgokc29sdmVyID0gbmV3IFNvbHZlcigkcG9saWN5LCAkcG9vbCwgJHRoaXMtPmlvKTsKdHJ5IHsKJGxvY2tUcmFuc2FjdGlvbiA9ICRzb2x2ZXItPnNvbHZlKCRyZXF1ZXN0LCAkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRydWxlU2V0U2l6ZSA9ICRzb2x2ZXItPmdldFJ1bGVTZXRTaXplKCk7CiRzb2x2ZXIgPSBudWxsOwp9IGNhdGNoIChTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiAkZSkgewokZXJyID0gJ1lvdXIgcmVxdWlyZW1lbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBpbnN0YWxsYWJsZSBzZXQgb2YgcGFja2FnZXMuJzsKJHByZXR0eVByb2JsZW0gPSAkZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICR0aGlzLT5pby0+aXNWZXJib3NlKCkpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4gJGVyciAuJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwcmV0dHlQcm9ibGVtKTsKaWYgKCEkdGhpcy0+ZGV2TW9kZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlJ1bm5pbmcgdXBkYXRlIHdpdGggLS1uby1kZXYgZG9lcyBub3QgbWVhbiByZXF1aXJlLWRldiBpcyBpZ25vcmVkLCBpdCBqdXN0IG1lYW5zIHRoZSBwYWNrYWdlcyB3aWxsIG5vdCBiZSBpbnN0YWxsZWQuIElmIGRldiByZXF1aXJlbWVudHMgYXJlIGJsb2NraW5nIHRoZSB1cGRhdGUgeW91IGhhdmUgdG8gcmVzb2x2ZSB0aG9zZSBwcm9ibGVtcy48L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlcnIuIlxuIi4kcHJldHR5UHJvYmxlbSk7CgpyZXR1cm4gbWF4KHNlbGY6OkVSUk9SX0dFTkVSSUNfRkFJTFVSRSwgJGUtPmdldENvZGUoKSk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiQW5hbHl6ZWQgIi5jb3VudCgkcG9vbCkuIiBwYWNrYWdlcyB0byByZXNvbHZlIGRlcGVuZGVuY2llcyIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJBbmFseXplZCAiLiRydWxlU2V0U2l6ZS4iIHJ1bGVzIHRvIHJlc29sdmUgZGVwZW5kZW5jaWVzIiwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKJHBvb2wgPSBudWxsOwoKaWYgKCEkbG9ja1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdOb3RoaW5nIHRvIG1vZGlmeSBpbiBsb2NrIGZpbGUnKTsKfQoKJGV4aXRDb2RlID0gJHRoaXMtPmV4dHJhY3REZXZQYWNrYWdlcygkbG9ja1RyYW5zYWN0aW9uLCAkcGxhdGZvcm1SZXBvLCAkYWxpYXNlcywgJHBvbGljeSwgJGxvY2tlZFJlcG9zaXRvcnkpOwppZiAoJGV4aXRDb2RlICE9PSAwKSB7CnJldHVybiAkZXhpdENvZGU7Cn0KCgppZiAobWV0aG9kX2V4aXN0cygnQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXInLCAnY2xlYXInKSkgeyAKXENvbXBvc2VyXFNlbXZlclxDb21waWxpbmdNYXRjaGVyOjpjbGVhcigpOwp9CgoKJHBsYXRmb3JtUmVxcyA9ICR0aGlzLT5leHRyYWN0UGxhdGZvcm1SZXF1aXJlbWVudHMoJHRoaXMtPnBhY2thZ2UtPmdldFJlcXVpcmVzKCkpOwokcGxhdGZvcm1EZXZSZXFzID0gJHRoaXMtPmV4dHJhY3RQbGF0Zm9ybVJlcXVpcmVtZW50cygkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7CgokaW5zdGFsbHNVcGRhdGVzID0gJHVuaW5zdGFsbHMgPSBbXTsKaWYgKCRsb2NrVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSkgewokaW5zdGFsbE5hbWVzID0gJHVwZGF0ZU5hbWVzID0gJHVuaW5zdGFsbE5hbWVzID0gW107CmZvcmVhY2ggKCRsb2NrVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSBhcyAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikgewokaW5zdGFsbHNVcGRhdGVzW10gPSAkb3BlcmF0aW9uOwokaW5zdGFsbE5hbWVzW10gPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKS4nOicuJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwp9IGVsc2VpZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewoKCmlmICgkdGhpcy0+dXBkYXRlTWlycm9ycwomJiAkb3BlcmF0aW9uLT5nZXRJbml0aWFsUGFja2FnZSgpLT5nZXROYW1lKCkgPT09ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpCiYmICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCktPmdldFZlcnNpb24oKSA9PT0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRWZXJzaW9uKCkKKSB7CmNvbnRpbnVlOwp9CgokaW5zdGFsbHNVcGRhdGVzW10gPSAkb3BlcmF0aW9uOwokdXBkYXRlTmFtZXNbXSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpLic6Jy4kb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZWlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVW5pbnN0YWxsT3BlcmF0aW9uKSB7CiR1bmluc3RhbGxzW10gPSAkb3BlcmF0aW9uOwokdW5pbnN0YWxsTmFtZXNbXSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpOwp9Cn0KCmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2xvY2snKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKIjxpbmZvPkxvY2sgZmlsZSBvcGVyYXRpb25zOiAlZCBpbnN0YWxsJXMsICVkIHVwZGF0ZSVzLCAlZCByZW1vdmFsJXM8L2luZm8+IiwKY291bnQoJGluc3RhbGxOYW1lcyksCjEgPT09IGNvdW50KCRpbnN0YWxsTmFtZXMpID8gJycgOiAncycsCmNvdW50KCR1cGRhdGVOYW1lcyksCjEgPT09IGNvdW50KCR1cGRhdGVOYW1lcykgPyAnJyA6ICdzJywKY291bnQoJHVuaW5zdGFsbHMpLAoxID09PSBjb3VudCgkdW5pbnN0YWxscykgPyAnJyA6ICdzJwopKTsKaWYgKCRpbnN0YWxsTmFtZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJJbnN0YWxsczogIi5pbXBsb2RlKCcsICcsICRpbnN0YWxsTmFtZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1cGRhdGVOYW1lcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlVwZGF0ZXM6ICIuaW1wbG9kZSgnLCAnLCAkdXBkYXRlTmFtZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1bmluc3RhbGxzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiUmVtb3ZhbHM6ICIuaW1wbG9kZSgnLCAnLCAkdW5pbnN0YWxsTmFtZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KfQp9Cgokc29ydEJ5TmFtZSA9IHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKTogaW50IHsKaWYgKCRhIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CiRhID0gJGEtPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpOwp9IGVsc2UgewokYSA9ICRhLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKTsKfQppZiAoJGIgaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24pIHsKJGIgPSAkYi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXROYW1lKCk7Cn0gZWxzZSB7CiRiID0gJGItPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gc3RyY21wKCRhLCAkYik7Cn07CnVzb3J0KCR1bmluc3RhbGxzLCAkc29ydEJ5TmFtZSk7CnVzb3J0KCRpbnN0YWxsc1VwZGF0ZXMsICRzb3J0QnlOYW1lKTsKCmZvcmVhY2ggKGFycmF5X21lcmdlKCR1bmluc3RhbGxzLCAkaW5zdGFsbHNVcGRhdGVzKSBhcyAkb3BlcmF0aW9uKSB7CgppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpKTsKfQoKCmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2xvY2snKSAmJiAoZmFsc2UgPT09IHN0cnBvcygkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCksICdBbGlhcycpIHx8ICR0aGlzLT5pby0+aXNEZWJ1ZygpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgLSAnIC4gJG9wZXJhdGlvbi0+c2hvdyh0cnVlKSk7Cn0KfQoKJHVwZGF0ZWRMb2NrID0gJHRoaXMtPmxvY2tlci0+c2V0TG9ja0RhdGEoCiRsb2NrVHJhbnNhY3Rpb24tPmdldE5ld0xvY2tQYWNrYWdlcyhmYWxzZSwgJHRoaXMtPnVwZGF0ZU1pcnJvcnMpLAokbG9ja1RyYW5zYWN0aW9uLT5nZXROZXdMb2NrUGFja2FnZXModHJ1ZSwgJHRoaXMtPnVwZGF0ZU1pcnJvcnMpLAokcGxhdGZvcm1SZXFzLAokcGxhdGZvcm1EZXZSZXFzLAokbG9ja1RyYW5zYWN0aW9uLT5nZXRBbGlhc2VzKCRhbGlhc2VzKSwKJHRoaXMtPnBhY2thZ2UtPmdldE1pbmltdW1TdGFiaWxpdHkoKSwKJHRoaXMtPnBhY2thZ2UtPmdldFN0YWJpbGl0eUZsYWdzKCksCiR0aGlzLT5wcmVmZXJTdGFibGUgfHwgJHRoaXMtPnBhY2thZ2UtPmdldFByZWZlclN0YWJsZSgpLAokdGhpcy0+cHJlZmVyTG93ZXN0LAokdGhpcy0+Y29uZmlnLT5nZXQoJ3BsYXRmb3JtJykgPzogW10sCiR0aGlzLT53cml0ZUxvY2sgJiYgJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zCik7CmlmICgkdXBkYXRlZExvY2sgJiYgJHRoaXMtPndyaXRlTG9jayAmJiAkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Xcml0aW5nIGxvY2sgZmlsZTwvaW5mbz4nKTsKfQoKaWYgKCRkb0luc3RhbGwpIHsKCnJldHVybiAkdGhpcy0+ZG9JbnN0YWxsKCRsb2NhbFJlcG8sIHRydWUpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3REZXZQYWNrYWdlcyhMb2NrVHJhbnNhY3Rpb24gJGxvY2tUcmFuc2FjdGlvbiwgUGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8sIGFycmF5ICRhbGlhc2VzLCBQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSwgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG9zaXRvcnkgPSBudWxsKTogaW50CnsKaWYgKCEkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSkgewpyZXR1cm4gMDsKfQoKJHJlc3VsdFJlcG8gPSBuZXcgQXJyYXlSZXBvc2l0b3J5KFtdKTsKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwpmb3JlYWNoICgkbG9ja1RyYW5zYWN0aW9uLT5nZXROZXdMb2NrUGFja2FnZXMoZmFsc2UpIGFzICRwa2cpIHsKJHJlc3VsdFJlcG8tPmFkZFBhY2thZ2UoJGxvYWRlci0+bG9hZCgkZHVtcGVyLT5kdW1wKCRwa2cpKSk7Cn0KCiRyZXBvc2l0b3J5U2V0ID0gJHRoaXMtPmNyZWF0ZVJlcG9zaXRvcnlTZXQodHJ1ZSwgJHBsYXRmb3JtUmVwbywgJGFsaWFzZXMpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkcmVzdWx0UmVwbyk7CgokcmVxdWVzdCA9ICR0aGlzLT5jcmVhdGVSZXF1ZXN0KCR0aGlzLT5maXhlZFJvb3RQYWNrYWdlLCAkcGxhdGZvcm1SZXBvKTsKJHRoaXMtPnJlcXVpcmVQYWNrYWdlc0ZvclVwZGF0ZSgkcmVxdWVzdCwgJGxvY2tlZFJlcG9zaXRvcnksIGZhbHNlKTsKCiRwb29sID0gJHJlcG9zaXRvcnlTZXQtPmNyZWF0ZVBvb2xXaXRoQWxsUGFja2FnZXMoKTsKCiRzb2x2ZXIgPSBuZXcgU29sdmVyKCRwb2xpY3ksICRwb29sLCAkdGhpcy0+aW8pOwp0cnkgewokbm9uRGV2TG9ja1RyYW5zYWN0aW9uID0gJHNvbHZlci0+c29sdmUoJHJlcXVlc3QsICR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHNvbHZlciA9IG51bGw7Cn0gY2F0Y2ggKFNvbHZlclByb2JsZW1zRXhjZXB0aW9uICRlKSB7CiRlcnIgPSAnVW5hYmxlIHRvIGZpbmQgYSBjb21wYXRpYmxlIHNldCBvZiBwYWNrYWdlcyBiYXNlZCBvbiB5b3VyIG5vbi1kZXYgcmVxdWlyZW1lbnRzIGFsb25lLic7CiRwcmV0dHlQcm9ibGVtID0gJGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpLCB0cnVlKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPicuICRlcnIgLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91ciByZXF1aXJlbWVudHMgY2FuIGJlIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSB3aGVuIHJlcXVpcmUtZGV2IHBhY2thZ2VzIGFyZSBwcmVzZW50LicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBtYXkgbmVlZCB0byBtb3ZlIHBhY2thZ2VzIGZyb20gcmVxdWlyZS1kZXYgb3Igc29tZSBvZiB0aGVpciBkZXBlbmRlbmNpZXMgdG8gcmVxdWlyZS4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwcmV0dHlQcm9ibGVtKTsKCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZXJyLiJcbiIuJHByZXR0eVByb2JsZW0pOwoKcmV0dXJuICRlLT5nZXRDb2RlKCk7Cn0KCiRsb2NrVHJhbnNhY3Rpb24tPnNldE5vbkRldlBhY2thZ2VzKCRub25EZXZMb2NrVHJhbnNhY3Rpb24pOwoKcmV0dXJuIDA7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG8sIGJvb2wgJGFscmVhZHlTb2x2ZWQgPSBmYWxzZSk6IGludAp7CmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2xvY2snKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzIGZyb20gbG9jayBmaWxlJy4oJHRoaXMtPmRldk1vZGUgPyAnIChpbmNsdWRpbmcgcmVxdWlyZS1kZXYpJyA6ICcnKS4nPC9pbmZvPicpOwp9CgokbG9ja2VkUmVwb3NpdG9yeSA9ICR0aGlzLT5sb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoJHRoaXMtPmRldk1vZGUpOwoKCgppZiAoISRhbHJlYWR5U29sdmVkKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+VmVyaWZ5aW5nIGxvY2sgZmlsZSBjb250ZW50cyBjYW4gYmUgaW5zdGFsbGVkIG9uIGN1cnJlbnQgcGxhdGZvcm0uPC9pbmZvPicpOwoKJHBsYXRmb3JtUmVwbyA9ICR0aGlzLT5jcmVhdGVQbGF0Zm9ybVJlcG8oZmFsc2UpOwoKJHBvbGljeSA9ICR0aGlzLT5jcmVhdGVQb2xpY3koZmFsc2UpOwoKJHJlcG9zaXRvcnlTZXQgPSAkdGhpcy0+Y3JlYXRlUmVwb3NpdG9yeVNldChmYWxzZSwgJHBsYXRmb3JtUmVwbywgW10sICRsb2NrZWRSZXBvc2l0b3J5KTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJGxvY2tlZFJlcG9zaXRvcnkpOwoKCiRyZXF1ZXN0ID0gJHRoaXMtPmNyZWF0ZVJlcXVlc3QoJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UsICRwbGF0Zm9ybVJlcG8sICRsb2NrZWRSZXBvc2l0b3J5KTsKCmlmICghJHRoaXMtPmxvY2tlci0+aXNGcmVzaCgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+V2FybmluZzogVGhlIGxvY2sgZmlsZSBpcyBub3QgdXAgdG8gZGF0ZSB3aXRoIHRoZSBsYXRlc3QgY2hhbmdlcyBpbiBjb21wb3Nlci5qc29uLiBZb3UgbWF5IGJlIGdldHRpbmcgb3V0ZGF0ZWQgZGVwZW5kZW5jaWVzLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBydW4gYGNvbXBvc2VyIHVwZGF0ZWAgb3IgYGNvbXBvc2VyIHVwZGF0ZSA8cGFja2FnZSBuYW1lPmAuPC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvID0gJHRoaXMtPmxvY2tlci0+Z2V0TWlzc2luZ1JlcXVpcmVtZW50SW5mbygkdGhpcy0+cGFja2FnZSwgJHRoaXMtPmRldk1vZGUpOwppZiAoJG1pc3NpbmdSZXF1aXJlbWVudEluZm8gIT09IFtdKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbWlzc2luZ1JlcXVpcmVtZW50SW5mbyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfTE9DS19GSUxFX0lOVkFMSUQ7Cn0KCmZvcmVhY2ggKCRsb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRyZXF1ZXN0LT5maXhMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKTsKfQoKZm9yZWFjaCAoJHRoaXMtPmxvY2tlci0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudHMoJHRoaXMtPmRldk1vZGUpIGFzICRsaW5rKSB7CiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9CgokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sKCRyZXF1ZXN0LCAkdGhpcy0+aW8sICR0aGlzLT5ldmVudERpc3BhdGNoZXIpOwoKCiRzb2x2ZXIgPSBuZXcgU29sdmVyKCRwb2xpY3ksICRwb29sLCAkdGhpcy0+aW8pOwp0cnkgewokbG9ja1RyYW5zYWN0aW9uID0gJHNvbHZlci0+c29sdmUoJHJlcXVlc3QsICR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHNvbHZlciA9IG51bGw7CgoKaWYgKDAgIT09IGNvdW50KCRsb2NrVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91ciBsb2NrIGZpbGUgY2Fubm90IGJlIGluc3RhbGxlZCBvbiB0aGlzIHN5c3RlbSB3aXRob3V0IGNoYW5nZXMuIFBsZWFzZSBydW4gY29tcG9zZXIgdXBkYXRlLjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnJldHVybiBzZWxmOjpFUlJPUl9MT0NLX0ZJTEVfSU5WQUxJRDsKfQp9IGNhdGNoIChTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiAkZSkgewokZXJyID0gJ1lvdXIgbG9jayBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSBjb21wYXRpYmxlIHNldCBvZiBwYWNrYWdlcy4gUGxlYXNlIHJ1biBjb21wb3NlciB1cGRhdGUuJzsKJHByZXR0eVByb2JsZW0gPSAkZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICR0aGlzLT5pby0+aXNWZXJib3NlKCkpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4gJGVyciAuJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwcmV0dHlQcm9ibGVtKTsKCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZXJyLiJcbiIuJHByZXR0eVByb2JsZW0pOwoKcmV0dXJuIG1heChzZWxmOjpFUlJPUl9HRU5FUklDX0ZBSUxVUkUsICRlLT5nZXRDb2RlKCkpOwp9Cn0KCgokbG9jYWxSZXBvVHJhbnNhY3Rpb24gPSBuZXcgTG9jYWxSZXBvVHJhbnNhY3Rpb24oJGxvY2tlZFJlcG9zaXRvcnksICRsb2NhbFJlcG8pOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaEluc3RhbGxlckV2ZW50KEluc3RhbGxlckV2ZW50czo6UFJFX09QRVJBVElPTlNfRVhFQywgJHRoaXMtPmRldk1vZGUsICR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucywgJGxvY2FsUmVwb1RyYW5zYWN0aW9uKTsKCiRpbnN0YWxscyA9ICR1cGRhdGVzID0gJHVuaW5zdGFsbHMgPSBbXTsKZm9yZWFjaCAoJGxvY2FsUmVwb1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkgYXMgJG9wZXJhdGlvbikgewppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKJGluc3RhbGxzW10gPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKS4nOicuJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwp9IGVsc2VpZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewokdXBkYXRlc1tdID0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCkuJzonLiRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKfSBlbHNlaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBVbmluc3RhbGxPcGVyYXRpb24pIHsKJHVuaW5zdGFsbHNbXSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpOwp9Cn0KCmlmICgkaW5zdGFsbHMgPT09IFtdICYmICR1cGRhdGVzID09PSBbXSAmJiAkdW5pbnN0YWxscyA9PT0gW10pIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdOb3RoaW5nIHRvIGluc3RhbGwsIHVwZGF0ZSBvciByZW1vdmUnKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoCiI8aW5mbz5QYWNrYWdlIG9wZXJhdGlvbnM6ICVkIGluc3RhbGwlcywgJWQgdXBkYXRlJXMsICVkIHJlbW92YWwlczwvaW5mbz4iLApjb3VudCgkaW5zdGFsbHMpLAoxID09PSBjb3VudCgkaW5zdGFsbHMpID8gJycgOiAncycsCmNvdW50KCR1cGRhdGVzKSwKMSA9PT0gY291bnQoJHVwZGF0ZXMpID8gJycgOiAncycsCmNvdW50KCR1bmluc3RhbGxzKSwKMSA9PT0gY291bnQoJHVuaW5zdGFsbHMpID8gJycgOiAncycKKSk7CmlmICgkaW5zdGFsbHMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJJbnN0YWxsczogIi5pbXBsb2RlKCcsICcsICRpbnN0YWxscyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQppZiAoJHVwZGF0ZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJVcGRhdGVzOiAiLmltcGxvZGUoJywgJywgJHVwZGF0ZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1bmluc3RhbGxzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiUmVtb3ZhbHM6ICIuaW1wbG9kZSgnLCAnLCAkdW5pbnN0YWxscyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQp9CgppZiAoJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zKSB7CiRsb2NhbFJlcG8tPnNldERldlBhY2thZ2VOYW1lcygkdGhpcy0+bG9ja2VyLT5nZXREZXZQYWNrYWdlTmFtZXMoKSk7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5leGVjdXRlKCRsb2NhbFJlcG8sICRsb2NhbFJlcG9UcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpLCAkdGhpcy0+ZGV2TW9kZSwgJHRoaXMtPnJ1blNjcmlwdHMsICR0aGlzLT5kb3dubG9hZE9ubHkpOwoKCmlmIChjb3VudCgkbG9jYWxSZXBvVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSkgPiAwKSB7CiR2ZW5kb3JEaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKaWYgKGlzX2RpcigkdmVuZG9yRGlyKSkgewoKCkB0b3VjaCgkdmVuZG9yRGlyKTsKfQp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRsb2NhbFJlcG9UcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpIGFzICRvcGVyYXRpb24pIHsKCmlmIChmYWxzZSA9PT0gc3RycG9zKCRvcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSwgJ0FsaWFzJykgfHwgJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgIC0gJyAuICRvcGVyYXRpb24tPnNob3coZmFsc2UpKTsKfQp9Cn0KCnJldHVybiAwOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlUGxhdGZvcm1SZXBvKGJvb2wgJGZvclVwZGF0ZSk6IFBsYXRmb3JtUmVwb3NpdG9yeQp7CmlmICgkZm9yVXBkYXRlKSB7CiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICR0aGlzLT5jb25maWctPmdldCgncGxhdGZvcm0nKSA/OiBbXTsKfSBlbHNlIHsKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJHRoaXMtPmxvY2tlci0+Z2V0UGxhdGZvcm1PdmVycmlkZXMoKTsKfQoKcmV0dXJuIG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVSZXBvc2l0b3J5U2V0KGJvb2wgJGZvclVwZGF0ZSwgUGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8sIGFycmF5ICRyb290QWxpYXNlcyA9IFtdLCA/UmVwb3NpdG9yeUludGVyZmFjZSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpOiBSZXBvc2l0b3J5U2V0CnsKaWYgKCRmb3JVcGRhdGUpIHsKJG1pbmltdW1TdGFiaWxpdHkgPSAkdGhpcy0+cGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwokc3RhYmlsaXR5RmxhZ3MgPSAkdGhpcy0+cGFja2FnZS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKTsKCiRyZXF1aXJlcyA9IGFycmF5X21lcmdlKCR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpLCAkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0gZWxzZSB7CiRtaW5pbXVtU3RhYmlsaXR5ID0gJHRoaXMtPmxvY2tlci0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwokc3RhYmlsaXR5RmxhZ3MgPSAkdGhpcy0+bG9ja2VyLT5nZXRTdGFiaWxpdHlGbGFncygpOwoKJHJlcXVpcmVzID0gW107CmZvcmVhY2ggKCRsb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKJGNvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKJHJlcXVpcmVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGNvbnN0cmFpbnQ7Cn0KfQoKJHJvb3RSZXF1aXJlcyA9IFtdOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcSA9PiAkY29uc3RyYWludCkgewppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBMaW5rKSB7CiRjb25zdHJhaW50ID0gJGNvbnN0cmFpbnQtPmdldENvbnN0cmFpbnQoKTsKfQoKaWYgKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJHJlcSkpIHsKY29udGludWU7Cn0gZWxzZWlmICgkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRjb25zdHJhaW50ID0gJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJHJlcSwgJGNvbnN0cmFpbnQpOwp9CiRyb290UmVxdWlyZXNbJHJlcV0gPSAkY29uc3RyYWludDsKfQoKJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UgPSBjbG9uZSAkdGhpcy0+cGFja2FnZTsKJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UtPnNldFJlcXVpcmVzKFtdKTsKJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UtPnNldERldlJlcXVpcmVzKFtdKTsKCiRzdGFiaWxpdHlGbGFnc1skdGhpcy0+cGFja2FnZS0+Z2V0TmFtZSgpXSA9IEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXNbVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHRoaXMtPnBhY2thZ2UtPmdldFZlcnNpb24oKSldOwoKJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkbWluaW11bVN0YWJpbGl0eSwgJHN0YWJpbGl0eUZsYWdzLCAkcm9vdEFsaWFzZXMsICR0aGlzLT5wYWNrYWdlLT5nZXRSZWZlcmVuY2VzKCksICRyb290UmVxdWlyZXMsICR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cyk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UpKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHBsYXRmb3JtUmVwbyk7CmlmICgkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSkgewoKCiRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgPSAkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeTsKaWYgKCRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CiRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgPSAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzLT5nZXRSZXBvc2l0b3JpZXMoKTsKfSBlbHNlIHsKJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcyA9IFskYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzXTsKfQpmb3JlYWNoICgkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzIGFzICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KSB7CmlmICgkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnkgfHwgJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkgaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlKSB7CiRyZXBvc2l0b3J5U2V0LT5hbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcygpOwpicmVhazsKfQp9CgokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSk7Cn0KCnJldHVybiAkcmVwb3NpdG9yeVNldDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQb2xpY3koYm9vbCAkZm9yVXBkYXRlKTogRGVmYXVsdFBvbGljeQp7CiRwcmVmZXJTdGFibGUgPSBudWxsOwokcHJlZmVyTG93ZXN0ID0gbnVsbDsKaWYgKCEkZm9yVXBkYXRlKSB7CiRwcmVmZXJTdGFibGUgPSAkdGhpcy0+bG9ja2VyLT5nZXRQcmVmZXJTdGFibGUoKTsKJHByZWZlckxvd2VzdCA9ICR0aGlzLT5sb2NrZXItPmdldFByZWZlckxvd2VzdCgpOwp9CgoKaWYgKG51bGwgPT09ICRwcmVmZXJTdGFibGUpIHsKJHByZWZlclN0YWJsZSA9ICR0aGlzLT5wcmVmZXJTdGFibGUgfHwgJHRoaXMtPnBhY2thZ2UtPmdldFByZWZlclN0YWJsZSgpOwp9CmlmIChudWxsID09PSAkcHJlZmVyTG93ZXN0KSB7CiRwcmVmZXJMb3dlc3QgPSAkdGhpcy0+cHJlZmVyTG93ZXN0Owp9CgpyZXR1cm4gbmV3IERlZmF1bHRQb2xpY3koJHByZWZlclN0YWJsZSwgJHByZWZlckxvd2VzdCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdChSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIFBsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpOiBSZXF1ZXN0CnsKJHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgkbG9ja2VkUmVwb3NpdG9yeSk7CgokcmVxdWVzdC0+Zml4UGFja2FnZSgkcm9vdFBhY2thZ2UpOwppZiAoJHJvb3RQYWNrYWdlIGluc3RhbmNlb2YgUm9vdEFsaWFzUGFja2FnZSkgewokcmVxdWVzdC0+Zml4UGFja2FnZSgkcm9vdFBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KCiRmaXhlZFBhY2thZ2VzID0gJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKTsKaWYgKCR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KSB7CiRmaXhlZFBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJGZpeGVkUGFja2FnZXMsICR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpKTsKfQoKCgoKJHByb3ZpZGVkID0gJHJvb3RQYWNrYWdlLT5nZXRQcm92aWRlcygpOwpmb3JlYWNoICgkZml4ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewoKaWYgKCRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkgIT09ICRwbGF0Zm9ybVJlcG8KfHwgIWlzc2V0KCRwcm92aWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkKfHwgISRwcm92aWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpCikgewokcmVxdWVzdC0+Zml4UGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcmV0dXJuICRyZXF1ZXN0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQYWNrYWdlc0ZvclVwZGF0ZShSZXF1ZXN0ICRyZXF1ZXN0LCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwsIGJvb2wgJGluY2x1ZGVEZXZSZXF1aXJlcyA9IHRydWUpOiB2b2lkCnsKCmlmICgkdGhpcy0+dXBkYXRlTWlycm9ycykgewokZXhjbHVkZWRQYWNrYWdlcyA9IFtdOwppZiAoISRpbmNsdWRlRGV2UmVxdWlyZXMpIHsKJGV4Y2x1ZGVkUGFja2FnZXMgPSBhcnJheV9mbGlwKCR0aGlzLT5sb2NrZXItPmdldERldlBhY2thZ2VOYW1lcygpKTsKfQoKZm9yZWFjaCAoJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJGxvY2tlZFBhY2thZ2UpIHsKCgppZiAoISRsb2NrZWRQYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkZXhjbHVkZWRQYWNrYWdlc1skbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCksIG5ldyBDb25zdHJhaW50KCc9PScsICRsb2NrZWRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpKTsKfQp9Cn0gZWxzZSB7CiRsaW5rcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoJGluY2x1ZGVEZXZSZXF1aXJlcykgewokbGlua3MgPSBhcnJheV9tZXJnZSgkbGlua3MsICR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKfQpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Um9vdEFsaWFzZXMoYm9vbCAkZm9yVXBkYXRlKTogYXJyYXkKewppZiAoJGZvclVwZGF0ZSkgewokYWxpYXNlcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc2VzKCk7Cn0gZWxzZSB7CiRhbGlhc2VzID0gJHRoaXMtPmxvY2tlci0+Z2V0QWxpYXNlcygpOwp9CgpyZXR1cm4gJGFsaWFzZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0UGxhdGZvcm1SZXF1aXJlbWVudHMoYXJyYXkgJGxpbmtzKTogYXJyYXkKewokcGxhdGZvcm1SZXFzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CiRwbGF0Zm9ybVJlcXNbJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0KfQoKcmV0dXJuICRwbGF0Zm9ybVJlcXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtb2NrTG9jYWxSZXBvc2l0b3JpZXMoUmVwb3NpdG9yeU1hbmFnZXIgJHJtKTogdm9pZAp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkcm0tPmdldExvY2FsUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1soc3RyaW5nKSAkcGFja2FnZV0gPSBjbG9uZSAkcGFja2FnZTsKfQpmb3JlYWNoICgkcGFja2FnZXMgYXMgJGtleSA9PiAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGFsaWFzID0gKHN0cmluZykgJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKJGNsYXNzTmFtZSA9IGdldF9jbGFzcygkcGFja2FnZSk7CiRwYWNrYWdlc1ska2V5XSA9IG5ldyAkY2xhc3NOYW1lKCRwYWNrYWdlc1skYWxpYXNdLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQp9CiRybS0+c2V0TG9jYWxSZXBvc2l0b3J5KApuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KCRwYWNrYWdlcykKKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQb29sT3B0aW1pemVyKFBvbGljeUludGVyZmFjZSAkcG9saWN5KTogP1Bvb2xPcHRpbWl6ZXIKewoKCgppZiAoJzAnID09PSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9QT09MX09QVElNSVpFUicpKSB7CiR0aGlzLT5pby0+d3JpdGUoJ1Bvb2wgT3B0aW1pemVyIHdhcyBkaXNhYmxlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBQb29sT3B0aW1pemVyKCRwb2xpY3kpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKElPSW50ZXJmYWNlICRpbywgQ29tcG9zZXIgJGNvbXBvc2VyKTogc2VsZgp7CnJldHVybiBuZXcgc3RhdGljKAokaW8sCiRjb21wb3Nlci0+Z2V0Q29uZmlnKCksCiRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLAokY29tcG9zZXItPmdldERvd25sb2FkTWFuYWdlcigpLAokY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCksCiRjb21wb3Nlci0+Z2V0TG9ja2VyKCksCiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLAokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLAokY29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCkKKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSk6IHNlbGYKewokdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSA9ICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRlbXBvcmFyeUNvbnN0cmFpbnRzKGFycmF5ICRjb25zdHJhaW50cyk6IHNlbGYKewokdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMgPSAkY29uc3RyYWludHM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERyeVJ1bihib29sICRkcnlSdW4gPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5kcnlSdW4gPSAoYm9vbCkgJGRyeVJ1bjsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRHJ5UnVuKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRyeVJ1bjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RG93bmxvYWRPbmx5KGJvb2wgJGRvd25sb2FkT25seSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmRvd25sb2FkT25seSA9ICRkb3dubG9hZE9ubHk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclNvdXJjZShib29sICRwcmVmZXJTb3VyY2UgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAoYm9vbCkgJHByZWZlclNvdXJjZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyRGlzdChib29sICRwcmVmZXJEaXN0ID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cHJlZmVyRGlzdCA9IChib29sKSAkcHJlZmVyRGlzdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW1pemVBdXRvbG9hZGVyKGJvb2wgJG9wdGltaXplQXV0b2xvYWRlcik6IHNlbGYKewokdGhpcy0+b3B0aW1pemVBdXRvbG9hZGVyID0gKGJvb2wpICRvcHRpbWl6ZUF1dG9sb2FkZXI7CmlmICghJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlcikgewoKCiR0aGlzLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoZmFsc2UpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoYm9vbCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlKTogc2VsZgp7CiR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgPSAoYm9vbCkgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpIHsKCiR0aGlzLT5zZXRPcHRpbWl6ZUF1dG9sb2FkZXIodHJ1ZSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdUF1dG9sb2FkZXIoYm9vbCAkYXBjdUF1dG9sb2FkZXIsID9zdHJpbmcgJGFwY3VBdXRvbG9hZGVyUHJlZml4ID0gbnVsbCk6IHNlbGYKewokdGhpcy0+YXBjdUF1dG9sb2FkZXIgPSAkYXBjdUF1dG9sb2FkZXI7CiR0aGlzLT5hcGN1QXV0b2xvYWRlclByZWZpeCA9ICRhcGN1QXV0b2xvYWRlclByZWZpeDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlKGJvb2wgJHVwZGF0ZSk6IHNlbGYKewokdGhpcy0+dXBkYXRlID0gKGJvb2wpICR1cGRhdGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEluc3RhbGwoYm9vbCAkaW5zdGFsbCk6IHNlbGYKewokdGhpcy0+aW5zdGFsbCA9IChib29sKSAkaW5zdGFsbDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2TW9kZShib29sICRkZXZNb2RlID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZGV2TW9kZSA9IChib29sKSAkZGV2TW9kZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREdW1wQXV0b2xvYWRlcihib29sICRkdW1wQXV0b2xvYWRlciA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmR1bXBBdXRvbG9hZGVyID0gKGJvb2wpICRkdW1wQXV0b2xvYWRlcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UnVuU2NyaXB0cyhib29sICRydW5TY3JpcHRzID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cnVuU2NyaXB0cyA9IChib29sKSAkcnVuU2NyaXB0czsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKENvbmZpZyAkY29uZmlnKTogc2VsZgp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NlKGJvb2wgJHZlcmJvc2UgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT52ZXJib3NlID0gKGJvb2wpICR2ZXJib3NlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnZlcmJvc2U7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWdub3JlUGxhdGZvcm1SZXF1aXJlbWVudHMoJGlnbm9yZVBsYXRmb3JtUmVxcyk6IHNlbGYKewp0cmlnZ2VyX2Vycm9yKCdJbnN0YWxsZXI6OnNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2Ugc2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCnJldHVybiAkdGhpcy0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcihQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6ZnJvbUJvb2xPckxpc3QoJGlnbm9yZVBsYXRmb3JtUmVxcykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcihQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogc2VsZgp7CiR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZU1pcnJvcnMoYm9vbCAkdXBkYXRlTWlycm9ycyk6IHNlbGYKewokdGhpcy0+dXBkYXRlTWlycm9ycyA9ICR1cGRhdGVNaXJyb3JzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGVBbGxvd0xpc3QoYXJyYXkgJHBhY2thZ2VzKTogc2VsZgp7CmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CiR0aGlzLT51cGRhdGVBbGxvd0xpc3QgPSBudWxsOwp9IGVsc2UgewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZShhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkcGFja2FnZXMpKSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhpbnQgJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyk6IHNlbGYKewppZiAoIWluX2FycmF5KCR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMsIFtSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQsIFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNfTk9fUk9PVF9SRVFVSVJFLCBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlIGZvciB1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgc3VwcGxpZWQiKTsKfQoKJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9ICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclN0YWJsZShib29sICRwcmVmZXJTdGFibGUgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTdGFibGUgPSAoYm9vbCkgJHByZWZlclN0YWJsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyTG93ZXN0KGJvb2wgJHByZWZlckxvd2VzdCA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPnByZWZlckxvd2VzdCA9IChib29sKSAkcHJlZmVyTG93ZXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFdyaXRlTG9jayhib29sICR3cml0ZUxvY2sgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT53cml0ZUxvY2sgPSAoYm9vbCkgJHdyaXRlTG9jazsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeGVjdXRlT3BlcmF0aW9ucyhib29sICRleGVjdXRlT3BlcmF0aW9ucyA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zID0gKGJvb2wpICRleGVjdXRlT3BlcmF0aW9uczsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXVkaXQoYm9vbCAkYXVkaXQpOiBzZWxmCnsKJHRoaXMtPmF1ZGl0ID0gJGF1ZGl0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JPbkF1ZGl0KGJvb2wgJGVycm9yT25BdWRpdCk6IHNlbGYKewokdGhpcy0+ZXJyb3JPbkF1ZGl0ID0gJGVycm9yT25BdWRpdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1ZGl0Rm9ybWF0KHN0cmluZyAkYXVkaXRGb3JtYXQpOiBzZWxmCnsKJHRoaXMtPmF1ZGl0Rm9ybWF0ID0gJGF1ZGl0Rm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogc2VsZgp7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5kaXNhYmxlUGx1Z2lucygpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcihTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyICRzdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKTogc2VsZgp7CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyID0gJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CgpyZXR1cm4gJHRoaXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCgoKCgpjbGFzcyBCaW5hcnlJbnN0YWxsZXIKewoKcHJvdGVjdGVkICRiaW5EaXI7Cgpwcm90ZWN0ZWQgJGJpbkNvbXBhdDsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcml2YXRlICR2ZW5kb3JEaXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJGJpbkRpciwgc3RyaW5nICRiaW5Db21wYXQsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCwgP3N0cmluZyAkdmVuZG9yRGlyID0gbnVsbCkKewokdGhpcy0+YmluRGlyID0gJGJpbkRpcjsKJHRoaXMtPmJpbkNvbXBhdCA9ICRiaW5Db21wYXQ7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZmlsZXN5c3RlbSA/OiBuZXcgRmlsZXN5c3RlbSgpOwokdGhpcy0+dmVuZG9yRGlyID0gJHZlbmRvckRpcjsKfQoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGxCaW5hcmllcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGluc3RhbGxQYXRoLCBib29sICR3YXJuT25PdmVyd3JpdGUgPSB0cnVlKTogdm9pZAp7CiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcygkcGFja2FnZSk7CmlmICghJGJpbmFyaWVzKSB7CnJldHVybjsKfQoKUGxhdGZvcm06Ondvcmthcm91bmRGaWxlc3lzdGVtSXNzdWVzKCk7Cgpmb3JlYWNoICgkYmluYXJpZXMgYXMgJGJpbikgewokYmluUGF0aCA9ICRpbnN0YWxsUGF0aC4nLycuJGJpbjsKaWYgKCFmaWxlX2V4aXN0cygkYmluUGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+U2tpcHBlZCBpbnN0YWxsYXRpb24gb2YgYmluICcuJGJpbi4nIGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBmaWxlIG5vdCBmb3VuZCBpbiBwYWNrYWdlPC93YXJuaW5nPicpOwpjb250aW51ZTsKfQppZiAoaXNfZGlyKCRiaW5QYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5Ta2lwcGVkIGluc3RhbGxhdGlvbiBvZiBiaW4gJy4kYmluLicgZm9yIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLic6IGZvdW5kIGEgZGlyZWN0b3J5IGF0IHRoYXQgcGF0aDwvd2FybmluZz4nKTsKY29udGludWU7Cn0KaWYgKCEkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJGJpblBhdGgpKSB7CgoKCgokYmluUGF0aCA9IHJlYWxwYXRoKCRiaW5QYXRoKTsKfQokdGhpcy0+aW5pdGlhbGl6ZUJpbkRpcigpOwokbGluayA9ICR0aGlzLT5iaW5EaXIuJy8nLmJhc2VuYW1lKCRiaW4pOwppZiAoZmlsZV9leGlzdHMoJGxpbmspKSB7CmlmICghaXNfbGluaygkbGluaykpIHsKaWYgKCR3YXJuT25PdmVyd3JpdGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgU2tpcHBlZCBpbnN0YWxsYXRpb24gb2YgYmluICcuJGJpbi4nIGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBuYW1lIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIGZpbGUnKTsKfQpjb250aW51ZTsKfQppZiAocmVhbHBhdGgoJGxpbmspID09PSByZWFscGF0aCgkYmluUGF0aCkpIHsKCiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGxpbmspOwp9Cn0KCiRiaW5Db21wYXQgPSAkdGhpcy0+YmluQ29tcGF0OwppZiAoJGJpbkNvbXBhdCA9PT0gImF1dG8iICYmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgfHwgUGxhdGZvcm06OmlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4KCkpKSB7CiRiaW5Db21wYXQgPSAnZnVsbCc7Cn0KCmlmICgkYmluQ29tcGF0ID09PSAiZnVsbCIpIHsKJHRoaXMtPmluc3RhbGxGdWxsQmluYXJpZXMoJGJpblBhdGgsICRsaW5rLCAkYmluLCAkcGFja2FnZSk7Cn0gZWxzZSB7CiR0aGlzLT5pbnN0YWxsVW5peHlQcm94eUJpbmFyaWVzKCRiaW5QYXRoLCAkbGluayk7Cn0KU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJGJpblBhdGgsIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUJpbmFyaWVzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmluaXRpYWxpemVCaW5EaXIoKTsKCiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcygkcGFja2FnZSk7CmlmICghJGJpbmFyaWVzKSB7CnJldHVybjsKfQpmb3JlYWNoICgkYmluYXJpZXMgYXMgJGJpbikgewokbGluayA9ICR0aGlzLT5iaW5EaXIuJy8nLmJhc2VuYW1lKCRiaW4pOwppZiAoaXNfbGluaygkbGluaykgfHwgZmlsZV9leGlzdHMoJGxpbmspKSB7IAokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRsaW5rKTsKfQppZiAoaXNfZmlsZSgkbGluay4nLmJhdCcpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGxpbmsuJy5iYXQnKTsKfQp9CgoKaWYgKGlzX2RpcigkdGhpcy0+YmluRGlyKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkdGhpcy0+YmluRGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgncm1kaXInLCAkdGhpcy0+YmluRGlyKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVybWluZUJpbmFyeUNhbGxlcihzdHJpbmcgJGJpbik6IHN0cmluZwp7CmlmICgnLmJhdCcgPT09IHN1YnN0cigkYmluLCAtNCkgfHwgJy5leGUnID09PSBzdWJzdHIoJGJpbiwgLTQpKSB7CnJldHVybiAnY2FsbCc7Cn0KCiRoYW5kbGUgPSBmb3BlbigkYmluLCAncicpOwokbGluZSA9IGZnZXRzKCRoYW5kbGUpOwpmY2xvc2UoJGhhbmRsZSk7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiMhLyg/OnVzci9iaW4vZW52ICk/KD86W14vXSsvKSooLispJH1tJywgKHN0cmluZykgJGxpbmUsICRtYXRjaCkpIHsKcmV0dXJuIHRyaW0oJG1hdGNoWzFdKTsKfQoKcmV0dXJuICdwaHAnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QmluYXJpZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKcmV0dXJuICRwYWNrYWdlLT5nZXRCaW5hcmllcygpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5zdGFsbEZ1bGxCaW5hcmllcyhzdHJpbmcgJGJpblBhdGgsIHN0cmluZyAkbGluaywgc3RyaW5nICRiaW4sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKCmlmICgnLmJhdCcgIT09IHN1YnN0cigkYmluUGF0aCwgLTQpKSB7CiR0aGlzLT5pbnN0YWxsVW5peHlQcm94eUJpbmFyaWVzKCRiaW5QYXRoLCAkbGluayk7CiRsaW5rIC49ICcuYmF0JzsKaWYgKGZpbGVfZXhpc3RzKCRsaW5rKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBTa2lwcGVkIGluc3RhbGxhdGlvbiBvZiBiaW4gJy4kYmluLicuYmF0IHByb3h5IGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBhIC5iYXQgcHJveHkgd2FzIGFscmVhZHkgaW5zdGFsbGVkJyk7Cn0KfQppZiAoIWZpbGVfZXhpc3RzKCRsaW5rKSkgewpmaWxlX3B1dF9jb250ZW50cygkbGluaywgJHRoaXMtPmdlbmVyYXRlV2luZG93c1Byb3h5Q29kZSgkYmluUGF0aCwgJGxpbmspKTsKU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJGxpbmssIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluc3RhbGxVbml4eVByb3h5QmluYXJpZXMoc3RyaW5nICRiaW5QYXRoLCBzdHJpbmcgJGxpbmspOiB2b2lkCnsKZmlsZV9wdXRfY29udGVudHMoJGxpbmssICR0aGlzLT5nZW5lcmF0ZVVuaXh5UHJveHlDb2RlKCRiaW5QYXRoLCAkbGluaykpOwpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkbGluaywgMDc3NyAmIH51bWFzaygpKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemVCaW5EaXIoKTogdm9pZAp7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRoaXMtPmJpbkRpcik7CiR0aGlzLT5iaW5EaXIgPSByZWFscGF0aCgkdGhpcy0+YmluRGlyKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlV2luZG93c1Byb3h5Q29kZShzdHJpbmcgJGJpbiwgc3RyaW5nICRsaW5rKTogc3RyaW5nCnsKJGJpblBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkbGluaywgJGJpbik7CiRjYWxsZXIgPSBzZWxmOjpkZXRlcm1pbmVCaW5hcnlDYWxsZXIoJGJpbik7CgoKCgppZiAoJGNhbGxlciA9PT0gJ3BocCcpIHsKcmV0dXJuICJARUNITyBPRkZcclxuIi4KInNldGxvY2FsIERJU0FCTEVERUxBWUVERVhQQU5TSU9OXHJcbiIuCiJTRVQgQklOX1RBUkdFVD0lfmRwMC8iLnRyaW0oUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoYmFzZW5hbWUoJGxpbmssICcuYmF0JykpLCAnIlwnJykuIlxyXG4iLgoiU0VUIENPTVBPU0VSX1JVTlRJTUVfQklOX0RJUj0lfmRwMFxyXG4iLgoieyRjYWxsZXJ9IFwiJUJJTl9UQVJHRVQlXCIgJSpcclxuIjsKfQoKcmV0dXJuICJARUNITyBPRkZcclxuIi4KInNldGxvY2FsIERJU0FCTEVERUxBWUVERVhQQU5TSU9OXHJcbiIuCiJTRVQgQklOX1RBUkdFVD0lfmRwMC8iLnRyaW0oUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGJpblBhdGgpLCAnIlwnJykuIlxyXG4iLgoiU0VUIENPTVBPU0VSX1JVTlRJTUVfQklOX0RJUj0lfmRwMFxyXG4iLgoieyRjYWxsZXJ9IFwiJUJJTl9UQVJHRVQlXCIgJSpcclxuIjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlVW5peHlQcm94eUNvZGUoc3RyaW5nICRiaW4sIHN0cmluZyAkbGluayk6IHN0cmluZwp7CiRiaW5QYXRoID0gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGgoJGxpbmssICRiaW4pOwoKJGJpbkRpciA9IFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKGRpcm5hbWUoJGJpblBhdGgpKTsKJGJpbkZpbGUgPSBiYXNlbmFtZSgkYmluUGF0aCk7CgokYmluQ29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkYmluKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgne14oIyEuKlxyP1xuKT9bXHJcblx0IF0qPFw/cGhwfScsICRiaW5Db250ZW50cywgJG1hdGNoKSkgewoKJHByb3h5Q29kZSA9ICRtYXRjaFsxXSA9PT0gbnVsbCA/ICcjIS91c3IvYmluL2VudiBwaHAnIDogdHJpbSgkbWF0Y2hbMV0pOwokYmluUGF0aEV4cG9ydGVkID0gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCRsaW5rLCAkYmluLCBmYWxzZSwgdHJ1ZSk7CiRzdHJlYW1Qcm94eUNvZGUgPSAkc3RyZWFtSGludCA9ICcnOwokZ2xvYmFsc0NvZGUgPSAnJEdMT0JBTFNbXCdfY29tcG9zZXJfYmluX2RpclwnXSA9IF9fRElSX187Jy4iXG4iOwokcGhwdW5pdEhhY2sxID0gJHBocHVuaXRIYWNrMiA9ICcnOwoKaWYgKCR0aGlzLT52ZW5kb3JEaXIpIHsKJGdsb2JhbHNDb2RlIC49ICckR0xPQkFMU1tcJ19jb21wb3Nlcl9hdXRvbG9hZF9wYXRoXCddID0gJyAuICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkbGluaywgJHRoaXMtPnZlbmRvckRpciAuICcvYXV0b2xvYWQucGhwJywgZmFsc2UsIHRydWUpLiI7XG4iOwp9CgppZiAoJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJGJpbikgPT09ICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR0aGlzLT52ZW5kb3JEaXIuJy9waHB1bml0L3BocHVuaXQvcGhwdW5pdCcpKSB7CgokZ2xvYmFsc0NvZGUgLj0gJyRHTE9CQUxTW1wnX19QSFBVTklUX0lTT0xBVElPTl9FWENMVURFX0xJU1RcJ10gPSAkR0xPQkFMU1tcJ19fUEhQVU5JVF9JU09MQVRJT05fQkxBQ0tMSVNUXCddID0gYXJyYXkocmVhbHBhdGgoJy4kYmluUGF0aEV4cG9ydGVkLicpKTsnLiJcbiI7CgokcGhwdW5pdEhhY2sxID0gIidwaHB2ZnNjb21wb3NlcjovLycuIjsKJHBocHVuaXRIYWNrMiA9ICcKICAgICAgICAgICAgICAgICRkYXRhID0gc3RyX3JlcGxhY2UoXCdfX0RJUl9fXCcsIHZhcl9leHBvcnQoZGlybmFtZSgkdGhpcy0+cmVhbHBhdGgpLCB0cnVlKSwgJGRhdGEpOwogICAgICAgICAgICAgICAgJGRhdGEgPSBzdHJfcmVwbGFjZShcJ19fRklMRV9fXCcsIHZhcl9leHBvcnQoJHRoaXMtPnJlYWxwYXRoLCB0cnVlKSwgJGRhdGEpOyc7Cn0KaWYgKHRyaW0oKHN0cmluZykgJG1hdGNoWzBdKSAhPT0gJzw/cGhwJykgewokc3RyZWFtSGludCA9ICcgdXNpbmcgYSBzdHJlYW0gd3JhcHBlciB0byBwcmV2ZW50IHRoZSBzaGViYW5nIGZyb20gYmVpbmcgb3V0cHV0IG9uIFBIUDw4Jy4iXG4gKiI7CiRzdHJlYW1Qcm94eUNvZGUgPSA8PDxTVFJFQU1QUk9YWQppZiAoUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewogICAgaWYgKCFjbGFzc19leGlzdHMoJ0NvbXBvc2VyXEJpblByb3h5V3JhcHBlcicpKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgZmluYWwgY2xhc3MgQmluUHJveHlXcmFwcGVyCiAgICAgICAgewogICAgICAgICAgICBwcml2YXRlIFwkaGFuZGxlOwogICAgICAgICAgICBwcml2YXRlIFwkcG9zaXRpb247CiAgICAgICAgICAgIHByaXZhdGUgXCRyZWFscGF0aDsKCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fb3BlbihcJHBhdGgsIFwkbW9kZSwgXCRvcHRpb25zLCAmXCRvcGVuZWRfcGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHJpZCBvZiBwaHB2ZnNjb21wb3NlcjovLyBwcmVmaXggZm9yIF9fRklMRV9fICYgX19ESVJfXyByZXNvbHV0aW9uCiAgICAgICAgICAgICAgICBcJG9wZW5lZF9wYXRoID0gc3Vic3RyKFwkcGF0aCwgMTcpOwogICAgICAgICAgICAgICAgXCR0aGlzLT5yZWFscGF0aCA9IHJlYWxwYXRoKFwkb3BlbmVkX3BhdGgpID86IFwkb3BlbmVkX3BhdGg7CiAgICAgICAgICAgICAgICBcJG9wZW5lZF9wYXRoID0gJHBocHVuaXRIYWNrMVwkdGhpcy0+cmVhbHBhdGg7CiAgICAgICAgICAgICAgICBcJHRoaXMtPmhhbmRsZSA9IGZvcGVuKFwkdGhpcy0+cmVhbHBhdGgsIFwkbW9kZSk7CiAgICAgICAgICAgICAgICBcJHRoaXMtPnBvc2l0aW9uID0gMDsKCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2wpIFwkdGhpcy0+aGFuZGxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3JlYWQoXCRjb3VudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgXCRkYXRhID0gZnJlYWQoXCR0aGlzLT5oYW5kbGUsIFwkY291bnQpOwoKICAgICAgICAgICAgICAgIGlmIChcJHRoaXMtPnBvc2l0aW9uID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgXCRkYXRhID0gcHJlZ19yZXBsYWNlKCd7XiMhLipcXHI/XFxufScsICcnLCBcJGRhdGEpOwogICAgICAgICAgICAgICAgfSRwaHB1bml0SGFjazIKCiAgICAgICAgICAgICAgICBcJHRoaXMtPnBvc2l0aW9uICs9IHN0cmxlbihcJGRhdGEpOwoKICAgICAgICAgICAgICAgIHJldHVybiBcJGRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fY2FzdChcJGNhc3RBcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFwkdGhpcy0+aGFuZGxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2Nsb3NlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmNsb3NlKFwkdGhpcy0+aGFuZGxlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9sb2NrKFwkb3BlcmF0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gXCRvcGVyYXRpb24gPyBmbG9jayhcJHRoaXMtPmhhbmRsZSwgXCRvcGVyYXRpb24pIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zZWVrKFwkb2Zmc2V0LCBcJHdoZW5jZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKDAgPT09IGZzZWVrKFwkdGhpcy0+aGFuZGxlLCBcJG9mZnNldCwgXCR3aGVuY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgXCR0aGlzLT5wb3NpdGlvbiA9IGZ0ZWxsKFwkdGhpcy0+aGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fdGVsbCgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJHRoaXMtPnBvc2l0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2VvZigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmZW9mKFwkdGhpcy0+aGFuZGxlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zdGF0KCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fc2V0X29wdGlvbihcJG9wdGlvbiwgXCRhcmcxLCBcJGFyZzIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gdXJsX3N0YXQoXCRwYXRoLCBcJGZsYWdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBcJHBhdGggPSBzdWJzdHIoXCRwYXRoLCAxNyk7CiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoXCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0KFwkcGF0aCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgKICAgICAgICAoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1fZ2V0X3dyYXBwZXJzJykgJiYgaW5fYXJyYXkoJ3BocHZmc2NvbXBvc2VyJywgc3RyZWFtX2dldF93cmFwcGVycygpLCB0cnVlKSkKICAgICAgICB8fCAoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcicpICYmIHN0cmVhbV93cmFwcGVyX3JlZ2lzdGVyKCdwaHB2ZnNjb21wb3NlcicsICdDb21wb3NlclxCaW5Qcm94eVdyYXBwZXInKSkKICAgICkgewogICAgICAgIHJldHVybiBpbmNsdWRlKCJwaHB2ZnNjb21wb3NlcjovLyIgLiAkYmluUGF0aEV4cG9ydGVkKTsKICAgIH0KfQoKU1RSRUFNUFJPWFk7Cn0KCnJldHVybiAkcHJveHlDb2RlIC4gIlxuIiAuIDw8PFBST1hZCjw/cGhwCgovKioKICogUHJveHkgUEhQIGZpbGUgZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCiAqCiAqIFRoaXMgZmlsZSBpbmNsdWRlcyB0aGUgcmVmZXJlbmNlZCBiaW4gcGF0aCAoJGJpblBhdGgpCiAqJHN0cmVhbUhpbnQKICogQGdlbmVyYXRlZAogKi8KCm5hbWVzcGFjZSBDb21wb3NlcjsKCiRnbG9iYWxzQ29kZQokc3RyZWFtUHJveHlDb2RlCnJldHVybiBpbmNsdWRlICRiaW5QYXRoRXhwb3J0ZWQ7CgpQUk9YWTsKfQoKcmV0dXJuIDw8PFBST1hZCiMhL3Vzci9iaW4vZW52IHNoCgojIFN1cHBvcnQgYmFzaCB0byBzdXBwb3J0IGBzb3VyY2VgIHdpdGggZmFsbGJhY2sgb24gJDAgaWYgdGhpcyBkb2VzIG5vdCBydW4gd2l0aCBiYXNoCiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM1MDA2NTA1LzY1MTIKc2VsZkFyZz0iXCRCQVNIX1NPVVJDRSIKaWYgWyAteiAiXCRzZWxmQXJnIiBdOyB0aGVuCiAgICBzZWxmQXJnPSJcJDAiCmZpCgpzZWxmPVwkKHJlYWxwYXRoIFwkc2VsZkFyZyAyPiAvZGV2L251bGwpCmlmIFsgLXogIlwkc2VsZiIgXTsgdGhlbgogICAgc2VsZj0iXCRzZWxmQXJnIgpmaQoKZGlyPVwkKGNkICJcJHtzZWxmJVsvXFxcXF0qfSIgPiAvZGV2L251bGw7IGNkICRiaW5EaXIgJiYgcHdkKQoKaWYgWyAtZCAvcHJvYy9jeWdkcml2ZSBdOyB0aGVuCiAgICBjYXNlIFwkKHdoaWNoIHBocCkgaW4KICAgICAgICBcJChyZWFkbGluayAtbiAvcHJvYy9jeWdkcml2ZSkvKikKICAgICAgICAgICAgIyBXZSBhcmUgaW4gQ3lnd2luIHVzaW5nIFdpbmRvd3MgcGhwLCBzbyB0aGUgcGF0aCBtdXN0IGJlIHRyYW5zbGF0ZWQKICAgICAgICAgICAgZGlyPVwkKGN5Z3BhdGggLW0gIlwkZGlyIik7CiAgICAgICAgICAgIDs7CiAgICBlc2FjCmZpCgpleHBvcnQgQ09NUE9TRVJfUlVOVElNRV9CSU5fRElSPSJcJChjZCAiXCR7c2VsZiVbL1xcXFxdKn0iID4gL2Rldi9udWxsOyBwd2QpIgoKIyBJZiBiYXNoIGlzIHNvdXJjaW5nIHRoaXMgZmlsZSwgd2UgaGF2ZSB0byBzb3VyY2UgdGhlIHRhcmdldCBhcyB3ZWxsCmJhc2hTb3VyY2U9IlwkQkFTSF9TT1VSQ0UiCmlmIFsgLW4gIlwkYmFzaFNvdXJjZSIgXTsgdGhlbgogICAgaWYgWyAiXCRiYXNoU291cmNlIiAhPSAiXCQwIiBdOyB0aGVuCiAgICAgICAgc291cmNlICJcJHtkaXJ9LyRiaW5GaWxlIiAiXCRAIgogICAgICAgIHJldHVybgogICAgZmkKZmkKCiJcJHtkaXJ9LyRiaW5GaWxlIiAiXCRAIgoKUFJPWFk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVCaW5hcmllc1ByZXNlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cT3BlcmF0aW9uSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cTWFya0FsaWFzSW5zdGFsbGVkT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRmlsZURvd25sb2FkZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CgoKCgoKCgoKY2xhc3MgSW5zdGFsbGF0aW9uTWFuYWdlcgp7Cgpwcml2YXRlICRpbnN0YWxsZXJzID0gW107Cgpwcml2YXRlICRjYWNoZSA9IFtdOwoKcHJpdmF0ZSAkbm90aWZpYWJsZVBhY2thZ2VzID0gW107Cgpwcml2YXRlICRsb29wOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7Cgpwcml2YXRlICRvdXRwdXRQcm9ncmVzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb29wICRsb29wLCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpCnsKJHRoaXMtPmxvb3AgPSAkbG9vcDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewokdGhpcy0+bm90aWZpYWJsZVBhY2thZ2VzID0gW107CkZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YSA9IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJbnN0YWxsZXIoSW5zdGFsbGVySW50ZXJmYWNlICRpbnN0YWxsZXIpOiB2b2lkCnsKYXJyYXlfdW5zaGlmdCgkdGhpcy0+aW5zdGFsbGVycywgJGluc3RhbGxlcik7CiR0aGlzLT5jYWNoZSA9IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVJbnN0YWxsZXIoSW5zdGFsbGVySW50ZXJmYWNlICRpbnN0YWxsZXIpOiB2b2lkCnsKaWYgKGZhbHNlICE9PSAoJGtleSA9IGFycmF5X3NlYXJjaCgkaW5zdGFsbGVyLCAkdGhpcy0+aW5zdGFsbGVycywgdHJ1ZSkpKSB7CmFycmF5X3NwbGljZSgkdGhpcy0+aW5zdGFsbGVycywgJGtleSwgMSk7CiR0aGlzLT5jYWNoZSA9IFtdOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5pbnN0YWxsZXJzIGFzICRpID0+ICRpbnN0YWxsZXIpIHsKaWYgKCEkaW5zdGFsbGVyIGluc3RhbmNlb2YgUGx1Z2luSW5zdGFsbGVyKSB7CmNvbnRpbnVlOwp9Cgp1bnNldCgkdGhpcy0+aW5zdGFsbGVyc1skaV0pOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVyKHN0cmluZyAkdHlwZSk6IEluc3RhbGxlckludGVyZmFjZQp7CiR0eXBlID0gc3RydG9sb3dlcigkdHlwZSk7CgppZiAoaXNzZXQoJHRoaXMtPmNhY2hlWyR0eXBlXSkpIHsKcmV0dXJuICR0aGlzLT5jYWNoZVskdHlwZV07Cn0KCmZvcmVhY2ggKCR0aGlzLT5pbnN0YWxsZXJzIGFzICRpbnN0YWxsZXIpIHsKaWYgKCRpbnN0YWxsZXItPnN1cHBvcnRzKCR0eXBlKSkgewpyZXR1cm4gJHRoaXMtPmNhY2hlWyR0eXBlXSA9ICRpbnN0YWxsZXI7Cn0KfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gaW5zdGFsbGVyIHR5cGU6ICcuJHR5cGUpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQYWNrYWdlSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CnJldHVybiAkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkgJiYgJHRoaXMtPmlzUGFja2FnZUluc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpLT5pc0luc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CnRyeSB7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CgpyZXR1cm47Cn0KCgppZiAoJGluc3RhbGxlciBpbnN0YW5jZW9mIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlKSB7CiRpbnN0YWxsZXItPmVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoJHBhY2thZ2UpOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBib29sICRkZXZNb2RlID0gdHJ1ZSwgYm9vbCAkcnVuU2NyaXB0cyA9IHRydWUsIGJvb2wgJGRvd25sb2FkT25seSA9IGZhbHNlKTogdm9pZAp7CgokY2xlYW51cFByb21pc2VzID0gW107Cgokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZShbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLCBmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwsIFNpZ25hbEhhbmRsZXIgJGhhbmRsZXIpIHVzZSAoJiRjbGVhbnVwUHJvbWlzZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+cnVuQ2xlYW51cCgkY2xlYW51cFByb21pc2VzKTsKJGhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9KTsKCnRyeSB7CgoKJGJhdGNoZXMgPSBbXTsKJGJhdGNoID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uIHx8ICRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiA/ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKSA6ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nICYmICgkZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKSkgJiYgaXNzZXQoJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtZG93bmxvYWRzJ10pICYmICRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddID09PSB0cnVlKSB7CmlmICgkYmF0Y2gpIHsKJGJhdGNoZXNbXSA9ICRiYXRjaDsKfQokYmF0Y2hlc1tdID0gWyRpbmRleCA9PiAkb3BlcmF0aW9uXTsKJGJhdGNoID0gW107Cgpjb250aW51ZTsKfQp9CiRiYXRjaFskaW5kZXhdID0gJG9wZXJhdGlvbjsKfQoKaWYgKCRiYXRjaCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9Cgpmb3JlYWNoICgkYmF0Y2hlcyBhcyAkYmF0Y2gpIHsKJHRoaXMtPmRvd25sb2FkQW5kRXhlY3V0ZUJhdGNoKCRyZXBvLCAkYmF0Y2gsICRjbGVhbnVwUHJvbWlzZXMsICRkZXZNb2RlLCAkcnVuU2NyaXB0cywgJGRvd25sb2FkT25seSwgJG9wZXJhdGlvbnMpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPnJ1bkNsZWFudXAoJGNsZWFudXBQcm9taXNlcyk7Cgp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQoKaWYgKCRkb3dubG9hZE9ubHkpIHsKcmV0dXJuOwp9CgoKCgokcmVwby0+d3JpdGUoJGRldk1vZGUsICR0aGlzKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXhlY3V0ZUJhdGNoKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBhcnJheSAmJGNsZWFudXBQcm9taXNlcywgYm9vbCAkZGV2TW9kZSwgYm9vbCAkcnVuU2NyaXB0cywgYm9vbCAkZG93bmxvYWRPbmx5LCBhcnJheSAkYWxsT3BlcmF0aW9ucyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CiRvcFR5cGUgPSAkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCk7CgoKaWYgKCFpbl9hcnJheSgkb3BUeXBlLCBbJ3VwZGF0ZScsICdpbnN0YWxsJywgJ3VuaW5zdGFsbCddKSkgewpjb250aW51ZTsKfQoKaWYgKCRvcFR5cGUgPT09ICd1cGRhdGUnKSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKTsKfSBlbHNlIHsKCiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5pdGlhbFBhY2thZ2UgPSBudWxsOwp9CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwoKJGNsZWFudXBQcm9taXNlc1skaW5kZXhdID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJG9wVHlwZSwgJGluc3RhbGxlciwgJHBhY2thZ2UsICRpbml0aWFsUGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlIHsKCgppZiAoISRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcmV0dXJuICRpbnN0YWxsZXItPmNsZWFudXAoJG9wVHlwZSwgJHBhY2thZ2UsICRpbml0aWFsUGFja2FnZSk7Cn07CgppZiAoJG9wVHlwZSAhPT0gJ3VuaW5zdGFsbCcpIHsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5kb3dubG9hZCgkcGFja2FnZSwgJGluaXRpYWxQYWNrYWdlKTsKaWYgKG51bGwgIT09ICRwcm9taXNlKSB7CiRwcm9taXNlc1tdID0gJHByb21pc2U7Cn0KfQp9CgoKaWYgKGNvdW50KCRwcm9taXNlcykpIHsKJHRoaXMtPndhaXRPblByb21pc2VzKCRwcm9taXNlcyk7Cn0KCmlmICgkZG93bmxvYWRPbmx5KSB7CiR0aGlzLT5ydW5DbGVhbnVwKCRjbGVhbnVwUHJvbWlzZXMpOwpyZXR1cm47Cn0KCgoKJGJhdGNoZXMgPSBbXTsKJGJhdGNoID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbiB8fCAkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiA/ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKSA6ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nIHx8ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInKSB7CmlmICgkYmF0Y2gpIHsKJGJhdGNoZXNbXSA9ICRiYXRjaDsKfQokYmF0Y2hlc1tdID0gWyRpbmRleCA9PiAkb3BlcmF0aW9uXTsKJGJhdGNoID0gW107Cgpjb250aW51ZTsKfQp9CiRiYXRjaFskaW5kZXhdID0gJG9wZXJhdGlvbjsKfQoKaWYgKCRiYXRjaCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9Cgpmb3JlYWNoICgkYmF0Y2hlcyBhcyAkYmF0Y2gpIHsKJHRoaXMtPmV4ZWN1dGVCYXRjaCgkcmVwbywgJGJhdGNoLCAkY2xlYW51cFByb21pc2VzLCAkZGV2TW9kZSwgJHJ1blNjcmlwdHMsICRhbGxPcGVyYXRpb25zKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhlY3V0ZUJhdGNoKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBhcnJheSAkY2xlYW51cFByb21pc2VzLCBib29sICRkZXZNb2RlLCBib29sICRydW5TY3JpcHRzLCBhcnJheSAkYWxsT3BlcmF0aW9ucyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKJHBvc3RFeGVjQ2FsbGJhY2tzID0gW107Cgpmb3JlYWNoICgkb3BlcmF0aW9ucyBhcyAkaW5kZXggPT4gJG9wZXJhdGlvbikgewokb3BUeXBlID0gJG9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpOwoKCmlmICghaW5fYXJyYXkoJG9wVHlwZSwgWyd1cGRhdGUnLCAnaW5zdGFsbCcsICd1bmluc3RhbGwnXSkpIHsKCmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgLSAnIC4gJG9wZXJhdGlvbi0+c2hvdyhmYWxzZSkpOwp9CiR0aGlzLT57JG9wVHlwZX0oJHJlcG8sICRvcGVyYXRpb24pOwoKY29udGludWU7Cn0KCmlmICgkb3BUeXBlID09PSAndXBkYXRlJykgewoKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCk7CiRpbml0aWFsUGFja2FnZSA9ICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCk7Cn0gZWxzZSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gbnVsbDsKfQoKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CgokZXZlbnROYW1lID0gWwonaW5zdGFsbCcgPT4gUGFja2FnZUV2ZW50czo6UFJFX1BBQ0tBR0VfSU5TVEFMTCwKJ3VwZGF0ZScgPT4gUGFja2FnZUV2ZW50czo6UFJFX1BBQ0tBR0VfVVBEQVRFLAondW5pbnN0YWxsJyA9PiBQYWNrYWdlRXZlbnRzOjpQUkVfUEFDS0FHRV9VTklOU1RBTEwsCl1bJG9wVHlwZV0gPz8gbnVsbDsKCmlmIChudWxsICE9PSAkZXZlbnROYW1lICYmICRydW5TY3JpcHRzICYmICR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hQYWNrYWdlRXZlbnQoJGV2ZW50TmFtZSwgJGRldk1vZGUsICRyZXBvLCAkYWxsT3BlcmF0aW9ucywgJG9wZXJhdGlvbik7Cn0KCiRkaXNwYXRjaGVyID0gJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcjsKJGlvID0gJHRoaXMtPmlvOwoKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5wcmVwYXJlKCRvcFR5cGUsICRwYWNrYWdlLCAkaW5pdGlhbFBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9taXNlID0gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkb3BUeXBlLCAkcmVwbywgJG9wZXJhdGlvbikgewpyZXR1cm4gJHRoaXMtPnskb3BUeXBlfSgkcmVwbywgJG9wZXJhdGlvbik7Cn0pLT50aGVuKCRjbGVhbnVwUHJvbWlzZXNbJGluZGV4XSkKLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJGRldk1vZGUsICRyZXBvKTogdm9pZCB7CiRyZXBvLT53cml0ZSgkZGV2TW9kZSwgJHRoaXMpOwp9LCBzdGF0aWMgZnVuY3Rpb24gKCRlKSB1c2UgKCRvcFR5cGUsICRwYWNrYWdlLCAkaW8pOiB2b2lkIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPGVycm9yPicgLiB1Y2ZpcnN0KCRvcFR5cGUpIC4nIG9mICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGZhaWxlZDwvZXJyb3I+Jyk7Cgp0aHJvdyAkZTsKfSk7CgokZXZlbnROYW1lID0gWwonaW5zdGFsbCcgPT4gUGFja2FnZUV2ZW50czo6UE9TVF9QQUNLQUdFX0lOU1RBTEwsCid1cGRhdGUnID0+IFBhY2thZ2VFdmVudHM6OlBPU1RfUEFDS0FHRV9VUERBVEUsCid1bmluc3RhbGwnID0+IFBhY2thZ2VFdmVudHM6OlBPU1RfUEFDS0FHRV9VTklOU1RBTEwsCl1bJG9wVHlwZV0gPz8gbnVsbDsKCmlmIChudWxsICE9PSAkZXZlbnROYW1lICYmICRydW5TY3JpcHRzICYmICRkaXNwYXRjaGVyKSB7CiRwb3N0RXhlY0NhbGxiYWNrc1tdID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGRpc3BhdGNoZXIsICRldmVudE5hbWUsICRkZXZNb2RlLCAkcmVwbywgJGFsbE9wZXJhdGlvbnMsICRvcGVyYXRpb24pOiB2b2lkIHsKJGRpc3BhdGNoZXItPmRpc3BhdGNoUGFja2FnZUV2ZW50KCRldmVudE5hbWUsICRkZXZNb2RlLCAkcmVwbywgJGFsbE9wZXJhdGlvbnMsICRvcGVyYXRpb24pOwp9Owp9CgokcHJvbWlzZXNbXSA9ICRwcm9taXNlOwp9CgoKaWYgKGNvdW50KCRwcm9taXNlcykpIHsKJHRoaXMtPndhaXRPblByb21pc2VzKCRwcm9taXNlcyk7Cn0KClBsYXRmb3JtOjp3b3JrYXJvdW5kRmlsZXN5c3RlbUlzc3VlcygpOwoKZm9yZWFjaCAoJHBvc3RFeGVjQ2FsbGJhY2tzIGFzICRjYikgewokY2IoKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdhaXRPblByb21pc2VzKGFycmF5ICRwcm9taXNlcyk6IHZvaWQKewokcHJvZ3Jlc3MgPSBudWxsOwppZiAoCiR0aGlzLT5vdXRwdXRQcm9ncmVzcwomJiAkdGhpcy0+aW8gaW5zdGFuY2VvZiBDb25zb2xlSU8KJiYgIVBsYXRmb3JtOjpnZXRFbnYoJ0NJJykKJiYgISR0aGlzLT5pby0+aXNEZWJ1ZygpCiYmIGNvdW50KCRwcm9taXNlcykgPiAxCikgewokcHJvZ3Jlc3MgPSAkdGhpcy0+aW8tPmdldFByb2dyZXNzQmFyKCk7Cn0KJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzLCAkcHJvZ3Jlc3MpOwppZiAoJHByb2dyZXNzKSB7CiRwcm9ncmVzcy0+Y2xlYXIoKTsKCmlmICghJHRoaXMtPmlvLT5pc0RlY29yYXRlZCgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP1Byb21pc2VJbnRlcmZhY2UKewokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5jbGVhbnVwKCJpbnN0YWxsIiwgJHBhY2thZ2UpOwoKcmV0dXJuICRwcm9taXNlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgSW5zdGFsbE9wZXJhdGlvbiAkb3BlcmF0aW9uKTogP1Byb21pc2VJbnRlcmZhY2UKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CiRwcm9taXNlID0gJGluc3RhbGxlci0+aW5zdGFsbCgkcmVwbywgJHBhY2thZ2UpOwokdGhpcy0+bWFya0Zvck5vdGlmaWNhdGlvbigkcGFja2FnZSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFVwZGF0ZU9wZXJhdGlvbiAkb3BlcmF0aW9uKTogP1Byb21pc2VJbnRlcmZhY2UKewokaW5pdGlhbCA9ICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCk7CiR0YXJnZXQgPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCk7CgokaW5pdGlhbFR5cGUgPSAkaW5pdGlhbC0+Z2V0VHlwZSgpOwokdGFyZ2V0VHlwZSA9ICR0YXJnZXQtPmdldFR5cGUoKTsKCmlmICgkaW5pdGlhbFR5cGUgPT09ICR0YXJnZXRUeXBlKSB7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRpbml0aWFsVHlwZSk7CiRwcm9taXNlID0gJGluc3RhbGxlci0+dXBkYXRlKCRyZXBvLCAkaW5pdGlhbCwgJHRhcmdldCk7CiR0aGlzLT5tYXJrRm9yTm90aWZpY2F0aW9uKCR0YXJnZXQpOwp9IGVsc2UgewokcHJvbWlzZSA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJGluaXRpYWxUeXBlKS0+dW5pbnN0YWxsKCRyZXBvLCAkaW5pdGlhbCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHRhcmdldFR5cGUpOwokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRpbnN0YWxsZXIsICRyZXBvLCAkdGFyZ2V0KTogUHJvbWlzZUludGVyZmFjZSB7CiRwcm9taXNlID0gJGluc3RhbGxlci0+aW5zdGFsbCgkcmVwbywgJHRhcmdldCk7CmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKcmV0dXJuICRwcm9taXNlOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfSk7Cn0KCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgVW5pbnN0YWxsT3BlcmF0aW9uICRvcGVyYXRpb24pOiA/UHJvbWlzZUludGVyZmFjZQp7CiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKCnJldHVybiAkaW5zdGFsbGVyLT51bmluc3RhbGwoJHJlcG8sICRwYWNrYWdlKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hcmtBbGlhc0luc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBNYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24gJG9wZXJhdGlvbik6IHZvaWQKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKCmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWFya0FsaWFzVW5pbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24gJG9wZXJhdGlvbik6IHZvaWQKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9zdHJpbmcKewokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKCnJldHVybiAkaW5zdGFsbGVyLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRPdXRwdXRQcm9ncmVzcyhib29sICRvdXRwdXRQcm9ncmVzcyk6IHZvaWQKewokdGhpcy0+b3V0cHV0UHJvZ3Jlc3MgPSAkb3V0cHV0UHJvZ3Jlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBub3RpZnlJbnN0YWxscyhJT0ludGVyZmFjZSAkaW8pOiB2b2lkCnsKJHByb21pc2VzID0gW107Cgp0cnkgewpmb3JlYWNoICgkdGhpcy0+bm90aWZpYWJsZVBhY2thZ2VzIGFzICRyZXBvVXJsID0+ICRwYWNrYWdlcykgewoKaWYgKHN0cnBvcygkcmVwb1VybCwgJyVwYWNrYWdlJScpKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdXJsID0gc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksICRyZXBvVXJsKTsKCiRwYXJhbXMgPSBbCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAondmVyc2lvbl9ub3JtYWxpemVkJyA9PiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLApdOwokb3B0cyA9IFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCidodHRwJyA9PiBbCidtZXRob2QnID0+ICdQT1NUJywKJ2hlYWRlcicgPT4gWydDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddLAonY29udGVudCcgPT4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCAnJywgJyYnKSwKJ3RpbWVvdXQnID0+IDMsCl0sCl07CgokcHJvbWlzZXNbXSA9ICR0aGlzLT5sb29wLT5nZXRIdHRwRG93bmxvYWRlcigpLT5hZGQoJHVybCwgJG9wdHMpOwp9Cgpjb250aW51ZTsKfQoKJHBvc3REYXRhID0gWydkb3dubG9hZHMnID0+IFtdXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlTm90aWZpY2F0aW9uID0gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksCl07CmlmIChzdHJwb3MoJHJlcG9VcmwsICdwYWNrYWdpc3Qub3JnLycpICE9PSBmYWxzZSkgewppZiAoaXNzZXQoRmlsZURvd25sb2FkZXI6OiRkb3dubG9hZE1ldGFkYXRhWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokcGFja2FnZU5vdGlmaWNhdGlvblsnZG93bmxvYWRlZCddID0gRmlsZURvd25sb2FkZXI6OiRkb3dubG9hZE1ldGFkYXRhWyRwYWNrYWdlLT5nZXROYW1lKCldOwp9IGVsc2UgewokcGFja2FnZU5vdGlmaWNhdGlvblsnZG93bmxvYWRlZCddID0gZmFsc2U7Cn0KfQokcG9zdERhdGFbJ2Rvd25sb2FkcyddW10gPSAkcGFja2FnZU5vdGlmaWNhdGlvbjsKfQoKJG9wdHMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJ10sCidjb250ZW50JyA9PiBqc29uX2VuY29kZSgkcG9zdERhdGEpLAondGltZW91dCcgPT4gNiwKXSwKXTsKCiRwcm9taXNlc1tdID0gJHRoaXMtPmxvb3AtPmdldEh0dHBEb3dubG9hZGVyKCktPmFkZCgkcmVwb1VybCwgJG9wdHMpOwp9CgokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCiR0aGlzLT5yZXNldCgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtGb3JOb3RpZmljYXRpb24oUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoJHBhY2thZ2UtPmdldE5vdGlmaWNhdGlvblVybCgpKSB7CiR0aGlzLT5ub3RpZmlhYmxlUGFja2FnZXNbJHBhY2thZ2UtPmdldE5vdGlmaWNhdGlvblVybCgpXVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJ1bkNsZWFudXAoYXJyYXkgJGNsZWFudXBQcm9taXNlcyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCiR0aGlzLT5sb29wLT5hYm9ydEpvYnMoKTsKCmZvcmVhY2ggKCRjbGVhbnVwUHJvbWlzZXMgYXMgJGNsZWFudXApIHsKJHByb21pc2VzW10gPSBuZXcgXFJlYWN0XFByb21pc2VcUHJvbWlzZShzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlKSB1c2UgKCRjbGVhbnVwKTogdm9pZCB7CiRwcm9taXNlID0gJGNsZWFudXAoKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHJlc29sdmUobnVsbCk7Cn0gZWxzZSB7CiRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRyZXNvbHZlKTogdm9pZCB7CiRyZXNvbHZlKG51bGwpOwp9KTsKfQp9KTsKfQoKaWYgKCFlbXB0eSgkcHJvbWlzZXMpKSB7CiR0aGlzLT5sb29wLT53YWl0KCRwcm9taXNlcyk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcVHJhbnNhY3Rpb247CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCmNsYXNzIEluc3RhbGxlckV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJGV4ZWN1dGVPcGVyYXRpb25zOwoKCgoKcHJpdmF0ZSAkdHJhbnNhY3Rpb247CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRldmVudE5hbWUsIENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCBib29sICRkZXZNb2RlLCBib29sICRleGVjdXRlT3BlcmF0aW9ucywgVHJhbnNhY3Rpb24gJHRyYW5zYWN0aW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGV2ZW50TmFtZSk7CgokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zID0gJGV4ZWN1dGVPcGVyYXRpb25zOwokdGhpcy0+dHJhbnNhY3Rpb24gPSAkdHJhbnNhY3Rpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlcigpOiBDb21wb3Nlcgp7CnJldHVybiAkdGhpcy0+Y29tcG9zZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpOiBJT0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Rldk1vZGUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGV2TW9kZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRXhlY3V0aW5nT3BlcmF0aW9ucygpOiBib29sCnsKcmV0dXJuICR0aGlzLT5leGVjdXRlT3BlcmF0aW9uczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uKCk6ID9UcmFuc2FjdGlvbgp7CnJldHVybiAkdGhpcy0+dHJhbnNhY3Rpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKY2xhc3MgSW5zdGFsbGVyRXZlbnRzCnsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX09QRVJBVElPTlNfRVhFQyA9ICdwcmUtb3BlcmF0aW9ucy1leGVjJzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBJbnN0YWxsZXJJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk7CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFydGlhbENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKCgoKCgoKCmNsYXNzIExpYnJhcnlJbnN0YWxsZXIgaW1wbGVtZW50cyBJbnN0YWxsZXJJbnRlcmZhY2UsIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkY29tcG9zZXI7Cgpwcm90ZWN0ZWQgJHZlbmRvckRpcjsKCnByb3RlY3RlZCAkZG93bmxvYWRNYW5hZ2VyOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkdHlwZTsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByb3RlY3RlZCAkYmluYXJ5SW5zdGFsbGVyOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgUGFydGlhbENvbXBvc2VyICRjb21wb3NlciwgP3N0cmluZyAkdHlwZSA9ICdsaWJyYXJ5JywgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCA/QmluYXJ5SW5zdGFsbGVyICRiaW5hcnlJbnN0YWxsZXIgPSBudWxsKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyID8gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKSA6IG51bGw7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKCiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW0oKTsKJHRoaXMtPnZlbmRvckRpciA9IHJ0cmltKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpLCAnLycpOwokdGhpcy0+YmluYXJ5SW5zdGFsbGVyID0gJGJpbmFyeUluc3RhbGxlciA/OiBuZXcgQmluYXJ5SW5zdGFsbGVyKCR0aGlzLT5pbywgcnRyaW0oJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyksICcvJyksICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWNvbXBhdCcpLCAkdGhpcy0+ZmlsZXN5c3RlbSwgJHRoaXMtPnZlbmRvckRpcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiAkcGFja2FnZVR5cGUgPT09ICR0aGlzLT50eXBlIHx8IG51bGwgPT09ICR0aGlzLT50eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgppZiAoRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkaW5zdGFsbFBhdGgpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmICR0aGlzLT5maWxlc3lzdGVtLT5pc0p1bmN0aW9uKCRpbnN0YWxsUGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19saW5rKCRpbnN0YWxsUGF0aCkpIHsKaWYgKHJlYWxwYXRoKCRpbnN0YWxsUGF0aCkgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5kb3dubG9hZCgkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5wcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+aW5pdGlhbGl6ZVZlbmRvckRpcigpOwokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKCgppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRvd25sb2FkUGF0aCkgJiYgJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPnJlbW92ZUJpbmFyaWVzKCRwYWNrYWdlKTsKfQoKJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbENvZGUoJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRiaW5hcnlJbnN0YWxsZXIsICRpbnN0YWxsUGF0aCwgJHBhY2thZ2UsICRyZXBvKTogdm9pZCB7CiRiaW5hcnlJbnN0YWxsZXItPmluc3RhbGxCaW5hcmllcygkcGFja2FnZSwgJGluc3RhbGxQYXRoKTsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRpbml0aWFsKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAnLiRpbml0aWFsKTsKfQoKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKCiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPnJlbW92ZUJpbmFyaWVzKCRpbml0aWFsKTsKJHByb21pc2UgPSAkdGhpcy0+dXBkYXRlQ29kZSgkaW5pdGlhbCwgJHRhcmdldCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJGJpbmFyeUluc3RhbGxlciA9ICR0aGlzLT5iaW5hcnlJbnN0YWxsZXI7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkdGFyZ2V0KTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkYmluYXJ5SW5zdGFsbGVyLCAkaW5zdGFsbFBhdGgsICR0YXJnZXQsICRpbml0aWFsLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5pbnN0YWxsQmluYXJpZXMoJHRhcmdldCwgJGluc3RhbGxQYXRoKTsKJHJlcG8tPnJlbW92ZVBhY2thZ2UoJGluaXRpYWwpOwppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCR0YXJnZXQpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICR0YXJnZXQpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kcGFja2FnZSk7Cn0KCiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZUNvZGUoJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldFBhY2thZ2VCYXNlUGF0aCgkcGFja2FnZSk7CiRmaWxlc3lzdGVtID0gJHRoaXMtPmZpbGVzeXN0ZW07CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGJpbmFyeUluc3RhbGxlciwgJGZpbGVzeXN0ZW0sICRkb3dubG9hZFBhdGgsICRwYWNrYWdlLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5yZW1vdmVCaW5hcmllcygkcGFja2FnZSk7CiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCmlmIChzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJy8nKSkgewokcGFja2FnZVZlbmRvckRpciA9IGRpcm5hbWUoJGRvd25sb2FkUGF0aCk7CmlmIChpc19kaXIoJHBhY2thZ2VWZW5kb3JEaXIpICYmICRmaWxlc3lzdGVtLT5pc0RpckVtcHR5KCRwYWNrYWdlVmVuZG9yRGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgncm1kaXInLCAkcGFja2FnZVZlbmRvckRpcik7Cn0KfQp9KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+aW5pdGlhbGl6ZVZlbmRvckRpcigpOwoKJGJhc2VQYXRoID0gKCR0aGlzLT52ZW5kb3JEaXIgPyAkdGhpcy0+dmVuZG9yRGlyLicvJyA6ICcnKSAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiR0YXJnZXREaXIgPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CgpyZXR1cm4gJGJhc2VQYXRoIC4gKCR0YXJnZXREaXIgPyAnLycuJHRhcmdldERpciA6ICcnKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPmluc3RhbGxCaW5hcmllcygkcGFja2FnZSwgJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKSwgZmFsc2UpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYWNrYWdlQmFzZVBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwokdGFyZ2V0RGlyID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwoKaWYgKCR0YXJnZXREaXIpIHsKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3svKicuc3RyX3JlcGxhY2UoJy8nLCAnLysnLCBwcmVnX3F1b3RlKCR0YXJnZXREaXIpKS4nLz8kfScsICcnLCAkaW5zdGFsbFBhdGgpOwp9CgpyZXR1cm4gJGluc3RhbGxQYXRoOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluc3RhbGxDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5pbnN0YWxsKCRwYWNrYWdlLCAkZG93bmxvYWRQYXRoKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewokaW5pdGlhbERvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkaW5pdGlhbCk7CiR0YXJnZXREb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHRhcmdldCk7CmlmICgkdGFyZ2V0RG93bmxvYWRQYXRoICE9PSAkaW5pdGlhbERvd25sb2FkUGF0aCkgewoKCmlmIChzdHJwb3MoJGluaXRpYWxEb3dubG9hZFBhdGgsICR0YXJnZXREb3dubG9hZFBhdGgpID09PSAwCnx8IHN0cnBvcygkdGFyZ2V0RG93bmxvYWRQYXRoLCAkaW5pdGlhbERvd25sb2FkUGF0aCkgPT09IDAKKSB7CiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZUNvZGUoJGluaXRpYWwpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR0YXJnZXQpOiBQcm9taXNlSW50ZXJmYWNlIHsKJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbENvZGUoJHRhcmdldCk7CmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKcmV0dXJuICRwcm9taXNlOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfSk7Cn0KCiR0aGlzLT5maWxlc3lzdGVtLT5yZW5hbWUoJGluaXRpYWxEb3dubG9hZFBhdGgsICR0YXJnZXREb3dubG9hZFBhdGgpOwp9CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT51cGRhdGUoJGluaXRpYWwsICR0YXJnZXQsICR0YXJnZXREb3dubG9hZFBhdGgpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZUNvZGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldFBhY2thZ2VCYXNlUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5yZW1vdmUoJHBhY2thZ2UsICRkb3dubG9hZFBhdGgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZVZlbmRvckRpcigpCnsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGhpcy0+dmVuZG9yRGlyKTsKJHRoaXMtPnZlbmRvckRpciA9IHJlYWxwYXRoKCR0aGlzLT52ZW5kb3JEaXIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RG93bmxvYWRNYW5hZ2VyKCk6IERvd25sb2FkTWFuYWdlcgp7CmFzc2VydCgkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyIGluc3RhbmNlb2YgRG93bmxvYWRNYW5hZ2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKHNlbGY6OmNsYXNzLicgc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXIgaW5zdGFuY2UgdG8gYmUgYWJsZSB0byBpbnN0YWxsLy4uLiBwYWNrYWdlcycpKTsKCnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgoKCmNsYXNzIE1ldGFwYWNrYWdlSW5zdGFsbGVyIGltcGxlbWVudHMgSW5zdGFsbGVySW50ZXJmYWNlCnsKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiAkcGFja2FnZVR5cGUgPT09ICdtZXRhcGFja2FnZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0luc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiAkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkpOwoKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJGluaXRpYWwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJGluaXRpYWwpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVXBkYXRlT3BlcmF0aW9uOjpmb3JtYXQoJGluaXRpYWwsICR0YXJnZXQpKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRpbml0aWFsKTsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHRhcmdldCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJHBhY2thZ2UpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVW5pbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCgoKY2xhc3MgTm9vcEluc3RhbGxlciBpbXBsZW1lbnRzIEluc3RhbGxlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJGluaXRpYWwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJGluaXRpYWwpOwp9CgokcmVwby0+cmVtb3ZlUGFja2FnZSgkaW5pdGlhbCk7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHRhcmdldCkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHRhcmdldCk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kcGFja2FnZSk7Cn0KJHJlcG8tPnJlbW92ZVBhY2thZ2UoJHBhY2thZ2UpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0YXJnZXREaXIgPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CgpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSAuICgkdGFyZ2V0RGlyID8gJy8nLiR0YXJnZXREaXIgOiAnJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE9wZXJhdGlvbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKCgoKCgoKY2xhc3MgUGFja2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJGxvY2FsUmVwbzsKCgoKCnByaXZhdGUgJG9wZXJhdGlvbnM7CgoKCgpwcml2YXRlICRvcGVyYXRpb247CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGV2ZW50TmFtZSwgQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sIGJvb2wgJGRldk1vZGUsIFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYXJyYXkgJG9wZXJhdGlvbnMsIE9wZXJhdGlvbkludGVyZmFjZSAkb3BlcmF0aW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGV2ZW50TmFtZSk7CgokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKJHRoaXMtPmxvY2FsUmVwbyA9ICRsb2NhbFJlcG87CiR0aGlzLT5vcGVyYXRpb25zID0gJG9wZXJhdGlvbnM7CiR0aGlzLT5vcGVyYXRpb24gPSAkb3BlcmF0aW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoKTogQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZXZNb2RlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbFJlcG8oKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+bG9jYWxSZXBvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3BlcmF0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvbigpOiBPcGVyYXRpb25JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7CgoKCgoKCmNsYXNzIFBhY2thZ2VFdmVudHMKewoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX0lOU1RBTEwgPSAncHJlLXBhY2thZ2UtaW5zdGFsbCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUEFDS0FHRV9JTlNUQUxMID0gJ3Bvc3QtcGFja2FnZS1pbnN0YWxsJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1BBQ0tBR0VfVVBEQVRFID0gJ3ByZS1wYWNrYWdlLXVwZGF0ZSc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUEFDS0FHRV9VUERBVEUgPSAncG9zdC1wYWNrYWdlLXVwZGF0ZSc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX1VOSU5TVEFMTCA9ICdwcmUtcGFja2FnZS11bmluc3RhbGwnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1BBQ0tBR0VfVU5JTlNUQUxMID0gJ3Bvc3QtcGFja2FnZS11bmluc3RhbGwnOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmNsYXNzIFBsdWdpbkluc3RhbGxlciBleHRlbmRzIExpYnJhcnlJbnN0YWxsZXIKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCA/RmlsZXN5c3RlbSAkZnMgPSBudWxsLCA/QmluYXJ5SW5zdGFsbGVyICRiaW5hcnlJbnN0YWxsZXIgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGlvLCAkY29tcG9zZXIsICdjb21wb3Nlci1wbHVnaW4nLCAkZnMsICRiaW5hcnlJbnN0YWxsZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSkKewpyZXR1cm4gJHBhY2thZ2VUeXBlID09PSAnY29tcG9zZXItcGx1Z2luJyB8fCAkcGFja2FnZVR5cGUgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZSgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewoKaWYgKCgkdHlwZSA9PT0gJ2luc3RhbGwnIHx8ICR0eXBlID09PSAndXBkYXRlJykgJiYgISR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmFyZVBsdWdpbnNEaXNhYmxlZCgnbG9jYWwnKSkgewokdGhpcy0+Z2V0UGx1Z2luTWFuYWdlcigpLT5pc1BsdWdpbkFsbG93ZWQoJHBhY2thZ2UtPmdldE5hbWUoKSwgZmFsc2UsIHRydWUgPT09ICgkcGFja2FnZS0+Z2V0RXh0cmEoKVsncGx1Z2luLW9wdGlvbmFsJ10gPz8gZmFsc2UpKTsKfQoKcmV0dXJuIHBhcmVudDo6cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CiRleHRyYSA9ICRwYWNrYWdlLT5nZXRFeHRyYSgpOwppZiAoZW1wdHkoJGV4dHJhWydjbGFzcyddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJywgY29tcG9zZXItcGx1Z2luIHBhY2thZ2VzIHNob3VsZCBoYXZlIGEgY2xhc3MgZGVmaW5lZCBpbiB0aGVpciBleHRyYSBrZXkgdG8gYmUgdXNhYmxlLicpOwp9CgpyZXR1cm4gcGFyZW50Ojpkb3dubG9hZCgkcGFja2FnZSwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokcHJvbWlzZSA9IHBhcmVudDo6aW5zdGFsbCgkcmVwbywgJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRwYWNrYWdlLCAkcmVwbyk6IHZvaWQgewp0cnkgewpQbGF0Zm9ybTo6d29ya2Fyb3VuZEZpbGVzeXN0ZW1Jc3N1ZXMoKTsKJHRoaXMtPmdldFBsdWdpbk1hbmFnZXIoKS0+cmVnaXN0ZXJQYWNrYWdlKCRwYWNrYWdlLCB0cnVlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+cm9sbGJhY2tJbnN0YWxsKCRlLCAkcmVwbywgJHBhY2thZ2UpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewokcHJvbWlzZSA9IHBhcmVudDo6dXBkYXRlKCRyZXBvLCAkaW5pdGlhbCwgJHRhcmdldCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJGluaXRpYWwsICR0YXJnZXQsICRyZXBvKTogdm9pZCB7CnRyeSB7ClBsYXRmb3JtOjp3b3JrYXJvdW5kRmlsZXN5c3RlbUlzc3VlcygpOwokdGhpcy0+Z2V0UGx1Z2luTWFuYWdlcigpLT5kZWFjdGl2YXRlUGFja2FnZSgkaW5pdGlhbCk7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPnJlZ2lzdGVyUGFja2FnZSgkdGFyZ2V0LCB0cnVlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+cm9sbGJhY2tJbnN0YWxsKCRlLCAkcmVwbywgJHRhcmdldCk7Cn0KfSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+Z2V0UGx1Z2luTWFuYWdlcigpLT51bmluc3RhbGxQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybiBwYXJlbnQ6OnVuaW5zdGFsbCgkcmVwbywgJHBhY2thZ2UpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJvbGxiYWNrSW5zdGFsbChcRXhjZXB0aW9uICRlLCBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUGx1Z2luIGluaXRpYWxpemF0aW9uIGZhaWxlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpLCB1bmluc3RhbGxpbmcgcGx1Z2luJyk7CnBhcmVudDo6dW5pbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7CnRocm93ICRlOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGx1Z2luTWFuYWdlcigpOiBQbHVnaW5NYW5hZ2VyCnsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKHNlbGY6OmNsYXNzLicgc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXIgaW5zdGFuY2UuJykpOwokcGx1Z2luTWFuYWdlciA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UGx1Z2luTWFuYWdlcigpOwoKcmV0dXJuICRwbHVnaW5NYW5hZ2VyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKCgoKCgoKCmNsYXNzIFByb2plY3RJbnN0YWxsZXIgaW1wbGVtZW50cyBJbnN0YWxsZXJJbnRlcmZhY2UKewoKcHJpdmF0ZSAkaW5zdGFsbFBhdGg7Cgpwcml2YXRlICRkb3dubG9hZE1hbmFnZXI7Cgpwcml2YXRlICRmaWxlc3lzdGVtOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkaW5zdGFsbFBhdGgsIERvd25sb2FkTWFuYWdlciAkZG0sIEZpbGVzeXN0ZW0gJGZzKQp7CiR0aGlzLT5pbnN0YWxsUGF0aCA9IHJ0cmltKHN0cnRyKCRpbnN0YWxsUGF0aCwgJ1xcJywgJy8nKSwgJy8nKS4nLyc7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkZG07CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSk6IGJvb2wKewpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6ID9Qcm9taXNlSW50ZXJmYWNlCnsKJGluc3RhbGxQYXRoID0gJHRoaXMtPmluc3RhbGxQYXRoOwppZiAoZmlsZV9leGlzdHMoJGluc3RhbGxQYXRoKSAmJiAhJHRoaXMtPmZpbGVzeXN0ZW0tPmlzRGlyRW1wdHkoJGluc3RhbGxQYXRoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBkaXJlY3RvcnkgJGluc3RhbGxQYXRoIGlzIG5vdCBlbXB0eS4iKTsKfQppZiAoIWlzX2RpcigkaW5zdGFsbFBhdGgpKSB7Cm1rZGlyKCRpbnN0YWxsUGF0aCwgMDc3NywgdHJ1ZSk7Cn0KCnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5kb3dubG9hZCgkcGFja2FnZSwgJGluc3RhbGxQYXRoLCAkcHJldlBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZSgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6ID9Qcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5kb3dubG9hZE1hbmFnZXItPnByZXBhcmUoJHR5cGUsICRwYWNrYWdlLCAkdGhpcy0+aW5zdGFsbFBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogP1Byb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+Y2xlYW51cCgkdHlwZSwgJHBhY2thZ2UsICR0aGlzLT5pbnN0YWxsUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5kb3dubG9hZE1hbmFnZXItPmluc3RhbGwoJHBhY2thZ2UsICR0aGlzLT5pbnN0YWxsUGF0aCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KTogP1Byb21pc2VJbnRlcmZhY2UKewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigibm90IHN1cHBvcnRlZCIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/UHJvbWlzZUludGVyZmFjZQp7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJub3Qgc3VwcG9ydGVkIik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmluc3RhbGxQYXRoOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKCgoKCgoKY2xhc3MgU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcgp7CnB1YmxpYyBjb25zdCBNT0RFX0xJU1QgPSAxOwpwdWJsaWMgY29uc3QgTU9ERV9CWV9QQUNLQUdFID0gMjsKcHVibGljIGNvbnN0IE1PREVfQllfU1VHR0VTVElPTiA9IDQ7CgoKCgpwcm90ZWN0ZWQgJHN1Z2dlc3RlZFBhY2thZ2VzID0gW107CgoKCgpwcml2YXRlICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBhY2thZ2Uoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0LCBzdHJpbmcgJHJlYXNvbik6IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIKewokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNbXSA9IFsKJ3NvdXJjZScgPT4gJHNvdXJjZSwKJ3RhcmdldCcgPT4gJHRhcmdldCwKJ3JlYXNvbicgPT4gJHJlYXNvbiwKXTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIKewokc291cmNlID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCkgYXMgJHRhcmdldCA9PiAkcmVhc29uKSB7CiR0aGlzLT5hZGRQYWNrYWdlKAokc291cmNlLAokdGFyZ2V0LAokcmVhc29uCik7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG91dHB1dChpbnQgJG1vZGUsID9JbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvID0gbnVsbCwgP1BhY2thZ2VJbnRlcmZhY2UgJG9ubHlEZXBlbmRlbnRzT2YgPSBudWxsKTogdm9pZAp7CiRzdWdnZXN0ZWRQYWNrYWdlcyA9ICR0aGlzLT5nZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCRpbnN0YWxsZWRSZXBvLCAkb25seURlcGVuZGVudHNPZik7Cgokc3VnZ2VzdGVycyA9IFtdOwokc3VnZ2VzdGVkID0gW107CmZvcmVhY2ggKCRzdWdnZXN0ZWRQYWNrYWdlcyBhcyAkc3VnZ2VzdGlvbikgewokc3VnZ2VzdGVyc1skc3VnZ2VzdGlvblsnc291cmNlJ11dWyRzdWdnZXN0aW9uWyd0YXJnZXQnXV0gPSAkc3VnZ2VzdGlvblsncmVhc29uJ107CiRzdWdnZXN0ZWRbJHN1Z2dlc3Rpb25bJ3RhcmdldCddXVskc3VnZ2VzdGlvblsnc291cmNlJ11dID0gJHN1Z2dlc3Rpb25bJ3JlYXNvbiddOwp9Cmtzb3J0KCRzdWdnZXN0ZXJzKTsKa3NvcnQoJHN1Z2dlc3RlZCk7CgoKaWYgKCRtb2RlICYgc2VsZjo6TU9ERV9MSVNUKSB7CmZvcmVhY2ggKGFycmF5X2tleXMoJHN1Z2dlc3RlZCkgYXMgJG5hbWUpIHsKJHRoaXMtPmlvLT53cml0ZShzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4nLCAkbmFtZSkpOwp9CgpyZXR1cm47Cn0KCgppZiAoJG1vZGUgJiBzZWxmOjpNT0RFX0JZX1BBQ0tBR0UpIHsKZm9yZWFjaCAoJHN1Z2dlc3RlcnMgYXMgJHN1Z2dlc3RlciA9PiAkc3VnZ2VzdGlvbnMpIHsKJHRoaXMtPmlvLT53cml0ZShzcHJpbnRmKCc8Y29tbWVudD4lczwvY29tbWVudD4gc3VnZ2VzdHM6JywgJHN1Z2dlc3RlcikpOwoKZm9yZWFjaCAoJHN1Z2dlc3Rpb25zIGFzICRzdWdnZXN0aW9uID0+ICRyZWFzb24pIHsKJHRoaXMtPmlvLT53cml0ZShzcHJpbnRmKCcgLSA8aW5mbz4lczwvaW5mbz4nIC4gKCRyZWFzb24gPyAnOiAlcycgOiAnJyksICRzdWdnZXN0aW9uLCAkdGhpcy0+ZXNjYXBlT3V0cHV0KCRyZWFzb24pKSk7Cn0KJHRoaXMtPmlvLT53cml0ZSgnJyk7Cn0KfQoKCmlmICgkbW9kZSAmIHNlbGY6Ok1PREVfQllfU1VHR0VTVElPTikgewoKaWYgKCRtb2RlICYgc2VsZjo6TU9ERV9CWV9QQUNLQUdFKSB7CiR0aGlzLT5pby0+d3JpdGUoc3RyX3JlcGVhdCgnLScsIDc4KSk7Cn0KZm9yZWFjaCAoJHN1Z2dlc3RlZCBhcyAkc3VnZ2VzdGlvbiA9PiAkc3VnZ2VzdGVycykgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJzxjb21tZW50PiVzPC9jb21tZW50PiBpcyBzdWdnZXN0ZWQgYnk6JywgJHN1Z2dlc3Rpb24pKTsKCmZvcmVhY2ggKCRzdWdnZXN0ZXJzIGFzICRzdWdnZXN0ZXIgPT4gJHJlYXNvbikgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJyAtIDxpbmZvPiVzPC9pbmZvPicgLiAoJHJlYXNvbiA/ICc6ICVzJyA6ICcnKSwgJHN1Z2dlc3RlciwgJHRoaXMtPmVzY2FwZU91dHB1dCgkcmVhc29uKSkpOwp9CiR0aGlzLT5pby0+d3JpdGUoJycpOwp9Cn0KCmlmICgkb25seURlcGVuZGVudHNPZikgewokYWxsU3VnZ2VzdGVkUGFja2FnZXMgPSAkdGhpcy0+Z2V0RmlsdGVyZWRTdWdnZXN0aW9ucygkaW5zdGFsbGVkUmVwbyk7CiRkaWZmID0gY291bnQoJGFsbFN1Z2dlc3RlZFBhY2thZ2VzKSAtIGNvdW50KCRzdWdnZXN0ZWRQYWNrYWdlcyk7CmlmICgkZGlmZikgewokdGhpcy0+aW8tPndyaXRlKCc8aW5mbz4nLiRkaWZmLicgYWRkaXRpb25hbCBzdWdnZXN0aW9uczwvaW5mbz4gYnkgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgY2FuIGJlIHNob3duIHdpdGggPGluZm8+LS1hbGw8L2luZm8+Jyk7Cn0KfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3V0cHV0TWluaW1hbGlzdGljKD9JbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvID0gbnVsbCwgP1BhY2thZ2VJbnRlcmZhY2UgJG9ubHlEZXBlbmRlbnRzT2YgPSBudWxsKTogdm9pZAp7CiRzdWdnZXN0ZWRQYWNrYWdlcyA9ICR0aGlzLT5nZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCRpbnN0YWxsZWRSZXBvLCAkb25seURlcGVuZGVudHNPZik7CmlmICgkc3VnZ2VzdGVkUGFja2FnZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz4nLmNvdW50KCRzdWdnZXN0ZWRQYWNrYWdlcykuJyBwYWNrYWdlIHN1Z2dlc3Rpb25zIHdlcmUgYWRkZWQgYnkgbmV3IGRlcGVuZGVuY2llcywgdXNlIGBjb21wb3NlciBzdWdnZXN0YCB0byBzZWUgZGV0YWlscy48L2luZm8+Jyk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEZpbHRlcmVkU3VnZ2VzdGlvbnMoP0luc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8gPSBudWxsLCA/UGFja2FnZUludGVyZmFjZSAkb25seURlcGVuZGVudHNPZiA9IG51bGwpOiBhcnJheQp7CiRzdWdnZXN0ZWRQYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwokaW5zdGFsbGVkTmFtZXMgPSBbXTsKaWYgKG51bGwgIT09ICRpbnN0YWxsZWRSZXBvICYmICFlbXB0eSgkc3VnZ2VzdGVkUGFja2FnZXMpKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRpbnN0YWxsZWROYW1lcyA9IGFycmF5X21lcmdlKAokaW5zdGFsbGVkTmFtZXMsCiRwYWNrYWdlLT5nZXROYW1lcygpCik7Cn0KfQoKJHNvdXJjZUZpbHRlciA9IFtdOwppZiAoJG9ubHlEZXBlbmRlbnRzT2YpIHsKJHNvdXJjZUZpbHRlciA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRsaW5rKTogc3RyaW5nIHsKcmV0dXJuICRsaW5rLT5nZXRUYXJnZXQoKTsKfSwgYXJyYXlfbWVyZ2UoJG9ubHlEZXBlbmRlbnRzT2YtPmdldFJlcXVpcmVzKCksICRvbmx5RGVwZW5kZW50c09mLT5nZXREZXZSZXF1aXJlcygpKSk7CiRzb3VyY2VGaWx0ZXJbXSA9ICRvbmx5RGVwZW5kZW50c09mLT5nZXROYW1lKCk7Cn0KCiRzdWdnZXN0aW9ucyA9IFtdOwpmb3JlYWNoICgkc3VnZ2VzdGVkUGFja2FnZXMgYXMgJHN1Z2dlc3Rpb24pIHsKaWYgKGluX2FycmF5KCRzdWdnZXN0aW9uWyd0YXJnZXQnXSwgJGluc3RhbGxlZE5hbWVzKSB8fCAoJHNvdXJjZUZpbHRlciAmJiAhaW5fYXJyYXkoJHN1Z2dlc3Rpb25bJ3NvdXJjZSddLCAkc291cmNlRmlsdGVyKSkpIHsKY29udGludWU7Cn0KCiRzdWdnZXN0aW9uc1tdID0gJHN1Z2dlc3Rpb247Cn0KCnJldHVybiAkc3VnZ2VzdGlvbnM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlT3V0cHV0KHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKcmV0dXJuIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKAokdGhpcy0+cmVtb3ZlQ29udHJvbENoYXJhY3RlcnMoJHN0cmluZykKKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZW1vdmVDb250cm9sQ2hhcmFjdGVycyhzdHJpbmcgJHN0cmluZyk6IHN0cmluZwp7CnJldHVybiBQcmVnOjpyZXBsYWNlKAonL1tbOmNudHJsOl1dLycsCicnLApzdHJfcmVwbGFjZSgiXG4iLCAnICcsICRzdHJpbmcpCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKdXNlIFNlbGRcSnNvbkxpbnRcSnNvblBhcnNlcjsKdXNlIFNlbGRcSnNvbkxpbnRcUGFyc2luZ0V4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwoKCgoKCgoKY2xhc3MgSnNvbkZpbGUKewpwdWJsaWMgY29uc3QgTEFYX1NDSEVNQSA9IDE7CnB1YmxpYyBjb25zdCBTVFJJQ1RfU0NIRU1BID0gMjsKcHVibGljIGNvbnN0IEFVVEhfU0NIRU1BID0gMzsKCgpwdWJsaWMgY29uc3QgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyA9IDY0OwoKcHVibGljIGNvbnN0IEpTT05fUFJFVFRZX1BSSU5UID0gMTI4OwoKcHVibGljIGNvbnN0IEpTT05fVU5FU0NBUEVEX1VOSUNPREUgPSAyNTY7CgpwdWJsaWMgY29uc3QgQ09NUE9TRVJfU0NIRU1BX1BBVEggPSBfX0RJUl9fIC4gJy8uLi8uLi8uLi9yZXMvY29tcG9zZXItc2NoZW1hLmpzb24nOwoKcHVibGljIGNvbnN0IElOREVOVF9ERUZBVUxUID0gJyAgICAnOwoKCnByaXZhdGUgJHBhdGg7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkaW5kZW50ID0gc2VsZjo6SU5ERU5UX0RFRkFVTFQ7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhdGgsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+cGF0aCA9ICRwYXRoOwoKaWYgKG51bGwgPT09ICRodHRwRG93bmxvYWRlciAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL31pJywgJHBhdGgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdodHRwIHVybHMgcmVxdWlyZSBhIEh0dHBEb3dubG9hZGVyIGluc3RhbmNlIHRvIGJlIHBhc3NlZCcpOwp9CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmlvID0gJGlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGF0aCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBhdGg7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBleGlzdHMoKTogYm9vbAp7CnJldHVybiBpc19maWxlKCR0aGlzLT5wYXRoKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWFkKCkKewp0cnkgewppZiAoJHRoaXMtPmh0dHBEb3dubG9hZGVyKSB7CiRqc29uID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHRoaXMtPnBhdGgpLT5nZXRCb2R5KCk7Cn0gZWxzZSB7CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+cGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgZmlsZSAiJy4kdGhpcy0+cGF0aC4nIiBpcyBub3QgcmVhZGFibGUuJyk7Cn0KaWYgKCR0aGlzLT5pbyAmJiAkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokcmVhbHBhdGhJbmZvID0gJyc7CiRyZWFscGF0aCA9IHJlYWxwYXRoKCR0aGlzLT5wYXRoKTsKaWYgKGZhbHNlICE9PSAkcmVhbHBhdGggJiYgJHJlYWxwYXRoICE9PSAkdGhpcy0+cGF0aCkgewokcmVhbHBhdGhJbmZvID0gJyAoJyAuICRyZWFscGF0aCAuICcpJzsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1JlYWRpbmcgJyAuICR0aGlzLT5wYXRoIC4gJHJlYWxwYXRoSW5mbyk7Cn0KJGpzb24gPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+cGF0aCk7Cn0KfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAwLCAkZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVhZCAnLiR0aGlzLT5wYXRoLiJcblxuIi4kZS0+Z2V0TWVzc2FnZSgpKTsKfQoKaWYgKCRqc29uID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWFkICcuJHRoaXMtPnBhdGgpOwp9CgokdGhpcy0+aW5kZW50ID0gc2VsZjo6ZGV0ZWN0SW5kZW50aW5nKCRqc29uKTsKCnJldHVybiBzdGF0aWM6OnBhcnNlSnNvbigkanNvbiwgJHRoaXMtPnBhdGgpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShhcnJheSAkaGFzaCwgaW50ICRvcHRpb25zID0gSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fUFJFVFRZX1BSSU5UIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSkKewppZiAoJHRoaXMtPnBhdGggPT09ICdwaHA6Ly9tZW1vcnknKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5wYXRoLCBzdGF0aWM6OmVuY29kZSgkaGFzaCwgJG9wdGlvbnMsICR0aGlzLT5pbmRlbnQpKTsKCnJldHVybjsKfQoKJGRpciA9IGRpcm5hbWUoJHRoaXMtPnBhdGgpOwppZiAoIWlzX2RpcigkZGlyKSkgewppZiAoZmlsZV9leGlzdHMoJGRpcikpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oCnJlYWxwYXRoKCRkaXIpLicgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnkuJwopOwp9CmlmICghQG1rZGlyKCRkaXIsIDA3NzcsIHRydWUpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKAokZGlyLicgZG9lcyBub3QgZXhpc3QgYW5kIGNvdWxkIG5vdCBiZSBjcmVhdGVkLicKKTsKfQp9CgokcmV0cmllcyA9IDM7CndoaWxlICgkcmV0cmllcy0tKSB7CnRyeSB7CiR0aGlzLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0aGlzLT5wYXRoLCBzdGF0aWM6OmVuY29kZSgkaGFzaCwgJG9wdGlvbnMsICR0aGlzLT5pbmRlbnQpLiAoJG9wdGlvbnMgJiBKU09OX1BSRVRUWV9QUklOVCA/ICJcbiIgOiAnJykpOwpicmVhazsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJHJldHJpZXMgPiAwKSB7CnVzbGVlcCg1MDAwMDApOwpjb250aW51ZTsKfQoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZChzdHJpbmcgJHBhdGgsIHN0cmluZyAkY29udGVudCkKewokY3VycmVudENvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwppZiAoZmFsc2UgPT09ICRjdXJyZW50Q29udGVudCB8fCAkY3VycmVudENvbnRlbnQgIT09ICRjb250ZW50KSB7CnJldHVybiBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJGNvbnRlbnQpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoaW50ICRzY2hlbWEgPSBzZWxmOjpTVFJJQ1RfU0NIRU1BLCA/c3RyaW5nICRzY2hlbWFGaWxlID0gbnVsbCk6IGJvb2wKewppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHRoaXMtPnBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGZpbGUgIicuJHRoaXMtPnBhdGguJyIgaXMgbm90IHJlYWRhYmxlLicpOwp9CiRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnBhdGgpOwokZGF0YSA9IGpzb25fZGVjb2RlKCRjb250ZW50KTsKCmlmIChudWxsID09PSAkZGF0YSAmJiAnbnVsbCcgIT09ICRjb250ZW50KSB7CnNlbGY6OnZhbGlkYXRlU3ludGF4KCRjb250ZW50LCAkdGhpcy0+cGF0aCk7Cn0KCnJldHVybiBzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJHRoaXMtPnBhdGgsICRkYXRhLCAkc2NoZW1hLCAkc2NoZW1hRmlsZSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUpzb25TY2hlbWEoc3RyaW5nICRzb3VyY2UsICRkYXRhLCBpbnQgJHNjaGVtYSwgP3N0cmluZyAkc2NoZW1hRmlsZSA9IG51bGwpOiBib29sCnsKJGlzQ29tcG9zZXJTY2hlbWFGaWxlID0gZmFsc2U7CmlmIChudWxsID09PSAkc2NoZW1hRmlsZSkgewokaXNDb21wb3NlclNjaGVtYUZpbGUgPSB0cnVlOwokc2NoZW1hRmlsZSA9IHNlbGY6OkNPTVBPU0VSX1NDSEVNQV9QQVRIOwp9CgoKaWYgKGZhbHNlID09PSBzdHJwb3MoJHNjaGVtYUZpbGUsICc6Ly8nKSkgewokc2NoZW1hRmlsZSA9ICdmaWxlOi8vJyAuICRzY2hlbWFGaWxlOwp9Cgokc2NoZW1hRGF0YSA9IChvYmplY3QpIFsnJHJlZicgPT4gJHNjaGVtYUZpbGVdOwoKaWYgKCRzY2hlbWEgPT09IHNlbGY6OkxBWF9TQ0hFTUEpIHsKJHNjaGVtYURhdGEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZTsKJHNjaGVtYURhdGEtPnJlcXVpcmVkID0gW107Cn0gZWxzZWlmICgkc2NoZW1hID09PSBzZWxmOjpTVFJJQ1RfU0NIRU1BICYmICRpc0NvbXBvc2VyU2NoZW1hRmlsZSkgewokc2NoZW1hRGF0YS0+YWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsKJHNjaGVtYURhdGEtPnJlcXVpcmVkID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ107Cn0gZWxzZWlmICgkc2NoZW1hID09PSBzZWxmOjpBVVRIX1NDSEVNQSAmJiAkaXNDb21wb3NlclNjaGVtYUZpbGUpIHsKJHNjaGVtYURhdGEgPSAob2JqZWN0KSBbJyRyZWYnID0+ICRzY2hlbWFGaWxlLicjL3Byb3BlcnRpZXMvY29uZmlnJywgJyRzY2hlbWEnID0+ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIl07Cn0KCiR2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKCk7CiR2YWxpZGF0b3ItPmNoZWNrKCRkYXRhLCAkc2NoZW1hRGF0YSk7CgppZiAoISR2YWxpZGF0b3ItPmlzVmFsaWQoKSkgewokZXJyb3JzID0gW107CmZvcmVhY2ggKChhcnJheSkgJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkgYXMgJGVycm9yKSB7CiRlcnJvcnNbXSA9ICgkZXJyb3JbJ3Byb3BlcnR5J10gPyAkZXJyb3JbJ3Byb3BlcnR5J10uJyA6ICcgOiAnJykuJGVycm9yWydtZXNzYWdlJ107Cn0KdGhyb3cgbmV3IEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uKCciJy4kc291cmNlLiciIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBKU09OIHNjaGVtYScsICRlcnJvcnMpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kZSgkZGF0YSwgaW50ICRvcHRpb25zID0gNDQ4LCBzdHJpbmcgJGluZGVudCA9IHNlbGY6OklOREVOVF9ERUZBVUxUKTogc3RyaW5nCnsKJGpzb24gPSBqc29uX2VuY29kZSgkZGF0YSwgJG9wdGlvbnMpOwoKaWYgKGZhbHNlID09PSAkanNvbikgewpzZWxmOjp0aHJvd0VuY29kZUVycm9yKGpzb25fbGFzdF9lcnJvcigpKTsKfQoKaWYgKCgkb3B0aW9ucyAmIEpTT05fUFJFVFRZX1BSSU5UKSA+IDAgJiYgJGluZGVudCAhPT0gc2VsZjo6SU5ERU5UX0RFRkFVTFQgKSB7CgpyZXR1cm4gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKAonI14gezQsfSNtJywKc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2gpIHVzZSAoJGluZGVudCk6IHN0cmluZyB7CnJldHVybiBzdHJfcmVwZWF0KCRpbmRlbnQsIChpbnQpKHN0cmxlbigkbWF0Y2hbMF0gPz8gJycpIC8gNCkpOwp9LAokanNvbgopOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0aHJvd0VuY29kZUVycm9yKGludCAkY29kZSk6IHZvaWQKewpzd2l0Y2ggKCRjb2RlKSB7CmNhc2UgSlNPTl9FUlJPUl9ERVBUSDoKJG1zZyA9ICdNYXhpbXVtIHN0YWNrIGRlcHRoIGV4Y2VlZGVkJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9TVEFURV9NSVNNQVRDSDoKJG1zZyA9ICdVbmRlcmZsb3cgb3IgdGhlIG1vZGVzIG1pc21hdGNoJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9DVFJMX0NIQVI6CiRtc2cgPSAnVW5leHBlY3RlZCBjb250cm9sIGNoYXJhY3RlciBmb3VuZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfVVRGODoKJG1zZyA9ICdNYWxmb3JtZWQgVVRGLTggY2hhcmFjdGVycywgcG9zc2libHkgaW5jb3JyZWN0bHkgZW5jb2RlZCc7CmJyZWFrOwpkZWZhdWx0OgokbXNnID0gJ1Vua25vd24gZXJyb3InOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0pTT04gZW5jb2RpbmcgZmFpbGVkOiAnLiRtc2cpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlSnNvbig/c3RyaW5nICRqc29uLCA/c3RyaW5nICRmaWxlID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGpzb24pIHsKcmV0dXJuIG51bGw7Cn0KJGRhdGEgPSBqc29uX2RlY29kZSgkanNvbiwgdHJ1ZSk7CmlmIChudWxsID09PSAkZGF0YSAmJiBKU09OX0VSUk9SX05PTkUgIT09IGpzb25fbGFzdF9lcnJvcigpKSB7CnNlbGY6OnZhbGlkYXRlU3ludGF4KCRqc29uLCAkZmlsZSk7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlU3ludGF4KHN0cmluZyAkanNvbiwgP3N0cmluZyAkZmlsZSA9IG51bGwpOiBib29sCnsKJHBhcnNlciA9IG5ldyBKc29uUGFyc2VyKCk7CiRyZXN1bHQgPSAkcGFyc2VyLT5saW50KCRqc29uKTsKaWYgKG51bGwgPT09ICRyZXN1bHQpIHsKaWYgKGRlZmluZWQoJ0pTT05fRVJST1JfVVRGOCcpICYmIEpTT05fRVJST1JfVVRGOCA9PT0ganNvbl9sYXN0X2Vycm9yKCkpIHsKaWYgKCRmaWxlID09PSBudWxsKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdUaGUgaW5wdXQgaXMgbm90IFVURi04LCBjb3VsZCBub3QgcGFyc2UgYXMgSlNPTicpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignIicgLiAkZmlsZSAuICciIGlzIG5vdCBVVEYtOCwgY291bGQgbm90IHBhcnNlIGFzIEpTT04nKTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCRmaWxlID09PSBudWxsKSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCdUaGUgaW5wdXQgZG9lcyBub3QgY29udGFpbiB2YWxpZCBKU09OJyAuICJcbiIgLiAkcmVzdWx0LT5nZXRNZXNzYWdlKCksCiRyZXN1bHQtPmdldERldGFpbHMoKSk7Cn0gZWxzZSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCciJyAuICRmaWxlIC4gJyIgZG9lcyBub3QgY29udGFpbiB2YWxpZCBKU09OJyAuICJcbiIgLiAkcmVzdWx0LT5nZXRNZXNzYWdlKCksCiRyZXN1bHQtPmdldERldGFpbHMoKSk7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXRlY3RJbmRlbnRpbmcoP3N0cmluZyAkanNvbik6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXihbIFx0XSspIiNtJywgJGpzb24gPz8gJycsICRtYXRjaCkpIHsKcmV0dXJuICRtYXRjaFsxXTsKfQpyZXR1cm4gc2VsZjo6SU5ERU5UX0RFRkFVTFQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCgoKCgoKY2xhc3MgSnNvbkZvcm1hdHRlcgp7CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0KHN0cmluZyAkanNvbiwgYm9vbCAkdW5lc2NhcGVVbmljb2RlLCBib29sICR1bmVzY2FwZVNsYXNoZXMpOiBzdHJpbmcKewokcmVzdWx0ID0gJyc7CiRwb3MgPSAwOwokc3RyTGVuID0gc3RybGVuKCRqc29uKTsKJGluZGVudFN0ciA9ICcgICAgJzsKJG5ld0xpbmUgPSAiXG4iOwokb3V0T2ZRdW90ZXMgPSB0cnVlOwokYnVmZmVyID0gJyc7CiRub2VzY2FwZSA9IHRydWU7Cgpmb3IgKCRpID0gMDsgJGkgPCAkc3RyTGVuOyAkaSsrKSB7CgokY2hhciA9IHN1YnN0cigkanNvbiwgJGksIDEpOwoKCmlmICgnIicgPT09ICRjaGFyICYmICRub2VzY2FwZSkgewokb3V0T2ZRdW90ZXMgPSAhJG91dE9mUXVvdGVzOwp9CgppZiAoISRvdXRPZlF1b3RlcykgewokYnVmZmVyIC49ICRjaGFyOwokbm9lc2NhcGUgPSAnXFwnID09PSAkY2hhciA/ICEkbm9lc2NhcGUgOiB0cnVlOwpjb250aW51ZTsKfQppZiAoJycgIT09ICRidWZmZXIpIHsKaWYgKCR1bmVzY2FwZVNsYXNoZXMpIHsKJGJ1ZmZlciA9IHN0cl9yZXBsYWNlKCdcXC8nLCAnLycsICRidWZmZXIpOwp9CgppZiAoJHVuZXNjYXBlVW5pY29kZSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSkgewoKJGJ1ZmZlciA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygnLyhcXFxcKyl1KFswLTlhLWZdezR9KS9pJywgc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2gpIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbMV0pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbMl0pKTsKJGwgPSBzdHJsZW4oJG1hdGNoWzFdKTsKCmlmICgkbCAlIDIpIHsKJGNvZGUgPSBoZXhkZWMoJG1hdGNoWzJdKTsKCgppZiAoMHhEODAwIDw9ICRjb2RlICYmIDB4REZGRiA+PSAkY29kZSkgewpyZXR1cm4gJG1hdGNoWzBdOwp9CgpyZXR1cm4gc3RyX3JlcGVhdCgnXFwnLCAkbCAtIDEpIC4gbWJfY29udmVydF9lbmNvZGluZygKcGFjaygnSConLCAkbWF0Y2hbMl0pLAonVVRGLTgnLAonVUNTLTJCRScKKTsKfQoKcmV0dXJuICRtYXRjaFswXTsKfSwgJGJ1ZmZlcik7Cn0KCiRyZXN1bHQgLj0gJGJ1ZmZlci4kY2hhcjsKJGJ1ZmZlciA9ICcnOwpjb250aW51ZTsKfQoKaWYgKCc6JyA9PT0gJGNoYXIpIHsKCiRjaGFyIC49ICcgJzsKfSBlbHNlaWYgKCd9JyA9PT0gJGNoYXIgfHwgJ10nID09PSAkY2hhcikgewokcG9zLS07CiRwcmV2Q2hhciA9IHN1YnN0cigkanNvbiwgJGkgLSAxLCAxKTsKCmlmICgneycgIT09ICRwcmV2Q2hhciAmJiAnWycgIT09ICRwcmV2Q2hhcikgewoKCiRyZXN1bHQgLj0gJG5ld0xpbmU7CiRyZXN1bHQgLj0gc3RyX3JlcGVhdCgkaW5kZW50U3RyLCAkcG9zKTsKfSBlbHNlIHsKCiRyZXN1bHQgPSBydHJpbSgkcmVzdWx0KTsKfQp9CgokcmVzdWx0IC49ICRjaGFyOwoKCgppZiAoJywnID09PSAkY2hhciB8fCAneycgPT09ICRjaGFyIHx8ICdbJyA9PT0gJGNoYXIpIHsKJHJlc3VsdCAuPSAkbmV3TGluZTsKCmlmICgneycgPT09ICRjaGFyIHx8ICdbJyA9PT0gJGNoYXIpIHsKJHBvcysrOwp9CgokcmVzdWx0IC49IHN0cl9yZXBlYXQoJGluZGVudFN0ciwgJHBvcyk7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKCgoKCmNsYXNzIEpzb25NYW5pcHVsYXRvcgp7Cgpwcml2YXRlIGNvbnN0IERFRklORVMgPSAnKD8oREVGSU5FKQogICAgICAgKD88bnVtYmVyPiAgICAtPyAoPz0gWzEtOV18MCg/IVxkKSApIFxkKysgKD86XC5cZCsrKT8gKD86W2VFXSBbKy1dPysgXGQrKyk/ICkKICAgICAgICg/PGJvb2xlYW4+ICAgdHJ1ZSB8IGZhbHNlIHwgbnVsbCApCiAgICAgICAoPzxzdHJpbmc+ICAgICIgKD86W14iXFxcXF0qKyB8IFxcXFwgWyJcXFxcYmZucnRcL10gfCBcXFxcIHUgWzAtOUEtRmEtZl17NH0gKSogIiApCiAgICAgICAoPzxhcnJheT4gICAgIFxbICAoPzogICg/Jmpzb24pIFxzKisgKD86ICwgKD8manNvbikgXHMqKyApKisgICk/KyAgXHMqKyBcXSApCiAgICAgICAoPzxwYWlyPiAgICAgIFxzKisgKD8mc3RyaW5nKSBccyorIDogKD8manNvbikgXHMqKyApCiAgICAgICAoPzxvYmplY3Q+ICAgIFx7ICAoPzogICg/JnBhaXIpICAoPzogLCAoPyZwYWlyKSAgKSorICApPysgIFxzKisgXH0gKQogICAgICAgKD88anNvbj4gICAgICBccyorICg/OiAoPyZudW1iZXIpIHwgKD8mYm9vbGVhbikgfCAoPyZzdHJpbmcpIHwgKD8mYXJyYXkpIHwgKD8mb2JqZWN0KSApICkKICAgICknOwoKCnByaXZhdGUgJGNvbnRlbnRzOwoKcHJpdmF0ZSAkbmV3bGluZTsKCnByaXZhdGUgJGluZGVudDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnRzKQp7CiRjb250ZW50cyA9IHRyaW0oJGNvbnRlbnRzKTsKaWYgKCRjb250ZW50cyA9PT0gJycpIHsKJGNvbnRlbnRzID0gJ3t9JzsKfQppZiAoIVByZWc6OmlzTWF0Y2goJyNeXHsoLiopXH0kI3MnLCAkY29udGVudHMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUganNvbiBmaWxlIG11c3QgYmUgYW4gb2JqZWN0ICh7fSknKTsKfQokdGhpcy0+bmV3bGluZSA9IGZhbHNlICE9PSBzdHJwb3MoJGNvbnRlbnRzLCAiXHJcbiIpID8gIlxyXG4iIDogIlxuIjsKJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzID09PSAne30nID8gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiAnfScgOiAkY29udGVudHM7CiR0aGlzLT5kZXRlY3RJbmRlbnRpbmcoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29udGVudHMgLiAkdGhpcy0+bmV3bGluZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZExpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJHBhY2thZ2UsIHN0cmluZyAkY29uc3RyYWludCwgYm9vbCAkc29ydFBhY2thZ2VzID0gZmFsc2UpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskdHlwZV0pKSB7CnJldHVybiAkdGhpcy0+YWRkTWFpbktleSgkdHlwZSwgWyRwYWNrYWdlID0+ICRjb25zdHJhaW50XSk7Cn0KCiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8pJy4KJyg/UDxwcm9wZXJ0eT4nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkdHlwZSkpLidccyo6XHMqKSg/UDx2YWx1ZT4oPyZqc29uKSkoP1A8ZW5kPi4qKX1zeCc7CmlmICghUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CnJldHVybiBmYWxzZTsKfQphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3ZhbHVlJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCiRsaW5rcyA9ICRtYXRjaGVzWyd2YWx1ZSddOwoKCiRwYWNrYWdlUmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRwYWNrYWdlKSk7CiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLiciKD9QPHBhY2thZ2U+Jy4kcGFja2FnZVJlZ2V4LicpIihccyo6XHMqKSg/JnN0cmluZyl9aXgnOwppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICRsaW5rcywgJHBhY2thZ2VNYXRjaGVzKSkgewphc3NlcnQoaXNfc3RyaW5nKCRwYWNrYWdlTWF0Y2hlc1sncGFja2FnZSddKSk7CgokZXhpc3RpbmdQYWNrYWdlID0gJHBhY2thZ2VNYXRjaGVzWydwYWNrYWdlJ107CiRwYWNrYWdlUmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRleGlzdGluZ1BhY2thZ2UpKTsKJGxpbmtzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7Jy5zZWxmOjpERUZJTkVTLiciJy4kcGFja2FnZVJlZ2V4LiciKD9QPHNlcGFyYXRvcj5ccyo6XHMqKSg/JnN0cmluZyl9aXgnLCBzdGF0aWMgZnVuY3Rpb24gKCRtKSB1c2UgKCRleGlzdGluZ1BhY2thZ2UsICRjb25zdHJhaW50KTogc3RyaW5nIHsKcmV0dXJuIEpzb25GaWxlOjplbmNvZGUoc3RyX3JlcGxhY2UoJ1xcLycsICcvJywgJGV4aXN0aW5nUGFja2FnZSkpIC4gJG1bJ3NlcGFyYXRvciddIC4gJyInIC4gJGNvbnN0cmFpbnQgLiAnIic7Cn0sICRsaW5rcyk7Cn0gZWxzZSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXlxzKlx7XHMqXFMrLio/KFxzKlx9XHMqKSQjcycsICRsaW5rcywgJG1hdGNoKSkgewoKJGxpbmtzID0gUHJlZzo6cmVwbGFjZSgKJ3snLnByZWdfcXVvdGUoJG1hdGNoWzFdKS4nJH0nLAoKYWRkY3NsYXNoZXMoJywnIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJHBhY2thZ2UpLic6ICcuSnNvbkZpbGU6OmVuY29kZSgkY29uc3RyYWludCkgLiAkbWF0Y2hbMV0sICdcXCQnKSwKJGxpbmtzCik7Cn0gZWxzZSB7CgokbGlua3MgPSAneycgLiAkdGhpcy0+bmV3bGluZSAuCiR0aGlzLT5pbmRlbnQgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgkcGFja2FnZSkuJzogJy5Kc29uRmlsZTo6ZW5jb2RlKCRjb25zdHJhaW50KSAuICR0aGlzLT5uZXdsaW5lIC4KJHRoaXMtPmluZGVudCAuICd9JzsKfQp9CgppZiAodHJ1ZSA9PT0gJHNvcnRQYWNrYWdlcykgewokcmVxdWlyZW1lbnRzID0ganNvbl9kZWNvZGUoJGxpbmtzLCB0cnVlKTsKJHRoaXMtPnNvcnRQYWNrYWdlcygkcmVxdWlyZW1lbnRzKTsKJGxpbmtzID0gJHRoaXMtPmZvcm1hdCgkcmVxdWlyZW1lbnRzKTsKfQoKJHRoaXMtPmNvbnRlbnRzID0gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkbWF0Y2hlc1sncHJvcGVydHknXSAuICRsaW5rcyAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzb3J0UGFja2FnZXMoYXJyYXkgJiRwYWNrYWdlcyA9IFtdKTogdm9pZAp7CiRwcmVmaXggPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXF1aXJlbWVudCk6IHN0cmluZyB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXF1aXJlbWVudCkpIHsKcmV0dXJuIFByZWc6OnJlcGxhY2UoClsKJy9ecGhwLycsCicvXmhodm0vJywKJy9eZXh0LycsCicvXmxpYi8nLAonL15cRC8nLApdLApbCicwLSQwJywKJzEtJDAnLAonMi0kMCcsCiczLSQwJywKJzQtJDAnLApdLAokcmVxdWlyZW1lbnQKKTsKfQoKcmV0dXJuICc1LScuJHJlcXVpcmVtZW50Owp9OwoKdWtzb3J0KCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHByZWZpeCk6IGludCB7CnJldHVybiBzdHJuYXRjbXAoJHByZWZpeCgkYSksICRwcmVmaXgoJGIpKTsKfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgYm9vbCAkYXBwZW5kID0gdHJ1ZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ3JlcG9zaXRvcmllcycsICRuYW1lLCAkY29uZmlnLCAkYXBwZW5kKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgncmVwb3NpdG9yaWVzJywgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ2NvbmZpZycsICRuYW1lLCAkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdjb25maWcnLCAkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQcm9wZXJ0eShzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IGJvb2wKewppZiAoc3RycG9zKCRuYW1lLCAnc3VnZ2VzdC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ3N1Z2dlc3QnLCBzdWJzdHIoJG5hbWUsIDgpLCAkdmFsdWUpOwp9CgppZiAoc3RycG9zKCRuYW1lLCAnZXh0cmEuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5hZGRTdWJOb2RlKCdleHRyYScsIHN1YnN0cigkbmFtZSwgNiksICR2YWx1ZSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdzY3JpcHRzLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+YWRkU3ViTm9kZSgnc2NyaXB0cycsIHN1YnN0cigkbmFtZSwgOCksICR2YWx1ZSk7Cn0KCnJldHVybiAkdGhpcy0+YWRkTWFpbktleSgkbmFtZSwgJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KHN0cmluZyAkbmFtZSk6IGJvb2wKewppZiAoc3RycG9zKCRuYW1lLCAnc3VnZ2VzdC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3N1Z2dlc3QnLCBzdWJzdHIoJG5hbWUsIDgpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ2V4dHJhLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgnZXh0cmEnLCBzdWJzdHIoJG5hbWUsIDYpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ3NjcmlwdHMuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdzY3JpcHRzJywgc3Vic3RyKCRuYW1lLCA4KSk7Cn0KCnJldHVybiAkdGhpcy0+cmVtb3ZlTWFpbktleSgkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTdWJOb2RlKHN0cmluZyAkbWFpbk5vZGUsIHN0cmluZyAkbmFtZSwgJHZhbHVlLCBib29sICRhcHBlbmQgPSB0cnVlKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKJHN1Yk5hbWUgPSBudWxsOwppZiAoaW5fYXJyYXkoJG1haW5Ob2RlLCBbJ2NvbmZpZycsICdleHRyYScsICdzY3JpcHRzJ10pICYmIGZhbHNlICE9PSBzdHJwb3MoJG5hbWUsICcuJykpIHsKWyRuYW1lLCAkc3ViTmFtZV0gPSBleHBsb2RlKCcuJywgJG5hbWUsIDIpOwp9CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJHRoaXMtPmFkZE1haW5LZXkoJG1haW5Ob2RlLCBbJG5hbWUgPT4gWyRzdWJOYW1lID0+ICR2YWx1ZV1dKTsKfSBlbHNlIHsKJHRoaXMtPmFkZE1haW5LZXkoJG1haW5Ob2RlLCBbJG5hbWUgPT4gJHZhbHVlXSk7Cn0KCnJldHVybiB0cnVlOwp9CgoKJG5vZGVSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PiBccyogXHsgXHMqICg/OiAoPyZzdHJpbmcpIFxzKiA6ICg/Jmpzb24pIFxzKiAsIFxzKiApKj8nLgpwcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJG1haW5Ob2RlKSkuJ1xzKjpccyopKD9QPGNvbnRlbnQ+KD8mb2JqZWN0KSkoP1A8ZW5kPi4qKX1zeCc7Cgp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgppZiAoIUBqc29uX2RlY29kZSgkY2hpbGRyZW4pKSB7CnJldHVybiBmYWxzZTsKfQoKCiRjaGlsZFJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJyg/UDxzdGFydD4iJy5wcmVnX3F1b3RlKCRuYW1lKS4nIlxzKjpccyopKD9QPGNvbnRlbnQ+KD8manNvbikpKD9QPGVuZD4sPyl9eCc7CmlmIChQcmVnOjppc01hdGNoKCRjaGlsZFJlZ2V4LCAkY2hpbGRyZW4sICRtYXRjaGVzKSkgewokY2hpbGRyZW4gPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJGNoaWxkUmVnZXgsIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgkc3ViTmFtZSwgJHZhbHVlKTogc3RyaW5nIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsICYmIGlzX3N0cmluZygkbWF0Y2hlc1snY29udGVudCddKSkgewokY3VyVmFsID0ganNvbl9kZWNvZGUoJG1hdGNoZXNbJ2NvbnRlbnQnXSwgdHJ1ZSk7CmlmICghaXNfYXJyYXkoJGN1clZhbCkpIHsKJGN1clZhbCA9IFtdOwp9CiRjdXJWYWxbJHN1Yk5hbWVdID0gJHZhbHVlOwokdmFsdWUgPSAkY3VyVmFsOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkdGhpcy0+Zm9ybWF0KCR2YWx1ZSwgMSkgLiAkbWF0Y2hlc1snZW5kJ107Cn0sICRjaGlsZHJlbik7Cn0gZWxzZSB7ClByZWc6Om1hdGNoKCcjXnsgKD9QPGxlYWRpbmdzcGFjZT5ccyo/KSAoP1A8Y29udGVudD5cUysuKj8pPyAoP1A8dHJhaWxpbmdzcGFjZT5ccyopIH0kI3N4JywgJGNoaWxkcmVuLCAkbWF0Y2gpOwoKJHdoaXRlc3BhY2UgPSAnJzsKaWYgKCFlbXB0eSgkbWF0Y2hbJ3RyYWlsaW5nc3BhY2UnXSkpIHsKJHdoaXRlc3BhY2UgPSAkbWF0Y2hbJ3RyYWlsaW5nc3BhY2UnXTsKfQoKaWYgKCFlbXB0eSgkbWF0Y2hbJ2NvbnRlbnQnXSkpIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiR2YWx1ZSA9IFskc3ViTmFtZSA9PiAkdmFsdWVdOwp9CgoKaWYgKCRhcHBlbmQpIHsKJGNoaWxkcmVuID0gUHJlZzo6cmVwbGFjZSgKJyMnLiR3aGl0ZXNwYWNlLid9JCMnLAphZGRjc2xhc2hlcygnLCcgLiAkdGhpcy0+bmV3bGluZSAuICR0aGlzLT5pbmRlbnQgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgkbmFtZSkuJzogJy4kdGhpcy0+Zm9ybWF0KCR2YWx1ZSwgMSkgLiAkd2hpdGVzcGFjZSAuICd9JywgJ1xcJCcpLAokY2hpbGRyZW4KKTsKfSBlbHNlIHsKJHdoaXRlc3BhY2UgPSAnJzsKaWYgKCFlbXB0eSgkbWF0Y2hbJ2xlYWRpbmdzcGFjZSddKSkgewokd2hpdGVzcGFjZSA9ICRtYXRjaFsnbGVhZGluZ3NwYWNlJ107Cn0KCiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2UoCicjXnsnLiR3aGl0ZXNwYWNlLicjJywKYWRkY3NsYXNoZXMoJ3snIC4gJHdoaXRlc3BhY2UgLiBKc29uRmlsZTo6ZW5jb2RlKCRuYW1lKS4nOiAnLiR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQsICdcXCQnKSwKJGNoaWxkcmVuCik7Cn0KfSBlbHNlIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiR2YWx1ZSA9IFskc3ViTmFtZSA9PiAkdmFsdWVdOwp9CgoKJGNoaWxkcmVuID0gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJG5hbWUpLic6ICcuJHRoaXMtPmZvcm1hdCgkdmFsdWUsIDEpIC4gJHdoaXRlc3BhY2UgLiAnfSc7Cn0KfQoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoJG0pIHVzZSAoJGNoaWxkcmVuKTogc3RyaW5nIHsKcmV0dXJuICRtWydzdGFydCddIC4gJGNoaWxkcmVuIC4gJG1bJ2VuZCddOwp9LCAkdGhpcy0+Y29udGVudHMpOwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVTdWJOb2RlKHN0cmluZyAkbWFpbk5vZGUsIHN0cmluZyAkbmFtZSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCgppZiAoZW1wdHkoJGRlY29kZWRbJG1haW5Ob2RlXSkpIHsKcmV0dXJuIHRydWU7Cn0KCgokbm9kZVJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+IFxzKiBceyBccyogKD86ICg/JnN0cmluZykgXHMqIDogKD8manNvbikgXHMqICwgXHMqICkqPycuCnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkbWFpbk5vZGUpKS4nXHMqOlxzKikoP1A8Y29udGVudD4oPyZvYmplY3QpKSg/UDxlbmQ+LiopfXN4JzsKdHJ5IHsKaWYgKCFQcmVnOjppc01hdGNoKCRub2RlUmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoKSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IFBSRUdfQkFDS1RSQUNLX0xJTUlUX0VSUk9SKSB7CnJldHVybiBmYWxzZTsKfQp0aHJvdyAkZTsKfQoKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ3N0YXJ0J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ2NvbnRlbnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnZW5kJ10pKTsKCiRjaGlsZHJlbiA9ICRtYXRjaFsnY29udGVudCddOwoKCmlmICghQGpzb25fZGVjb2RlKCRjaGlsZHJlbiwgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9Cgokc3ViTmFtZSA9IG51bGw7CmlmIChpbl9hcnJheSgkbWFpbk5vZGUsIFsnY29uZmlnJywgJ2V4dHJhJywgJ3NjcmlwdHMnXSkgJiYgZmFsc2UgIT09IHN0cnBvcygkbmFtZSwgJy4nKSkgewpbJG5hbWUsICRzdWJOYW1lXSA9IGV4cGxvZGUoJy4nLCAkbmFtZSwgMik7Cn0KCgppZiAoIWlzc2V0KCRkZWNvZGVkWyRtYWluTm9kZV1bJG5hbWVdKSB8fCAoJHN1Yk5hbWUgJiYgIWlzc2V0KCRkZWNvZGVkWyRtYWluTm9kZV1bJG5hbWVdWyRzdWJOYW1lXSkpKSB7CnJldHVybiB0cnVlOwp9CgoKJGtleVJlZ2V4ID0gc3RyX3JlcGxhY2UoJy8nLCAnXFxcXD8vJywgcHJlZ19xdW90ZSgkbmFtZSkpOwppZiAoUHJlZzo6aXNNYXRjaCgneyInLiRrZXlSZWdleC4nIlxzKjp9aScsICRjaGlsZHJlbikpIHsKCmlmIChQcmVnOjppc01hdGNoQWxsKCd7Jy5zZWxmOjpERUZJTkVTLiciJy4ka2V5UmVnZXguJyJccyo6XHMqKD86KD8manNvbikpfXgnLCAkY2hpbGRyZW4sICRtYXRjaGVzKSkgewokYmVzdE1hdGNoID0gJyc7CmZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRtYXRjaCkgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaCkpOwppZiAoc3RybGVuKCRiZXN0TWF0Y2gpIDwgc3RybGVuKCRtYXRjaCkpIHsKJGJlc3RNYXRjaCA9ICRtYXRjaDsKfQp9CiRjaGlsZHJlbkNsZWFuID0gUHJlZzo6cmVwbGFjZSgneyxccyonLnByZWdfcXVvdGUoJGJlc3RNYXRjaCkuJ31pJywgJycsICRjaGlsZHJlbiwgLTEsICRjb3VudCk7CmlmICgxICE9PSAkY291bnQpIHsKJGNoaWxkcmVuQ2xlYW4gPSBQcmVnOjpyZXBsYWNlKCd7Jy5wcmVnX3F1b3RlKCRiZXN0TWF0Y2gpLidccyosP1xzKn1pJywgJycsICRjaGlsZHJlbkNsZWFuLCAtMSwgJGNvdW50KTsKaWYgKDEgIT09ICRjb3VudCkgewpyZXR1cm4gZmFsc2U7Cn0KfQp9Cn0gZWxzZSB7CiRjaGlsZHJlbkNsZWFuID0gJGNoaWxkcmVuOwp9CgppZiAoIWlzc2V0KCRjaGlsZHJlbkNsZWFuKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSnNvbk1hbmlwdWxhdG9yOiBcJGNoaWxkcmVuQ2xlYW4gaXMgbm90IGRlZmluZWQuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIik7Cn0KCgp1bnNldCgkbWF0Y2gpOwpQcmVnOjptYXRjaCgnI157IFxzKj8gKD9QPGNvbnRlbnQ+XFMrLio/KT8gKD9QPHRyYWlsaW5nc3BhY2U+XHMqKSB9JCNzeCcsICRjaGlsZHJlbkNsZWFuLCAkbWF0Y2gpOwppZiAoZW1wdHkoJG1hdGNoWydjb250ZW50J10pKSB7CiRuZXdsaW5lID0gJHRoaXMtPm5ld2xpbmU7CiRpbmRlbnQgPSAkdGhpcy0+aW5kZW50OwoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpIHVzZSAoJGluZGVudCwgJG5ld2xpbmUpOiBzdHJpbmcgewpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAneycgLiAkbmV3bGluZSAuICRpbmRlbnQgLiAnfScgLiAkbWF0Y2hlc1snZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiRjdXJWYWwgPSBqc29uX2RlY29kZSgkY2hpbGRyZW4sIHRydWUpOwp1bnNldCgkY3VyVmFsWyRuYW1lXVskc3ViTmFtZV0pOwokdGhpcy0+YWRkU3ViTm9kZSgkbWFpbk5vZGUsICRuYW1lLCAkY3VyVmFsWyRuYW1lXSk7Cn0KCnJldHVybiB0cnVlOwp9CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCRuYW1lLCAkc3ViTmFtZSwgJGNoaWxkcmVuQ2xlYW4pOiBzdHJpbmcgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydjb250ZW50J10pKTsKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiRjdXJWYWwgPSBqc29uX2RlY29kZSgkbWF0Y2hlc1snY29udGVudCddLCB0cnVlKTsKdW5zZXQoJGN1clZhbFskbmFtZV1bJHN1Yk5hbWVdKTsKJGNoaWxkcmVuQ2xlYW4gPSAkdGhpcy0+Zm9ybWF0KCRjdXJWYWwpOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkY2hpbGRyZW5DbGVhbiAuICRtYXRjaGVzWydlbmQnXTsKfSwgJHRoaXMtPmNvbnRlbnRzKTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTWFpbktleShzdHJpbmcgJGtleSwgJGNvbnRlbnQpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CiRjb250ZW50ID0gJHRoaXMtPmZvcm1hdCgkY29udGVudCk7CgoKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPyknLgonKD9QPGtleT4nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgka2V5KSkuJ1xzKjpccyooPyZqc29uKSkoP1A8ZW5kPi4qKX1zeCc7CmlmIChpc3NldCgkZGVjb2RlZFska2V5XSkgJiYgUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CgppZiAoIUBqc29uX2RlY29kZSgneycuJG1hdGNoZXNbJ2tleSddLid9JykpIHsKcmV0dXJuIGZhbHNlOwp9CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuIEpzb25GaWxlOjplbmNvZGUoJGtleSkuJzogJy4kY29udGVudCAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJyNbXntcc10oXHMqKVx9JCMnLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCkpIHsKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZSgKJyMnLiRtYXRjaFsxXS4nXH0kIycsCmFkZGNzbGFzaGVzKCcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJGtleSkuICc6ICcuICRjb250ZW50IC4gJHRoaXMtPm5ld2xpbmUgLiAnfScsICdcXCQnKSwKJHRoaXMtPmNvbnRlbnRzCik7CgpyZXR1cm4gdHJ1ZTsKfQoKCiR0aGlzLT5jb250ZW50cyA9IFByZWc6OnJlcGxhY2UoCicjXH0kIycsCmFkZGNzbGFzaGVzKCR0aGlzLT5pbmRlbnQgLiBKc29uRmlsZTo6ZW5jb2RlKCRrZXkpLiAnOiAnLiRjb250ZW50IC4gJHRoaXMtPm5ld2xpbmUgLiAnfScsICdcXCQnKSwKJHRoaXMtPmNvbnRlbnRzCik7CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZU1haW5LZXkoc3RyaW5nICRrZXkpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgppZiAoIWFycmF5X2tleV9leGlzdHMoJGtleSwgJGRlY29kZWQpKSB7CnJldHVybiB0cnVlOwp9CgoKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPyknLgonKD9QPHJlbW92YWw+Jy5wcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJGtleSkpLidccyo6XHMqKD8manNvbikpXHMqLD9ccyooP1A8ZW5kPi4qKX1zeCc7CmlmIChQcmVnOjppc01hdGNoKCRyZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydyZW1vdmFsJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCgppZiAoIUBqc29uX2RlY29kZSgneycuJG1hdGNoZXNbJ3JlbW92YWwnXS4nfScpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjLFxzKiQjJywgJG1hdGNoZXNbJ3N0YXJ0J10pICYmIFByZWc6OmlzTWF0Y2goJyNeXH0kIycsICRtYXRjaGVzWydlbmQnXSkpIHsKJG1hdGNoZXNbJ3N0YXJ0J10gPSBydHJpbShQcmVnOjpyZXBsYWNlKCcjLChccyopJCMnLCAnJDEnLCAkbWF0Y2hlc1snc3RhcnQnXSksICR0aGlzLT5pbmRlbnQpOwp9CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuICRtYXRjaGVzWydlbmQnXTsKaWYgKFByZWc6OmlzTWF0Y2goJyNeXHtccypcfVxzKiQjJywgJHRoaXMtPmNvbnRlbnRzKSkgewokdGhpcy0+Y29udGVudHMgPSAie1xufSI7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVNYWluS2V5SWZFbXB0eShzdHJpbmcgJGtleSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCmlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVjb2RlZCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19hcnJheSgkZGVjb2RlZFska2V5XSkgJiYgY291bnQoJGRlY29kZWRbJGtleV0pID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlTWFpbktleSgka2V5KTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoJGRhdGEsIGludCAkZGVwdGggPSAwKTogc3RyaW5nCnsKaWYgKGlzX2FycmF5KCRkYXRhKSkgewpyZXNldCgkZGF0YSk7CgppZiAoaXNfbnVtZXJpYyhrZXkoJGRhdGEpKSkgewpmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWwpIHsKJGRhdGFbJGtleV0gPSAkdGhpcy0+Zm9ybWF0KCR2YWwsICRkZXB0aCArIDEpOwp9CgpyZXR1cm4gJ1snLmltcGxvZGUoJywgJywgJGRhdGEpLiddJzsKfQoKJG91dCA9ICd7JyAuICR0aGlzLT5uZXdsaW5lOwokZWxlbXMgPSBbXTsKZm9yZWFjaCAoJGRhdGEgYXMgJGtleSA9PiAkdmFsKSB7CiRlbGVtc1tdID0gc3RyX3JlcGVhdCgkdGhpcy0+aW5kZW50LCAkZGVwdGggKyAyKSAuIEpzb25GaWxlOjplbmNvZGUoJGtleSkuICc6ICcuJHRoaXMtPmZvcm1hdCgkdmFsLCAkZGVwdGggKyAxKTsKfQoKcmV0dXJuICRvdXQgLiBpbXBsb2RlKCcsJy4kdGhpcy0+bmV3bGluZSwgJGVsZW1zKSAuICR0aGlzLT5uZXdsaW5lIC4gc3RyX3JlcGVhdCgkdGhpcy0+aW5kZW50LCAkZGVwdGggKyAxKSAuICd9JzsKfQoKcmV0dXJuIEpzb25GaWxlOjplbmNvZGUoJGRhdGEpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50aW5nKCk6IHZvaWQKewokdGhpcy0+aW5kZW50ID0gSnNvbkZpbGU6OmRldGVjdEluZGVudGluZygkdGhpcy0+Y29udGVudHMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEpzb247Cgp1c2UgRXhjZXB0aW9uOwoKCgoKY2xhc3MgSnNvblZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KewoKCgpwcm90ZWN0ZWQgJGVycm9yczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIGFycmF5ICRlcnJvcnMgPSBbXSwgP0V4Y2VwdGlvbiAkcHJldmlvdXMgPSBudWxsKQp7CiR0aGlzLT5lcnJvcnMgPSAkZXJyb3JzOwpwYXJlbnQ6Ol9fY29uc3RydWN0KChzdHJpbmcpICRtZXNzYWdlLCAwLCAkcHJldmlvdXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxNZXRob2RDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXFBhcmFtZXRlcnNBY2NlcHRvclNlbGVjdG9yOwp1c2UgUEhQU3RhblxUeXBlXEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxCb29sZWFuVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEJvb2xlYW5UeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50U3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxJbnRlZ2VyUmFuZ2VUeXBlOwp1c2UgUEhQU3RhblxUeXBlXEludGVnZXJUeXBlOwp1c2UgUEhQU3RhblxUeXBlXE1peGVkVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZVV0aWxzOwp1c2UgUEhQU3RhblxUeXBlXFVuaW9uVHlwZTsKCmZpbmFsIGNsYXNzIENvbmZpZ1JldHVyblR5cGVFeHRlbnNpb24gaW1wbGVtZW50cyBEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbgp7Cgpwcml2YXRlICRwcm9wZXJ0aWVzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiRzY2hlbWEgPSBKc29uRmlsZTo6cGFyc2VKc29uKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKEpzb25GaWxlOjpDT01QT1NFUl9TQ0hFTUFfUEFUSCkpOwoKCgpmb3JlYWNoICgkc2NoZW1hWydwcm9wZXJ0aWVzJ11bJ2NvbmZpZyddWydwcm9wZXJ0aWVzJ10gYXMgJHByb3AgPT4gJGNvbmYpIHsKJHR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRjb25mLCAkcHJvcCk7CgokdGhpcy0+cHJvcGVydGllc1skcHJvcF0gPSAkdHlwZTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3MoKTogc3RyaW5nCnsKcmV0dXJuIENvbmZpZzo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc01ldGhvZFN1cHBvcnRlZChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uKTogYm9vbAp7CnJldHVybiBzdHJ0b2xvd2VyKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCkpID09PSAnZ2V0JzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGVGcm9tTWV0aG9kQ2FsbChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBNZXRob2RDYWxsICRtZXRob2RDYWxsLCBTY29wZSAkc2NvcGUpOiBUeXBlCnsKJGFyZ3MgPSAkbWV0aG9kQ2FsbC0+Z2V0QXJncygpOwoKJGRlZmF1bHRSZXR1cm4gPSBQYXJhbWV0ZXJzQWNjZXB0b3JTZWxlY3Rvcjo6c2VsZWN0U2luZ2xlKCRtZXRob2RSZWZsZWN0aW9uLT5nZXRWYXJpYW50cygpKS0+Z2V0UmV0dXJuVHlwZSgpOwoKaWYgKGNvdW50KCRhcmdzKSA8IDEpIHsKcmV0dXJuICRkZWZhdWx0UmV0dXJuOwp9Cgoka2V5VHlwZSA9ICRzY29wZS0+Z2V0VHlwZSgkYXJnc1swXS0+dmFsdWUpOwppZiAobWV0aG9kX2V4aXN0cygka2V5VHlwZSwgJ2dldENvbnN0YW50U3RyaW5ncycpKSB7IAokc3RyaW5ncyA9ICRrZXlUeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKTsKfSBlbHNlIHsKCiRzdHJpbmdzID0gVHlwZVV0aWxzOjpnZXRDb25zdGFudFN0cmluZ3MoJGtleVR5cGUpOyAKfQppZiAoJHN0cmluZ3MgIT09IFtdKSB7CiR0eXBlcyA9IFtdOwpmb3JlYWNoKCRzdHJpbmdzIGFzICRzdHJpbmcpIHsKaWYgKCFpc3NldCgkdGhpcy0+cHJvcGVydGllc1skc3RyaW5nLT5nZXRWYWx1ZSgpXSkpIHsKcmV0dXJuICRkZWZhdWx0UmV0dXJuOwp9CiR0eXBlc1tdID0gJHRoaXMtPnByb3BlcnRpZXNbJHN0cmluZy0+Z2V0VmFsdWUoKV07Cn0KCnJldHVybiBUeXBlQ29tYmluYXRvcjo6dW5pb24oLi4uJHR5cGVzKTsKfQoKcmV0dXJuICRkZWZhdWx0UmV0dXJuOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlVHlwZShhcnJheSAkZGVmLCBzdHJpbmcgJHBhdGgpOiBUeXBlCnsKaWYgKGlzc2V0KCRkZWZbJ3R5cGUnXSkpIHsKJHR5cGVzID0gW107CmZvcmVhY2ggKChhcnJheSkgJGRlZlsndHlwZSddIGFzICR0eXBlKSB7CnN3aXRjaCAoJHR5cGUpIHsKY2FzZSAnaW50ZWdlcic6CmlmIChpbl9hcnJheSgkcGF0aCwgWydwcm9jZXNzLXRpbWVvdXQnLCAnY2FjaGUtdHRsJywgJ2NhY2hlLWZpbGVzLXR0bCcsICdjYWNoZS1maWxlcy1tYXhzaXplJ10sIHRydWUpKSB7CiR0eXBlc1tdID0gSW50ZWdlclJhbmdlVHlwZTo6Y3JlYXRlQWxsR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7Cn0gZWxzZSB7CiR0eXBlc1tdID0gbmV3IEludGVnZXJUeXBlKCk7Cn0KYnJlYWs7CgpjYXNlICdzdHJpbmcnOgppZiAoJHBhdGggPT09ICdjYWNoZS1maWxlcy1tYXhzaXplJykgewoKfSBlbHNlaWYgKCRwYXRoID09PSAnZGlzY2FyZC1jaGFuZ2VzJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3N0YXNoJyk7Cn0gZWxzZWlmICgkcGF0aCA9PT0gJ3VzZS1wYXJlbnQtZGlyJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3Byb21wdCcpOwp9IGVsc2VpZiAoJHBhdGggPT09ICdzdG9yZS1hdXRocycpIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwcm9tcHQnKTsKfSBlbHNlaWYgKCRwYXRoID09PSAncGxhdGZvcm0tY2hlY2snKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgncGhwLW9ubHknKTsKfSBlbHNlaWYgKCRwYXRoID09PSAnZ2l0aHViLXByb3RvY29scycpIHsKJHR5cGVzW10gPSBuZXcgVW5pb25UeXBlKFtuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdnaXQnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnaHR0cHMnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnc3NoJyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2h0dHAnKV0pOwp9IGVsc2VpZiAoc3RyX3N0YXJ0c193aXRoKCRwYXRoLCAncHJlZmVycmVkLWluc3RhbGwnKSkgewokdHlwZXNbXSA9IG5ldyBVbmlvblR5cGUoW25ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3NvdXJjZScpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdkaXN0JyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2F1dG8nKV0pOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBTdHJpbmdUeXBlKCk7Cn0KYnJlYWs7CgpjYXNlICdib29sZWFuJzoKaWYgKCRwYXRoID09PSAncGxhdGZvcm0uYWRkaXRpb25hbFByb3BlcnRpZXMnKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50Qm9vbGVhblR5cGUoZmFsc2UpOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBCb29sZWFuVHlwZSgpOwp9CmJyZWFrOwoKY2FzZSAnb2JqZWN0JzoKJGFkZGxQcm9wVHlwZSA9IG51bGw7CmlmIChpc3NldCgkZGVmWydhZGRpdGlvbmFsUHJvcGVydGllcyddKSkgewokYWRkbFByb3BUeXBlID0gJHRoaXMtPnBhcnNlVHlwZSgkZGVmWydhZGRpdGlvbmFsUHJvcGVydGllcyddLCAkcGF0aC4nLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJyk7Cn0KCmlmIChpc3NldCgkZGVmWydwcm9wZXJ0aWVzJ10pKSB7CiRrZXlOYW1lcyA9IFtdOwokdmFsVHlwZXMgPSBbXTsKJG9wdGlvbmFsS2V5cyA9IFtdOwokcHJvcEluZGV4ID0gMDsKZm9yZWFjaCAoJGRlZlsncHJvcGVydGllcyddIGFzICRwcm9wTmFtZSA9PiAkcHJvcGRlZikgewoka2V5TmFtZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJHByb3BOYW1lKTsKJHZhbFR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRwcm9wZGVmLCAkcGF0aC4nLicuJHByb3BOYW1lKTsKaWYgKCFpc3NldCgkZGVmWydyZXF1aXJlZCddKSB8fCAhaW5fYXJyYXkoJHByb3BOYW1lLCAkZGVmWydyZXF1aXJlZCddLCB0cnVlKSkgewokdmFsVHlwZSA9IFR5cGVDb21iaW5hdG9yOjphZGROdWxsKCR2YWxUeXBlKTsKJG9wdGlvbmFsS2V5c1tdID0gJHByb3BJbmRleDsKfQokdmFsVHlwZXNbXSA9ICR2YWxUeXBlOwokcHJvcEluZGV4Kys7Cn0KCmlmICgkYWRkbFByb3BUeXBlICE9PSBudWxsKSB7CiR0eXBlc1tdID0gbmV3IEFycmF5VHlwZShUeXBlQ29tYmluYXRvcjo6dW5pb24obmV3IFN0cmluZ1R5cGUoKSwgLi4uJGtleU5hbWVzKSwgVHlwZUNvbWJpbmF0b3I6OnVuaW9uKCRhZGRsUHJvcFR5cGUsIC4uLiR2YWxUeXBlcykpOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudEFycmF5VHlwZSgka2V5TmFtZXMsICR2YWxUeXBlcywgWzBdLCAkb3B0aW9uYWxLZXlzKTsKfQp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBBcnJheVR5cGUobmV3IFN0cmluZ1R5cGUoKSwgJGFkZGxQcm9wVHlwZSA/PyBuZXcgTWl4ZWRUeXBlKCkpOwp9CmJyZWFrOwoKY2FzZSAnYXJyYXknOgppZiAoaXNzZXQoJGRlZlsnaXRlbXMnXSkpIHsKJHZhbFR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRkZWZbJ2l0ZW1zJ10sICRwYXRoLicuaXRlbXMnKTsKfSBlbHNlIHsKJHZhbFR5cGUgPSBuZXcgTWl4ZWRUeXBlKCk7Cn0KCiR0eXBlc1tdID0gbmV3IEFycmF5VHlwZShuZXcgSW50ZWdlclR5cGUoKSwgJHZhbFR5cGUpOwpicmVhazsKCmRlZmF1bHQ6CiR0eXBlc1tdID0gbmV3IE1peGVkVHlwZSgpOwp9Cn0KCiR0eXBlID0gVHlwZUNvbWJpbmF0b3I6OnVuaW9uKC4uLiR0eXBlcyk7Cn0gZWxzZWlmIChpc3NldCgkZGVmWydlbnVtJ10pKSB7CiR0eXBlID0gVHlwZUNvbWJpbmF0b3I6OnVuaW9uKC4uLmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkdmFsdWUpOiBDb25zdGFudFN0cmluZ1R5cGUgewpyZXR1cm4gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgkdmFsdWUpOwp9LCAkZGVmWydlbnVtJ10pKTsKfSBlbHNlIHsKJHR5cGUgPSBuZXcgTWl4ZWRUeXBlKCk7Cn0KCgppZiAoJHBhdGggPT09ICdhbGxvdy1wbHVnaW5zJyAmJiB0aW1lKCkgPCBzdHJ0b3RpbWUoJzIwMjItMDctMDEnKSkgewokdHlwZSA9IFR5cGVDb21iaW5hdG9yOjphZGROdWxsKCR0eXBlKTsKfQoKCmlmIChpbl9hcnJheSgkcGF0aCwgWydhdXRvbG9hZGVyLXN1ZmZpeCcsICdnaXRsYWItcHJvdG9jb2wnXSwgdHJ1ZSkpIHsKJHR5cGUgPSBUeXBlQ29tYmluYXRvcjo6YWRkTnVsbCgkdHlwZSk7Cn0KCnJldHVybiAkdHlwZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSdWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXE1ldGhvZENhbGw7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXE1ldGhvZFJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFR5cGVcQWNjZXNzb3J5XEFjY2Vzc29yeU5vbkVtcHR5U3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudFN0cmluZ1R5cGU7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRJbnRlZ2VyVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxJbnRlZ2VyVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcT2JqZWN0VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBocFBhcnNlclxOb2RlXElkZW50aWZpZXI7CgpmaW5hbCBjbGFzcyBSdWxlUmVhc29uRGF0YVJldHVyblR5cGVFeHRlbnNpb24gaW1wbGVtZW50cyBEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbgp7CnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzcygpOiBzdHJpbmcKewpyZXR1cm4gUnVsZTo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc01ldGhvZFN1cHBvcnRlZChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uKTogYm9vbAp7CnJldHVybiBzdHJ0b2xvd2VyKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCkpID09PSAnZ2V0cmVhc29uZGF0YSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlRnJvbU1ldGhvZENhbGwoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgTWV0aG9kQ2FsbCAkbWV0aG9kQ2FsbCwgU2NvcGUgJHNjb3BlKTogVHlwZQp7CiRyZWFzb25UeXBlID0gJHNjb3BlLT5nZXRUeXBlKG5ldyBNZXRob2RDYWxsKCRtZXRob2RDYWxsLT52YXIsIG5ldyBJZGVudGlmaWVyKCdnZXRSZWFzb24nKSkpOwoKJHR5cGVzID0gWwpSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSA9PiBuZXcgQ29uc3RhbnRBcnJheVR5cGUoW25ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3BhY2thZ2VOYW1lJyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2NvbnN0cmFpbnQnKV0sIFtuZXcgU3RyaW5nVHlwZSwgbmV3IE9iamVjdFR5cGUoQ29uc3RyYWludEludGVyZmFjZTo6Y2xhc3MpXSksClJ1bGU6OlJVTEVfRklYRUQgPT4gbmV3IENvbnN0YW50QXJyYXlUeXBlKFtuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwYWNrYWdlJyldLCBbbmV3IE9iamVjdFR5cGUoQmFzZVBhY2thZ2U6OmNsYXNzKV0pLApSdWxlOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1QgPT4gbmV3IE9iamVjdFR5cGUoTGluazo6Y2xhc3MpLApSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVMgPT4gbmV3IE9iamVjdFR5cGUoTGluazo6Y2xhc3MpLApSdWxlOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FID0+IFR5cGVDb21iaW5hdG9yOjppbnRlcnNlY3QobmV3IFN0cmluZ1R5cGUsIG5ldyBBY2Nlc3NvcnlOb25FbXB0eVN0cmluZ1R5cGUoKSksClJ1bGU6OlJVTEVfTEVBUk5FRCA9PiBuZXcgSW50ZWdlclR5cGUoKSwKUnVsZTo6UlVMRV9QQUNLQUdFX0FMSUFTID0+IG5ldyBPYmplY3RUeXBlKEJhc2VQYWNrYWdlOjpjbGFzcyksClJ1bGU6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTID0+IG5ldyBPYmplY3RUeXBlKEJhc2VQYWNrYWdlOjpjbGFzcyksCl07Cgpmb3JlYWNoICgkdHlwZXMgYXMgJGNvbnN0ID0+ICR0eXBlKSB7CmlmICgobmV3IENvbnN0YW50SW50ZWdlclR5cGUoJGNvbnN0KSktPmlzU3VwZXJUeXBlT2YoJHJlYXNvblR5cGUpLT55ZXMoKSkgewpyZXR1cm4gJHR5cGU7Cn0KfQoKcmV0dXJuIFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi4kdHlwZXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwoKCgoKY2xhc3MgQWxpYXNQYWNrYWdlIGV4dGVuZHMgQmFzZVBhY2thZ2UKewoKcHJvdGVjdGVkICR2ZXJzaW9uOwoKcHJvdGVjdGVkICRwcmV0dHlWZXJzaW9uOwoKcHJvdGVjdGVkICRkZXY7Cgpwcm90ZWN0ZWQgJHJvb3RQYWNrYWdlQWxpYXMgPSBmYWxzZTsKCgoKCnByb3RlY3RlZCAkc3RhYmlsaXR5OwoKcHJvdGVjdGVkICRoYXNTZWxmVmVyc2lvblJlcXVpcmVzID0gZmFsc2U7CgoKcHJvdGVjdGVkICRhbGlhc09mOwoKcHJvdGVjdGVkICRyZXF1aXJlczsKCnByb3RlY3RlZCAkZGV2UmVxdWlyZXM7Cgpwcm90ZWN0ZWQgJGNvbmZsaWN0czsKCnByb3RlY3RlZCAkcHJvdmlkZXM7Cgpwcm90ZWN0ZWQgJHJlcGxhY2VzOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChCYXNlUGFja2FnZSAkYWxpYXNPZiwgc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkYWxpYXNPZi0+Z2V0TmFtZSgpKTsKCiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT5wcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CiR0aGlzLT5hbGlhc09mID0gJGFsaWFzT2Y7CiR0aGlzLT5zdGFiaWxpdHkgPSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbik7CiR0aGlzLT5kZXYgPSAkdGhpcy0+c3RhYmlsaXR5ID09PSAnZGV2JzsKCmZvcmVhY2ggKExpbms6OiRUWVBFUyBhcyAkdHlwZSkgewokbGlua3MgPSAkYWxpYXNPZi0+eydnZXQnIC4gdWNmaXJzdCgkdHlwZSl9KCk7CiR0aGlzLT57JHR5cGV9ID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkbGlua3MsICR0eXBlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNPZigpCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHkoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdGFiaWxpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJldHR5VmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGV2KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXF1aXJlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25mbGljdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmNvbmZsaWN0czsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHJvdmlkZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcGxhY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRldlJlcXVpcmVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSb290UGFja2FnZUFsaWFzKGJvb2wgJHZhbHVlKTogdm9pZAp7CiR0aGlzLT5yb290UGFja2FnZUFsaWFzID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNSb290UGFja2FnZUFsaWFzKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnJvb3RQYWNrYWdlQWxpYXM7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoYXJyYXkgJGxpbmtzLCAkbGlua1R5cGUpOiBhcnJheQp7CgokcHJldHR5VmVyc2lvbiA9ICR0aGlzLT5wcmV0dHlWZXJzaW9uOwppZiAoJHByZXR0eVZlcnNpb24gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwcmV0dHlWZXJzaW9uID0gJHRoaXMtPmFsaWFzT2YtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKaWYgKFxpbl9hcnJheSgkbGlua1R5cGUsIFtMaW5rOjpUWVBFX0NPTkZMSUNULCBMaW5rOjpUWVBFX1BST1ZJREUsIExpbms6OlRZUEVfUkVQTEFDRV0sIHRydWUpKSB7CiRuZXdMaW5rcyA9IFtdOwpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKCmlmICgnc2VsZi52ZXJzaW9uJyA9PT0gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSkgewokbmV3TGlua3NbXSA9IG5ldyBMaW5rKCRsaW5rLT5nZXRTb3VyY2UoKSwgJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJHRoaXMtPnZlcnNpb24pLCAkbGlua1R5cGUsICRwcmV0dHlWZXJzaW9uKTsKJGNvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcHJldHR5VmVyc2lvbik7Cn0KfQokbGlua3MgPSBhcnJheV9tZXJnZSgkbGlua3MsICRuZXdMaW5rcyk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRsaW5rcyBhcyAkaW5kZXggPT4gJGxpbmspIHsKaWYgKCdzZWxmLnZlcnNpb24nID09PSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKSB7CmlmICgkbGlua1R5cGUgPT09IExpbms6OlRZUEVfUkVRVUlSRSkgewokdGhpcy0+aGFzU2VsZlZlcnNpb25SZXF1aXJlcyA9IHRydWU7Cn0KJGxpbmtzWyRpbmRleF0gPSBuZXcgTGluaygkbGluay0+Z2V0U291cmNlKCksICRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICR0aGlzLT52ZXJzaW9uKSwgJGxpbmtUeXBlLCAkcHJldHR5VmVyc2lvbik7CiRjb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJHByZXR0eVZlcnNpb24pOwp9Cn0KfQoKcmV0dXJuICRsaW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlbGZWZXJzaW9uUmVxdWlyZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aGFzU2VsZlZlcnNpb25SZXF1aXJlczsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuIHBhcmVudDo6X190b1N0cmluZygpLicgKCcuKCR0aGlzLT5yb290UGFja2FnZUFsaWFzID8gJ3Jvb3QgJyA6ICcnKS4gJ2FsaWFzIG9mICcuJHRoaXMtPmFsaWFzT2YtPmdldFZlcnNpb24oKS4nKSc7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFR5cGUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldERpcigpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRUYXJnZXREaXIoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4dHJhKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRFeHRyYSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5zdGFsbGF0aW9uU291cmNlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEluc3RhbGxhdGlvblNvdXJjZSgkdHlwZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZVR5cGUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VVcmwoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZVVybHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVJlZmVyZW5jZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZVJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFNvdXJjZVJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTb3VyY2VNaXJyb3JzKCRtaXJyb3JzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VNaXJyb3JzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VHlwZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0VHlwZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0VXJsKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFVybHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RSZWZlcmVuY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFJlZmVyZW5jZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERpc3RSZWZlcmVuY2UoJHJlZmVyZW5jZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0U2hhMUNoZWNrc3VtKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RTaGExQ2hlY2tzdW0oKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFRyYW5zcG9ydE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFRyYW5zcG9ydE9wdGlvbnMoJG9wdGlvbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdE1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREaXN0TWlycm9ycygkbWlycm9ycyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0TWlycm9ycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RNaXJyb3JzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXV0b2xvYWQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERldkF1dG9sb2FkKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREZXZBdXRvbG9hZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZVBhdGhzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRJbmNsdWRlUGF0aHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGVhc2VEYXRlKCk6ID9cRGF0ZVRpbWVJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFJlbGVhc2VEYXRlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QmluYXJpZXMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN1Z2dlc3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTdWdnZXN0cygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldE5vdGlmaWNhdGlvblVybCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZWZhdWx0QnJhbmNoKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmlzRGVmYXVsdEJyYW5jaCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFVybCg/c3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERpc3RVcmwoJHVybCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VHlwZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREaXN0VHlwZSgkdHlwZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VEaXN0UmVmZXJlbmNlcyhzdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U291cmNlRGlzdFJlZmVyZW5jZXMoJHJlZmVyZW5jZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBGaWx0ZXJJdGVyYXRvcjsKdXNlIEl0ZXJhdG9yOwp1c2UgUGhhckRhdGE7CnVzZSBTcGxGaWxlSW5mbzsKCgoKCmNsYXNzIEFyY2hpdmFibGVGaWxlc0ZpbHRlciBleHRlbmRzIEZpbHRlckl0ZXJhdG9yCnsKCnByaXZhdGUgJGRpcnMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKTogYm9vbAp7CiRmaWxlID0gJHRoaXMtPmdldElubmVySXRlcmF0b3IoKS0+Y3VycmVudCgpOwppZiAoJGZpbGUtPmlzRGlyKCkpIHsKJHRoaXMtPmRpcnNbXSA9IChzdHJpbmcpICRmaWxlOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZEVtcHR5RGlyKFBoYXJEYXRhICRwaGFyLCBzdHJpbmcgJHNvdXJjZXMpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPmRpcnMgYXMgJGZpbGVwYXRoKSB7CiRsb2NhbG5hbWUgPSBzdHJfcmVwbGFjZSgkc291cmNlcyAuICIvIiwgJycsICRmaWxlcGF0aCk7CiRwaGFyLT5hZGRFbXB0eURpcigkbG9jYWxuYW1lKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgRmlsZXN5c3RlbUl0ZXJhdG9yOwp1c2UgRmlsdGVySXRlcmF0b3I7CnVzZSBJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcU3BsRmlsZUluZm87CgoKCgoKCgoKCgpjbGFzcyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIgZXh0ZW5kcyBGaWx0ZXJJdGVyYXRvcgp7CgoKCnByb3RlY3RlZCAkZmluZGVyOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNvdXJjZXMsIGFycmF5ICRleGNsdWRlcywgYm9vbCAkaWdub3JlRmlsdGVycyA9IGZhbHNlKQp7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7Cgokc291cmNlcyA9ICRmcy0+bm9ybWFsaXplUGF0aChyZWFscGF0aCgkc291cmNlcykpOwoKaWYgKCRpZ25vcmVGaWx0ZXJzKSB7CiRmaWx0ZXJzID0gW107Cn0gZWxzZSB7CiRmaWx0ZXJzID0gWwpuZXcgR2l0RXhjbHVkZUZpbHRlcigkc291cmNlcyksCm5ldyBDb21wb3NlckV4Y2x1ZGVGaWx0ZXIoJHNvdXJjZXMsICRleGNsdWRlcyksCl07Cn0KCiR0aGlzLT5maW5kZXIgPSBuZXcgRmluZGVyKCk7CgokZmlsdGVyID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGZpbGUpIHVzZSAoJHNvdXJjZXMsICRmaWx0ZXJzLCAkZnMpOiBib29sIHsKaWYgKCRmaWxlLT5pc0xpbmsoKSAmJiAoJGZpbGUtPmdldFJlYWxQYXRoKCkgPT09IGZhbHNlIHx8IHN0cnBvcygkZmlsZS0+Z2V0UmVhbFBhdGgoKSwgJHNvdXJjZXMpICE9PSAwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRyZWxhdGl2ZVBhdGggPSBQcmVnOjpyZXBsYWNlKAonI14nLnByZWdfcXVvdGUoJHNvdXJjZXMsICcjJykuJyMnLAonJywKJGZzLT5ub3JtYWxpemVQYXRoKCRmaWxlLT5nZXRSZWFsUGF0aCgpKQopOwoKJGV4Y2x1ZGUgPSBmYWxzZTsKZm9yZWFjaCAoJGZpbHRlcnMgYXMgJGZpbHRlcikgewokZXhjbHVkZSA9ICRmaWx0ZXItPmZpbHRlcigkcmVsYXRpdmVQYXRoLCAkZXhjbHVkZSk7Cn0KCnJldHVybiAhJGV4Y2x1ZGU7Cn07CgppZiAobWV0aG9kX2V4aXN0cygkZmlsdGVyLCAnYmluZFRvJykpIHsKJGZpbHRlciA9ICRmaWx0ZXItPmJpbmRUbyhudWxsKTsKfQoKJHRoaXMtPmZpbmRlcgotPmluKCRzb3VyY2VzKQotPmZpbHRlcigkZmlsdGVyKQotPmlnbm9yZVZDUyh0cnVlKQotPmlnbm9yZURvdEZpbGVzKGZhbHNlKQotPnNvcnRCeU5hbWUoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPmZpbmRlci0+Z2V0SXRlcmF0b3IoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKTogYm9vbAp7CgokY3VycmVudCA9ICR0aGlzLT5nZXRJbm5lckl0ZXJhdG9yKCktPmN1cnJlbnQoKTsKCmlmICghJGN1cnJlbnQtPmlzRGlyKCkpIHsKcmV0dXJuIHRydWU7Cn0KCiRpdGVyYXRvciA9IG5ldyBGaWxlc3lzdGVtSXRlcmF0b3IoKHN0cmluZykgJGN1cnJlbnQsIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKTsKCnJldHVybiAhJGl0ZXJhdG9yLT52YWxpZCgpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcVXRpbFxTeW5jSGVscGVyOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCmNsYXNzIEFyY2hpdmVNYW5hZ2VyCnsKCnByb3RlY3RlZCAkZG93bmxvYWRNYW5hZ2VyOwoKcHJvdGVjdGVkICRsb29wOwoKCgoKcHJvdGVjdGVkICRhcmNoaXZlcnMgPSBbXTsKCgoKCnByb3RlY3RlZCAkb3ZlcndyaXRlRmlsZXMgPSB0cnVlOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KERvd25sb2FkTWFuYWdlciAkZG93bmxvYWRNYW5hZ2VyLCBMb29wICRsb29wKQp7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkZG93bmxvYWRNYW5hZ2VyOwokdGhpcy0+bG9vcCA9ICRsb29wOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkQXJjaGl2ZXIoQXJjaGl2ZXJJbnRlcmZhY2UgJGFyY2hpdmVyKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlcnNbXSA9ICRhcmNoaXZlcjsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPdmVyd3JpdGVGaWxlcyhib29sICRvdmVyd3JpdGVGaWxlcyk6IHNlbGYKewokdGhpcy0+b3ZlcndyaXRlRmlsZXMgPSAkb3ZlcndyaXRlRmlsZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZUZpbGVuYW1lUGFydHMoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewokYmFzZU5hbWUgPSAkcGFja2FnZS0+Z2V0QXJjaGl2ZU5hbWUoKTsKaWYgKG51bGwgPT09ICRiYXNlTmFtZSkgewokYmFzZU5hbWUgPSBQcmVnOjpyZXBsYWNlKCcjW15hLXowLTktX10jaScsICctJywgJHBhY2thZ2UtPmdldE5hbWUoKSk7Cn0KCiRwYXJ0cyA9IFsKJ2Jhc2UnID0+ICRiYXNlTmFtZSwKXTsKCiRkaXN0UmVmZXJlbmNlID0gJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKTsKaWYgKG51bGwgIT09ICRkaXN0UmVmZXJlbmNlICYmIFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkZGlzdFJlZmVyZW5jZSkpIHsKJHBhcnRzWydkaXN0X3JlZmVyZW5jZSddID0gJGRpc3RSZWZlcmVuY2U7CiRwYXJ0c1snZGlzdF90eXBlJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKfSBlbHNlIHsKJHBhcnRzWyd2ZXJzaW9uJ10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokcGFydHNbJ2Rpc3RfcmVmZXJlbmNlJ10gPSAkZGlzdFJlZmVyZW5jZTsKfQoKJHNvdXJjZVJlZmVyZW5jZSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKaWYgKG51bGwgIT09ICRzb3VyY2VSZWZlcmVuY2UpIHsKJHBhcnRzWydzb3VyY2VfcmVmZXJlbmNlJ10gPSBzdWJzdHIoc2hhMSgkc291cmNlUmVmZXJlbmNlKSwgMCwgNik7Cn0KCiRwYXJ0cyA9IGFycmF5X2ZpbHRlcigkcGFydHMpOwpmb3JlYWNoICgkcGFydHMgYXMgJGtleSA9PiAkcGFydCkgewokcGFydHNbJGtleV0gPSBzdHJfcmVwbGFjZSgnLycsICctJywgJHBhcnQpOwp9CgpyZXR1cm4gJHBhcnRzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZUZpbGVuYW1lRnJvbVBhcnRzKGFycmF5ICRwYXJ0cyk6IHN0cmluZwp7CnJldHVybiBpbXBsb2RlKCctJywgJHBhcnRzKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlRmlsZW5hbWUoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRQYWNrYWdlRmlsZW5hbWVGcm9tUGFydHMoJHRoaXMtPmdldFBhY2thZ2VGaWxlbmFtZVBhcnRzKCRwYWNrYWdlKSk7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJjaGl2ZShDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZm9ybWF0LCBzdHJpbmcgJHRhcmdldERpciwgP3N0cmluZyAkZmlsZU5hbWUgPSBudWxsLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewppZiAoZW1wdHkoJGZvcm1hdCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Zvcm1hdCBtdXN0IGJlIHNwZWNpZmllZCcpOwp9CgoKJHVzYWJsZUFyY2hpdmVyID0gbnVsbDsKZm9yZWFjaCAoJHRoaXMtPmFyY2hpdmVycyBhcyAkYXJjaGl2ZXIpIHsKaWYgKCRhcmNoaXZlci0+c3VwcG9ydHMoJGZvcm1hdCwgJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSkpIHsKJHVzYWJsZUFyY2hpdmVyID0gJGFyY2hpdmVyOwpicmVhazsKfQp9CgoKaWYgKG51bGwgPT09ICR1c2FibGVBcmNoaXZlcikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignTm8gYXJjaGl2ZXIgZm91bmQgdG8gc3VwcG9ydCAlcyBmb3JtYXQnLCAkZm9ybWF0KSk7Cn0KCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRzb3VyY2VQYXRoID0gcmVhbHBhdGgoJy4nKTsKfSBlbHNlIHsKCiRzb3VyY2VQYXRoID0gc3lzX2dldF90ZW1wX2RpcigpLicvY29tcG9zZXJfYXJjaGl2ZScudW5pcWlkKCk7CiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHNvdXJjZVBhdGgpOwoKdHJ5IHsKCiRwcm9taXNlID0gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+ZG93bmxvYWQoJHBhY2thZ2UsICRzb3VyY2VQYXRoKTsKU3luY0hlbHBlcjo6YXdhaXQoJHRoaXMtPmxvb3AsICRwcm9taXNlKTsKJHByb21pc2UgPSAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5pbnN0YWxsKCRwYWNrYWdlLCAkc291cmNlUGF0aCk7ClN5bmNIZWxwZXI6OmF3YWl0KCR0aGlzLT5sb29wLCAkcHJvbWlzZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkc291cmNlUGF0aCk7CnRocm93ICRlOwp9CgoKaWYgKGZpbGVfZXhpc3RzKCRjb21wb3Nlckpzb25QYXRoID0gJHNvdXJjZVBhdGguJy9jb21wb3Nlci5qc29uJykpIHsKJGpzb25GaWxlID0gbmV3IEpzb25GaWxlKCRjb21wb3Nlckpzb25QYXRoKTsKJGpzb25EYXRhID0gJGpzb25GaWxlLT5yZWFkKCk7CmlmICghZW1wdHkoJGpzb25EYXRhWydhcmNoaXZlJ11bJ25hbWUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVOYW1lKCRqc29uRGF0YVsnYXJjaGl2ZSddWyduYW1lJ10pOwp9CmlmICghZW1wdHkoJGpzb25EYXRhWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVFeGNsdWRlcygkanNvbkRhdGFbJ2FyY2hpdmUnXVsnZXhjbHVkZSddKTsKfQp9Cn0KCiRzdXBwb3J0ZWRGb3JtYXRzID0gJHRoaXMtPmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKJHBhY2thZ2VOYW1lUGFydHMgPSBudWxsID09PSAkZmlsZU5hbWUgPwokdGhpcy0+Z2V0UGFja2FnZUZpbGVuYW1lUGFydHMoJHBhY2thZ2UpCjogWydiYXNlJyA9PiAkZmlsZU5hbWVdOwoKJHBhY2thZ2VOYW1lID0gJHRoaXMtPmdldFBhY2thZ2VGaWxlbmFtZUZyb21QYXJ0cygkcGFja2FnZU5hbWVQYXJ0cyk7CiRleGNsdWRlUGF0dGVybnMgPSAkdGhpcy0+YnVpbGRFeGNsdWRlUGF0dGVybnMoJHBhY2thZ2VOYW1lUGFydHMsICRzdXBwb3J0ZWRGb3JtYXRzKTsKCgokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0YXJnZXREaXIpOwokdGFyZ2V0ID0gcmVhbHBhdGgoJHRhcmdldERpcikuJy8nLiRwYWNrYWdlTmFtZS4nLicuJGZvcm1hdDsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0YXJnZXQpKTsKCmlmICghJHRoaXMtPm92ZXJ3cml0ZUZpbGVzICYmIGZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CnJldHVybiAkdGFyZ2V0Owp9CgoKJHRlbXBUYXJnZXQgPSBzeXNfZ2V0X3RlbXBfZGlyKCkuJy9jb21wb3Nlcl9hcmNoaXZlJy51bmlxaWQoKS4nLicuJGZvcm1hdDsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0ZW1wVGFyZ2V0KSk7CgokYXJjaGl2ZVBhdGggPSAkdXNhYmxlQXJjaGl2ZXItPmFyY2hpdmUoCiRzb3VyY2VQYXRoLAokdGVtcFRhcmdldCwKJGZvcm1hdCwKYXJyYXlfbWVyZ2UoJGV4Y2x1ZGVQYXR0ZXJucywgJHBhY2thZ2UtPmdldEFyY2hpdmVFeGNsdWRlcygpKSwKJGlnbm9yZUZpbHRlcnMKKTsKJGZpbGVzeXN0ZW0tPnJlbmFtZSgkYXJjaGl2ZVBhdGgsICR0YXJnZXQpOwoKCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRzb3VyY2VQYXRoKTsKfQokZmlsZXN5c3RlbS0+cmVtb3ZlKCR0ZW1wVGFyZ2V0KTsKCnJldHVybiAkdGFyZ2V0Owp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRXhjbHVkZVBhdHRlcm5zKGFycmF5ICRwYXJ0cywgYXJyYXkgJGZvcm1hdHMpOiBhcnJheQp7CiRiYXNlID0gJHBhcnRzWydiYXNlJ107CmlmIChjb3VudCgkcGFydHMpID4gMSkgewokYmFzZSAuPSAnLSonOwp9CgokcGF0dGVybnMgPSBbXTsKZm9yZWFjaCAoJGZvcm1hdHMgYXMgJGZvcm1hdCkgewokcGF0dGVybnNbXSA9ICIkYmFzZS4kZm9ybWF0IjsKfQoKcmV0dXJuICRwYXR0ZXJuczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRGb3JtYXRzKCk6IGFycmF5CnsKCgoKCgokZm9ybWF0cyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YXJjaGl2ZXJzIGFzICRhcmNoaXZlcikgewokaXRlbXMgPSBbXTsKc3dpdGNoIChnZXRfY2xhc3MoJGFyY2hpdmVyKSkgewpjYXNlIFppcEFyY2hpdmVyOjpjbGFzczoKJGl0ZW1zID0gWyd6aXAnXTsKYnJlYWs7CgpjYXNlIFBoYXJBcmNoaXZlcjo6Y2xhc3M6CiRpdGVtcyA9IFsnemlwJywgJ3RhcicsICd0YXIuZ3onLCAndGFyLmJ6MiddOwpicmVhazsKfQoKJGZvcm1hdHMgPSBhcnJheV9tZXJnZSgkZm9ybWF0cywgJGl0ZW1zKTsKfQoKcmV0dXJuIGFycmF5X3VuaXF1ZSgkZm9ybWF0cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCgoKCgoKaW50ZXJmYWNlIEFyY2hpdmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJjaGl2ZShzdHJpbmcgJHNvdXJjZXMsIHN0cmluZyAkdGFyZ2V0LCBzdHJpbmcgJGZvcm1hdCwgYXJyYXkgJGV4Y2x1ZGVzID0gW10sIGJvb2wgJGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IHN0cmluZzsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkZm9ybWF0LCA/c3RyaW5nICRzb3VyY2VUeXBlKTogYm9vbDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7CgoKCgphYnN0cmFjdCBjbGFzcyBCYXNlRXhjbHVkZUZpbHRlcgp7CgoKCnByb3RlY3RlZCAkc291cmNlUGF0aDsKCgoKCnByb3RlY3RlZCAkZXhjbHVkZVBhdHRlcm5zOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc291cmNlUGF0aCkKewokdGhpcy0+c291cmNlUGF0aCA9ICRzb3VyY2VQYXRoOwokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zID0gW107Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsdGVyKHN0cmluZyAkcmVsYXRpdmVQYXRoLCBib29sICRleGNsdWRlKTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT5leGNsdWRlUGF0dGVybnMgYXMgJHBhdHRlcm5EYXRhKSB7ClskcGF0dGVybiwgJG5lZ2F0ZSwgJHN0cmlwTGVhZGluZ1NsYXNoXSA9ICRwYXR0ZXJuRGF0YTsKCmlmICgkc3RyaXBMZWFkaW5nU2xhc2gpIHsKJHBhdGggPSBzdWJzdHIoJHJlbGF0aXZlUGF0aCwgMSk7Cn0gZWxzZSB7CiRwYXRoID0gJHJlbGF0aXZlUGF0aDsKfQoKdHJ5IHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwYXRoKSkgewokZXhjbHVkZSA9ICEkbmVnYXRlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9Cn0KCnJldHVybiAkZXhjbHVkZTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VMaW5lcyhhcnJheSAkbGluZXMsIGNhbGxhYmxlICRsaW5lUGFyc2VyKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfZmlsdGVyKAphcnJheV9tYXAoCnN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpIHVzZSAoJGxpbmVQYXJzZXIpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKCmlmICghJGxpbmUgfHwgMCA9PT0gc3RycG9zKCRsaW5lLCAnIycpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGxpbmVQYXJzZXIoJGxpbmUpOwp9LAokbGluZXMKKSwKc3RhdGljIGZ1bmN0aW9uICgkcGF0dGVybik6IGJvb2wgewpyZXR1cm4gJHBhdHRlcm4gIT09IG51bGw7Cn0KKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVBhdHRlcm5zKGFycmF5ICRydWxlcyk6IGFycmF5CnsKJHBhdHRlcm5zID0gW107CmZvcmVhY2ggKCRydWxlcyBhcyAkcnVsZSkgewokcGF0dGVybnNbXSA9ICR0aGlzLT5nZW5lcmF0ZVBhdHRlcm4oJHJ1bGUpOwp9CgpyZXR1cm4gJHBhdHRlcm5zOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlUGF0dGVybihzdHJpbmcgJHJ1bGUpOiBhcnJheQp7CiRuZWdhdGUgPSBmYWxzZTsKJHBhdHRlcm4gPSAnJzsKCmlmICgkcnVsZSAhPT0gJycgJiYgJHJ1bGVbMF0gPT09ICchJykgewokbmVnYXRlID0gdHJ1ZTsKJHJ1bGUgPSBsdHJpbSgkcnVsZSwgJyEnKTsKfQoKJGZpcnN0U2xhc2hQb3NpdGlvbiA9IHN0cnBvcygkcnVsZSwgJy8nKTsKaWYgKDAgPT09ICRmaXJzdFNsYXNoUG9zaXRpb24pIHsKJHBhdHRlcm4gPSAnXi8nOwp9IGVsc2VpZiAoZmFsc2UgPT09ICRmaXJzdFNsYXNoUG9zaXRpb24gfHwgc3RybGVuKCRydWxlKSAtIDEgPT09ICRmaXJzdFNsYXNoUG9zaXRpb24pIHsKJHBhdHRlcm4gPSAnLyc7Cn0KCiRydWxlID0gdHJpbSgkcnVsZSwgJy8nKTsKCgokcnVsZSA9IHN1YnN0cihGaW5kZXJcR2xvYjo6dG9SZWdleCgkcnVsZSksIDIsIC0yKTsKCnJldHVybiBbJ3snLiRwYXR0ZXJuLiRydWxlLicoPz0kfC8pfScsICRuZWdhdGUsIGZhbHNlXTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKCgoKCgpjbGFzcyBDb21wb3NlckV4Y2x1ZGVGaWx0ZXIgZXh0ZW5kcyBCYXNlRXhjbHVkZUZpbHRlcgp7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzb3VyY2VQYXRoLCBhcnJheSAkZXhjbHVkZVJ1bGVzKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHNvdXJjZVBhdGgpOwokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zID0gJHRoaXMtPmdlbmVyYXRlUGF0dGVybnMoJGV4Y2x1ZGVSdWxlcyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCgoKY2xhc3MgR2l0RXhjbHVkZUZpbHRlciBleHRlbmRzIEJhc2VFeGNsdWRlRmlsdGVyCnsKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc291cmNlUGF0aCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRzb3VyY2VQYXRoKTsKCmlmIChmaWxlX2V4aXN0cygkc291cmNlUGF0aC4nLy5naXRhdHRyaWJ1dGVzJykpIHsKJHRoaXMtPmV4Y2x1ZGVQYXR0ZXJucyA9IGFycmF5X21lcmdlKAokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zLAokdGhpcy0+cGFyc2VMaW5lcygKZmlsZSgkc291cmNlUGF0aC4nLy5naXRhdHRyaWJ1dGVzJyksClskdGhpcywgJ3BhcnNlR2l0QXR0cmlidXRlc0xpbmUnXQopCik7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZUdpdEF0dHJpYnV0ZXNMaW5lKHN0cmluZyAkbGluZSk6ID9hcnJheQp7CiRwYXJ0cyA9IFByZWc6OnNwbGl0KCcjXHMrIycsICRsaW5lKTsKCmlmIChjb3VudCgkcGFydHMpID09PSAyICYmICRwYXJ0c1sxXSA9PT0gJ2V4cG9ydC1pZ25vcmUnKSB7CnJldHVybiAkdGhpcy0+Z2VuZXJhdGVQYXR0ZXJuKCRwYXJ0c1swXSk7Cn0KCmlmIChjb3VudCgkcGFydHMpID09PSAyICYmICRwYXJ0c1sxXSA9PT0gJy1leHBvcnQtaWdub3JlJykgewpyZXR1cm4gJHRoaXMtPmdlbmVyYXRlUGF0dGVybignIScuJHBhcnRzWzBdKTsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCgoKCgoKY2xhc3MgUGhhckFyY2hpdmVyIGltcGxlbWVudHMgQXJjaGl2ZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkIHN0YXRpYyAkZm9ybWF0cyA9IFsKJ3ppcCcgPT4gXFBoYXI6OlpJUCwKJ3RhcicgPT4gXFBoYXI6OlRBUiwKJ3Rhci5neicgPT4gXFBoYXI6OlRBUiwKJ3Rhci5iejInID0+IFxQaGFyOjpUQVIsCl07CgoKcHJvdGVjdGVkIHN0YXRpYyAkY29tcHJlc3NGb3JtYXRzID0gWwondGFyLmd6JyA9PiBcUGhhcjo6R1osCid0YXIuYnoyJyA9PiBcUGhhcjo6QloyLApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoc3RyaW5nICRzb3VyY2VzLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRmb3JtYXQsIGFycmF5ICRleGNsdWRlcyA9IFtdLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewokc291cmNlcyA9IHJlYWxwYXRoKCRzb3VyY2VzKTsKCgppZiAoZmlsZV9leGlzdHMoJHRhcmdldCkpIHsKdW5saW5rKCR0YXJnZXQpOwp9Cgp0cnkgewokZmlsZW5hbWUgPSBzdWJzdHIoJHRhcmdldCwgMCwgc3RycnBvcygkdGFyZ2V0LCAkZm9ybWF0KSAtIDEpOwoKCmlmIChpc3NldChzdGF0aWM6OiRjb21wcmVzc0Zvcm1hdHNbJGZvcm1hdF0pKSB7CgokdGFyZ2V0ID0gJGZpbGVuYW1lIC4gJy50YXInOwp9CgokcGhhciA9IG5ldyBcUGhhckRhdGEoCiR0YXJnZXQsClxGaWxlc3lzdGVtSXRlcmF0b3I6OktFWV9BU19QQVRITkFNRSB8IFxGaWxlc3lzdGVtSXRlcmF0b3I6OkNVUlJFTlRfQVNfRklMRUlORk8sCicnLApzdGF0aWM6OiRmb3JtYXRzWyRmb3JtYXRdCik7CiRmaWxlcyA9IG5ldyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIoJHNvdXJjZXMsICRleGNsdWRlcywgJGlnbm9yZUZpbHRlcnMpOwokZmlsZXNPbmx5ID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbHRlcigkZmlsZXMpOwokcGhhci0+YnVpbGRGcm9tSXRlcmF0b3IoJGZpbGVzT25seSwgJHNvdXJjZXMpOwokZmlsZXNPbmx5LT5hZGRFbXB0eURpcigkcGhhciwgJHNvdXJjZXMpOwoKaWYgKGlzc2V0KHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKCmlmICghJHBoYXItPmNhbkNvbXByZXNzKHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0NhbiBub3QgY29tcHJlc3MgdG8gJXMgZm9ybWF0JywgJGZvcm1hdCkpOwp9CgoKdW5saW5rKCR0YXJnZXQpOwoKCiRwaGFyLT5jb21wcmVzcyhzdGF0aWM6OiRjb21wcmVzc0Zvcm1hdHNbJGZvcm1hdF0pOwoKCiR0YXJnZXQgPSAkZmlsZW5hbWUgLiAnLicgLiAkZm9ybWF0Owp9CgpyZXR1cm4gJHRhcmdldDsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9IHNwcmludGYoCiJDb3VsZCBub3QgY3JlYXRlIGFyY2hpdmUgJyVzJyBmcm9tICclcyc6ICVzIiwKJHRhcmdldCwKJHNvdXJjZXMsCiRlLT5nZXRNZXNzYWdlKCkKKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSwgJGUtPmdldENvZGUoKSwgJGUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJGZvcm1hdCwgP3N0cmluZyAkc291cmNlVHlwZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoc3RhdGljOjokZm9ybWF0c1skZm9ybWF0XSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBaaXBBcmNoaXZlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwoKCgoKY2xhc3MgWmlwQXJjaGl2ZXIgaW1wbGVtZW50cyBBcmNoaXZlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgc3RhdGljICRmb3JtYXRzID0gWwonemlwJyA9PiB0cnVlLApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoc3RyaW5nICRzb3VyY2VzLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRmb3JtYXQsIGFycmF5ICRleGNsdWRlcyA9IFtdLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokc291cmNlc1JlYWxwYXRoID0gcmVhbHBhdGgoJHNvdXJjZXMpOwppZiAoZmFsc2UgIT09ICRzb3VyY2VzUmVhbHBhdGgpIHsKJHNvdXJjZXMgPSAkc291cmNlc1JlYWxwYXRoOwp9CnVuc2V0KCRzb3VyY2VzUmVhbHBhdGgpOwokc291cmNlcyA9ICRmcy0+bm9ybWFsaXplUGF0aCgkc291cmNlcyk7CgokemlwID0gbmV3IFppcEFyY2hpdmUoKTsKJHJlcyA9ICR6aXAtPm9wZW4oJHRhcmdldCwgWmlwQXJjaGl2ZTo6Q1JFQVRFKTsKaWYgKCRyZXMgPT09IHRydWUpIHsKJGZpbGVzID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkc291cmNlcywgJGV4Y2x1ZGVzLCAkaWdub3JlRmlsdGVycyk7CmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgewoKJGZpbGVwYXRoID0gc3RydHIoJGZpbGUtPmdldFBhdGgoKS4iLyIuJGZpbGUtPmdldEZpbGVuYW1lKCksICdcXCcsICcvJyk7CiRsb2NhbG5hbWUgPSAkZmlsZXBhdGg7CmlmIChzdHJwb3MoJGxvY2FsbmFtZSwgJHNvdXJjZXMgLiAnLycpID09PSAwKSB7CiRsb2NhbG5hbWUgPSBzdWJzdHIoJGxvY2FsbmFtZSwgc3RybGVuKCRzb3VyY2VzIC4gJy8nKSk7Cn0KaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR6aXAtPmFkZEVtcHR5RGlyKCRsb2NhbG5hbWUpOwp9IGVsc2UgewokemlwLT5hZGRGaWxlKCRmaWxlcGF0aCwgJGxvY2FsbmFtZSk7Cn0KCgoKCmlmIChtZXRob2RfZXhpc3RzKCR6aXAsICdzZXRFeHRlcm5hbEF0dHJpYnV0ZXNOYW1lJykpIHsKJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlcGF0aCk7CgoKCgokemlwLT5zZXRFeHRlcm5hbEF0dHJpYnV0ZXNOYW1lKCRsb2NhbG5hbWUsIFppcEFyY2hpdmU6Ok9QU1lTX1VOSVgsICRwZXJtcyA8PCAxNik7Cn0KfQppZiAoJHppcC0+Y2xvc2UoKSkgewpyZXR1cm4gJHRhcmdldDsKfQp9CiRtZXNzYWdlID0gc3ByaW50ZigKIkNvdWxkIG5vdCBjcmVhdGUgYXJjaGl2ZSAnJXMnIGZyb20gJyVzJzogJXMiLAokdGFyZ2V0LAokc291cmNlcywKJHppcC0+Z2V0U3RhdHVzU3RyaW5nKCkKKTsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkZm9ybWF0LCA/c3RyaW5nICRzb3VyY2VUeXBlKTogYm9vbAp7CnJldHVybiBpc3NldChzdGF0aWM6OiRmb3JtYXRzWyRmb3JtYXRdKSAmJiAkdGhpcy0+Y29tcHJlc3Npb25BdmFpbGFibGUoKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjb21wcmVzc2lvbkF2YWlsYWJsZSgpOiBib29sCnsKcmV0dXJuIGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CgoKCgoKCmFic3RyYWN0IGNsYXNzIEJhc2VQYWNrYWdlIGltcGxlbWVudHMgUGFja2FnZUludGVyZmFjZQp7CgoKCgpwdWJsaWMgc3RhdGljICRzdXBwb3J0ZWRMaW5rVHlwZXMgPSBbCidyZXF1aXJlJyA9PiBbJ2Rlc2NyaXB0aW9uJyA9PiAncmVxdWlyZXMnLCAnbWV0aG9kJyA9PiBMaW5rOjpUWVBFX1JFUVVJUkVdLAonY29uZmxpY3QnID0+IFsnZGVzY3JpcHRpb24nID0+ICdjb25mbGljdHMnLCAnbWV0aG9kJyA9PiBMaW5rOjpUWVBFX0NPTkZMSUNUXSwKJ3Byb3ZpZGUnID0+IFsnZGVzY3JpcHRpb24nID0+ICdwcm92aWRlcycsICdtZXRob2QnID0+IExpbms6OlRZUEVfUFJPVklERV0sCidyZXBsYWNlJyA9PiBbJ2Rlc2NyaXB0aW9uJyA9PiAncmVwbGFjZXMnLCAnbWV0aG9kJyA9PiBMaW5rOjpUWVBFX1JFUExBQ0VdLAoncmVxdWlyZS1kZXYnID0+IFsnZGVzY3JpcHRpb24nID0+ICdyZXF1aXJlcyAoZm9yIGRldmVsb3BtZW50KScsICdtZXRob2QnID0+IExpbms6OlRZUEVfREVWX1JFUVVJUkVdLApdOwoKcHVibGljIGNvbnN0IFNUQUJJTElUWV9TVEFCTEUgPSAwOwpwdWJsaWMgY29uc3QgU1RBQklMSVRZX1JDID0gNTsKcHVibGljIGNvbnN0IFNUQUJJTElUWV9CRVRBID0gMTA7CnB1YmxpYyBjb25zdCBTVEFCSUxJVFlfQUxQSEEgPSAxNTsKcHVibGljIGNvbnN0IFNUQUJJTElUWV9ERVYgPSAyMDsKCgpwdWJsaWMgc3RhdGljICRzdGFiaWxpdGllcyA9IFsKJ3N0YWJsZScgPT4gc2VsZjo6U1RBQklMSVRZX1NUQUJMRSwKJ1JDJyA9PiBzZWxmOjpTVEFCSUxJVFlfUkMsCidiZXRhJyA9PiBzZWxmOjpTVEFCSUxJVFlfQkVUQSwKJ2FscGhhJyA9PiBzZWxmOjpTVEFCSUxJVFlfQUxQSEEsCidkZXYnID0+IHNlbGY6OlNUQUJJTElUWV9ERVYsCl07CgoKCgoKCnB1YmxpYyAkaWQ7Cgpwcm90ZWN0ZWQgJG5hbWU7Cgpwcm90ZWN0ZWQgJHByZXR0eU5hbWU7Cgpwcm90ZWN0ZWQgJHJlcG9zaXRvcnkgPSBudWxsOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5wcmV0dHlOYW1lID0gJG5hbWU7CiR0aGlzLT5uYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiR0aGlzLT5pZCA9IC0xOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJldHR5TmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCRwcm92aWRlcyA9IHRydWUpOiBhcnJheQp7CiRuYW1lcyA9IFsKJHRoaXMtPmdldE5hbWUoKSA9PiB0cnVlLApdOwoKaWYgKCRwcm92aWRlcykgewpmb3JlYWNoICgkdGhpcy0+Z2V0UHJvdmlkZXMoKSBhcyAkbGluaykgewokbmFtZXNbJGxpbmstPmdldFRhcmdldCgpXSA9IHRydWU7Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJG5hbWVzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9CgpyZXR1cm4gYXJyYXlfa2V5cygkbmFtZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWQoaW50ICRpZCk6IHZvaWQKewokdGhpcy0+aWQgPSAkaWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmlkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmlmICgkdGhpcy0+cmVwb3NpdG9yeSAmJiAkcmVwb3NpdG9yeSAhPT0gJHRoaXMtPnJlcG9zaXRvcnkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAiJXMiIGNhbm5vdCBiZSBhZGRlZCB0byByZXBvc2l0b3J5ICIlcyIgYXMgaXQgaXMgYWxyZWFkeSBpbiByZXBvc2l0b3J5ICIlcyIuJywKJHRoaXMtPmdldFByZXR0eU5hbWUoKSwKJHJlcG9zaXRvcnktPmdldFJlcG9OYW1lKCksCiR0aGlzLT5yZXBvc2l0b3J5LT5nZXRSZXBvTmFtZSgpCikpOwp9CiR0aGlzLT5yZXBvc2l0b3J5ID0gJHJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5KCk6ID9SZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQbGF0Zm9ybSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbmlxdWVOYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpLictJy4kdGhpcy0+Z2V0VmVyc2lvbigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKJHNlbGYgPSAkdGhpczsKaWYgKCR0aGlzIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRzZWxmID0gJHRoaXMtPmdldEFsaWFzT2YoKTsKfQppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJHBhY2thZ2UgPT09ICRzZWxmOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFVuaXF1ZU5hbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eU5hbWUoKS4nICcuJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bGxQcmV0dHlWZXJzaW9uKGJvb2wgJHRydW5jYXRlID0gdHJ1ZSwgaW50ICRkaXNwbGF5TW9kZSA9IFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYpOiBzdHJpbmcKewppZiAoJGRpc3BsYXlNb2RlID09PSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUZfSUZfREVWICYmCighJHRoaXMtPmlzRGV2KCkgfHwgIVxpbl9hcnJheSgkdGhpcy0+Z2V0U291cmNlVHlwZSgpLCBbJ2hnJywgJ2dpdCddKSkKKSB7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cgpzd2l0Y2ggKCRkaXNwbGF5TW9kZSkgewpjYXNlIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVY6CmNhc2UgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9TT1VSQ0VfUkVGOgokcmVmZXJlbmNlID0gJHRoaXMtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwpicmVhazsKY2FzZSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGOgokcmVmZXJlbmNlID0gJHRoaXMtPmdldERpc3RSZWZlcmVuY2UoKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdEaXNwbGF5IG1vZGUgJy4kZGlzcGxheU1vZGUuJyBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0KCmlmIChudWxsID09PSAkcmVmZXJlbmNlKSB7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CgoKaWYgKCR0cnVuY2F0ZSAmJiBcc3RybGVuKCRyZWZlcmVuY2UpID09PSA0MCAmJiAkdGhpcy0+Z2V0U291cmNlVHlwZSgpICE9PSAnc3ZuJykgewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKSAuICcgJyAuIHN1YnN0cigkcmVmZXJlbmNlLCAwLCA3KTsKfQoKcmV0dXJuICR0aGlzLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnICcgLiAkcmVmZXJlbmNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5UHJpb3JpdHkoKTogaW50CnsKcmV0dXJuIHNlbGY6OiRzdGFiaWxpdGllc1skdGhpcy0+Z2V0U3RhYmlsaXR5KCldOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKJHRoaXMtPnJlcG9zaXRvcnkgPSBudWxsOwokdGhpcy0+aWQgPSAtMTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYWNrYWdlTmFtZVRvUmVnZXhwKHN0cmluZyAkYWxsb3dQYXR0ZXJuLCBzdHJpbmcgJHdyYXAgPSAne14lcyR9aScpOiBzdHJpbmcKewokY2xlYW5lZEFsbG93UGF0dGVybiA9IHN0cl9yZXBsYWNlKCdcXConLCAnLionLCBwcmVnX3F1b3RlKCRhbGxvd1BhdHRlcm4pKTsKCnJldHVybiBzcHJpbnRmKCR3cmFwLCAkY2xlYW5lZEFsbG93UGF0dGVybik7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhY2thZ2VOYW1lc1RvUmVnZXhwKGFycmF5ICRwYWNrYWdlTmFtZXMsIHN0cmluZyAkd3JhcCA9ICd7Xig/OiVzKSR9aUQnKTogc3RyaW5nCnsKJHBhY2thZ2VOYW1lcyA9IGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkcGFja2FnZU5hbWUpOiBzdHJpbmcgewpyZXR1cm4gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2VOYW1lLCAnJXMnKTsKfSwKJHBhY2thZ2VOYW1lcwopOwoKcmV0dXJuIHNwcmludGYoJHdyYXAsIGltcGxvZGUoJ3wnLCAkcGFja2FnZU5hbWVzKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxDb21wYXJlcjsKCnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgpjbGFzcyBDb21wYXJlcgp7Cgpwcml2YXRlICRzb3VyY2U7Cgpwcml2YXRlICR1cGRhdGU7Cgpwcml2YXRlICRjaGFuZ2VkOwoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZShzdHJpbmcgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+c291cmNlID0gJHNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZShzdHJpbmcgJHVwZGF0ZSk6IHZvaWQKewokdGhpcy0+dXBkYXRlID0gJHVwZGF0ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZWQoYm9vbCAkZXhwbGljYXRlZCA9IGZhbHNlKQp7CiRjaGFuZ2VkID0gJHRoaXMtPmNoYW5nZWQ7CmlmICghY291bnQoJGNoYW5nZWQpKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJGV4cGxpY2F0ZWQpIHsKZm9yZWFjaCAoJGNoYW5nZWQgYXMgJHNlY3Rpb25LZXkgPT4gJGl0ZW1TZWN0aW9uKSB7CmZvcmVhY2ggKCRpdGVtU2VjdGlvbiBhcyAkaXRlbUtleSA9PiAkaXRlbSkgewokY2hhbmdlZFskc2VjdGlvbktleV1bJGl0ZW1LZXldID0gJGl0ZW0uJyAoJy4kc2VjdGlvbktleS4nKSc7Cn0KfQp9CgpyZXR1cm4gJGNoYW5nZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VkQXNTdHJpbmcoYm9vbCAkdG9TdHJpbmcgPSBmYWxzZSwgYm9vbCAkZXhwbGljYXRlZCA9IGZhbHNlKTogc3RyaW5nCnsKJGNoYW5nZWQgPSAkdGhpcy0+Z2V0Q2hhbmdlZCgkZXhwbGljYXRlZCk7CmlmIChmYWxzZSA9PT0gJGNoYW5nZWQpIHsKcmV0dXJuICcnOwp9Cgokc3RyaW5ncyA9IFtdOwpmb3JlYWNoICgkY2hhbmdlZCBhcyAkc2VjdGlvbktleSA9PiAkaXRlbVNlY3Rpb24pIHsKZm9yZWFjaCAoJGl0ZW1TZWN0aW9uIGFzICRpdGVtS2V5ID0+ICRpdGVtKSB7CiRzdHJpbmdzW10gPSAkaXRlbS4iXHJcbiI7Cn0KfQoKcmV0dXJuIHRyaW0oaW1wbG9kZSgiXHJcbiIsICRzdHJpbmdzKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkb0NvbXBhcmUoKTogdm9pZAp7CiRzb3VyY2UgPSBbXTsKJGRlc3RpbmF0aW9uID0gW107CiR0aGlzLT5jaGFuZ2VkID0gW107CiRjdXJyZW50RGlyZWN0b3J5ID0gUGxhdGZvcm06OmdldEN3ZCgpOwpjaGRpcigkdGhpcy0+c291cmNlKTsKJHNvdXJjZSA9ICR0aGlzLT5kb1RyZWUoJy4nLCAkc291cmNlKTsKaWYgKCFpc19hcnJheSgkc291cmNlKSkgewpyZXR1cm47Cn0KY2hkaXIoJGN1cnJlbnREaXJlY3RvcnkpOwpjaGRpcigkdGhpcy0+dXBkYXRlKTsKJGRlc3RpbmF0aW9uID0gJHRoaXMtPmRvVHJlZSgnLicsICRkZXN0aW5hdGlvbik7CmlmICghaXNfYXJyYXkoJGRlc3RpbmF0aW9uKSkgewpleGl0Owp9CmNoZGlyKCRjdXJyZW50RGlyZWN0b3J5KTsKZm9yZWFjaCAoJHNvdXJjZSBhcyAkZGlyID0+ICR2YWx1ZSkgewpmb3JlYWNoICgkdmFsdWUgYXMgJGZpbGUgPT4gJGhhc2gpIHsKaWYgKGlzc2V0KCRkZXN0aW5hdGlvblskZGlyXVskZmlsZV0pKSB7CmlmICgkaGFzaCAhPT0gJGRlc3RpbmF0aW9uWyRkaXJdWyRmaWxlXSkgewokdGhpcy0+Y2hhbmdlZFsnY2hhbmdlZCddW10gPSAkZGlyLicvJy4kZmlsZTsKfQp9IGVsc2UgewokdGhpcy0+Y2hhbmdlZFsncmVtb3ZlZCddW10gPSAkZGlyLicvJy4kZmlsZTsKfQp9Cn0KZm9yZWFjaCAoJGRlc3RpbmF0aW9uIGFzICRkaXIgPT4gJHZhbHVlKSB7CmZvcmVhY2ggKCR2YWx1ZSBhcyAkZmlsZSA9PiAkaGFzaCkgewppZiAoIWlzc2V0KCRzb3VyY2VbJGRpcl1bJGZpbGVdKSkgewokdGhpcy0+Y2hhbmdlZFsnYWRkZWQnXVtdID0gJGRpci4nLycuJGZpbGU7Cn0KfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1RyZWUoc3RyaW5nICRkaXIsIGFycmF5ICYkYXJyYXkpCnsKaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsKd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7CmlmICgkZmlsZSAhPT0gJy4nICYmICRmaWxlICE9PSAnLi4nKSB7CmlmIChpc19saW5rKCRkaXIuJy8nLiRmaWxlKSkgewokYXJyYXlbJGRpcl1bJGZpbGVdID0gcmVhZGxpbmsoJGRpci4nLycuJGZpbGUpOwp9IGVsc2VpZiAoaXNfZGlyKCRkaXIuJy8nLiRmaWxlKSkgewppZiAoIWNvdW50KCRhcnJheSkpIHsKJGFycmF5WzBdID0gJ1RlbXAnOwp9CmlmICghJHRoaXMtPmRvVHJlZSgkZGlyLicvJy4kZmlsZSwgJGFycmF5KSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBlbHNlaWYgKGlzX2ZpbGUoJGRpci4nLycuJGZpbGUpICYmIGZpbGVzaXplKCRkaXIuJy8nLiRmaWxlKSkgewokYXJyYXlbJGRpcl1bJGZpbGVdID0gbWQ1X2ZpbGUoJGRpci4nLycuJGZpbGUpOwp9Cn0KfQppZiAoY291bnQoJGFycmF5KSA+IDEgJiYgaXNzZXQoJGFycmF5WycwJ10pKSB7CnVuc2V0KCRhcnJheVsnMCddKTsKfQoKcmV0dXJuICRhcnJheTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7CgoKCgpjbGFzcyBDb21wbGV0ZUFsaWFzUGFja2FnZSBleHRlbmRzIEFsaWFzUGFja2FnZSBpbXBsZW1lbnRzIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGFsaWFzT2Y7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbXBsZXRlUGFja2FnZSAkYWxpYXNPZiwgc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkYWxpYXNPZiwgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzT2YoKQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNjcmlwdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNjcmlwdHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNjcmlwdHMoYXJyYXkgJHNjcmlwdHMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFNjcmlwdHMoJHNjcmlwdHMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRSZXBvc2l0b3JpZXMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcmllcyhhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRSZXBvc2l0b3JpZXMoJHJlcG9zaXRvcmllcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRMaWNlbnNlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRMaWNlbnNlKGFycmF5ICRsaWNlbnNlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRMaWNlbnNlKCRsaWNlbnNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEtleXdvcmRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRLZXl3b3JkcygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0S2V5d29yZHMoYXJyYXkgJGtleXdvcmRzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRLZXl3b3Jkcygka2V5d29yZHMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGVzY3JpcHRpb24oKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERlc2NyaXB0aW9uKD9zdHJpbmcgJGRlc2NyaXB0aW9uKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREZXNjcmlwdGlvbigkZGVzY3JpcHRpb24pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SG9tZXBhZ2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0SG9tZXBhZ2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEhvbWVwYWdlKD9zdHJpbmcgJGhvbWVwYWdlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRIb21lcGFnZSgkaG9tZXBhZ2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aG9ycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXV0aG9ycygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aG9ycyhhcnJheSAkYXV0aG9ycyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QXV0aG9ycygkYXV0aG9ycyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdXBwb3J0KCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTdXBwb3J0KCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTdXBwb3J0KGFycmF5ICRzdXBwb3J0KTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTdXBwb3J0KCRzdXBwb3J0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bmRpbmcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEZ1bmRpbmcoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEZ1bmRpbmcoYXJyYXkgJGZ1bmRpbmcpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEZ1bmRpbmcoJGZ1bmRpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNBYmFuZG9uZWQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+aXNBYmFuZG9uZWQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50UGFja2FnZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFiYW5kb25lZCgkYWJhbmRvbmVkKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBYmFuZG9uZWQoJGFiYW5kb25lZCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlTmFtZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRBcmNoaXZlTmFtZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZU5hbWUoP3N0cmluZyAkbmFtZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QXJjaGl2ZU5hbWUoJG5hbWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZUV4Y2x1ZGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRBcmNoaXZlRXhjbHVkZXMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVFeGNsdWRlcyhhcnJheSAkZXhjbHVkZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEFyY2hpdmVFeGNsdWRlcygkZXhjbHVkZXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7CgoKCgoKCmNsYXNzIENvbXBsZXRlUGFja2FnZSBleHRlbmRzIFBhY2thZ2UgaW1wbGVtZW50cyBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRyZXBvc2l0b3JpZXMgPSBbXTsKCnByb3RlY3RlZCAkbGljZW5zZSA9IFtdOwoKcHJvdGVjdGVkICRrZXl3b3JkcyA9IFtdOwoKcHJvdGVjdGVkICRhdXRob3JzID0gW107Cgpwcm90ZWN0ZWQgJGRlc2NyaXB0aW9uID0gbnVsbDsKCnByb3RlY3RlZCAkaG9tZXBhZ2UgPSBudWxsOwoKcHJvdGVjdGVkICRzY3JpcHRzID0gW107Cgpwcm90ZWN0ZWQgJHN1cHBvcnQgPSBbXTsKCnByb3RlY3RlZCAkZnVuZGluZyA9IFtdOwoKcHJvdGVjdGVkICRhYmFuZG9uZWQgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXJjaGl2ZU5hbWUgPSBudWxsOwoKcHJvdGVjdGVkICRhcmNoaXZlRXhjbHVkZXMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTY3JpcHRzKGFycmF5ICRzY3JpcHRzKTogdm9pZAp7CiR0aGlzLT5zY3JpcHRzID0gJHNjcmlwdHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTY3JpcHRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5zY3JpcHRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yaWVzKGFycmF5ICRyZXBvc2l0b3JpZXMpOiB2b2lkCnsKJHRoaXMtPnJlcG9zaXRvcmllcyA9ICRyZXBvc2l0b3JpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcmllczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExpY2Vuc2UoYXJyYXkgJGxpY2Vuc2UpOiB2b2lkCnsKJHRoaXMtPmxpY2Vuc2UgPSAkbGljZW5zZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExpY2Vuc2UoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmxpY2Vuc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRLZXl3b3JkcyhhcnJheSAka2V5d29yZHMpOiB2b2lkCnsKJHRoaXMtPmtleXdvcmRzID0gJGtleXdvcmRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5d29yZHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmtleXdvcmRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aG9ycyhhcnJheSAkYXV0aG9ycyk6IHZvaWQKewokdGhpcy0+YXV0aG9ycyA9ICRhdXRob3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aG9ycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YXV0aG9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlc2NyaXB0aW9uKD9zdHJpbmcgJGRlc2NyaXB0aW9uKTogdm9pZAp7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9tZXBhZ2UoP3N0cmluZyAkaG9tZXBhZ2UpOiB2b2lkCnsKJHRoaXMtPmhvbWVwYWdlID0gJGhvbWVwYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SG9tZXBhZ2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+aG9tZXBhZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdXBwb3J0KGFycmF5ICRzdXBwb3J0KTogdm9pZAp7CiR0aGlzLT5zdXBwb3J0ID0gJHN1cHBvcnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdXBwb3J0KCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5zdXBwb3J0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RnVuZGluZyhhcnJheSAkZnVuZGluZyk6IHZvaWQKewokdGhpcy0+ZnVuZGluZyA9ICRmdW5kaW5nOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVuZGluZygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZnVuZGluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQWJhbmRvbmVkKCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpICR0aGlzLT5hYmFuZG9uZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBYmFuZG9uZWQoJGFiYW5kb25lZCk6IHZvaWQKewokdGhpcy0+YWJhbmRvbmVkID0gJGFiYW5kb25lZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50UGFja2FnZSgpOiA/c3RyaW5nCnsKcmV0dXJuIFxpc19zdHJpbmcoJHRoaXMtPmFiYW5kb25lZCkgPyAkdGhpcy0+YWJhbmRvbmVkIDogbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVOYW1lKD9zdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPmFyY2hpdmVOYW1lID0gJG5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlTmFtZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hcmNoaXZlTmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVFeGNsdWRlcyhhcnJheSAkZXhjbHVkZXMpOiB2b2lkCnsKJHRoaXMtPmFyY2hpdmVFeGNsdWRlcyA9ICRleGNsdWRlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVFeGNsdWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YXJjaGl2ZUV4Y2x1ZGVzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7CgoKCgoKCgoKaW50ZXJmYWNlIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSBleHRlbmRzIFBhY2thZ2VJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTY3JpcHRzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNjcmlwdHMoYXJyYXkgJHNjcmlwdHMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yaWVzKGFycmF5ICRyZXBvc2l0b3JpZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZSgpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExpY2Vuc2UoYXJyYXkgJGxpY2Vuc2UpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5d29yZHMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRLZXl3b3JkcyhhcnJheSAka2V5d29yZHMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogP3N0cmluZzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbihzdHJpbmcgJGRlc2NyaXB0aW9uKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhvbWVwYWdlKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9tZXBhZ2Uoc3RyaW5nICRob21lcGFnZSk6IHZvaWQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcnMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRob3JzKGFycmF5ICRhdXRob3JzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1cHBvcnQoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdXBwb3J0KGFycmF5ICRzdXBwb3J0KTogdm9pZDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVuZGluZygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZ1bmRpbmcoYXJyYXkgJGZ1bmRpbmcpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQWJhbmRvbmVkKCk6IGJvb2w7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZU5hbWUoKTogP3N0cmluZzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlTmFtZShzdHJpbmcgJG5hbWUpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZUV4Y2x1ZGVzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZUV4Y2x1ZGVzKGFycmF5ICRleGNsdWRlcyk6IHZvaWQ7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKY2xhc3MgQXJyYXlEdW1wZXIKewoKCgpwdWJsaWMgZnVuY3Rpb24gZHVtcChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewoka2V5cyA9IFsKJ2JpbmFyaWVzJyA9PiAnYmluJywKJ3R5cGUnLAonZXh0cmEnLAonaW5zdGFsbGF0aW9uU291cmNlJyA9PiAnaW5zdGFsbGF0aW9uLXNvdXJjZScsCidhdXRvbG9hZCcsCidkZXZBdXRvbG9hZCcgPT4gJ2F1dG9sb2FkLWRldicsCidub3RpZmljYXRpb25VcmwnID0+ICdub3RpZmljYXRpb24tdXJsJywKJ2luY2x1ZGVQYXRocycgPT4gJ2luY2x1ZGUtcGF0aCcsCl07CgokZGF0YSA9IFtdOwokZGF0YVsnbmFtZSddID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJGRhdGFbJ3ZlcnNpb24nXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CgppZiAoJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSB7CiRkYXRhWyd0YXJnZXQtZGlyJ10gPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpKSB7CiRkYXRhWydzb3VyY2UnXVsndHlwZSddID0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKTsKJGRhdGFbJ3NvdXJjZSddWyd1cmwnXSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKTsKaWYgKG51bGwgIT09ICgkdmFsdWUgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpKSB7CiRkYXRhWydzb3VyY2UnXVsncmVmZXJlbmNlJ10gPSAkdmFsdWU7Cn0KaWYgKCRtaXJyb3JzID0gJHBhY2thZ2UtPmdldFNvdXJjZU1pcnJvcnMoKSkgewokZGF0YVsnc291cmNlJ11bJ21pcnJvcnMnXSA9ICRtaXJyb3JzOwp9Cn0KCmlmICgkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSkgewokZGF0YVsnZGlzdCddWyd0eXBlJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKJGRhdGFbJ2Rpc3QnXVsndXJsJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpOwppZiAobnVsbCAhPT0gKCR2YWx1ZSA9ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpKSB7CiRkYXRhWydkaXN0J11bJ3JlZmVyZW5jZSddID0gJHZhbHVlOwp9CmlmIChudWxsICE9PSAoJHZhbHVlID0gJHBhY2thZ2UtPmdldERpc3RTaGExQ2hlY2tzdW0oKSkpIHsKJGRhdGFbJ2Rpc3QnXVsnc2hhc3VtJ10gPSAkdmFsdWU7Cn0KaWYgKCRtaXJyb3JzID0gJHBhY2thZ2UtPmdldERpc3RNaXJyb3JzKCkpIHsKJGRhdGFbJ2Rpc3QnXVsnbWlycm9ycyddID0gJG1pcnJvcnM7Cn0KfQoKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMgYXMgJHR5cGUgPT4gJG9wdHMpIHsKaWYgKCRsaW5rcyA9ICRwYWNrYWdlLT57J2dldCcudWNmaXJzdCgkb3B0c1snbWV0aG9kJ10pfSgpKSB7CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewokZGF0YVskdHlwZV1bJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0Ka3NvcnQoJGRhdGFbJHR5cGVdKTsKfQp9CgppZiAoJHBhY2thZ2VzID0gJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCkpIHsKa3NvcnQoJHBhY2thZ2VzKTsKJGRhdGFbJ3N1Z2dlc3QnXSA9ICRwYWNrYWdlczsKfQoKaWYgKCRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpIGluc3RhbmNlb2YgXERhdGVUaW1lSW50ZXJmYWNlKSB7CiRkYXRhWyd0aW1lJ10gPSAkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKS0+Zm9ybWF0KERBVEVfUkZDMzMzOSk7Cn0KCmlmICgkcGFja2FnZS0+aXNEZWZhdWx0QnJhbmNoKCkpIHsKJGRhdGFbJ2RlZmF1bHQtYnJhbmNoJ10gPSB0cnVlOwp9CgokZGF0YSA9ICR0aGlzLT5kdW1wVmFsdWVzKCRwYWNrYWdlLCAka2V5cywgJGRhdGEpOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CmlmICgkcGFja2FnZS0+Z2V0QXJjaGl2ZU5hbWUoKSkgewokZGF0YVsnYXJjaGl2ZSddWyduYW1lJ10gPSAkcGFja2FnZS0+Z2V0QXJjaGl2ZU5hbWUoKTsKfQppZiAoJHBhY2thZ2UtPmdldEFyY2hpdmVFeGNsdWRlcygpKSB7CiRkYXRhWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSA9ICRwYWNrYWdlLT5nZXRBcmNoaXZlRXhjbHVkZXMoKTsKfQoKJGtleXMgPSBbCidzY3JpcHRzJywKJ2xpY2Vuc2UnLAonYXV0aG9ycycsCidkZXNjcmlwdGlvbicsCidob21lcGFnZScsCidrZXl3b3JkcycsCidyZXBvc2l0b3JpZXMnLAonc3VwcG9ydCcsCidmdW5kaW5nJywKXTsKCiRkYXRhID0gJHRoaXMtPmR1bXBWYWx1ZXMoJHBhY2thZ2UsICRrZXlzLCAkZGF0YSk7CgppZiAoaXNzZXQoJGRhdGFbJ2tleXdvcmRzJ10pICYmIFxpc19hcnJheSgkZGF0YVsna2V5d29yZHMnXSkpIHsKc29ydCgkZGF0YVsna2V5d29yZHMnXSk7Cn0KCmlmICgkcGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewokZGF0YVsnYWJhbmRvbmVkJ10gPSAkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgPzogdHJ1ZTsKfQp9CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokbWluaW11bVN0YWJpbGl0eSA9ICRwYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CmlmICgkbWluaW11bVN0YWJpbGl0eSkgewokZGF0YVsnbWluaW11bS1zdGFiaWxpdHknXSA9ICRtaW5pbXVtU3RhYmlsaXR5Owp9Cn0KCmlmIChcY291bnQoJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKSkgPiAwKSB7CiRkYXRhWyd0cmFuc3BvcnQtb3B0aW9ucyddID0gJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKfQoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBWYWx1ZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJGtleXMsIGFycmF5ICRkYXRhKTogYXJyYXkKewpmb3JlYWNoICgka2V5cyBhcyAkbWV0aG9kID0+ICRrZXkpIHsKaWYgKGlzX251bWVyaWMoJG1ldGhvZCkpIHsKJG1ldGhvZCA9ICRrZXk7Cn0KCiRnZXR0ZXIgPSAnZ2V0Jy51Y2ZpcnN0KCRtZXRob2QpOwokdmFsdWUgPSAkcGFja2FnZS0+eyRnZXR0ZXJ9KCk7CgppZiAobnVsbCAhPT0gJHZhbHVlICYmICEoXGlzX2FycmF5KCR2YWx1ZSkgJiYgMCA9PT0gXGNvdW50KCR2YWx1ZSkpKSB7CiRkYXRhWyRrZXldID0gJHZhbHVlOwp9Cn0KCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIExpbmsKewpwdWJsaWMgY29uc3QgVFlQRV9SRVFVSVJFID0gJ3JlcXVpcmVzJzsKcHVibGljIGNvbnN0IFRZUEVfREVWX1JFUVVJUkUgPSAnZGV2UmVxdWlyZXMnOwpwdWJsaWMgY29uc3QgVFlQRV9QUk9WSURFID0gJ3Byb3ZpZGVzJzsKcHVibGljIGNvbnN0IFRZUEVfQ09ORkxJQ1QgPSAnY29uZmxpY3RzJzsKcHVibGljIGNvbnN0IFRZUEVfUkVQTEFDRSA9ICdyZXBsYWNlcyc7CgoKCgoKcHVibGljIGNvbnN0IFRZUEVfRE9FU19OT1RfUkVRVUlSRSA9ICdkb2VzIG5vdCByZXF1aXJlJzsKCnByaXZhdGUgY29uc3QgVFlQRV9VTktOT1dOID0gJ3JlbGF0ZXMgdG8nOwoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgJFRZUEVTID0gWwpzZWxmOjpUWVBFX1JFUVVJUkUsCnNlbGY6OlRZUEVfREVWX1JFUVVJUkUsCnNlbGY6OlRZUEVfUFJPVklERSwKc2VsZjo6VFlQRV9DT05GTElDVCwKc2VsZjo6VFlQRV9SRVBMQUNFLApdOwoKCgoKcHJvdGVjdGVkICRzb3VyY2U7CgoKCgpwcm90ZWN0ZWQgJHRhcmdldDsKCgoKCnByb3RlY3RlZCAkY29uc3RyYWludDsKCgoKCgpwcm90ZWN0ZWQgJGRlc2NyaXB0aW9uOwoKCgoKcHJvdGVjdGVkICRwcmV0dHlDb25zdHJhaW50OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KApzdHJpbmcgJHNvdXJjZSwKc3RyaW5nICR0YXJnZXQsCkNvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsCiRkZXNjcmlwdGlvbiA9IHNlbGY6OlRZUEVfVU5LTk9XTiwKP3N0cmluZyAkcHJldHR5Q29uc3RyYWludCA9IG51bGwKKSB7CiR0aGlzLT5zb3VyY2UgPSBzdHJ0b2xvd2VyKCRzb3VyY2UpOwokdGhpcy0+dGFyZ2V0ID0gc3RydG9sb3dlcigkdGFyZ2V0KTsKJHRoaXMtPmNvbnN0cmFpbnQgPSAkY29uc3RyYWludDsKJHRoaXMtPmRlc2NyaXB0aW9uID0gc2VsZjo6VFlQRV9ERVZfUkVRVUlSRSA9PT0gJGRlc2NyaXB0aW9uID8gJ3JlcXVpcmVzIChmb3IgZGV2ZWxvcG1lbnQpJyA6ICRkZXNjcmlwdGlvbjsKJHRoaXMtPnByZXR0eUNvbnN0cmFpbnQgPSAkcHJldHR5Q29uc3RyYWludDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVzY3JpcHRpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2UoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50YXJnZXQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25zdHJhaW50KCk6IENvbnN0cmFpbnRJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNvbnN0cmFpbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlDb25zdHJhaW50KCk6IHN0cmluZwp7CmlmIChudWxsID09PSAkdGhpcy0+cHJldHR5Q29uc3RyYWludCkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKCdMaW5rICVzIGhhcyBiZWVuIG1pc2NvbmZpZ3VyZWQgYW5kIGhhZCBubyBwcmV0dHlDb25zdHJhaW50IGdpdmVuLicsICR0aGlzKSk7Cn0KCnJldHVybiAkdGhpcy0+cHJldHR5Q29uc3RyYWludDsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2UuJyAnLiR0aGlzLT5kZXNjcmlwdGlvbi4nICcuJHRoaXMtPnRhcmdldC4nICgnLiR0aGlzLT5jb25zdHJhaW50LicpJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyhQYWNrYWdlSW50ZXJmYWNlICRzb3VyY2VQYWNrYWdlKTogc3RyaW5nCnsKcmV0dXJuICRzb3VyY2VQYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nICcuJHRoaXMtPmRlc2NyaXB0aW9uLicgJy4kdGhpcy0+dGFyZ2V0LicgJy4kdGhpcy0+Y29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCmNsYXNzIEFycmF5TG9hZGVyIGltcGxlbWVudHMgTG9hZGVySW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkbG9hZE9wdGlvbnM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1ZlcnNpb25QYXJzZXIgJHBhcnNlciA9IG51bGwsIGJvb2wgJGxvYWRPcHRpb25zID0gZmFsc2UpCnsKaWYgKCEkcGFyc2VyKSB7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKfQokdGhpcy0+dmVyc2lvblBhcnNlciA9ICRwYXJzZXI7CiR0aGlzLT5sb2FkT3B0aW9ucyA9ICRsb2FkT3B0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZQp7CmlmICgkY2xhc3MgIT09ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScgJiYgJGNsYXNzICE9PSAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScpIHsKdHJpZ2dlcl9lcnJvcignVGhlICRjbGFzcyBhcmcgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHJlYWNoIG91dCB0byBDb21wb3NlciBtYWludGFpbmVycyBBU0FQIGlmIHlvdSBzdGlsbCBuZWVkIHRoaXMuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgokcGFja2FnZSA9ICR0aGlzLT5jcmVhdGVPYmplY3QoJGNvbmZpZywgJGNsYXNzKTsKCmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRvcHRzKSB7CmlmICghaXNzZXQoJGNvbmZpZ1skdHlwZV0pIHx8ICFpc19hcnJheSgkY29uZmlnWyR0eXBlXSkpIHsKY29udGludWU7Cn0KJG1ldGhvZCA9ICdzZXQnLnVjZmlyc3QoJG9wdHNbJ21ldGhvZCddKTsKJHBhY2thZ2UtPnskbWV0aG9kfSgKJHRoaXMtPnBhcnNlTGlua3MoCiRwYWNrYWdlLT5nZXROYW1lKCksCiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksCiRvcHRzWydtZXRob2QnXSwKJGNvbmZpZ1skdHlwZV0KKQopOwp9CgokcGFja2FnZSA9ICR0aGlzLT5jb25maWd1cmVPYmplY3QoJHBhY2thZ2UsICRjb25maWcpOwoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHZlcnNpb25zKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKJGxpbmtDYWNoZSA9IFtdOwoKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CiRwYWNrYWdlID0gJHRoaXMtPmNyZWF0ZU9iamVjdCgkdmVyc2lvbiwgJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk7CgokdGhpcy0+Y29uZmlndXJlQ2FjaGVkTGlua3MoJGxpbmtDYWNoZSwgJHBhY2thZ2UsICR2ZXJzaW9uKTsKJHBhY2thZ2UgPSAkdGhpcy0+Y29uZmlndXJlT2JqZWN0KCRwYWNrYWdlLCAkdmVyc2lvbik7CgokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVPYmplY3QoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyk6IENvbXBsZXRlUGFja2FnZQp7CmlmICghaXNzZXQoJGNvbmZpZ1snbmFtZSddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVW5rbm93biBwYWNrYWdlIGhhcyBubyBuYW1lIGRlZmluZWQgKCcuanNvbl9lbmNvZGUoJGNvbmZpZykuJykuJyk7Cn0KaWYgKCFpc3NldCgkY29uZmlnWyd2ZXJzaW9uJ10pIHx8ICFpc19zY2FsYXIoJGNvbmZpZ1sndmVyc2lvbiddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUGFja2FnZSAnLiRjb25maWdbJ25hbWUnXS4nIGhhcyBubyB2ZXJzaW9uIGRlZmluZWQuJyk7Cn0KaWYgKCFpc19zdHJpbmcoJGNvbmZpZ1sndmVyc2lvbiddKSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAoc3RyaW5nKSAkY29uZmlnWyd2ZXJzaW9uJ107Cn0KCgppZiAoaXNzZXQoJGNvbmZpZ1sndmVyc2lvbl9ub3JtYWxpemVkJ10pICYmIGlzX3N0cmluZygkY29uZmlnWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkpIHsKJHZlcnNpb24gPSAkY29uZmlnWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXTsKCgppZiAoJHZlcnNpb24gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkY29uZmlnWyd2ZXJzaW9uJ10pOwp9Cn0gZWxzZSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkY29uZmlnWyd2ZXJzaW9uJ10pOwp9CgpyZXR1cm4gbmV3ICRjbGFzcygkY29uZmlnWyduYW1lJ10sICR2ZXJzaW9uLCAkY29uZmlnWyd2ZXJzaW9uJ10pOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbmZpZ3VyZU9iamVjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkY29uZmlnKTogQmFzZVBhY2thZ2UKewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0FycmF5TG9hZGVyIGV4cGVjdHMgaW5zdGFuY2VzIG9mIHRoZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZSBjbGFzcyB0byBmdW5jdGlvbiBjb3JyZWN0bHknKTsKfQoKJHBhY2thZ2UtPnNldFR5cGUoaXNzZXQoJGNvbmZpZ1sndHlwZSddKSA/IHN0cnRvbG93ZXIoJGNvbmZpZ1sndHlwZSddKSA6ICdsaWJyYXJ5Jyk7CgppZiAoaXNzZXQoJGNvbmZpZ1sndGFyZ2V0LWRpciddKSkgewokcGFja2FnZS0+c2V0VGFyZ2V0RGlyKCRjb25maWdbJ3RhcmdldC1kaXInXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydleHRyYSddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snZXh0cmEnXSkpIHsKJHBhY2thZ2UtPnNldEV4dHJhKCRjb25maWdbJ2V4dHJhJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYmluJ10pKSB7CmlmICghXGlzX2FycmF5KCRjb25maWdbJ2JpbiddKSkgewokY29uZmlnWydiaW4nXSA9IFskY29uZmlnWydiaW4nXV07Cn0KZm9yZWFjaCAoJGNvbmZpZ1snYmluJ10gYXMgJGtleSA9PiAkYmluKSB7CiRjb25maWdbJ2JpbiddWyRrZXldID0gbHRyaW0oJGJpbiwgJy8nKTsKfQokcGFja2FnZS0+c2V0QmluYXJpZXMoJGNvbmZpZ1snYmluJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snaW5zdGFsbGF0aW9uLXNvdXJjZSddKSkgewokcGFja2FnZS0+c2V0SW5zdGFsbGF0aW9uU291cmNlKCRjb25maWdbJ2luc3RhbGxhdGlvbi1zb3VyY2UnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydkZWZhdWx0LWJyYW5jaCddKSAmJiAkY29uZmlnWydkZWZhdWx0LWJyYW5jaCddID09PSB0cnVlKSB7CiRwYWNrYWdlLT5zZXRJc0RlZmF1bHRCcmFuY2godHJ1ZSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydzb3VyY2UnXSkpIHsKaWYgKCFpc3NldCgkY29uZmlnWydzb3VyY2UnXVsndHlwZSddLCAkY29uZmlnWydzb3VyY2UnXVsndXJsJ10sICRjb25maWdbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oc3ByaW50ZigKIlBhY2thZ2UgJXMncyBzb3VyY2Uga2V5IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMge1widHlwZVwiOiAuLi4sIFwidXJsXCI6IC4uLiwgXCJyZWZlcmVuY2VcIjogLi4ufSxcbiVzIGdpdmVuLiIsCiRjb25maWdbJ25hbWUnXSwKanNvbl9lbmNvZGUoJGNvbmZpZ1snc291cmNlJ10pCikpOwp9CiRwYWNrYWdlLT5zZXRTb3VyY2VUeXBlKCRjb25maWdbJ3NvdXJjZSddWyd0eXBlJ10pOwokcGFja2FnZS0+c2V0U291cmNlVXJsKCRjb25maWdbJ3NvdXJjZSddWyd1cmwnXSk7CiRwYWNrYWdlLT5zZXRTb3VyY2VSZWZlcmVuY2UoaXNzZXQoJGNvbmZpZ1snc291cmNlJ11bJ3JlZmVyZW5jZSddKSA/IChzdHJpbmcpICRjb25maWdbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSA6IG51bGwpOwppZiAoaXNzZXQoJGNvbmZpZ1snc291cmNlJ11bJ21pcnJvcnMnXSkpIHsKJHBhY2thZ2UtPnNldFNvdXJjZU1pcnJvcnMoJGNvbmZpZ1snc291cmNlJ11bJ21pcnJvcnMnXSk7Cn0KfQoKaWYgKGlzc2V0KCRjb25maWdbJ2Rpc3QnXSkpIHsKaWYgKCFpc3NldCgkY29uZmlnWydkaXN0J11bJ3R5cGUnXSwgJGNvbmZpZ1snZGlzdCddWyd1cmwnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oc3ByaW50ZigKIlBhY2thZ2UgJXMncyBkaXN0IGtleSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzICIuCiJ7XCJ0eXBlXCI6IC4uLiwgXCJ1cmxcIjogLi4uLCBcInJlZmVyZW5jZVwiOiAuLi4sIFwic2hhc3VtXCI6IC4uLn0sXG4lcyBnaXZlbi4iLAokY29uZmlnWyduYW1lJ10sCmpzb25fZW5jb2RlKCRjb25maWdbJ2Rpc3QnXSkKKSk7Cn0KJHBhY2thZ2UtPnNldERpc3RUeXBlKCRjb25maWdbJ2Rpc3QnXVsndHlwZSddKTsKJHBhY2thZ2UtPnNldERpc3RVcmwoJGNvbmZpZ1snZGlzdCddWyd1cmwnXSk7CiRwYWNrYWdlLT5zZXREaXN0UmVmZXJlbmNlKGlzc2V0KCRjb25maWdbJ2Rpc3QnXVsncmVmZXJlbmNlJ10pID8gKHN0cmluZykgJGNvbmZpZ1snZGlzdCddWydyZWZlcmVuY2UnXSA6IG51bGwpOwokcGFja2FnZS0+c2V0RGlzdFNoYTFDaGVja3N1bSgkY29uZmlnWydkaXN0J11bJ3NoYXN1bSddID8/IG51bGwpOwppZiAoaXNzZXQoJGNvbmZpZ1snZGlzdCddWydtaXJyb3JzJ10pKSB7CiRwYWNrYWdlLT5zZXREaXN0TWlycm9ycygkY29uZmlnWydkaXN0J11bJ21pcnJvcnMnXSk7Cn0KfQoKaWYgKGlzc2V0KCRjb25maWdbJ3N1Z2dlc3QnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ3N1Z2dlc3QnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snc3VnZ2VzdCddIGFzICR0YXJnZXQgPT4gJHJlYXNvbikgewppZiAoJ3NlbGYudmVyc2lvbicgPT09IHRyaW0oJHJlYXNvbikpIHsKJGNvbmZpZ1snc3VnZ2VzdCddWyR0YXJnZXRdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQp9CiRwYWNrYWdlLT5zZXRTdWdnZXN0cygkY29uZmlnWydzdWdnZXN0J10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQnXSkpIHsKJHBhY2thZ2UtPnNldEF1dG9sb2FkKCRjb25maWdbJ2F1dG9sb2FkJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQtZGV2J10pKSB7CiRwYWNrYWdlLT5zZXREZXZBdXRvbG9hZCgkY29uZmlnWydhdXRvbG9hZC1kZXYnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydpbmNsdWRlLXBhdGgnXSkpIHsKJHBhY2thZ2UtPnNldEluY2x1ZGVQYXRocygkY29uZmlnWydpbmNsdWRlLXBhdGgnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1sndGltZSddKSkgewokdGltZSA9IFByZWc6OmlzTWF0Y2goJy9eXGQrKyQvRCcsICRjb25maWdbJ3RpbWUnXSkgPyAnQCcuJGNvbmZpZ1sndGltZSddIDogJGNvbmZpZ1sndGltZSddOwoKdHJ5IHsKJGRhdGUgPSBuZXcgXERhdGVUaW1lKCR0aW1lLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwokcGFja2FnZS0+c2V0UmVsZWFzZURhdGUoJGRhdGUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKaWYgKCFlbXB0eSgkY29uZmlnWydub3RpZmljYXRpb24tdXJsJ10pKSB7CiRwYWNrYWdlLT5zZXROb3RpZmljYXRpb25VcmwoJGNvbmZpZ1snbm90aWZpY2F0aW9uLXVybCddKTsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CmlmICghZW1wdHkoJGNvbmZpZ1snYXJjaGl2ZSddWyduYW1lJ10pKSB7CiRwYWNrYWdlLT5zZXRBcmNoaXZlTmFtZSgkY29uZmlnWydhcmNoaXZlJ11bJ25hbWUnXSk7Cn0KaWYgKCFlbXB0eSgkY29uZmlnWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVFeGNsdWRlcygkY29uZmlnWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydzY3JpcHRzJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydzY3JpcHRzJ10pKSB7CmZvcmVhY2ggKCRjb25maWdbJ3NjcmlwdHMnXSBhcyAkZXZlbnQgPT4gJGxpc3RlbmVycykgewokY29uZmlnWydzY3JpcHRzJ11bJGV2ZW50XSA9IChhcnJheSkgJGxpc3RlbmVyczsKfQpmb3JlYWNoIChbJ2NvbXBvc2VyJywgJ3BocCcsICdwdXRlbnYnXSBhcyAkcmVzZXJ2ZWQpIHsKaWYgKGlzc2V0KCRjb25maWdbJ3NjcmlwdHMnXVskcmVzZXJ2ZWRdKSkgewp0cmlnZ2VyX2Vycm9yKCdUaGUgYCcuJHJlc2VydmVkLidgIHNjcmlwdCBuYW1lIGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UsIHBsZWFzZSBhdm9pZCBkZWZpbmluZyBpdCcsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQp9CiRwYWNrYWdlLT5zZXRTY3JpcHRzKCRjb25maWdbJ3NjcmlwdHMnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snZGVzY3JpcHRpb24nXSkgJiYgXGlzX3N0cmluZygkY29uZmlnWydkZXNjcmlwdGlvbiddKSkgewokcGFja2FnZS0+c2V0RGVzY3JpcHRpb24oJGNvbmZpZ1snZGVzY3JpcHRpb24nXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snaG9tZXBhZ2UnXSkgJiYgXGlzX3N0cmluZygkY29uZmlnWydob21lcGFnZSddKSkgewokcGFja2FnZS0+c2V0SG9tZXBhZ2UoJGNvbmZpZ1snaG9tZXBhZ2UnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1sna2V5d29yZHMnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2tleXdvcmRzJ10pKSB7CiRwYWNrYWdlLT5zZXRLZXl3b3JkcyhhcnJheV9tYXAoJ3N0cnZhbCcsICRjb25maWdbJ2tleXdvcmRzJ10pKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydsaWNlbnNlJ10pKSB7CiRwYWNrYWdlLT5zZXRMaWNlbnNlKFxpc19hcnJheSgkY29uZmlnWydsaWNlbnNlJ10pID8gJGNvbmZpZ1snbGljZW5zZSddIDogWyRjb25maWdbJ2xpY2Vuc2UnXV0pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2F1dGhvcnMnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2F1dGhvcnMnXSkpIHsKJHBhY2thZ2UtPnNldEF1dGhvcnMoJGNvbmZpZ1snYXV0aG9ycyddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3N1cHBvcnQnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ3N1cHBvcnQnXSkpIHsKJHBhY2thZ2UtPnNldFN1cHBvcnQoJGNvbmZpZ1snc3VwcG9ydCddKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydmdW5kaW5nJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydmdW5kaW5nJ10pKSB7CiRwYWNrYWdlLT5zZXRGdW5kaW5nKCRjb25maWdbJ2Z1bmRpbmcnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydhYmFuZG9uZWQnXSkpIHsKJHBhY2thZ2UtPnNldEFiYW5kb25lZCgkY29uZmlnWydhYmFuZG9uZWQnXSk7Cn0KfQoKaWYgKCR0aGlzLT5sb2FkT3B0aW9ucyAmJiBpc3NldCgkY29uZmlnWyd0cmFuc3BvcnQtb3B0aW9ucyddKSkgewokcGFja2FnZS0+c2V0VHJhbnNwb3J0T3B0aW9ucygkY29uZmlnWyd0cmFuc3BvcnQtb3B0aW9ucyddKTsKfQoKaWYgKCRhbGlhc05vcm1hbGl6ZWQgPSAkdGhpcy0+Z2V0QnJhbmNoQWxpYXMoJGNvbmZpZykpIHsKJHByZXR0eUFsaWFzID0gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkYWxpYXNOb3JtYWxpemVkKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlKSB7CnJldHVybiBuZXcgUm9vdEFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzTm9ybWFsaXplZCwgJHByZXR0eUFsaWFzKTsKfQoKcmV0dXJuIG5ldyBDb21wbGV0ZUFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzTm9ybWFsaXplZCwgJHByZXR0eUFsaWFzKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb25maWd1cmVDYWNoZWRMaW5rcyhhcnJheSAmJGxpbmtDYWNoZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJGNvbmZpZyk6IHZvaWQKewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiRwcmV0dHlWZXJzaW9uID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKCmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRvcHRzKSB7CmlmIChpc3NldCgkY29uZmlnWyR0eXBlXSkpIHsKJG1ldGhvZCA9ICdzZXQnLnVjZmlyc3QoJG9wdHNbJ21ldGhvZCddKTsKCiRsaW5rcyA9IFtdOwpmb3JlYWNoICgkY29uZmlnWyR0eXBlXSBhcyAkcHJldHR5VGFyZ2V0ID0+ICRjb25zdHJhaW50KSB7CiR0YXJnZXQgPSBzdHJ0b2xvd2VyKCRwcmV0dHlUYXJnZXQpOwoKCmlmICgkdGFyZ2V0ID09PSAkbmFtZSkgewpjb250aW51ZTsKfQoKaWYgKCRjb25zdHJhaW50ID09PSAnc2VsZi52ZXJzaW9uJykgewokbGlua3NbJHRhcmdldF0gPSAkdGhpcy0+Y3JlYXRlTGluaygkbmFtZSwgJHByZXR0eVZlcnNpb24sICRvcHRzWydtZXRob2QnXSwgJHRhcmdldCwgJGNvbnN0cmFpbnQpOwp9IGVsc2UgewppZiAoIWlzc2V0KCRsaW5rQ2FjaGVbJG5hbWVdWyR0eXBlXVskdGFyZ2V0XVskY29uc3RyYWludF0pKSB7CiRsaW5rQ2FjaGVbJG5hbWVdWyR0eXBlXVskdGFyZ2V0XVskY29uc3RyYWludF0gPSBbJHRhcmdldCwgJHRoaXMtPmNyZWF0ZUxpbmsoJG5hbWUsICRwcmV0dHlWZXJzaW9uLCAkb3B0c1snbWV0aG9kJ10sICR0YXJnZXQsICRjb25zdHJhaW50KV07Cn0KClskdGFyZ2V0LCAkbGlua10gPSAkbGlua0NhY2hlWyRuYW1lXVskdHlwZV1bJHRhcmdldF1bJGNvbnN0cmFpbnRdOwokbGlua3NbJHRhcmdldF0gPSAkbGluazsKfQp9CgokcGFja2FnZS0+eyRtZXRob2R9KCRsaW5rcyk7Cn0KfQp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlTGlua3Moc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkc291cmNlVmVyc2lvbiwgc3RyaW5nICRkZXNjcmlwdGlvbiwgYXJyYXkgJGxpbmtzKTogYXJyYXkKewokcmVzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkdGFyZ2V0ID0+ICRjb25zdHJhaW50KSB7CmlmICghaXNfc3RyaW5nKCRjb25zdHJhaW50KSkgewpjb250aW51ZTsKfQokdGFyZ2V0ID0gc3RydG9sb3dlcigoc3RyaW5nKSAkdGFyZ2V0KTsKJHJlc1skdGFyZ2V0XSA9ICR0aGlzLT5jcmVhdGVMaW5rKCRzb3VyY2UsICRzb3VyY2VWZXJzaW9uLCAkZGVzY3JpcHRpb24sICR0YXJnZXQsICRjb25zdHJhaW50KTsKfQoKcmV0dXJuICRyZXM7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUxpbmsoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkc291cmNlVmVyc2lvbiwgc3RyaW5nICRkZXNjcmlwdGlvbiwgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkcHJldHR5Q29uc3RyYWludCk6IExpbmsKewppZiAoIVxpc19zdHJpbmcoJHByZXR0eUNvbnN0cmFpbnQpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdMaW5rIGNvbnN0cmFpbnQgaW4gJy4kc291cmNlLicgJy4kZGVzY3JpcHRpb24uJyA+ICcuJHRhcmdldC4nIHNob3VsZCBiZSBhIHN0cmluZywgZ290ICcuXGdldHR5cGUoJHByZXR0eUNvbnN0cmFpbnQpIC4gJyAoJyAuIHZhcl9leHBvcnQoJHByZXR0eUNvbnN0cmFpbnQsIHRydWUpIC4gJyknKTsKfQppZiAoJ3NlbGYudmVyc2lvbicgPT09ICRwcmV0dHlDb25zdHJhaW50KSB7CiRwYXJzZWRDb25zdHJhaW50ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHNvdXJjZVZlcnNpb24pOwp9IGVsc2UgewokcGFyc2VkQ29uc3RyYWludCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRwcmV0dHlDb25zdHJhaW50KTsKfQoKcmV0dXJuIG5ldyBMaW5rKCRzb3VyY2UsICR0YXJnZXQsICRwYXJzZWRDb25zdHJhaW50LCAkZGVzY3JpcHRpb24sICRwcmV0dHlDb25zdHJhaW50KTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hBbGlhcyhhcnJheSAkY29uZmlnKTogP3N0cmluZwp7CmlmICghaXNzZXQoJGNvbmZpZ1sndmVyc2lvbiddKSB8fCAhaXNfc2NhbGFyKCRjb25maWdbJ3ZlcnNpb24nXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ25vL2ludmFsaWQgdmVyc2lvbiBkZWZpbmVkJyk7Cn0KaWYgKCFpc19zdHJpbmcoJGNvbmZpZ1sndmVyc2lvbiddKSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAoc3RyaW5nKSAkY29uZmlnWyd2ZXJzaW9uJ107Cn0KCmlmIChzdHJwb3MoJGNvbmZpZ1sndmVyc2lvbiddLCAnZGV2LScpICE9PSAwICYmICctZGV2JyAhPT0gc3Vic3RyKCRjb25maWdbJ3ZlcnNpb24nXSwgLTQpKSB7CnJldHVybiBudWxsOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10gYXMgJHNvdXJjZUJyYW5jaCA9PiAkdGFyZ2V0QnJhbmNoKSB7CiRzb3VyY2VCcmFuY2ggPSAoc3RyaW5nKSAkc291cmNlQnJhbmNoOwoKCmlmICgnLWRldicgIT09IHN1YnN0cigkdGFyZ2V0QnJhbmNoLCAtNCkpIHsKY29udGludWU7Cn0KCgppZiAoJHRhcmdldEJyYW5jaCA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHZhbGlkYXRlZFRhcmdldEJyYW5jaCA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9IGVsc2UgewokdmFsaWRhdGVkVGFyZ2V0QnJhbmNoID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaChzdWJzdHIoJHRhcmdldEJyYW5jaCwgMCwgLTQpKTsKfQppZiAoJy1kZXYnICE9PSBzdWJzdHIoJHZhbGlkYXRlZFRhcmdldEJyYW5jaCwgLTQpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKHN0cnRvbG93ZXIoJGNvbmZpZ1sndmVyc2lvbiddKSAhPT0gc3RydG9sb3dlcigkc291cmNlQnJhbmNoKSkgewpjb250aW51ZTsKfQoKCmlmICgoJHNvdXJjZVByZWZpeCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeCgkc291cmNlQnJhbmNoKSkKJiYgKCR0YXJnZXRQcmVmaXggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJHRhcmdldEJyYW5jaCkpCiYmIChzdHJpcG9zKCR0YXJnZXRQcmVmaXgsICRzb3VyY2VQcmVmaXgpICE9PSAwKQopIHsKY29udGludWU7Cn0KCnJldHVybiAkdmFsaWRhdGVkVGFyZ2V0QnJhbmNoOwp9Cn0KCmlmICgKaXNzZXQoJGNvbmZpZ1snZGVmYXVsdC1icmFuY2gnXSkKJiYgJGNvbmZpZ1snZGVmYXVsdC1icmFuY2gnXSA9PT0gdHJ1ZQomJiBmYWxzZSA9PT0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KFByZWc6OnJlcGxhY2UoJ3tedn0nLCAnJywgJGNvbmZpZ1sndmVyc2lvbiddKSkKKSB7CnJldHVybiBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUzsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7CgoKCgpjbGFzcyBJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKcHJpdmF0ZSAkZXJyb3JzOwoKcHJpdmF0ZSAkd2FybmluZ3M7Cgpwcml2YXRlICRkYXRhOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGVycm9ycywgYXJyYXkgJHdhcm5pbmdzLCBhcnJheSAkZGF0YSkKewokdGhpcy0+ZXJyb3JzID0gJGVycm9yczsKJHRoaXMtPndhcm5pbmdzID0gJHdhcm5pbmdzOwokdGhpcy0+ZGF0YSA9ICRkYXRhOwpwYXJlbnQ6Ol9fY29uc3RydWN0KCJJbnZhbGlkIHBhY2thZ2UgaW5mb3JtYXRpb246IFxuIi5pbXBsb2RlKCJcbiIsIGFycmF5X21lcmdlKCRlcnJvcnMsICR3YXJuaW5ncykpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERhdGEoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRhdGE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFdhcm5pbmdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT53YXJuaW5nczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CgoKCgpjbGFzcyBKc29uTG9hZGVyCnsKCnByaXZhdGUgJGxvYWRlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb2FkZXJJbnRlcmZhY2UgJGxvYWRlcikKewokdGhpcy0+bG9hZGVyID0gJGxvYWRlcjsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkKCRqc29uKTogQmFzZVBhY2thZ2UKewppZiAoJGpzb24gaW5zdGFuY2VvZiBKc29uRmlsZSkgewokY29uZmlnID0gJGpzb24tPnJlYWQoKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRqc29uKSkgewokY29uZmlnID0gSnNvbkZpbGU6OnBhcnNlSnNvbihmaWxlX2dldF9jb250ZW50cygkanNvbiksICRqc29uKTsKfSBlbHNlaWYgKGlzX3N0cmluZygkanNvbikpIHsKJGNvbmZpZyA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGpzb24pOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAoiSnNvbkxvYWRlcjogVW5rbm93biBcJGpzb24gcGFyYW1ldGVyICVzLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIsCmdldHR5cGUoJGpzb24pCikpOwp9CgpyZXR1cm4gJHRoaXMtPmxvYWRlci0+bG9hZCgkY29uZmlnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgoKaW50ZXJmYWNlIExvYWRlckludGVyZmFjZQp7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzID0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk6IEJhc2VQYWNrYWdlOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5TWFuYWdlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgoKCgpjbGFzcyBSb290UGFja2FnZUxvYWRlciBleHRlbmRzIEFycmF5TG9hZGVyCnsKCgoKcHJpdmF0ZSAkbWFuYWdlcjsKCgoKCnByaXZhdGUgJGNvbmZpZzsKCgoKCnByaXZhdGUgJHZlcnNpb25HdWVzc2VyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlNYW5hZ2VyICRtYW5hZ2VyLCBDb25maWcgJGNvbmZpZywgP1ZlcnNpb25QYXJzZXIgJHBhcnNlciA9IG51bGwsID9WZXJzaW9uR3Vlc3NlciAkdmVyc2lvbkd1ZXNzZXIgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXJzZXIpOwoKJHRoaXMtPm1hbmFnZXIgPSAkbWFuYWdlcjsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT52ZXJzaW9uR3Vlc3NlciA9ICR2ZXJzaW9uR3Vlc3NlciA/OiBuZXcgVmVyc2lvbkd1ZXNzZXIoJGNvbmZpZywgbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pLCAkdGhpcy0+dmVyc2lvblBhcnNlcik7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzID0gJ0NvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2UnLCA/c3RyaW5nICRjd2QgPSBudWxsKTogQmFzZVBhY2thZ2UKewppZiAoJGNsYXNzICE9PSAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScpIHsKdHJpZ2dlcl9lcnJvcignVGhlICRjbGFzcyBhcmcgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHJlYWNoIG91dCB0byBDb21wb3NlciBtYWludGFpbmVycyBBU0FQIGlmIHlvdSBzdGlsbCBuZWVkIHRoaXMuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgppZiAoIWlzc2V0KCRjb25maWdbJ25hbWUnXSkpIHsKJGNvbmZpZ1snbmFtZSddID0gJ19fcm9vdF9fJzsKfSBlbHNlaWYgKCRlcnIgPSBWYWxpZGF0aW5nQXJyYXlMb2FkZXI6Omhhc1BhY2thZ2VOYW1pbmdFcnJvcigkY29uZmlnWyduYW1lJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91ciBwYWNrYWdlIG5hbWUgJy4kZXJyKTsKfQokYXV0b1ZlcnNpb25lZCA9IGZhbHNlOwppZiAoIWlzc2V0KCRjb25maWdbJ3ZlcnNpb24nXSkpIHsKJGNvbW1pdCA9IG51bGw7CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1JPT1RfVkVSU0lPTicpKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1JPT1RfVkVSU0lPTicpOwp9IGVsc2UgewokdmVyc2lvbkRhdGEgPSAkdGhpcy0+dmVyc2lvbkd1ZXNzZXItPmd1ZXNzVmVyc2lvbigkY29uZmlnLCAkY3dkID8/IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSkpOwppZiAoJHZlcnNpb25EYXRhKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXTsKJGNvbmZpZ1sndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXTsKJGNvbW1pdCA9ICR2ZXJzaW9uRGF0YVsnY29tbWl0J107Cn0KfQoKaWYgKCFpc3NldCgkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9ICcxLjAuMCc7CiRhdXRvVmVyc2lvbmVkID0gdHJ1ZTsKfQoKaWYgKCRjb21taXQpIHsKJGNvbmZpZ1snc291cmNlJ10gPSBbCid0eXBlJyA9PiAnJywKJ3VybCcgPT4gJycsCidyZWZlcmVuY2UnID0+ICRjb21taXQsCl07CiRjb25maWdbJ2Rpc3QnXSA9IFsKJ3R5cGUnID0+ICcnLAondXJsJyA9PiAnJywKJ3JlZmVyZW5jZScgPT4gJGNvbW1pdCwKXTsKfQp9CgoKJHBhY2thZ2UgPSBwYXJlbnQ6OmxvYWQoJGNvbmZpZywgJGNsYXNzKTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdEFsaWFzUGFja2FnZSkgewokcmVhbFBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9IGVsc2UgewokcmVhbFBhY2thZ2UgPSAkcGFja2FnZTsKfQoKaWYgKCEkcmVhbFBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RpbmcgYSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlIGF0IHRoaXMgcG9pbnQnKTsKfQoKaWYgKCRhdXRvVmVyc2lvbmVkKSB7CiRyZWFsUGFja2FnZS0+cmVwbGFjZVZlcnNpb24oJHJlYWxQYWNrYWdlLT5nZXRWZXJzaW9uKCksIFJvb3RQYWNrYWdlOjpERUZBVUxUX1BSRVRUWV9WRVJTSU9OKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pKSB7CiRyZWFsUGFja2FnZS0+c2V0TWluaW11bVN0YWJpbGl0eShWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJGNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXSkpOwp9CgokYWxpYXNlcyA9IFtdOwokc3RhYmlsaXR5RmxhZ3MgPSBbXTsKJHJlZmVyZW5jZXMgPSBbXTsKZm9yZWFjaCAoWydyZXF1aXJlJywgJ3JlcXVpcmUtZGV2J10gYXMgJGxpbmtUeXBlKSB7CmlmIChpc3NldCgkY29uZmlnWyRsaW5rVHlwZV0pKSB7CiRsaW5rSW5mbyA9IEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzWyRsaW5rVHlwZV07CiRtZXRob2QgPSAnZ2V0Jy51Y2ZpcnN0KCRsaW5rSW5mb1snbWV0aG9kJ10pOwokbGlua3MgPSBbXTsKZm9yZWFjaCAoJHJlYWxQYWNrYWdlLT57JG1ldGhvZH0oKSBhcyAkbGluaykgewokbGlua3NbJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCktPmdldFByZXR0eVN0cmluZygpOwp9CiRhbGlhc2VzID0gJHRoaXMtPmV4dHJhY3RBbGlhc2VzKCRsaW5rcywgJGFsaWFzZXMpOwokc3RhYmlsaXR5RmxhZ3MgPSBzZWxmOjpleHRyYWN0U3RhYmlsaXR5RmxhZ3MoJGxpbmtzLCAkcmVhbFBhY2thZ2UtPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgJHN0YWJpbGl0eUZsYWdzKTsKJHJlZmVyZW5jZXMgPSBzZWxmOjpleHRyYWN0UmVmZXJlbmNlcygkbGlua3MsICRyZWZlcmVuY2VzKTsKCmlmIChpc3NldCgkbGlua3NbJGNvbmZpZ1snbmFtZSddXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1Jvb3QgcGFja2FnZSBcJyVzXCcgY2Fubm90IHJlcXVpcmUgaXRzZWxmIGluIGl0cyBjb21wb3Nlci5qc29uJyAuIFBIUF9FT0wgLgonRGlkIHlvdSBhY2NpZGVudGFsbHkgbmFtZSB5b3VyIHJvb3QgcGFja2FnZSBhZnRlciBhbiBleHRlcm5hbCBwYWNrYWdlPycsICRjb25maWdbJ25hbWUnXSkpOwp9Cn0KfQoKZm9yZWFjaCAoYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcykgYXMgJGxpbmtUeXBlKSB7CmlmIChpc3NldCgkY29uZmlnWyRsaW5rVHlwZV0pKSB7CmZvcmVhY2ggKCRjb25maWdbJGxpbmtUeXBlXSBhcyAkbGlua05hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRlcnIgPSBWYWxpZGF0aW5nQXJyYXlMb2FkZXI6Omhhc1BhY2thZ2VOYW1pbmdFcnJvcigkbGlua05hbWUsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbGlua1R5cGUuJy4nLiRlcnIpOwp9Cn0KfQp9CgokcmVhbFBhY2thZ2UtPnNldEFsaWFzZXMoJGFsaWFzZXMpOwokcmVhbFBhY2thZ2UtPnNldFN0YWJpbGl0eUZsYWdzKCRzdGFiaWxpdHlGbGFncyk7CiRyZWFsUGFja2FnZS0+c2V0UmVmZXJlbmNlcygkcmVmZXJlbmNlcyk7CgppZiAoaXNzZXQoJGNvbmZpZ1sncHJlZmVyLXN0YWJsZSddKSkgewokcmVhbFBhY2thZ2UtPnNldFByZWZlclN0YWJsZSgoYm9vbCkgJGNvbmZpZ1sncHJlZmVyLXN0YWJsZSddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2NvbmZpZyddKSkgewokcmVhbFBhY2thZ2UtPnNldENvbmZpZygkY29uZmlnWydjb25maWcnXSk7Cn0KCiRyZXBvcyA9IFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3MobnVsbCwgJHRoaXMtPmNvbmZpZywgJHRoaXMtPm1hbmFnZXIpOwpmb3JlYWNoICgkcmVwb3MgYXMgJHJlcG8pIHsKJHRoaXMtPm1hbmFnZXItPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9CiRyZWFsUGFja2FnZS0+c2V0UmVwb3NpdG9yaWVzKCR0aGlzLT5jb25maWctPmdldFJlcG9zaXRvcmllcygpKTsKCnJldHVybiAkcGFja2FnZTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0QWxpYXNlcyhhcnJheSAkcmVxdWlyZXMsIGFycmF5ICRhbGlhc2VzKTogYXJyYXkKewpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcU5hbWUgPT4gJHJlcVZlcnNpb24pIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3soPzpefFx8ICp8LCAqKShbXixccyN8XSspKD86I1teIF0rKT8gK2FzICsoW14sXHN8XSspKD86JHwgKlx8fCAqLCl9JywgJHJlcVZlcnNpb24sICRtYXRjaCkpIHsKJGFsaWFzZXNbXSA9IFsKJ3BhY2thZ2UnID0+IHN0cnRvbG93ZXIoJHJlcU5hbWUpLAondmVyc2lvbicgPT4gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkbWF0Y2hbMV0sICRyZXFWZXJzaW9uKSwKJ2FsaWFzJyA9PiAkbWF0Y2hbMl0sCidhbGlhc19ub3JtYWxpemVkJyA9PiAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRtYXRjaFsyXSwgJHJlcVZlcnNpb24pLApdOwp9IGVsc2VpZiAoc3RycG9zKCRyZXFWZXJzaW9uLCAnIGFzICcpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignSW52YWxpZCBhbGlhcyBkZWZpbml0aW9uIGluICInLiRyZXFOYW1lLiciOiAiJy4kcmVxVmVyc2lvbi4nIi4gQWxpYXNlcyBzaG91bGQgYmUgaW4gdGhlIGZvcm0gImV4YWN0LXZlcnNpb24gYXMgb3RoZXItZXhhY3QtdmVyc2lvbiIuJyk7Cn0KfQoKcmV0dXJuICRhbGlhc2VzOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdFN0YWJpbGl0eUZsYWdzKGFycmF5ICRyZXF1aXJlcywgc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5LCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MpOiBhcnJheQp7CiRzdGFiaWxpdGllcyA9IEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXM7CgokbWluaW11bVN0YWJpbGl0eSA9ICRzdGFiaWxpdGllc1skbWluaW11bVN0YWJpbGl0eV07CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxTmFtZSA9PiAkcmVxVmVyc2lvbikgewokY29uc3RyYWludHMgPSBbXTsKCgokb3JTcGxpdCA9IFByZWc6OnNwbGl0KCd7XHMqXHxcfD9ccyp9JywgdHJpbSgkcmVxVmVyc2lvbikpOwpmb3JlYWNoICgkb3JTcGxpdCBhcyAkb3JDb25zdHJhaW50KSB7CiRhbmRTcGxpdCA9IFByZWc6OnNwbGl0KCd7KD88IV58YXN8Wz0+PCAsXSkgKig/PCEtKVssIF0oPyEtKSAqKD8hLHxhc3wkKX0nLCAkb3JDb25zdHJhaW50KTsKZm9yZWFjaCAoJGFuZFNwbGl0IGFzICRhbmRDb25zdHJhaW50KSB7CiRjb25zdHJhaW50c1tdID0gJGFuZENvbnN0cmFpbnQ7Cn0KfQoKCiRtYXRjaGVkID0gZmFsc2U7CmZvcmVhY2ggKCRjb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15bXkBdKj9AKCcuaW1wbG9kZSgnfCcsIGFycmF5X2tleXMoJHN0YWJpbGl0aWVzKSkuJykkfWknLCAkY29uc3RyYWludCwgJG1hdGNoKSkgewokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcU5hbWUpOwokc3RhYmlsaXR5ID0gJHN0YWJpbGl0aWVzW1ZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkbWF0Y2hbMV0pXTsKCmlmIChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSAmJiAkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdID4gJHN0YWJpbGl0eSkgewpjb250aW51ZTsKfQokc3RhYmlsaXR5RmxhZ3NbJG5hbWVdID0gJHN0YWJpbGl0eTsKJG1hdGNoZWQgPSB0cnVlOwp9Cn0KCmlmICgkbWF0Y2hlZCkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJGNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CgoKJHJlcVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7XihbXixcc0BdKykgYXMgLiskfScsICckMScsICRjb25zdHJhaW50KTsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW14sXHNAXSskfScsICRyZXFWZXJzaW9uKSAmJiAnc3RhYmxlJyAhPT0gKCRzdGFiaWxpdHlOYW1lID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHJlcVZlcnNpb24pKSkgewokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcU5hbWUpOwokc3RhYmlsaXR5ID0gJHN0YWJpbGl0aWVzWyRzdGFiaWxpdHlOYW1lXTsKaWYgKChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSAmJiAkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdID4gJHN0YWJpbGl0eSkgfHwgKCRtaW5pbXVtU3RhYmlsaXR5ID4gJHN0YWJpbGl0eSkpIHsKY29udGludWU7Cn0KJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA9ICRzdGFiaWxpdHk7Cn0KfQp9CgpyZXR1cm4gJHN0YWJpbGl0eUZsYWdzOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdFJlZmVyZW5jZXMoYXJyYXkgJHJlcXVpcmVzLCBhcnJheSAkcmVmZXJlbmNlcyk6IGFycmF5CnsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXFOYW1lID0+ICRyZXFWZXJzaW9uKSB7CiRyZXFWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oW14sXHNAXSspIGFzIC4rJH0nLCAnJDEnLCAkcmVxVmVyc2lvbik7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlteLFxzQF0rPyMoW2EtZjAtOV0rKSR9JywgJHJlcVZlcnNpb24sICRtYXRjaCkgJiYgJ2RldicgPT09IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCRyZXFWZXJzaW9uKSkgewokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcU5hbWUpOwokcmVmZXJlbmNlc1skbmFtZV0gPSAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuICRyZWZlcmVuY2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwoKCgoKY2xhc3MgVmFsaWRhdGluZ0FycmF5TG9hZGVyIGltcGxlbWVudHMgTG9hZGVySW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IENIRUNLX0FMTCA9IDM7CnB1YmxpYyBjb25zdCBDSEVDS19VTkJPVU5EX0NPTlNUUkFJTlRTID0gMTsKcHVibGljIGNvbnN0IENIRUNLX1NUUklDVF9DT05TVFJBSU5UUyA9IDI7CgoKcHJpdmF0ZSAkbG9hZGVyOwoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCnByaXZhdGUgJGVycm9yczsKCnByaXZhdGUgJHdhcm5pbmdzOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkZmxhZ3M7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoTG9hZGVySW50ZXJmYWNlICRsb2FkZXIsIGJvb2wgJHN0cmljdE5hbWUgPSB0cnVlLCA/VmVyc2lvblBhcnNlciAkcGFyc2VyID0gbnVsbCwgaW50ICRmbGFncyA9IDApCnsKJHRoaXMtPmxvYWRlciA9ICRsb2FkZXI7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gJHBhcnNlciA/PyBuZXcgVmVyc2lvblBhcnNlcigpOwokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7CgppZiAoJHN0cmljdE5hbWUgIT09IHRydWUpIHsgCnRyaWdnZXJfZXJyb3IoJyRzdHJpY3ROYW1lIG11c3QgYmUgc2V0IHRvIHRydWUgaW4gVmFsaWRhdGluZ0FycmF5TG9hZGVyXCdzIGNvbnN0cnVjdG9yIGFzIG9mIDIuMiwgYW5kIGl0IHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjAnLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZQp7CiR0aGlzLT5lcnJvcnMgPSBbXTsKJHRoaXMtPndhcm5pbmdzID0gW107CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCduYW1lJywgdHJ1ZSk7CmlmIChpc3NldCgkY29uZmlnWyduYW1lJ10pICYmIG51bGwgIT09ICgkZXJyID0gc2VsZjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRjb25maWdbJ25hbWUnXSkpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICduYW1lIDogJy4kZXJyOwp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddKSkgewppZiAoIWlzX3NjYWxhcigkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CiR0aGlzLT52YWxpZGF0ZVN0cmluZygndmVyc2lvbicpOwp9IGVsc2UgewppZiAoIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CiR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSA9IChzdHJpbmcpICR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXTsKfQp0cnkgewokdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3ZlcnNpb24gOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp1bnNldCgkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pOwp9Cn0KfQoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ2NvbmZpZyddWydwbGF0Zm9ybSddKSkgewpmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5jb25maWdbJ2NvbmZpZyddWydwbGF0Zm9ybSddIGFzICRrZXkgPT4gJHBsYXRmb3JtKSB7CmlmIChmYWxzZSA9PT0gJHBsYXRmb3JtKSB7CmNvbnRpbnVlOwp9CmlmICghaXNfc3RyaW5nKCRwbGF0Zm9ybSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2NvbmZpZy5wbGF0Zm9ybS4nIC4gJGtleSAuICcgOiBpbnZhbGlkIHZhbHVlICgnLmdldHR5cGUoJHBsYXRmb3JtKS4nICcudmFyX2V4cG9ydCgkcGxhdGZvcm0sIHRydWUpLicpOiBleHBlY3RlZCBzdHJpbmcgb3IgZmFsc2UnOwpjb250aW51ZTsKfQp0cnkgewokdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwbGF0Zm9ybSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2NvbmZpZy5wbGF0Zm9ybS4nIC4gJGtleSAuICcgOiBpbnZhbGlkIHZhbHVlICgnLiRwbGF0Zm9ybS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp9Cn0KfQoKJHRoaXMtPnZhbGlkYXRlUmVnZXgoJ3R5cGUnLCAnW0EtWmEtejAtOS1dKycpOwokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ3RhcmdldC1kaXInKTsKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2V4dHJhJyk7CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snYmluJ10pKSB7CmlmIChpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1snYmluJ10pKSB7CiR0aGlzLT52YWxpZGF0ZVN0cmluZygnYmluJyk7Cn0gZWxzZSB7CiR0aGlzLT52YWxpZGF0ZUZsYXRBcnJheSgnYmluJyk7Cn0KfQoKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3NjcmlwdHMnKTsgCiR0aGlzLT52YWxpZGF0ZVN0cmluZygnZGVzY3JpcHRpb24nKTsKJHRoaXMtPnZhbGlkYXRlVXJsKCdob21lcGFnZScpOwokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2tleXdvcmRzJywgJ1tccHtOfVxwe0x9IC5fLV0rJyk7CgokcmVsZWFzZURhdGUgPSBudWxsOwokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ3RpbWUnKTsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3RpbWUnXSkpIHsKdHJ5IHsKJHJlbGVhc2VEYXRlID0gbmV3IFxEYXRlVGltZSgkdGhpcy0+Y29uZmlnWyd0aW1lJ10sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3RpbWUgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3RpbWUnXS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp1bnNldCgkdGhpcy0+Y29uZmlnWyd0aW1lJ10pOwp9Cn0KCgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKSAmJiAobnVsbCA9PT0gJHJlbGVhc2VEYXRlIHx8ICRyZWxlYXNlRGF0ZS0+Z2V0VGltZXN0YW1wKCkgPj0gc3RydG90aW1lKCctOGRheXMnKSkpIHsKaWYgKGlzX2FycmF5KCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSkgfHwgaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSkpIHsKJGxpY2Vuc2VzID0gKGFycmF5KSAkdGhpcy0+Y29uZmlnWydsaWNlbnNlJ107CgokbGljZW5zZVZhbGlkYXRvciA9IG5ldyBTcGR4TGljZW5zZXMoKTsKZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRsaWNlbnNlKSB7CgppZiAoJ3Byb3ByaWV0YXJ5JyA9PT0gJGxpY2Vuc2UpIHsKY29udGludWU7Cn0KJGxpY2Vuc2VUb1ZhbGlkYXRlID0gc3RyX3JlcGxhY2UoJ3Byb3ByaWV0YXJ5JywgJ01JVCcsICRsaWNlbnNlKTsKaWYgKCEkbGljZW5zZVZhbGlkYXRvci0+dmFsaWRhdGUoJGxpY2Vuc2VUb1ZhbGlkYXRlKSkgewppZiAoJGxpY2Vuc2VWYWxpZGF0b3ItPnZhbGlkYXRlKHRyaW0oJGxpY2Vuc2VUb1ZhbGlkYXRlKSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAlcyBtdXN0IG5vdCBjb250YWluIGV4dHJhIHNwYWNlcywgbWFrZSBzdXJlIHRvIHRyaW0gaXQuJywKanNvbl9lbmNvZGUoJGxpY2Vuc2UpCik7Cn0gZWxzZSB7CiR0aGlzLT53YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgJXMgaXMgbm90IGEgdmFsaWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHNlZSBodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzLyBpZiB5b3UgdXNlIGFuIG9wZW4gbGljZW5zZS4nIC4gUEhQX0VPTCAuCidJZiB0aGUgc29mdHdhcmUgaXMgY2xvc2VkLXNvdXJjZSwgeW91IG1heSB1c2UgInByb3ByaWV0YXJ5IiBhcyBsaWNlbnNlLicsCmpzb25fZW5jb2RlKCRsaWNlbnNlKQopOwp9Cn0KfQp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnYXV0aG9ycycpKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXSBhcyAka2V5ID0+ICRhdXRob3IpIHsKaWYgKCFpc19hcnJheSgkYXV0aG9yKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnYXV0aG9ycy4nLiRrZXkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXR0eXBlKCRhdXRob3IpLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV0pOwpjb250aW51ZTsKfQpmb3JlYWNoIChbJ2hvbWVwYWdlJywgJ2VtYWlsJywgJ25hbWUnLCAncm9sZSddIGFzICRhdXRob3JEYXRhKSB7CmlmIChpc3NldCgkYXV0aG9yWyRhdXRob3JEYXRhXSkgJiYgIWlzX3N0cmluZygkYXV0aG9yWyRhdXRob3JEYXRhXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicuJy4kYXV0aG9yRGF0YS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XVskYXV0aG9yRGF0YV0pOwp9Cn0KaWYgKGlzc2V0KCRhdXRob3JbJ2hvbWVwYWdlJ10pICYmICEkdGhpcy0+ZmlsdGVyVXJsKCRhdXRob3JbJ2hvbWVwYWdlJ10pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicuaG9tZXBhZ2UgOiBpbnZhbGlkIHZhbHVlICgnLiRhdXRob3JbJ2hvbWVwYWdlJ10uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV1bJ2hvbWVwYWdlJ10pOwp9CmlmIChpc3NldCgkYXV0aG9yWydlbWFpbCddKSAmJiBmYWxzZSA9PT0gZmlsdGVyX3ZhcigkYXV0aG9yWydlbWFpbCddLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicuZW1haWwgOiBpbnZhbGlkIHZhbHVlICgnLiRhdXRob3JbJ2VtYWlsJ10uJyksIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldWydlbWFpbCddKTsKfQppZiAoXGNvdW50KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XSkgPT09IDApIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldKTsKfQp9CmlmIChcY291bnQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddKSA9PT0gMCkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ10pOwp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnc3VwcG9ydCcpICYmICFlbXB0eSgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J10pKSB7CmZvcmVhY2ggKFsnaXNzdWVzJywgJ2ZvcnVtJywgJ3dpa2knLCAnc291cmNlJywgJ2VtYWlsJywgJ2lyYycsICdkb2NzJywgJ3JzcycsICdjaGF0JywgJ3NlY3VyaXR5J10gYXMgJGtleSkgewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3N1cHBvcnQuJy4ka2V5LicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKTsKfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydlbWFpbCddKSAmJiAhZmlsdGVyX3ZhcigkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2VtYWlsJ10sIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnc3VwcG9ydC5lbWFpbCA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydlbWFpbCddLicpLCBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnZW1haWwnXSk7Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddKSAmJiAhJHRoaXMtPmZpbHRlclVybCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddLCBbJ2lyYycsICdpcmNzJ10pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ3N1cHBvcnQuaXJjIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddLicpLCBtdXN0IGJlIGEgaXJjOi8vPHNlcnZlcj4vPGNoYW5uZWw+IG9yIGlyY3M6Ly8gVVJMJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydpcmMnXSk7Cn0KCmZvcmVhY2ggKFsnaXNzdWVzJywgJ2ZvcnVtJywgJ3dpa2knLCAnc291cmNlJywgJ2RvY3MnLCAnY2hhdCcsICdzZWN1cml0eSddIGFzICRrZXkpIHsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSkgJiYgISR0aGlzLT5maWx0ZXJVcmwoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdzdXBwb3J0LicuJGtleS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pOwp9Cn0KaWYgKGVtcHR5KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXSkpIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddKTsKfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2Z1bmRpbmcnKSAmJiAhZW1wdHkoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddKSkgewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ10gYXMgJGtleSA9PiAkZnVuZGluZ09wdGlvbikgewppZiAoIWlzX2FycmF5KCRmdW5kaW5nT3B0aW9uKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnZnVuZGluZy4nLiRrZXkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXR0eXBlKCRmdW5kaW5nT3B0aW9uKS4nIGdpdmVuJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddWyRrZXldKTsKY29udGludWU7Cn0KZm9yZWFjaCAoWyd0eXBlJywgJ3VybCddIGFzICRmdW5kaW5nRGF0YSkgewppZiAoaXNzZXQoJGZ1bmRpbmdPcHRpb25bJGZ1bmRpbmdEYXRhXSkgJiYgIWlzX3N0cmluZygkZnVuZGluZ09wdGlvblskZnVuZGluZ0RhdGFdKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnZnVuZGluZy4nLiRrZXkuJy4nLiRmdW5kaW5nRGF0YS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XVskZnVuZGluZ0RhdGFdKTsKfQp9CmlmIChpc3NldCgkZnVuZGluZ09wdGlvblsndXJsJ10pICYmICEkdGhpcy0+ZmlsdGVyVXJsKCRmdW5kaW5nT3B0aW9uWyd1cmwnXSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZnVuZGluZy4nLiRrZXkuJy51cmwgOiBpbnZhbGlkIHZhbHVlICgnLiRmdW5kaW5nT3B0aW9uWyd1cmwnXS4nKSwgbXVzdCBiZSBhbiBodHRwL2h0dHBzIFVSTCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XVsndXJsJ10pOwp9CmlmIChlbXB0eSgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV0pKSB7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XSk7Cn0KfQppZiAoZW1wdHkoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddKSkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ10pOwp9Cn0KCiR1bmJvdW5kQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJzEwMDAwMDAwLWRldicpOwoKZm9yZWFjaCAoYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcykgYXMgJGxpbmtUeXBlKSB7CmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgkbGlua1R5cGUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CiRwYWNrYWdlID0gKHN0cmluZykgJHBhY2thZ2U7CmlmICgwID09PSBzdHJjYXNlY21wKCRwYWNrYWdlLCAkdGhpcy0+Y29uZmlnWyduYW1lJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IGEgcGFja2FnZSBjYW5ub3Qgc2V0IGEgJy4kbGlua1R5cGUuJyBvbiBpdHNlbGYnOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV1bJHBhY2thZ2VdKTsKY29udGludWU7Cn0KaWYgKCRlcnIgPSBzZWxmOjpoYXNQYWNrYWdlTmFtaW5nRXJyb3IoJHBhY2thZ2UsIHRydWUpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJGxpbmtUeXBlLicuJy4kZXJyOwp9IGVsc2VpZiAoIVByZWc6OmlzTWF0Y2goJ3teW0EtWmEtejAtOV8uLy1dKyR9JywgJHBhY2thZ2UpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IGludmFsaWQga2V5LCBwYWNrYWdlIG5hbWVzIG11c3QgYmUgc3RyaW5ncyBjb250YWluaW5nIG9ubHkgW0EtWmEtejAtOV8uLy1dJzsKfQppZiAoIWlzX3N0cmluZygkY29uc3RyYWludCkpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgdmVyc2lvbiBjb25zdHJhaW50JzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdWyRwYWNrYWdlXSk7Cn0gZWxzZWlmICgnc2VsZi52ZXJzaW9uJyAhPT0gJGNvbnN0cmFpbnQpIHsKdHJ5IHsKJGxpbmtDb25zdHJhaW50ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IGludmFsaWQgdmVyc2lvbiBjb25zdHJhaW50ICgnLiRlLT5nZXRNZXNzYWdlKCkuJyknOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV1bJHBhY2thZ2VdKTsKY29udGludWU7Cn0KCgppZiAoCigkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpDSEVDS19VTkJPVU5EX0NPTlNUUkFJTlRTKQomJiAncmVxdWlyZScgPT09ICRsaW5rVHlwZQomJiAkbGlua0NvbnN0cmFpbnQtPm1hdGNoZXMoJHVuYm91bmRDb25zdHJhaW50KQomJiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZSkKKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogdW5ib3VuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICgnLiRjb25zdHJhaW50LicpIHNob3VsZCBiZSBhdm9pZGVkJzsKfSBlbHNlaWYgKAoKKCR0aGlzLT5mbGFncyAmIHNlbGY6OkNIRUNLX1NUUklDVF9DT05TVFJBSU5UUykKJiYgJ3JlcXVpcmUnID09PSAkbGlua1R5cGUKJiYgJGxpbmtDb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiBpbl9hcnJheSgkbGlua0NvbnN0cmFpbnQtPmdldE9wZXJhdG9yKCksIFsnPT0nLCAnPSddLCB0cnVlKQomJiAobmV3IENvbnN0cmFpbnQoJz49JywgJzEuMC4wLjAtZGV2JykpLT5tYXRjaGVzKCRsaW5rQ29uc3RyYWludCkKKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogZXhhY3QgdmVyc2lvbiBjb25zdHJhaW50cyAoJy4kY29uc3RyYWludC4nKSBzaG91bGQgYmUgYXZvaWRlZCBpZiB0aGUgcGFja2FnZSBmb2xsb3dzIHNlbWFudGljIHZlcnNpb25pbmcnOwp9Cn0KCmlmICgkbGlua1R5cGUgPT09ICdjb25mbGljdCcgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1sncmVwbGFjZSddKSAmJiAka2V5cyA9IGFycmF5X2ludGVyc2VjdF9rZXkoJHRoaXMtPmNvbmZpZ1sncmVwbGFjZSddLCAkdGhpcy0+Y29uZmlnWydjb25mbGljdCddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiB5b3UgY2Fubm90IGNvbmZsaWN0IHdpdGggYSBwYWNrYWdlIHRoYXQgaXMgYWxzbyByZXBsYWNlZCwgYXMgcmVwbGFjZSBhbHJlYWR5IGNyZWF0ZXMgYW4gaW1wbGljaXQgY29uZmxpY3QgcnVsZSc7CnVuc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXVskcGFja2FnZV0pOwp9Cn0KfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3N1Z2dlc3QnKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydzdWdnZXN0J10pKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25maWdbJ3N1Z2dlc3QnXSBhcyAkcGFja2FnZSA9PiAkZGVzY3JpcHRpb24pIHsKaWYgKCFpc19zdHJpbmcoJGRlc2NyaXB0aW9uKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnc3VnZ2VzdC4nLiRwYWNrYWdlLicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nIGRlc2NyaWJpbmcgd2h5IHRoZSBwYWNrYWdlIGlzIHN1Z2dlc3RlZCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1Z2dlc3QnXVskcGFja2FnZV0pOwp9Cn0KfQoKaWYgKCR0aGlzLT52YWxpZGF0ZVN0cmluZygnbWluaW11bS1zdGFiaWxpdHknKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKSkgewppZiAoIWlzc2V0KEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXNbc3RydG9sb3dlcigkdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKV0pICYmICR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10gIT09ICdSQycpIHsKJHRoaXMtPmVycm9yc1tdID0gJ21pbmltdW0tc3RhYmlsaXR5IDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddLicpLCBtdXN0IGJlIG9uZSBvZiAnLmltcGxvZGUoJywgJywgYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6JHN0YWJpbGl0aWVzKSk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pOwp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnYXV0b2xvYWQnKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddKSkgewokdHlwZXMgPSBbJ3Bzci0wJywgJ3Bzci00JywgJ2NsYXNzbWFwJywgJ2ZpbGVzJywgJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddIGFzICR0eXBlID0+ICR0eXBlQ29uZmlnKSB7CmlmICghaW5fYXJyYXkoJHR5cGUsICR0eXBlcykpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dG9sb2FkIDogaW52YWxpZCB2YWx1ZSAoJy4kdHlwZS4nKSwgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsICR0eXBlcyk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dG9sb2FkJ11bJHR5cGVdKTsKfQppZiAoJHR5cGUgPT09ICdwc3ItNCcpIHsKZm9yZWFjaCAoJHR5cGVDb25maWcgYXMgJG5hbWVzcGFjZSA9PiAkZGlycykgewppZiAoJG5hbWVzcGFjZSAhPT0gJycgJiYgJ1xcJyAhPT0gc3Vic3RyKChzdHJpbmcpICRuYW1lc3BhY2UsIC0xKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnYXV0b2xvYWQucHNyLTQgOiBpbnZhbGlkIHZhbHVlICgnLiRuYW1lc3BhY2UuJyksIG5hbWVzcGFjZXMgbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IsIHNob3VsZCBiZSAnLiRuYW1lc3BhY2UuJ1xcXFwnOwp9Cn0KfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddWydwc3ItNCddKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyd0YXJnZXQtZGlyJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICd0YXJnZXQtZGlyIDogdGhpcyBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgYXV0b2xvYWQucHNyLTQgc2V0dGluZywgcmVtb3ZlIHRhcmdldC1kaXIgdG8gdXBncmFkZSB0byBwc3ItNCc7CgoKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0b2xvYWQnXVsncHNyLTQnXSk7Cn0KCmZvcmVhY2ggKFsnc291cmNlJywgJ2Rpc3QnXSBhcyAkc3JjVHlwZSkgewppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJHNyY1R5cGUpICYmICFlbXB0eSgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndHlwZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcudHlwZSA6IG11c3QgYmUgcHJlc2VudCc7Cn0KaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy51cmwgOiBtdXN0IGJlIHByZXNlbnQnOwp9CmlmICgkc3JjVHlwZSA9PT0gJ3NvdXJjZScgJiYgIWlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnJlZmVyZW5jZSA6IG11c3QgYmUgcHJlc2VudCc7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd0eXBlJ10pICYmICFpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3R5cGUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnR5cGUgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0dHlwZSgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndHlwZSddKS4nIGdpdmVuJzsKfQppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3VybCddKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnVybCA6IHNob3VsZCBiZSBhIHN0cmluZywgJy5nZXR0eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pICYmICFpc19pbnQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3JlZmVyZW5jZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcucmVmZXJlbmNlIDogc2hvdWxkIGJlIGEgc3RyaW5nIG9yIGludCwgJy5nZXR0eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccyotfScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnJlZmVyZW5jZSA6IG11c3Qgbm90IHN0YXJ0IHdpdGggYSAiLSIsICInLiR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXS4nIiBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccyotfScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnVybCA6IG11c3Qgbm90IHN0YXJ0IHdpdGggYSAiLSIsICInLiR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXS4nIiBnaXZlbic7Cn0KfQp9CgoKCgokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2luY2x1ZGUtcGF0aCcpOwokdGhpcy0+dmFsaWRhdGVBcnJheSgndHJhbnNwb3J0LW9wdGlvbnMnKTsKCgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMgOiBtdXN0IGJlIGFuIGFycmF5IG9mIHZlcnNpb25zID0+IGFsaWFzZXMnOwp9IGVsc2Ugewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSBhcyAkc291cmNlQnJhbmNoID0+ICR0YXJnZXRCcmFuY2gpIHsKaWYgKCFpc19zdHJpbmcoJHRhcmdldEJyYW5jaCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuanNvbl9lbmNvZGUoJHRhcmdldEJyYW5jaCkuJykgbXVzdCBiZSBhIHN0cmluZywgIicuZ2V0dHlwZSgkdGFyZ2V0QnJhbmNoKS4nIiByZWNlaXZlZC4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXVskc291cmNlQnJhbmNoXSk7Cgpjb250aW51ZTsKfQoKCmlmICgnLWRldicgIT09IHN1YnN0cigkdGFyZ2V0QnJhbmNoLCAtNCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuJHRhcmdldEJyYW5jaC4nKSBtdXN0IGVuZCBpbiAtZGV2JzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHNvdXJjZUJyYW5jaF0pOwoKY29udGludWU7Cn0KCgokdmFsaWRhdGVkVGFyZ2V0QnJhbmNoID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaChzdWJzdHIoJHRhcmdldEJyYW5jaCwgMCwgLTQpKTsKaWYgKCctZGV2JyAhPT0gc3Vic3RyKCR2YWxpZGF0ZWRUYXJnZXRCcmFuY2gsIC00KSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMuJy4kc291cmNlQnJhbmNoLicgOiB0aGUgdGFyZ2V0IGJyYW5jaCAoJy4kdGFyZ2V0QnJhbmNoLicpIG11c3QgYmUgYSBwYXJzZWFibGUgbnVtYmVyIGxpa2UgMi4wLWRldic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyRzb3VyY2VCcmFuY2hdKTsKCmNvbnRpbnVlOwp9CgoKaWYgKCgkc291cmNlUHJlZml4ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KCRzb3VyY2VCcmFuY2gpKQomJiAoJHRhcmdldFByZWZpeCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeCgkdGFyZ2V0QnJhbmNoKSkKJiYgKHN0cmlwb3MoJHRhcmdldFByZWZpeCwgJHNvdXJjZVByZWZpeCkgIT09IDApCikgewokdGhpcy0+d2FybmluZ3NbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMuJy4kc291cmNlQnJhbmNoLicgOiB0aGUgdGFyZ2V0IGJyYW5jaCAoJy4kdGFyZ2V0QnJhbmNoLicpIGlzIG5vdCBhIHZhbGlkIG51bWVyaWMgYWxpYXMgZm9yIHRoaXMgdmVyc2lvbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyRzb3VyY2VCcmFuY2hdKTsKfQp9Cn0KfQoKaWYgKCR0aGlzLT5lcnJvcnMpIHsKdGhyb3cgbmV3IEludmFsaWRQYWNrYWdlRXhjZXB0aW9uKCR0aGlzLT5lcnJvcnMsICR0aGlzLT53YXJuaW5ncywgJGNvbmZpZyk7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkdGhpcy0+Y29uZmlnLCAkY2xhc3MpOwokdGhpcy0+Y29uZmlnID0gW107CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRXYXJuaW5ncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+d2FybmluZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNQYWNrYWdlTmFtaW5nRXJyb3Ioc3RyaW5nICRuYW1lLCBib29sICRpc0xpbmsgPSBmYWxzZSk6ID9zdHJpbmcKewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICghUHJlZzo6aXNNYXRjaCgne15bYS16MC05XSg/OltfLi1dP1thLXowLTldKyspKisvW2EtejAtOV0oPzooPzpbXy5dfC17MSwyfSk/W2EtejAtOV0rKykqKyR9aUQnLCAkbmFtZSkpIHsKcmV0dXJuICRuYW1lLicgaXMgaW52YWxpZCwgaXQgc2hvdWxkIGhhdmUgYSB2ZW5kb3IgbmFtZSwgYSBmb3J3YXJkIHNsYXNoLCBhbmQgYSBwYWNrYWdlIG5hbWUuIFRoZSB2ZW5kb3IgYW5kIHBhY2thZ2UgbmFtZSBjYW4gYmUgd29yZHMgc2VwYXJhdGVkIGJ5IC0sIC4gb3IgXy4gVGhlIGNvbXBsZXRlIG5hbWUgc2hvdWxkIG1hdGNoICJeW2EtejAtOV0oW18uLV0/W2EtejAtOV0rKSovW2EtejAtOV0oKFtfLl0/fC17MCwyfSlbYS16MC05XSspKiQiLic7Cn0KCiRyZXNlcnZlZE5hbWVzID0gWydudWwnLCAnY29uJywgJ3BybicsICdhdXgnLCAnY29tMScsICdjb20yJywgJ2NvbTMnLCAnY29tNCcsICdjb201JywgJ2NvbTYnLCAnY29tNycsICdjb204JywgJ2NvbTknLCAnbHB0MScsICdscHQyJywgJ2xwdDMnLCAnbHB0NCcsICdscHQ1JywgJ2xwdDYnLCAnbHB0NycsICdscHQ4JywgJ2xwdDknXTsKJGJpdHMgPSBleHBsb2RlKCcvJywgc3RydG9sb3dlcigkbmFtZSkpOwppZiAoaW5fYXJyYXkoJGJpdHNbMF0sICRyZXNlcnZlZE5hbWVzLCB0cnVlKSB8fCBpbl9hcnJheSgkYml0c1sxXSwgJHJlc2VydmVkTmFtZXMsIHRydWUpKSB7CnJldHVybiAkbmFtZS4nIGlzIHJlc2VydmVkLCBwYWNrYWdlIGFuZCB2ZW5kb3IgbmFtZXMgY2FuIG5vdCBtYXRjaCBhbnkgb2Y6ICcuaW1wbG9kZSgnLCAnLCAkcmVzZXJ2ZWROYW1lcykuJy4nOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne1wuanNvbiR9JywgJG5hbWUpKSB7CnJldHVybiAkbmFtZS4nIGlzIGludmFsaWQsIHBhY2thZ2UgbmFtZXMgY2FuIG5vdCBlbmQgaW4gLmpzb24sIGNvbnNpZGVyIHJlbmFtaW5nIGl0IG9yIHBlcmhhcHMgdXNpbmcgYSAtanNvbiBzdWZmaXggaW5zdGVhZC4nOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne1tBLVpdfScsICRuYW1lKSkgewppZiAoJGlzTGluaykgewpyZXR1cm4gJG5hbWUuJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgbm90IGNvbnRhaW4gdXBwZXJjYXNlIGNoYXJhY3RlcnMuIFBsZWFzZSB1c2UgJy5zdHJ0b2xvd2VyKCRuYW1lKS4nIGluc3RlYWQuJzsKfQoKJHN1Z2dlc3ROYW1lID0gUHJlZzo6cmVwbGFjZSgneyg/OihbYS16XSkoW0EtWl0pfChbQS1aXSkoW0EtWl1bYS16XSkpfScsICdcXDFcXDMtXFwyXFw0JywgJG5hbWUpOwokc3VnZ2VzdE5hbWUgPSBzdHJ0b2xvd2VyKCRzdWdnZXN0TmFtZSk7CgpyZXR1cm4gJG5hbWUuJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgbm90IGNvbnRhaW4gdXBwZXJjYXNlIGNoYXJhY3RlcnMuIFdlIHN1Z2dlc3QgdXNpbmcgJy4kc3VnZ2VzdE5hbWUuJyBpbnN0ZWFkLic7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2V4KHN0cmluZyAkcHJvcGVydHksIHN0cmluZyAkcmVnZXgsIGJvb2wgJG1hbmRhdG9yeSA9IGZhbHNlKTogYm9vbAp7CmlmICghJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCRwcm9wZXJ0eSwgJG1hbmRhdG9yeSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teJy4kcmVnZXguJyR9dScsICR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKJG1lc3NhZ2UgPSAkcHJvcGVydHkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldLicpLCBtdXN0IG1hdGNoICcuJHJlZ2V4OwppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkbWVzc2FnZTsKfSBlbHNlIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbWVzc2FnZTsKfQp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyhzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHByb3BlcnR5LicgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0dHlwZSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkgfHwgdHJpbSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pID09PSAnJykgewppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IG11c3QgYmUgcHJlc2VudCc7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVBcnJheShzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSAmJiAhaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXR0eXBlKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSB8fCAhY291bnQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IG11c3QgYmUgcHJlc2VudCBhbmQgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCc7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlRmxhdEFycmF5KHN0cmluZyAkcHJvcGVydHksID9zdHJpbmcgJHJlZ2V4ID0gbnVsbCwgYm9vbCAkbWFuZGF0b3J5ID0gZmFsc2UpOiBib29sCnsKaWYgKCEkdGhpcy0+dmFsaWRhdGVBcnJheSgkcHJvcGVydHksICRtYW5kYXRvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHBhc3MgPSB0cnVlOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0gYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSAmJiAhaXNfbnVtZXJpYygkdmFsdWUpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRwcm9wZXJ0eS4nLicuJGtleS4nIDogbXVzdCBiZSBhIHN0cmluZyBvciBpbnQsICcuZ2V0dHlwZSgkdmFsdWUpLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV1bJGtleV0pOwokcGFzcyA9IGZhbHNlOwoKY29udGludWU7Cn0KCmlmICgkcmVnZXggJiYgIVByZWc6OmlzTWF0Y2goJ3teJy4kcmVnZXguJyR9dScsIChzdHJpbmcpICR2YWx1ZSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkcHJvcGVydHkuJy4nLiRrZXkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHZhbHVlLicpLCBtdXN0IG1hdGNoICcuJHJlZ2V4Owp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV1bJGtleV0pOwokcGFzcyA9IGZhbHNlOwp9Cn0KCnJldHVybiAkcGFzczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVVybChzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoISR0aGlzLT52YWxpZGF0ZVN0cmluZygkcHJvcGVydHksICRtYW5kYXRvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCEkdGhpcy0+ZmlsdGVyVXJsKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkcHJvcGVydHkuJyA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldLicpLCBtdXN0IGJlIGFuIGh0dHAvaHR0cHMgVVJMJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbHRlclVybCgkdmFsdWUsIGFycmF5ICRzY2hlbWVzID0gWydodHRwJywgJ2h0dHBzJ10pOiBib29sCnsKaWYgKCR2YWx1ZSA9PT0gJycpIHsKcmV0dXJuIHRydWU7Cn0KCiRiaXRzID0gcGFyc2VfdXJsKCR2YWx1ZSk7CmlmIChlbXB0eSgkYml0c1snc2NoZW1lJ10pIHx8IGVtcHR5KCRiaXRzWydob3N0J10pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFpbl9hcnJheSgkYml0c1snc2NoZW1lJ10sICRzY2hlbWVzLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIFNlbGRcSnNvbkxpbnRcUGFyc2luZ0V4Y2VwdGlvbjsKCgoKCgoKCmNsYXNzIExvY2tlcgp7Cgpwcml2YXRlICRsb2NrRmlsZTsKCnByaXZhdGUgJGluc3RhbGxhdGlvbk1hbmFnZXI7Cgpwcml2YXRlICRoYXNoOwoKcHJpdmF0ZSAkY29udGVudEhhc2g7Cgpwcml2YXRlICRsb2FkZXI7Cgpwcml2YXRlICRkdW1wZXI7Cgpwcml2YXRlICRwcm9jZXNzOwoKcHJpdmF0ZSAkbG9ja0RhdGFDYWNoZSA9IG51bGw7Cgpwcml2YXRlICR2aXJ0dWFsRmlsZVdyaXR0ZW4gPSBmYWxzZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBKc29uRmlsZSAkbG9ja0ZpbGUsIEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIHN0cmluZyAkY29tcG9zZXJGaWxlQ29udGVudHMsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5sb2NrRmlsZSA9ICRsb2NrRmlsZTsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXIgPSAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKJHRoaXMtPmhhc2ggPSBtZDUoJGNvbXBvc2VyRmlsZUNvbnRlbnRzKTsKJHRoaXMtPmNvbnRlbnRIYXNoID0gc2VsZjo6Z2V0Q29udGVudEhhc2goJGNvbXBvc2VyRmlsZUNvbnRlbnRzKTsKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKTsKJHRoaXMtPmR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRlbnRIYXNoKHN0cmluZyAkY29tcG9zZXJGaWxlQ29udGVudHMpOiBzdHJpbmcKewokY29udGVudCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGNvbXBvc2VyRmlsZUNvbnRlbnRzLCAnY29tcG9zZXIuanNvbicpOwoKJHJlbGV2YW50S2V5cyA9IFsKJ25hbWUnLAondmVyc2lvbicsCidyZXF1aXJlJywKJ3JlcXVpcmUtZGV2JywKJ2NvbmZsaWN0JywKJ3JlcGxhY2UnLAoncHJvdmlkZScsCidtaW5pbXVtLXN0YWJpbGl0eScsCidwcmVmZXItc3RhYmxlJywKJ3JlcG9zaXRvcmllcycsCidleHRyYScsCl07CgokcmVsZXZhbnRDb250ZW50ID0gW107Cgpmb3JlYWNoIChhcnJheV9pbnRlcnNlY3QoJHJlbGV2YW50S2V5cywgYXJyYXlfa2V5cygkY29udGVudCkpIGFzICRrZXkpIHsKJHJlbGV2YW50Q29udGVudFska2V5XSA9ICRjb250ZW50WyRrZXldOwp9CmlmIChpc3NldCgkY29udGVudFsnY29uZmlnJ11bJ3BsYXRmb3JtJ10pKSB7CiRyZWxldmFudENvbnRlbnRbJ2NvbmZpZyddWydwbGF0Zm9ybSddID0gJGNvbnRlbnRbJ2NvbmZpZyddWydwbGF0Zm9ybSddOwp9Cgprc29ydCgkcmVsZXZhbnRDb250ZW50KTsKCnJldHVybiBtZDUoSnNvbkZpbGU6OmVuY29kZSgkcmVsZXZhbnRDb250ZW50LCAwKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0xvY2tlZCgpOiBib29sCnsKaWYgKCEkdGhpcy0+dmlydHVhbEZpbGVXcml0dGVuICYmICEkdGhpcy0+bG9ja0ZpbGUtPmV4aXN0cygpKSB7CnJldHVybiBmYWxzZTsKfQoKJGRhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiBpc3NldCgkZGF0YVsncGFja2FnZXMnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCk6IGJvb2wKewokbG9jayA9ICR0aGlzLT5sb2NrRmlsZS0+cmVhZCgpOwoKaWYgKCFlbXB0eSgkbG9ja1snY29udGVudC1oYXNoJ10pKSB7CgpyZXR1cm4gJHRoaXMtPmNvbnRlbnRIYXNoID09PSAkbG9ja1snY29udGVudC1oYXNoJ107Cn0KCgppZiAoIWVtcHR5KCRsb2NrWydoYXNoJ10pKSB7CnJldHVybiAkdGhpcy0+aGFzaCA9PT0gJGxvY2tbJ2hhc2gnXTsKfQoKCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2tlZFJlcG9zaXRvcnkoYm9vbCAkd2l0aERldlJlcXMgPSBmYWxzZSk6IExvY2tBcnJheVJlcG9zaXRvcnkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKJHBhY2thZ2VzID0gbmV3IExvY2tBcnJheVJlcG9zaXRvcnkoKTsKCiRsb2NrZWRQYWNrYWdlcyA9ICRsb2NrRGF0YVsncGFja2FnZXMnXTsKaWYgKCR3aXRoRGV2UmVxcykgewppZiAoaXNzZXQoJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSkpIHsKJGxvY2tlZFBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJGxvY2tlZFBhY2thZ2VzLCAkbG9ja0RhdGFbJ3BhY2thZ2VzLWRldiddKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgbG9jayBmaWxlIGRvZXMgbm90IGNvbnRhaW4gcmVxdWlyZS1kZXYgaW5mb3JtYXRpb24sIHJ1biBpbnN0YWxsIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbiBvciBkZWxldGUgaXQgYW5kIHJ1biBjb21wb3NlciB1cGRhdGUgdG8gZ2VuZXJhdGUgYSBuZXcgbG9jayBmaWxlLicpOwp9Cn0KCmlmIChlbXB0eSgkbG9ja2VkUGFja2FnZXMpKSB7CnJldHVybiAkcGFja2FnZXM7Cn0KCmlmIChpc3NldCgkbG9ja2VkUGFja2FnZXNbMF1bJ25hbWUnXSkpIHsKJHBhY2thZ2VCeU5hbWUgPSBbXTsKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2VzIGFzICRpbmZvKSB7CiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkaW5mbyk7CiRwYWNrYWdlcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7CiRwYWNrYWdlQnlOYW1lWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2VCeU5hbWVbJHBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KfQoKaWYgKGlzc2V0KCRsb2NrRGF0YVsnYWxpYXNlcyddKSkgewpmb3JlYWNoICgkbG9ja0RhdGFbJ2FsaWFzZXMnXSBhcyAkYWxpYXMpIHsKaWYgKGlzc2V0KCRwYWNrYWdlQnlOYW1lWyRhbGlhc1sncGFja2FnZSddXSkpIHsKJGFsaWFzUGtnID0gbmV3IENvbXBsZXRlQWxpYXNQYWNrYWdlKCRwYWNrYWdlQnlOYW1lWyRhbGlhc1sncGFja2FnZSddXSwgJGFsaWFzWydhbGlhc19ub3JtYWxpemVkJ10sICRhbGlhc1snYWxpYXMnXSk7CiRhbGlhc1BrZy0+c2V0Um9vdFBhY2thZ2VBbGlhcyh0cnVlKTsKJHBhY2thZ2VzLT5hZGRQYWNrYWdlKCRhbGlhc1BrZyk7Cn0KfQp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdXIgY29tcG9zZXIubG9jayBpcyBpbnZhbGlkLiBSdW4gImNvbXBvc2VyIHVwZGF0ZSIgdG8gZ2VuZXJhdGUgYSBuZXcgb25lLicpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UGFja2FnZU5hbWVzKCk6IGFycmF5CnsKJG5hbWVzID0gW107CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwppZiAoaXNzZXQoJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSkpIHsKZm9yZWFjaCAoJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSBhcyAkcGFja2FnZSkgewokbmFtZXNbXSA9IHN0cnRvbG93ZXIoJHBhY2thZ2VbJ25hbWUnXSk7Cn0KfQoKcmV0dXJuICRuYW1lczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsYXRmb3JtUmVxdWlyZW1lbnRzKGJvb2wgJHdpdGhEZXZSZXFzID0gZmFsc2UpOiBhcnJheQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwokcmVxdWlyZW1lbnRzID0gW107CgppZiAoIWVtcHR5KCRsb2NrRGF0YVsncGxhdGZvcm0nXSkpIHsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5sb2FkZXItPnBhcnNlTGlua3MoCidfX3Jvb3RfXycsCicxLjAuMCcsCkxpbms6OlRZUEVfUkVRVUlSRSwKJGxvY2tEYXRhWydwbGF0Zm9ybSddID8/IFtdCik7Cn0KCmlmICgkd2l0aERldlJlcXMgJiYgIWVtcHR5KCRsb2NrRGF0YVsncGxhdGZvcm0tZGV2J10pKSB7CiRkZXZSZXF1aXJlbWVudHMgPSAkdGhpcy0+bG9hZGVyLT5wYXJzZUxpbmtzKAonX19yb290X18nLAonMS4wLjAnLApMaW5rOjpUWVBFX1JFUVVJUkUsCiRsb2NrRGF0YVsncGxhdGZvcm0tZGV2J10gPz8gW10KKTsKCiRyZXF1aXJlbWVudHMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZW1lbnRzLCAkZGV2UmVxdWlyZW1lbnRzKTsKfQoKcmV0dXJuICRyZXF1aXJlbWVudHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZwp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsnbWluaW11bS1zdGFiaWxpdHknXSA/PyAnc3RhYmxlJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eUZsYWdzKCk6IGFycmF5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydzdGFiaWxpdHktZmxhZ3MnXSA/PyBbXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlclN0YWJsZSgpOiA/Ym9vbAp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKCgpyZXR1cm4gJGxvY2tEYXRhWydwcmVmZXItc3RhYmxlJ10gPz8gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlckxvd2VzdCgpOiA/Ym9vbAp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKCgpyZXR1cm4gJGxvY2tEYXRhWydwcmVmZXItbG93ZXN0J10gPz8gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsYXRmb3JtT3ZlcnJpZGVzKCk6IGFycmF5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydwbGF0Zm9ybS1vdmVycmlkZXMnXSA/PyBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpOiBhcnJheQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsnYWxpYXNlcyddID8/IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2luQXBpKCkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiAkbG9ja0RhdGFbJ3BsdWdpbi1hcGktdmVyc2lvbiddID8/ICcxLjEuMCc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrRGF0YSgpOiBhcnJheQp7CmlmIChudWxsICE9PSAkdGhpcy0+bG9ja0RhdGFDYWNoZSkgewpyZXR1cm4gJHRoaXMtPmxvY2tEYXRhQ2FjaGU7Cn0KCmlmICghJHRoaXMtPmxvY2tGaWxlLT5leGlzdHMoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyBsb2NrZmlsZSBmb3VuZC4gVW5hYmxlIHRvIHJlYWQgbG9ja2VkIHBhY2thZ2VzJyk7Cn0KCnJldHVybiAkdGhpcy0+bG9ja0RhdGFDYWNoZSA9ICR0aGlzLT5sb2NrRmlsZS0+cmVhZCgpOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NrRGF0YShhcnJheSAkcGFja2FnZXMsID9hcnJheSAkZGV2UGFja2FnZXMsIGFycmF5ICRwbGF0Zm9ybVJlcXMsIGFycmF5ICRwbGF0Zm9ybURldlJlcXMsIGFycmF5ICRhbGlhc2VzLCBzdHJpbmcgJG1pbmltdW1TdGFiaWxpdHksIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYm9vbCAkcHJlZmVyU3RhYmxlLCBib29sICRwcmVmZXJMb3dlc3QsIGFycmF5ICRwbGF0Zm9ybU92ZXJyaWRlcywgYm9vbCAkd3JpdGUgPSB0cnVlKTogYm9vbAp7CgoKJGFsaWFzZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkYWxpYXMpOiBhcnJheSB7CmlmIChpbl9hcnJheSgkYWxpYXNbJ3ZlcnNpb24nXSwgWydkZXYtbWFzdGVyJywgJ2Rldi10cnVuaycsICdkZXYtZGVmYXVsdCddLCB0cnVlKSkgewokYWxpYXNbJ3ZlcnNpb24nXSA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9CgpyZXR1cm4gJGFsaWFzOwp9LCAkYWxpYXNlcyk7CgokbG9jayA9IFsKJ19yZWFkbWUnID0+IFsnVGhpcyBmaWxlIGxvY2tzIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0IHRvIGEga25vd24gc3RhdGUnLAonUmVhZCBtb3JlIGFib3V0IGl0IGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMS1iYXNpYy11c2FnZS5tZCNpbnN0YWxsaW5nLWRlcGVuZGVuY2llcycsCidUaGlzIGZpbGUgaXMgQGdlbmVyJy4nYXRlZCBhdXRvbWF0aWNhbGx5JywgXSwKJ2NvbnRlbnQtaGFzaCcgPT4gJHRoaXMtPmNvbnRlbnRIYXNoLAoncGFja2FnZXMnID0+IG51bGwsCidwYWNrYWdlcy1kZXYnID0+IG51bGwsCidhbGlhc2VzJyA9PiAkYWxpYXNlcywKJ21pbmltdW0tc3RhYmlsaXR5JyA9PiAkbWluaW11bVN0YWJpbGl0eSwKJ3N0YWJpbGl0eS1mbGFncycgPT4gJHN0YWJpbGl0eUZsYWdzLAoncHJlZmVyLXN0YWJsZScgPT4gJHByZWZlclN0YWJsZSwKJ3ByZWZlci1sb3dlc3QnID0+ICRwcmVmZXJMb3dlc3QsCl07CgokbG9ja1sncGFja2FnZXMnXSA9ICR0aGlzLT5sb2NrUGFja2FnZXMoJHBhY2thZ2VzKTsKaWYgKG51bGwgIT09ICRkZXZQYWNrYWdlcykgewokbG9ja1sncGFja2FnZXMtZGV2J10gPSAkdGhpcy0+bG9ja1BhY2thZ2VzKCRkZXZQYWNrYWdlcyk7Cn0KCiRsb2NrWydwbGF0Zm9ybSddID0gJHBsYXRmb3JtUmVxczsKJGxvY2tbJ3BsYXRmb3JtLWRldiddID0gJHBsYXRmb3JtRGV2UmVxczsKaWYgKFxjb3VudCgkcGxhdGZvcm1PdmVycmlkZXMpID4gMCkgewokbG9ja1sncGxhdGZvcm0tb3ZlcnJpZGVzJ10gPSAkcGxhdGZvcm1PdmVycmlkZXM7Cn0KJGxvY2tbJ3BsdWdpbi1hcGktdmVyc2lvbiddID0gUGx1Z2luSW50ZXJmYWNlOjpQTFVHSU5fQVBJX1ZFUlNJT047Cgp0cnkgewokaXNMb2NrZWQgPSAkdGhpcy0+aXNMb2NrZWQoKTsKfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiAkZSkgewokaXNMb2NrZWQgPSBmYWxzZTsKfQppZiAoISRpc0xvY2tlZCB8fCAkbG9jayAhPT0gJHRoaXMtPmdldExvY2tEYXRhKCkpIHsKaWYgKCR3cml0ZSkgewokdGhpcy0+bG9ja0ZpbGUtPndyaXRlKCRsb2NrKTsKJHRoaXMtPmxvY2tEYXRhQ2FjaGUgPSBudWxsOwokdGhpcy0+dmlydHVhbEZpbGVXcml0dGVuID0gZmFsc2U7Cn0gZWxzZSB7CiR0aGlzLT52aXJ0dWFsRmlsZVdyaXR0ZW4gPSB0cnVlOwokdGhpcy0+bG9ja0RhdGFDYWNoZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oSnNvbkZpbGU6OmVuY29kZSgkbG9jaykpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2NrUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewokbG9ja2VkID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgokbmFtZSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiR2ZXJzaW9uID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKCmlmICghJG5hbWUgfHwgISR2ZXJzaW9uKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZigKJ1BhY2thZ2UgIiVzIiBoYXMgbm8gdmVyc2lvbiBvciBuYW1lIGFuZCBjYW4gbm90IGJlIGxvY2tlZCcsCiRwYWNrYWdlCikpOwp9Cgokc3BlYyA9ICR0aGlzLT5kdW1wZXItPmR1bXAoJHBhY2thZ2UpOwp1bnNldCgkc3BlY1sndmVyc2lvbl9ub3JtYWxpemVkJ10pOwoKCiR0aW1lID0gJHNwZWNbJ3RpbWUnXSA/PyBudWxsOwp1bnNldCgkc3BlY1sndGltZSddKTsKaWYgKCRwYWNrYWdlLT5pc0RldigpICYmICRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSA9PT0gJ3NvdXJjZScpIHsKCiR0aW1lID0gJHRoaXMtPmdldFBhY2thZ2VUaW1lKCRwYWNrYWdlKSA/OiAkdGltZTsKfQppZiAobnVsbCAhPT0gJHRpbWUpIHsKJHNwZWNbJ3RpbWUnXSA9ICR0aW1lOwp9Cgp1bnNldCgkc3BlY1snaW5zdGFsbGF0aW9uLXNvdXJjZSddKTsKCiRsb2NrZWRbXSA9ICRzcGVjOwp9Cgp1c29ydCgkbG9ja2VkLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgewokY29tcGFyaXNvbiA9IHN0cmNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsKCmlmICgwICE9PSAkY29tcGFyaXNvbikgewpyZXR1cm4gJGNvbXBhcmlzb247Cn0KCgpyZXR1cm4gc3RyY21wKCRhWyd2ZXJzaW9uJ10sICRiWyd2ZXJzaW9uJ10pOwp9KTsKCnJldHVybiAkbG9ja2VkOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VUaW1lKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnJldHVybiBudWxsOwp9CgokcGF0aCA9ICR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmICgkcGF0aCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQokcGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKJHNvdXJjZVR5cGUgPSAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpOwokZGF0ZXRpbWUgPSBudWxsOwoKaWYgKCRwYXRoICYmIGluX2FycmF5KCRzb3VyY2VUeXBlLCBbJ2dpdCcsICdoZyddKSkgewokc291cmNlUmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpID86ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7CnN3aXRjaCAoJHNvdXJjZVR5cGUpIHsKY2FzZSAnZ2l0JzoKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IGxvZyAtbjEgLS1wcmV0dHk9JWN0ICcuUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHNvdXJjZVJlZikuR2l0VXRpbDo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZygkdGhpcy0+cHJvY2VzcyksICRvdXRwdXQsICRwYXRoKSAmJiBQcmVnOjppc01hdGNoKCd7XlxzKlxkK1xzKiR9JywgJG91dHB1dCkpIHsKJGRhdGV0aW1lID0gbmV3IFxEYXRlVGltZSgnQCcudHJpbSgkb3V0cHV0KSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKfQpicmVhazsKCmNhc2UgJ2hnJzoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdoZyBsb2cgLS10ZW1wbGF0ZSAie2RhdGV8aGdkYXRlfSIgLXIgJy5Qcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkc291cmNlUmVmKSwgJG91dHB1dCwgJHBhdGgpICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxkKylccyp9JywgJG91dHB1dCwgJG1hdGNoKSkgewokZGF0ZXRpbWUgPSBuZXcgXERhdGVUaW1lKCdAJy4kbWF0Y2hbMV0sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KYnJlYWs7Cn0KfQoKcmV0dXJuICRkYXRldGltZSA/ICRkYXRldGltZS0+Zm9ybWF0KERBVEVfUkZDMzMzOSkgOiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWlzc2luZ1JlcXVpcmVtZW50SW5mbyhSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkaW5jbHVkZURldik6IGFycmF5CnsKJG1pc3NpbmdSZXF1aXJlbWVudEluZm8gPSBbXTsKJG1pc3NpbmdSZXF1aXJlbWVudHMgPSBmYWxzZTsKJHNldHMgPSBbWydyZXBvJyA9PiAkdGhpcy0+Z2V0TG9ja2VkUmVwb3NpdG9yeShmYWxzZSksICdtZXRob2QnID0+ICdnZXRSZXF1aXJlcycsICdkZXNjcmlwdGlvbicgPT4gJ1JlcXVpcmVkJ11dOwppZiAoJGluY2x1ZGVEZXYgPT09IHRydWUpIHsKJHNldHNbXSA9IFsncmVwbycgPT4gJHRoaXMtPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSksICdtZXRob2QnID0+ICdnZXREZXZSZXF1aXJlcycsICdkZXNjcmlwdGlvbicgPT4gJ1JlcXVpcmVkIChpbiByZXF1aXJlLWRldiknXTsKfQokcm9vdFJlcG8gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRwYWNrYWdlKTsKCmZvcmVhY2ggKCRzZXRzIGFzICRzZXQpIHsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHNldFsncmVwbyddLCAkcm9vdFJlcG9dKTsKCmZvcmVhY2ggKGNhbGxfdXNlcl9mdW5jKFskcGFja2FnZSwgJHNldFsnbWV0aG9kJ11dKSBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICgkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJykgewpjb250aW51ZTsKfQppZiAoJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKSA9PT0gW10pIHsKJHJlc3VsdHMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkbGluay0+Z2V0VGFyZ2V0KCkpOwoKaWYgKCRyZXN1bHRzICE9PSBbXSkgewokcHJvdmlkZXIgPSByZXNldCgkcmVzdWx0cyk7CiRkZXNjcmlwdGlvbiA9ICRwcm92aWRlci0+Z2V0UHJldHR5VmVyc2lvbigpOwppZiAoJHByb3ZpZGVyLT5nZXROYW1lKCkgIT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewpmb3JlYWNoIChbJ2dldFJlcGxhY2VzJyA9PiAncmVwbGFjZWQgYXMgJXMgYnkgJXMnLCAnZ2V0UHJvdmlkZXMnID0+ICdwcm92aWRlZCBhcyAlcyBieSAlcyddIGFzICRtZXRob2QgPT4gJHRleHQpIHsKZm9yZWFjaCAoY2FsbF91c2VyX2Z1bmMoWyRwcm92aWRlciwgJG1ldGhvZF0pIGFzICRwcm92aWRlckxpbmspIHsKaWYgKCRwcm92aWRlckxpbmstPmdldFRhcmdldCgpID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJGRlc2NyaXB0aW9uID0gc3ByaW50ZigkdGV4dCwgJHByb3ZpZGVyTGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLCAkcHJvdmlkZXItPmdldFByZXR0eU5hbWUoKS4nICcuJHByb3ZpZGVyLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwpicmVhayAyOwp9Cn0KfQp9CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnLSAnIC4gJHNldFsnZGVzY3JpcHRpb24nXS4nIHBhY2thZ2UgIicgLiAkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIiBpcyBpbiB0aGUgbG9jayBmaWxlIGFzICInLiRkZXNjcmlwdGlvbi4nIiBidXQgdGhhdCBkb2VzIG5vdCBzYXRpc2Z5IHlvdXIgY29uc3RyYWludCAiJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLiciLic7Cn0gZWxzZSB7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnLSAnIC4gJHNldFsnZGVzY3JpcHRpb24nXS4nIHBhY2thZ2UgIicgLiAkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIiBpcyBub3QgcHJlc2VudCBpbiB0aGUgbG9jayBmaWxlLic7Cn0KJG1pc3NpbmdSZXF1aXJlbWVudHMgPSB0cnVlOwp9Cn0KfQoKaWYgKCRtaXNzaW5nUmVxdWlyZW1lbnRzKSB7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBjb21wb3NlciBmaWxlcyBhcmUgaW5jb3JyZWN0bHkgbWVyZ2VkIG9yIHRoZSBjb21wb3Nlci5qc29uIGZpbGUgaXMgbWFudWFsbHkgZWRpdGVkLic7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnUmVhZCBtb3JlIGFib3V0IGNvcnJlY3RseSByZXNvbHZpbmcgbWVyZ2UgY29uZmxpY3RzIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9yZXNvbHZpbmctbWVyZ2UtY29uZmxpY3RzLm1kJzsKJG1pc3NpbmdSZXF1aXJlbWVudEluZm9bXSA9ICdhbmQgcHJlZmVyIHVzaW5nIHRoZSAicmVxdWlyZSIgY29tbWFuZCBvdmVyIGVkaXRpbmcgdGhlIGNvbXBvc2VyLmpzb24gZmlsZSBkaXJlY3RseSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3JlcXVpcmUtcic7Cn0KCnJldHVybiAkbWlzc2luZ1JlcXVpcmVtZW50SW5mbzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxDb21wb3Nlck1pcnJvcjsKCgoKCgoKCgoKY2xhc3MgUGFja2FnZSBleHRlbmRzIEJhc2VQYWNrYWdlCnsKCnByb3RlY3RlZCAkdHlwZTsKCnByb3RlY3RlZCAkdGFyZ2V0RGlyOwoKcHJvdGVjdGVkICRpbnN0YWxsYXRpb25Tb3VyY2U7Cgpwcm90ZWN0ZWQgJHNvdXJjZVR5cGU7Cgpwcm90ZWN0ZWQgJHNvdXJjZVVybDsKCnByb3RlY3RlZCAkc291cmNlUmVmZXJlbmNlOwoKcHJvdGVjdGVkICRzb3VyY2VNaXJyb3JzOwoKcHJvdGVjdGVkICRkaXN0VHlwZTsKCnByb3RlY3RlZCAkZGlzdFVybDsKCnByb3RlY3RlZCAkZGlzdFJlZmVyZW5jZTsKCnByb3RlY3RlZCAkZGlzdFNoYTFDaGVja3N1bTsKCnByb3RlY3RlZCAkZGlzdE1pcnJvcnM7Cgpwcm90ZWN0ZWQgJHZlcnNpb247Cgpwcm90ZWN0ZWQgJHByZXR0eVZlcnNpb247Cgpwcm90ZWN0ZWQgJHJlbGVhc2VEYXRlOwoKcHJvdGVjdGVkICRleHRyYSA9IFtdOwoKcHJvdGVjdGVkICRiaW5hcmllcyA9IFtdOwoKcHJvdGVjdGVkICRkZXY7CgoKCgpwcm90ZWN0ZWQgJHN0YWJpbGl0eTsKCnByb3RlY3RlZCAkbm90aWZpY2F0aW9uVXJsOwoKCnByb3RlY3RlZCAkcmVxdWlyZXMgPSBbXTsKCnByb3RlY3RlZCAkY29uZmxpY3RzID0gW107Cgpwcm90ZWN0ZWQgJHByb3ZpZGVzID0gW107Cgpwcm90ZWN0ZWQgJHJlcGxhY2VzID0gW107Cgpwcm90ZWN0ZWQgJGRldlJlcXVpcmVzID0gW107Cgpwcm90ZWN0ZWQgJHN1Z2dlc3RzID0gW107CgoKCgpwcm90ZWN0ZWQgJGF1dG9sb2FkID0gW107CgoKCgpwcm90ZWN0ZWQgJGRldkF1dG9sb2FkID0gW107Cgpwcm90ZWN0ZWQgJGluY2x1ZGVQYXRocyA9IFtdOwoKcHJvdGVjdGVkICRpc0RlZmF1bHRCcmFuY2ggPSBmYWxzZTsKCnByb3RlY3RlZCAkdHJhbnNwb3J0T3B0aW9ucyA9IFtdOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUpOwoKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKJHRoaXMtPnByZXR0eVZlcnNpb24gPSAkcHJldHR5VmVyc2lvbjsKCiR0aGlzLT5zdGFiaWxpdHkgPSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbik7CiR0aGlzLT5kZXYgPSAkdGhpcy0+c3RhYmlsaXR5ID09PSAnZGV2JzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGV2KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFR5cGUoc3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT50eXBlID0gJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dHlwZSA/OiAnbGlicmFyeSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHkoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdGFiaWxpdHk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRUYXJnZXREaXIoP3N0cmluZyAkdGFyZ2V0RGlyKTogdm9pZAp7CiR0aGlzLT50YXJnZXREaXIgPSAkdGFyZ2V0RGlyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6ID9zdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhcmdldERpcikgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIGx0cmltKFByZWc6OnJlcGxhY2UoJ3sgKD86XnxbXFxcXC9dKykgXC5cLj8gKD86W1xcXFwvXSt8JCkgKD86XC5cLj8gKD86W1xcXFwvXSt8JCkgKSp9eCcsICcvJywgJHRoaXMtPnRhcmdldERpciksICcvJyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeHRyYShhcnJheSAkZXh0cmEpOiB2b2lkCnsKJHRoaXMtPmV4dHJhID0gJGV4dHJhOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0cmEoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmV4dHJhOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmluYXJpZXMoYXJyYXkgJGJpbmFyaWVzKTogdm9pZAp7CiR0aGlzLT5iaW5hcmllcyA9ICRiaW5hcmllczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJpbmFyaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5iaW5hcmllczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEluc3RhbGxhdGlvblNvdXJjZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5pbnN0YWxsYXRpb25Tb3VyY2UgPSAkdHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvblNvdXJjZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5pbnN0YWxsYXRpb25Tb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VUeXBlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZVR5cGUgPSAkdHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVR5cGUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+c291cmNlVHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZVVybCg/c3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZVVybCA9ICR1cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmwoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+c291cmNlVXJsOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlUmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+c291cmNlUmVmZXJlbmNlID0gJHJlZmVyZW5jZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVJlZmVyZW5jZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2VSZWZlcmVuY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VNaXJyb3JzKD9hcnJheSAkbWlycm9ycyk6IHZvaWQKewokdGhpcy0+c291cmNlTWlycm9ycyA9ICRtaXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlTWlycm9ycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPnNvdXJjZU1pcnJvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5nZXRVcmxzKCR0aGlzLT5zb3VyY2VVcmwsICR0aGlzLT5zb3VyY2VNaXJyb3JzLCAkdGhpcy0+c291cmNlUmVmZXJlbmNlLCAkdGhpcy0+c291cmNlVHlwZSwgJ3NvdXJjZScpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFR5cGUoP3N0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+ZGlzdFR5cGUgPSAkdHlwZSA9PT0gJycgPyBudWxsIDogJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VHlwZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kaXN0VHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RVcmwoP3N0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5kaXN0VXJsID0gJHVybCA9PT0gJycgPyBudWxsIDogJHVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RVcmwoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZGlzdFVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZAp7CiR0aGlzLT5kaXN0UmVmZXJlbmNlID0gJHJlZmVyZW5jZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RSZWZlcmVuY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZGlzdFJlZmVyZW5jZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RTaGExQ2hlY2tzdW0oP3N0cmluZyAkc2hhMWNoZWNrc3VtKTogdm9pZAp7CiR0aGlzLT5kaXN0U2hhMUNoZWNrc3VtID0gJHNoYTFjaGVja3N1bTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RTaGExQ2hlY2tzdW0oKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZGlzdFNoYTFDaGVja3N1bTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RNaXJyb3JzKD9hcnJheSAkbWlycm9ycyk6IHZvaWQKewokdGhpcy0+ZGlzdE1pcnJvcnMgPSAkbWlycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RNaXJyb3JzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+ZGlzdE1pcnJvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Z2V0VXJscygkdGhpcy0+ZGlzdFVybCwgJHRoaXMtPmRpc3RNaXJyb3JzLCAkdGhpcy0+ZGlzdFJlZmVyZW5jZSwgJHRoaXMtPmRpc3RUeXBlLCAnZGlzdCcpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dHJhbnNwb3J0T3B0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRyYW5zcG9ydE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiB2b2lkCnsKJHRoaXMtPnRyYW5zcG9ydE9wdGlvbnMgPSAkb3B0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnByZXR0eVZlcnNpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWxlYXNlRGF0ZSg/XERhdGVUaW1lSW50ZXJmYWNlICRyZWxlYXNlRGF0ZSk6IHZvaWQKewokdGhpcy0+cmVsZWFzZURhdGUgPSAkcmVsZWFzZURhdGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWxlYXNlRGF0ZSgpOiA/XERhdGVUaW1lSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZWxlYXNlRGF0ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVxdWlyZXMoYXJyYXkgJHJlcXVpcmVzKTogdm9pZAp7CmlmIChpc3NldCgkcmVxdWlyZXNbMF0pKSB7IAokcmVxdWlyZXMgPSAkdGhpcy0+Y29udmVydExpbmtzVG9NYXAoJHJlcXVpcmVzLCAnc2V0UmVxdWlyZXMnKTsKfQoKJHRoaXMtPnJlcXVpcmVzID0gJHJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25mbGljdHMoYXJyYXkgJGNvbmZsaWN0cyk6IHZvaWQKewppZiAoaXNzZXQoJGNvbmZsaWN0c1swXSkpIHsgCiRjb25mbGljdHMgPSAkdGhpcy0+Y29udmVydExpbmtzVG9NYXAoJGNvbmZsaWN0cywgJ3NldENvbmZsaWN0cycpOwp9CgokdGhpcy0+Y29uZmxpY3RzID0gJGNvbmZsaWN0czsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25mbGljdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmNvbmZsaWN0czsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvdmlkZXMoYXJyYXkgJHByb3ZpZGVzKTogdm9pZAp7CmlmIChpc3NldCgkcHJvdmlkZXNbMF0pKSB7IAokcHJvdmlkZXMgPSAkdGhpcy0+Y29udmVydExpbmtzVG9NYXAoJHByb3ZpZGVzLCAnc2V0UHJvdmlkZXMnKTsKfQoKJHRoaXMtPnByb3ZpZGVzID0gJHByb3ZpZGVzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wcm92aWRlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwbGFjZXMoYXJyYXkgJHJlcGxhY2VzKTogdm9pZAp7CmlmIChpc3NldCgkcmVwbGFjZXNbMF0pKSB7IAokcmVwbGFjZXMgPSAkdGhpcy0+Y29udmVydExpbmtzVG9NYXAoJHJlcGxhY2VzLCAnc2V0UmVwbGFjZXMnKTsKfQoKJHRoaXMtPnJlcGxhY2VzID0gJHJlcGxhY2VzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBsYWNlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UmVxdWlyZXMoYXJyYXkgJGRldlJlcXVpcmVzKTogdm9pZAp7CmlmIChpc3NldCgkZGV2UmVxdWlyZXNbMF0pKSB7IAokZGV2UmVxdWlyZXMgPSAkdGhpcy0+Y29udmVydExpbmtzVG9NYXAoJGRldlJlcXVpcmVzLCAnc2V0RGV2UmVxdWlyZXMnKTsKfQoKJHRoaXMtPmRldlJlcXVpcmVzID0gJGRldlJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRldlJlcXVpcmVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdWdnZXN0cyhhcnJheSAkc3VnZ2VzdHMpOiB2b2lkCnsKJHRoaXMtPnN1Z2dlc3RzID0gJHN1Z2dlc3RzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VnZ2VzdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN1Z2dlc3RzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkKGFycmF5ICRhdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+YXV0b2xvYWQgPSAkYXV0b2xvYWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YXV0b2xvYWQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2QXV0b2xvYWQoYXJyYXkgJGRldkF1dG9sb2FkKTogdm9pZAp7CiR0aGlzLT5kZXZBdXRvbG9hZCA9ICRkZXZBdXRvbG9hZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldkF1dG9sb2FkKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kZXZBdXRvbG9hZDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5jbHVkZVBhdGhzKGFycmF5ICRpbmNsdWRlUGF0aHMpOiB2b2lkCnsKJHRoaXMtPmluY2x1ZGVQYXRocyA9ICRpbmNsdWRlUGF0aHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbmNsdWRlUGF0aHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmluY2x1ZGVQYXRoczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE5vdGlmaWNhdGlvblVybChzdHJpbmcgJG5vdGlmaWNhdGlvblVybCk6IHZvaWQKewokdGhpcy0+bm90aWZpY2F0aW9uVXJsID0gJG5vdGlmaWNhdGlvblVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvblVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5ub3RpZmljYXRpb25Vcmw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRJc0RlZmF1bHRCcmFuY2goYm9vbCAkZGVmYXVsdEJyYW5jaCk6IHZvaWQKewokdGhpcy0+aXNEZWZhdWx0QnJhbmNoID0gJGRlZmF1bHRCcmFuY2g7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlZmF1bHRCcmFuY2goKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aXNEZWZhdWx0QnJhbmNoOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlRGlzdFJlZmVyZW5jZXMoc3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPnNldFNvdXJjZVJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKCgoKaWYgKAokdGhpcy0+Z2V0RGlzdFVybCgpICE9PSBudWxsCiYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vKD86KD86d3d3XC4pP2JpdGJ1Y2tldFwub3JnfChhcGlcLik/Z2l0aHViXC5jb218KD86d3d3XC4pP2dpdGxhYlwuY29tKS99aScsICR0aGlzLT5nZXREaXN0VXJsKCkpCikgewokdGhpcy0+c2V0RGlzdFJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKJHRoaXMtPnNldERpc3RVcmwoUHJlZzo6cmVwbGFjZSgneyg/PD0vfHNoYT0pW2EtZjAtOV17NDB9KD89L3wkKX1pJywgJHJlZmVyZW5jZSwgJHRoaXMtPmdldERpc3RVcmwoKSkpOwp9IGVsc2VpZiAoJHRoaXMtPmdldERpc3RSZWZlcmVuY2UoKSkgeyAKJHRoaXMtPnNldERpc3RSZWZlcmVuY2UoJHJlZmVyZW5jZSk7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlVmVyc2lvbihzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbik6IHZvaWQKewokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+cHJldHR5VmVyc2lvbiA9ICRwcmV0dHlWZXJzaW9uOwoKJHRoaXMtPnN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKTsKJHRoaXMtPmRldiA9ICR0aGlzLT5zdGFiaWxpdHkgPT09ICdkZXYnOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFVybHMoP3N0cmluZyAkdXJsLCA/YXJyYXkgJG1pcnJvcnMsID9zdHJpbmcgJHJlZiwgP3N0cmluZyAkdHlwZSwgc3RyaW5nICR1cmxUeXBlKTogYXJyYXkKewppZiAoISR1cmwpIHsKcmV0dXJuIFtdOwp9CgppZiAoJHVybFR5cGUgPT09ICdkaXN0JyAmJiBmYWxzZSAhPT0gc3RycG9zKCR1cmwsICclJykpIHsKJHVybCA9IENvbXBvc2VyTWlycm9yOjpwcm9jZXNzVXJsKCR1cmwsICR0aGlzLT5uYW1lLCAkdGhpcy0+dmVyc2lvbiwgJHJlZiwgJHR5cGUsICR0aGlzLT5wcmV0dHlWZXJzaW9uKTsKfQoKJHVybHMgPSBbJHVybF07CmlmICgkbWlycm9ycykgewpmb3JlYWNoICgkbWlycm9ycyBhcyAkbWlycm9yKSB7CmlmICgkdXJsVHlwZSA9PT0gJ2Rpc3QnKSB7CiRtaXJyb3JVcmwgPSBDb21wb3Nlck1pcnJvcjo6cHJvY2Vzc1VybCgkbWlycm9yWyd1cmwnXSwgJHRoaXMtPm5hbWUsICR0aGlzLT52ZXJzaW9uLCAkcmVmLCAkdHlwZSwgJHRoaXMtPnByZXR0eVZlcnNpb24pOwp9IGVsc2VpZiAoJHVybFR5cGUgPT09ICdzb3VyY2UnICYmICR0eXBlID09PSAnZ2l0JykgewokbWlycm9yVXJsID0gQ29tcG9zZXJNaXJyb3I6OnByb2Nlc3NHaXRVcmwoJG1pcnJvclsndXJsJ10sICR0aGlzLT5uYW1lLCAkdXJsLCAkdHlwZSk7Cn0gZWxzZWlmICgkdXJsVHlwZSA9PT0gJ3NvdXJjZScgJiYgJHR5cGUgPT09ICdoZycpIHsKJG1pcnJvclVybCA9IENvbXBvc2VyTWlycm9yOjpwcm9jZXNzSGdVcmwoJG1pcnJvclsndXJsJ10sICR0aGlzLT5uYW1lLCAkdXJsLCAkdHlwZSk7Cn0gZWxzZSB7CmNvbnRpbnVlOwp9CmlmICghXGluX2FycmF5KCRtaXJyb3JVcmwsICR1cmxzKSkgewokZnVuYyA9ICRtaXJyb3JbJ3ByZWZlcnJlZCddID8gJ2FycmF5X3Vuc2hpZnQnIDogJ2FycmF5X3B1c2gnOwokZnVuYygkdXJscywgJG1pcnJvclVybCk7Cn0KfQp9CgpyZXR1cm4gJHVybHM7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbnZlcnRMaW5rc1RvTWFwKGFycmF5ICRsaW5rcywgc3RyaW5nICRzb3VyY2UpOiBhcnJheQp7CnRyaWdnZXJfZXJyb3IoJ1BhY2thZ2U6OicuJHNvdXJjZS4nIG11c3QgYmUgY2FsbGVkIHdpdGggYSBtYXAgb2YgbG93ZXJjYXNlZCBwYWNrYWdlIG5hbWUgPT4gTGluayBvYmplY3QsIGdvdCBhIGluZGV4ZWQgYXJyYXksIHRoaXMgaXMgZGVwcmVjYXRlZCBhbmQgeW91IHNob3VsZCBmaXggeW91ciB1c2FnZS4nKTsKJG5ld0xpbmtzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewokbmV3TGlua3NbJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rOwp9CgpyZXR1cm4gJG5ld0xpbmtzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwoKCgoKCgoKCgoKCmludGVyZmFjZSBQYWNrYWdlSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IERJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYgPSAwOwpwdWJsaWMgY29uc3QgRElTUExBWV9TT1VSQ0VfUkVGID0gMTsKcHVibGljIGNvbnN0IERJU1BMQVlfRElTVF9SRUYgPSAyOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKCk6IHN0cmluZzsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXMoYm9vbCAkcHJvdmlkZXMgPSB0cnVlKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWQoaW50ICRpZCk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpOiBpbnQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXYoKTogYm9vbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRyYSgpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25Tb3VyY2UoP3N0cmluZyAkdHlwZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmwoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybHMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VSZWZlcmVuY2UoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RUeXBlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJsKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJscygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RSZWZlcmVuY2UoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RTaGExQ2hlY2tzdW0oKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RNaXJyb3JzKCk6ID9hcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0TWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCk6IHN0cmluZzsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bGxQcmV0dHlWZXJzaW9uKGJvb2wgJHRydW5jYXRlID0gdHJ1ZSwgaW50ICRkaXNwbGF5TW9kZSA9IHNlbGY6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWxlYXNlRGF0ZSgpOiA/XERhdGVUaW1lSW50ZXJmYWNlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5KCk6IHN0cmluZzsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1aXJlcygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25mbGljdHMoKTogYXJyYXk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXMoKTogYXJyYXk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZXMoKTogYXJyYXk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UmVxdWlyZXMoKTogYXJyYXk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1Z2dlc3RzKCk6IGFycmF5OwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2xvYWQoKTogYXJyYXk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZBdXRvbG9hZCgpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbmNsdWRlUGF0aHMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnkoKTogP1JlcG9zaXRvcnlJbnRlcmZhY2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcmllcygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbmlxdWVOYW1lKCk6IHN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvblVybCgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpOiBzdHJpbmc7CgpwdWJsaWMgZnVuY3Rpb24gaXNEZWZhdWx0QnJhbmNoKCk6IGJvb2w7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnRPcHRpb25zKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJhbnNwb3J0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlUmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFVybCg/c3RyaW5nICR1cmwpOiB2b2lkOwoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RUeXBlKD9zdHJpbmcgJHR5cGUpOiB2b2lkOwoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VEaXN0UmVmZXJlbmNlcyhzdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQ7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7CgoKCgpjbGFzcyBSb290QWxpYXNQYWNrYWdlIGV4dGVuZHMgQ29tcGxldGVBbGlhc1BhY2thZ2UgaW1wbGVtZW50cyBSb290UGFja2FnZUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGFsaWFzT2Y7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJvb3RQYWNrYWdlICRhbGlhc09mLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRhbGlhc09mLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNPZigpCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QWxpYXNlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eUZsYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTdGFiaWxpdHlGbGFncygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVmZXJlbmNlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFByZWZlclN0YWJsZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRDb25maWcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcXVpcmVzKGFycmF5ICRyZXF1aXJlcyk6IHZvaWQKewokdGhpcy0+cmVxdWlyZXMgPSAkdGhpcy0+cmVwbGFjZVNlbGZWZXJzaW9uRGVwZW5kZW5jaWVzKCRyZXF1aXJlcywgTGluazo6VFlQRV9SRVFVSVJFKTsKCiR0aGlzLT5hbGlhc09mLT5zZXRSZXF1aXJlcygkcmVxdWlyZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UmVxdWlyZXMoYXJyYXkgJGRldlJlcXVpcmVzKTogdm9pZAp7CiR0aGlzLT5kZXZSZXF1aXJlcyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJGRldlJlcXVpcmVzLCBMaW5rOjpUWVBFX0RFVl9SRVFVSVJFKTsKCiR0aGlzLT5hbGlhc09mLT5zZXREZXZSZXF1aXJlcygkZGV2UmVxdWlyZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmxpY3RzKGFycmF5ICRjb25mbGljdHMpOiB2b2lkCnsKJHRoaXMtPmNvbmZsaWN0cyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJGNvbmZsaWN0cywgTGluazo6VFlQRV9DT05GTElDVCk7CiR0aGlzLT5hbGlhc09mLT5zZXRDb25mbGljdHMoJGNvbmZsaWN0cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm92aWRlcyhhcnJheSAkcHJvdmlkZXMpOiB2b2lkCnsKJHRoaXMtPnByb3ZpZGVzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkcHJvdmlkZXMsIExpbms6OlRZUEVfUFJPVklERSk7CiR0aGlzLT5hbGlhc09mLT5zZXRQcm92aWRlcygkcHJvdmlkZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwbGFjZXMoYXJyYXkgJHJlcGxhY2VzKTogdm9pZAp7CiR0aGlzLT5yZXBsYWNlcyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJHJlcGxhY2VzLCBMaW5rOjpUWVBFX1JFUExBQ0UpOwokdGhpcy0+YWxpYXNPZi0+c2V0UmVwbGFjZXMoJHJlcGxhY2VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkKGFycmF5ICRhdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QXV0b2xvYWQoJGF1dG9sb2FkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldkF1dG9sb2FkKGFycmF5ICRkZXZBdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGV2QXV0b2xvYWQoJGRldkF1dG9sb2FkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YWJpbGl0eUZsYWdzKGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U3RhYmlsaXR5RmxhZ3MoJHN0YWJpbGl0eUZsYWdzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1pbmltdW1TdGFiaWxpdHkoc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5KTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRNaW5pbXVtU3RhYmlsaXR5KCRtaW5pbXVtU3RhYmlsaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclN0YWJsZShib29sICRwcmVmZXJTdGFibGUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFByZWZlclN0YWJsZSgkcHJlZmVyU3RhYmxlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZyhhcnJheSAkY29uZmlnKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRDb25maWcoJGNvbmZpZyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRSZWZlcmVuY2VzKCRyZWZlcmVuY2VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEFsaWFzZXMoJGFsaWFzZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTdWdnZXN0cygkc3VnZ2VzdHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXh0cmEoYXJyYXkgJGV4dHJhKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRFeHRyYSgkZXh0cmEpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKcGFyZW50OjpfX2Nsb25lKCk7CiR0aGlzLT5hbGlhc09mID0gY2xvbmUgJHRoaXMtPmFsaWFzT2Y7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCgoKY2xhc3MgUm9vdFBhY2thZ2UgZXh0ZW5kcyBDb21wbGV0ZVBhY2thZ2UgaW1wbGVtZW50cyBSb290UGFja2FnZUludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBERUZBVUxUX1BSRVRUWV9WRVJTSU9OID0gJzEuMC4wK25vLXZlcnNpb24tc2V0JzsKCgpwcm90ZWN0ZWQgJG1pbmltdW1TdGFiaWxpdHkgPSAnc3RhYmxlJzsKCnByb3RlY3RlZCAkcHJlZmVyU3RhYmxlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHN0YWJpbGl0eUZsYWdzID0gW107Cgpwcm90ZWN0ZWQgJGNvbmZpZyA9IFtdOwoKcHJvdGVjdGVkICRyZWZlcmVuY2VzID0gW107Cgpwcm90ZWN0ZWQgJGFsaWFzZXMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNaW5pbXVtU3RhYmlsaXR5KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSk6IHZvaWQKewokdGhpcy0+bWluaW11bVN0YWJpbGl0eSA9ICRtaW5pbXVtU3RhYmlsaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm1pbmltdW1TdGFiaWxpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdGFiaWxpdHlGbGFncyhhcnJheSAkc3RhYmlsaXR5RmxhZ3MpOiB2b2lkCnsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN0YWJpbGl0eUZsYWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQKewokdGhpcy0+cHJlZmVyU3RhYmxlID0gJHByZWZlclN0YWJsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlclN0YWJsZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5wcmVmZXJTdGFibGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoYXJyYXkgJGNvbmZpZyk6IHZvaWQKewokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVmZXJlbmNlcyhhcnJheSAkcmVmZXJlbmNlcyk6IHZvaWQKewokdGhpcy0+cmVmZXJlbmNlcyA9ICRyZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVmZXJlbmNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzZXMgPSAkYWxpYXNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCgoKCgoKCgppbnRlcmZhY2UgUm9vdFBhY2thZ2VJbnRlcmZhY2UgZXh0ZW5kcyBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1pbmltdW1TdGFiaWxpdHkoKTogc3RyaW5nOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHlGbGFncygpOiBhcnJheTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlcygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmZXJTdGFibGUoKTogYm9vbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcXVpcmVzKGFycmF5ICRyZXF1aXJlcyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZSZXF1aXJlcyhhcnJheSAkZGV2UmVxdWlyZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmxpY3RzKGFycmF5ICRjb25mbGljdHMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvdmlkZXMoYXJyYXkgJHByb3ZpZGVzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcGxhY2VzKGFycmF5ICRyZXBsYWNlcyk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2xvYWQoYXJyYXkgJGF1dG9sb2FkKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZBdXRvbG9hZChhcnJheSAkZGV2QXV0b2xvYWQpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RhYmlsaXR5RmxhZ3MoYXJyYXkgJHN0YWJpbGl0eUZsYWdzKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNaW5pbXVtU3RhYmlsaXR5KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoYXJyYXkgJGNvbmZpZyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeHRyYShhcnJheSAkZXh0cmEpOiB2b2lkOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCmNsYXNzIFN0YWJpbGl0eUZpbHRlcgp7CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1BhY2thZ2VBY2NlcHRhYmxlKGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJG5hbWVzLCBzdHJpbmcgJHN0YWJpbGl0eSk6IGJvb2wKewpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKCmlmIChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSkgewppZiAoQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllc1skc3RhYmlsaXR5XSA8PSAkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSB7CnJldHVybiB0cnVlOwp9Cn0gZWxzZWlmIChpc3NldCgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzWyRzdGFiaWxpdHldKSkgewoKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCgoKCgpjbGFzcyBWZXJzaW9uQnVtcGVyCnsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVtcFJlcXVpcmVtZW50KENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHByZXR0eUNvbnN0cmFpbnQgPSAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCk7CmlmIChzdHJfc3RhcnRzX3dpdGgoJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpLCAnZGV2LScpKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKJHZlcnNpb24gPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwppZiAoc3RyX3N0YXJ0c193aXRoKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICdkZXYtJykpIHsKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigkcGFyc2VyKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwokZXh0cmEgPSAkbG9hZGVyLT5nZXRCcmFuY2hBbGlhcygkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKSk7CgoKaWYgKG51bGwgPT09ICRleHRyYSB8fCAkZXh0cmEgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKJHZlcnNpb24gPSAkZXh0cmE7Cn0KCiRpbnRlcnZhbHMgPSBJbnRlcnZhbHM6OmdldCgkY29uc3RyYWludCk7CgoKaWYgKFxjb3VudCgkaW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddKSA+IDApIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgokbWFqb3IgPSBQcmVnOjpyZXBsYWNlKCd7XihcZCspLip9JywgJyQxJywgJHZlcnNpb24pOwokdmVyc2lvbldpdGhvdXRTdWZmaXggPSBQcmVnOjpyZXBsYWNlKCd7KD86XC4oPzowfDk5OTk5OTkpKSsoLWRldik/JH0nLCAnJywgJHZlcnNpb24pOwokbmV3UHJldHR5Q29uc3RyYWludCA9ICdeJy4kdmVyc2lvbldpdGhvdXRTdWZmaXg7CgoKaWYgKCFQcmVnOjppc01hdGNoKCd7XlxeXGQrKFwuXGQrKSokfScsICRuZXdQcmV0dHlDb25zdHJhaW50KSkgewpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KCiRwYXR0ZXJuID0gJ3sKICAgICAgICAgICAgKD88PSx8XCB8XHx8XikgIyBsZWFkaW5nIHNlcGFyYXRvcgogICAgICAgICAgICAoP1A8Y29uc3RyYWludD4KICAgICAgICAgICAgICAgIFxeJy4kbWFqb3IuJyg/OlwuXGQrKSogIyBlLmcuIF4yLmFueXRoaW5nCiAgICAgICAgICAgICAgICB8IH4nLiRtYWpvci4nKD86XC5cZCspezAsMn0gIyBlLmcuIH4yIG9yIH4yLjIgb3IgfjIuMi4yIGJ1dCBubyBtb3JlCiAgICAgICAgICAgICAgICB8ICcuJG1ham9yLicoPzpcLlsqeF0pKyAjIGUuZy4gMi4qIG9yIDIuKi4qIG9yIDIueC54LnggZXRjCiAgICAgICAgICAgICAgICB8ID49XGQoPzpcLlxkKykqICMgZS5nLiA+PTIgb3IgPj0xLjIgZXRjCiAgICAgICAgICAgICkKICAgICAgICAgICAgKD89LHwkfFwgfFx8fEApICMgdHJhaWxpbmcgc2VwYXJhdG9yCiAgICAgICAgfXgnOwppZiAoUHJlZzo6aXNNYXRjaEFsbFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkcHJldHR5Q29uc3RyYWludCwgJG1hdGNoZXMpKSB7CiRtb2RpZmllZCA9ICRwcmV0dHlDb25zdHJhaW50Owpmb3JlYWNoIChhcnJheV9yZXZlcnNlKCRtYXRjaGVzWydjb25zdHJhaW50J10pIGFzICRtYXRjaCkgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFswXSkpOwokc3VmZml4ID0gJyc7CmlmIChzdWJzdHJfY291bnQoJG1hdGNoWzBdLCAnLicpID09PSAyICYmIHN1YnN0cl9jb3VudCgkdmVyc2lvbldpdGhvdXRTdWZmaXgsICcuJykgPT09IDEpIHsKJHN1ZmZpeCA9ICcuMCc7Cn0KaWYgKHN0cl9zdGFydHNfd2l0aCgkbWF0Y2hbMF0sICd+JykgJiYgc3Vic3RyX2NvdW50KCRtYXRjaFswXSwgJy4nKSA9PT0gMikgewokcmVwbGFjZW1lbnQgPSAnficuJHZlcnNpb25XaXRob3V0U3VmZml4LiRzdWZmaXg7Cn0gZWxzZWlmIChzdHJfc3RhcnRzX3dpdGgoJG1hdGNoWzBdLCAnPj0nKSkgewokcmVwbGFjZW1lbnQgPSAnPj0nLiR2ZXJzaW9uV2l0aG91dFN1ZmZpeC4kc3VmZml4Owp9IGVsc2UgewokcmVwbGFjZW1lbnQgPSAkbmV3UHJldHR5Q29uc3RyYWludC4kc3VmZml4Owp9CiRtb2RpZmllZCA9IHN1YnN0cl9yZXBsYWNlKCRtb2RpZmllZCwgJHJlcGxhY2VtZW50LCAkbWF0Y2hbMV0sIFBsYXRmb3JtOjpzdHJsZW4oJG1hdGNoWzBdKSk7Cn0KCgokbmV3Q29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJG1vZGlmaWVkKTsKaWYgKEludGVydmFsczo6aXNTdWJzZXRPZigkbmV3Q29uc3RyYWludCwgJGNvbnN0cmFpbnQpICYmIEludGVydmFsczo6aXNTdWJzZXRPZigkY29uc3RyYWludCwgJG5ld0NvbnN0cmFpbnQpKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKcmV0dXJuICRtb2RpZmllZDsKfQoKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xIZ0RyaXZlcjsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyIGFzIFNlbXZlclZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxVdGlsXEdpdCBhcyBHaXRVdGlsOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBSZWFjdFxQcm9taXNlXENhbmNlbGxhYmxlUHJvbWlzZUludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgoKY2xhc3MgVmVyc2lvbkd1ZXNzZXIKewoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRwcm9jZXNzOwoKCgoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb25maWcgJGNvbmZpZywgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCBTZW12ZXJWZXJzaW9uUGFyc2VyICR2ZXJzaW9uUGFyc2VyKQp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwokdGhpcy0+dmVyc2lvblBhcnNlciA9ICR2ZXJzaW9uUGFyc2VyOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ3Vlc3NWZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuIG51bGw7Cn0KCgoKaWYgKFBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewpyZXR1cm4gbnVsbDsKfQoKJHZlcnNpb25EYXRhID0gJHRoaXMtPmd1ZXNzR2l0VmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHBhdGgpOwppZiAobnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgokdmVyc2lvbkRhdGEgPSAkdGhpcy0+Z3Vlc3NIZ1ZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKTsKaWYgKG51bGwgIT09ICR2ZXJzaW9uRGF0YSAmJiBudWxsICE9PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkgewpyZXR1cm4gJHRoaXMtPnBvc3Rwcm9jZXNzKCR2ZXJzaW9uRGF0YSk7Cn0KCiR2ZXJzaW9uRGF0YSA9ICR0aGlzLT5ndWVzc0Zvc3NpbFZlcnNpb24oJHBhdGgpOwppZiAobnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgokdmVyc2lvbkRhdGEgPSAkdGhpcy0+Z3Vlc3NTdm5WZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCk7CmlmIChudWxsICE9PSAkdmVyc2lvbkRhdGEgJiYgbnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBvc3Rwcm9jZXNzKGFycmF5ICR2ZXJzaW9uRGF0YSk6IGFycmF5CnsKaWYgKCFlbXB0eSgkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddKSAmJiAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddID09PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSAmJiAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nXSA9PT0gJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddKSB7CnVuc2V0KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10sICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddKTsKfQoKaWYgKCctZGV2JyA9PT0gc3Vic3RyKCR2ZXJzaW9uRGF0YVsndmVyc2lvbiddLCAtNCkgJiYgUHJlZzo6aXNNYXRjaCgne1wuOXs3fX0nLCAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddID0gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSk7Cn0KCmlmICghZW1wdHkoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSkgJiYgJy1kZXYnID09PSBzdWJzdHIoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSwgLTQpICYmIFByZWc6OmlzTWF0Y2goJ3tcLjl7N319JywgJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10gPSBQcmVnOjpyZXBsYWNlKCd7KFwuOXs3fSkrfScsICcueCcsICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10pOwp9CgpyZXR1cm4gJHZlcnNpb25EYXRhOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NHaXRWZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiBhcnJheQp7CkdpdFV0aWw6OmNsZWFuRW52KCk7CiRjb21taXQgPSBudWxsOwokdmVyc2lvbiA9IG51bGw7CiRwcmV0dHlWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gbnVsbDsKJGlzRGV0YWNoZWQgPSBmYWxzZTsKCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnYnJhbmNoJywgJy1hJywgJy0tbm8tY29sb3InLCAnLS1uby1hYmJyZXYnLCAnLXYnXSwgJG91dHB1dCwgJHBhdGgpKSB7CiRicmFuY2hlcyA9IFtdOwokaXNGZWF0dXJlQnJhbmNoID0gZmFsc2U7CgoKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OlwqICkgKihcKG5vIGJyYW5jaFwpfFwoZGV0YWNoZWQgZnJvbSBcUytcKXxcKEhFQUQgZGV0YWNoZWQgYXQgXFMrXCl8XFMrKSAqKFthLWYwLTldKykgLiokfScsICRicmFuY2gsICRtYXRjaCkpIHsKaWYgKAokbWF0Y2hbMV0gPT09ICcobm8gYnJhbmNoKScKfHwgc3RycG9zKCRtYXRjaFsxXSwgJyhkZXRhY2hlZCAnKSA9PT0gMAp8fCBzdHJwb3MoJG1hdGNoWzFdLCAnKEhFQUQgZGV0YWNoZWQgYXQnKSA9PT0gMAopIHsKJHZlcnNpb24gPSAnZGV2LScgLiAkbWF0Y2hbMl07CiRwcmV0dHlWZXJzaW9uID0gJHZlcnNpb247CiRpc0ZlYXR1cmVCcmFuY2ggPSB0cnVlOwokaXNEZXRhY2hlZCA9IHRydWU7Cn0gZWxzZSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaCgkbWF0Y2hbMV0pOwokcHJldHR5VmVyc2lvbiA9ICdkZXYtJyAuICRtYXRjaFsxXTsKJGlzRmVhdHVyZUJyYW5jaCA9ICR0aGlzLT5pc0ZlYXR1cmVCcmFuY2goJHBhY2thZ2VDb25maWcsICRtYXRjaFsxXSk7Cn0KCiRjb21taXQgPSAkbWF0Y2hbMl07Cn0KCmlmICgkYnJhbmNoICYmICFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiAqLisvSEVBRCB9JywgJGJyYW5jaCkpIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86XCogKT8gKigoPzpyZW1vdGVzLyg/Om9yaWdpbnx1cHN0cmVhbSkvKT9bXlxzL10rKSAqKFthLWYwLTldKykgLiokfScsICRicmFuY2gsICRtYXRjaCkpIHsKJGJyYW5jaGVzW10gPSAkbWF0Y2hbMV07Cn0KfQp9CgppZiAoJGlzRmVhdHVyZUJyYW5jaCkgewokZmVhdHVyZVZlcnNpb24gPSAkdmVyc2lvbjsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CgoKJHJlc3VsdCA9ICR0aGlzLT5ndWVzc0ZlYXR1cmVWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkdmVyc2lvbiwgJGJyYW5jaGVzLCAnZ2l0IHJldi1saXN0ICVjYW5kaWRhdGUlLi4lYnJhbmNoJScsICRwYXRoKTsKJHZlcnNpb24gPSAkcmVzdWx0Wyd2ZXJzaW9uJ107CiRwcmV0dHlWZXJzaW9uID0gJHJlc3VsdFsncHJldHR5X3ZlcnNpb24nXTsKfQp9CgppZiAoISR2ZXJzaW9uIHx8ICRpc0RldGFjaGVkKSB7CiRyZXN1bHQgPSAkdGhpcy0+dmVyc2lvbkZyb21HaXRUYWdzKCRwYXRoKTsKaWYgKCRyZXN1bHQpIHsKJHZlcnNpb24gPSAkcmVzdWx0Wyd2ZXJzaW9uJ107CiRwcmV0dHlWZXJzaW9uID0gJHJlc3VsdFsncHJldHR5X3ZlcnNpb24nXTsKJGZlYXR1cmVWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gbnVsbDsKfQp9CgppZiAobnVsbCA9PT0gJGNvbW1pdCkgewokY29tbWFuZCA9ICdnaXQgbG9nIC0tcHJldHR5PSIlSCIgLW4xIEhFQUQnLkdpdFV0aWw6OmdldE5vU2hvd1NpZ25hdHVyZUZsYWcoJHRoaXMtPnByb2Nlc3MpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewokY29tbWl0ID0gdHJpbSgkb3V0cHV0KSA/OiBudWxsOwp9Cn0KCmlmICgkZmVhdHVyZVZlcnNpb24pIHsKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICRjb21taXQsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb24sICdmZWF0dXJlX3ZlcnNpb24nID0+ICRmZWF0dXJlVmVyc2lvbiwgJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nID0+ICRmZWF0dXJlUHJldHR5VmVyc2lvbl07Cn0KCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiAkY29tbWl0LCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2ZXJzaW9uRnJvbUdpdFRhZ3Moc3RyaW5nICRwYXRoKTogP2FycmF5CnsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IGRlc2NyaWJlIC0tZXhhY3QtbWF0Y2ggLS10YWdzJywgJG91dHB1dCwgJHBhdGgpKSB7CnRyeSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSh0cmltKCRvdXRwdXQpKTsKCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAncHJldHR5X3ZlcnNpb24nID0+IHRyaW0oJG91dHB1dCldOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBndWVzc0hnVmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgc3RyaW5nICRwYXRoKTogP2FycmF5CnsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnaGcgYnJhbmNoJywgJG91dHB1dCwgJHBhdGgpKSB7CiRicmFuY2ggPSB0cmltKCRvdXRwdXQpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGJyYW5jaCk7CiRpc0ZlYXR1cmVCcmFuY2ggPSAwID09PSBzdHJwb3MoJHZlcnNpb24sICdkZXYtJyk7CgppZiAoVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMgPT09ICR2ZXJzaW9uKSB7CnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiBudWxsLCAncHJldHR5X3ZlcnNpb24nID0+ICdkZXYtJy4kYnJhbmNoXTsKfQoKaWYgKCEkaXNGZWF0dXJlQnJhbmNoKSB7CnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiBudWxsLCAncHJldHR5X3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfQoKCiRpbyA9IG5ldyBOdWxsSU8oKTsKJGRyaXZlciA9IG5ldyBIZ0RyaXZlcihbJ3VybCcgPT4gJHBhdGhdLCAkaW8sICR0aGlzLT5jb25maWcsIG5ldyBIdHRwRG93bmxvYWRlcigkaW8sICR0aGlzLT5jb25maWcpLCAkdGhpcy0+cHJvY2Vzcyk7CiRicmFuY2hlcyA9IGFycmF5X21hcCgnc3RydmFsJywgYXJyYXlfa2V5cygkZHJpdmVyLT5nZXRCcmFuY2hlcygpKSk7CgoKJHJlc3VsdCA9ICR0aGlzLT5ndWVzc0ZlYXR1cmVWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkdmVyc2lvbiwgJGJyYW5jaGVzLCAnaGcgbG9nIC1yICJub3QgYW5jZXN0b3JzKFwnJWNhbmRpZGF0ZSVcJykgYW5kIGFuY2VzdG9ycyhcJyVicmFuY2glXCcpIiAtLXRlbXBsYXRlICJ7bm9kZX1cXG4iJywgJHBhdGgpOwokcmVzdWx0Wydjb21taXQnXSA9ICcnOwokcmVzdWx0WydmZWF0dXJlX3ZlcnNpb24nXSA9ICR2ZXJzaW9uOwokcmVzdWx0WydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10gPSAkdmVyc2lvbjsKCnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzRmVhdHVyZVZlcnNpb24oYXJyYXkgJHBhY2thZ2VDb25maWcsID9zdHJpbmcgJHZlcnNpb24sIGFycmF5ICRicmFuY2hlcywgc3RyaW5nICRzY21DbWRsaW5lLCBzdHJpbmcgJHBhdGgpOiBhcnJheQp7CiRwcmV0dHlWZXJzaW9uID0gJHZlcnNpb247CgoKCmlmICghaXNzZXQoJHBhY2thZ2VDb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyR2ZXJzaW9uXSkKfHwgc3RycG9zKGpzb25fZW5jb2RlKCRwYWNrYWdlQ29uZmlnKSwgJyJzZWxmLnZlcnNpb24iJykKKSB7CiRicmFuY2ggPSBQcmVnOjpyZXBsYWNlKCd7XmRldi19JywgJycsICR2ZXJzaW9uKTsKJGxlbmd0aCA9IFBIUF9JTlRfTUFYOwoKCmlmICghJHRoaXMtPmlzRmVhdHVyZUJyYW5jaCgkcGFja2FnZUNvbmZpZywgJGJyYW5jaCkpIHsKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9CgoKCgp1c29ydCgkYnJhbmNoZXMsIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKTogaW50IHsKJGFSZW1vdGUgPSAwID09PSBzdHJwb3MoJGEsICdyZW1vdGVzLycpOwokYlJlbW90ZSA9IDAgPT09IHN0cnBvcygkYiwgJ3JlbW90ZXMvJyk7CgppZiAoJGFSZW1vdGUgIT09ICRiUmVtb3RlKSB7CnJldHVybiAkYVJlbW90ZSA/IDEgOiAtMTsKfQoKcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGIsICRhKTsKfSk7CgokcHJvbWlzZXMgPSBbXTsKJHRoaXMtPnByb2Nlc3MtPnNldE1heEpvYnMoMzApOwp0cnkgewpmb3JlYWNoICgkYnJhbmNoZXMgYXMgJGNhbmRpZGF0ZSkgewokY2FuZGlkYXRlVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3tecmVtb3Rlcy9cUysvfScsICcnLCAkY2FuZGlkYXRlKTsKCgppZiAoJGNhbmRpZGF0ZSA9PT0gJGJyYW5jaCB8fCAkdGhpcy0+aXNGZWF0dXJlQnJhbmNoKCRwYWNrYWdlQ29uZmlnLCAkY2FuZGlkYXRlVmVyc2lvbikpIHsKY29udGludWU7Cn0KCiRjbWRMaW5lID0gc3RyX3JlcGxhY2UoWyclY2FuZGlkYXRlJScsICclYnJhbmNoJSddLCBbJGNhbmRpZGF0ZSwgJGJyYW5jaF0sICRzY21DbWRsaW5lKTsKJHByb21pc2VzW10gPSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZUFzeW5jKCRjbWRMaW5lLCAkcGF0aCktPnRoZW4oZnVuY3Rpb24gKFByb2Nlc3MgJHByb2Nlc3MpIHVzZSAoJiRsZW5ndGgsICYkdmVyc2lvbiwgJiRwcmV0dHlWZXJzaW9uLCAkY2FuZGlkYXRlVmVyc2lvbiwgJiRwcm9taXNlcyk6IHZvaWQgewppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewpyZXR1cm47Cn0KCiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0T3V0cHV0KCk7CmlmIChzdHJsZW4oJG91dHB1dCkgPCAkbGVuZ3RoKSB7CiRsZW5ndGggPSBzdHJsZW4oJG91dHB1dCk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaCgkY2FuZGlkYXRlVmVyc2lvbik7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJGNhbmRpZGF0ZVZlcnNpb247CmlmICgkbGVuZ3RoID09PSAwKSB7CmZvcmVhY2ggKCRwcm9taXNlcyBhcyAkcHJvbWlzZSkgewoKXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkcHJvbWlzZSktPmNhbmNlbCgpOwp9Cn0KfQp9KTsKfQoKJHRoaXMtPnByb2Nlc3MtPndhaXQoKTsKfSBmaW5hbGx5IHsKJHRoaXMtPnByb2Nlc3MtPnJlc2V0TWF4Sm9icygpOwp9Cn0KCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc0ZlYXR1cmVCcmFuY2goYXJyYXkgJHBhY2thZ2VDb25maWcsID9zdHJpbmcgJGJyYW5jaE5hbWUpOiBib29sCnsKJG5vbkZlYXR1cmVCcmFuY2hlcyA9ICcnOwppZiAoIWVtcHR5KCRwYWNrYWdlQ29uZmlnWydub24tZmVhdHVyZS1icmFuY2hlcyddKSkgewokbm9uRmVhdHVyZUJyYW5jaGVzID0gaW1wbG9kZSgnfCcsICRwYWNrYWdlQ29uZmlnWydub24tZmVhdHVyZS1icmFuY2hlcyddKTsKfQoKcmV0dXJuICFQcmVnOjppc01hdGNoKCd7XignIC4gJG5vbkZlYXR1cmVCcmFuY2hlcyAuICd8bWFzdGVyfG1haW58bGF0ZXN0fG5leHR8Y3VycmVudHxzdXBwb3J0fHRpcHx0cnVua3xkZWZhdWx0fGRldmVsb3B8XGQrXC4uKykkfScsICRicmFuY2hOYW1lLCAkbWF0Y2gpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzRm9zc2lsVmVyc2lvbihzdHJpbmcgJHBhdGgpOiBhcnJheQp7CiR2ZXJzaW9uID0gbnVsbDsKJHByZXR0eVZlcnNpb24gPSBudWxsOwoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIGJyYW5jaCBsaXN0JywgJG91dHB1dCwgJHBhdGgpKSB7CiRicmFuY2ggPSB0cmltKCRvdXRwdXQpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGJyYW5jaCk7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJGJyYW5jaDsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIHRhZyBsaXN0JywgJG91dHB1dCwgJHBhdGgpKSB7CnRyeSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSh0cmltKCRvdXRwdXQpKTsKJHByZXR0eVZlcnNpb24gPSB0cmltKCRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICcnLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzU3ZuVmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgc3RyaW5nICRwYXRoKTogP2FycmF5CnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ3N2biBpbmZvIC0teG1sJywgJG91dHB1dCwgJHBhdGgpKSB7CiR0cnVua1BhdGggPSBpc3NldCgkcGFja2FnZUNvbmZpZ1sndHJ1bmstcGF0aCddKSA/IHByZWdfcXVvdGUoJHBhY2thZ2VDb25maWdbJ3RydW5rLXBhdGgnXSwgJyMnKSA6ICd0cnVuayc7CiRicmFuY2hlc1BhdGggPSBpc3NldCgkcGFja2FnZUNvbmZpZ1snYnJhbmNoZXMtcGF0aCddKSA/IHByZWdfcXVvdGUoJHBhY2thZ2VDb25maWdbJ2JyYW5jaGVzLXBhdGgnXSwgJyMnKSA6ICdicmFuY2hlcyc7CiR0YWdzUGF0aCA9IGlzc2V0KCRwYWNrYWdlQ29uZmlnWyd0YWdzLXBhdGgnXSkgPyBwcmVnX3F1b3RlKCRwYWNrYWdlQ29uZmlnWyd0YWdzLXBhdGgnXSwgJyMnKSA6ICd0YWdzJzsKCiR1cmxQYXR0ZXJuID0gJyM8dXJsPi4qLygnIC4gJHRydW5rUGF0aCAuICd8KCcgLiAkYnJhbmNoZXNQYXRoIC4gJ3wnIC4gJHRhZ3NQYXRoIC4gJykvKC4qKSk8L3VybD4jJzsKCmlmIChQcmVnOjppc01hdGNoKCR1cmxQYXR0ZXJuLCAkb3V0cHV0LCAkbWF0Y2hlcykpIHsKaWYgKGlzc2V0KCRtYXRjaGVzWzJdLCAkbWF0Y2hlc1szXSkgJiYgKCRicmFuY2hlc1BhdGggPT09ICRtYXRjaGVzWzJdIHx8ICR0YWdzUGF0aCA9PT0gJG1hdGNoZXNbMl0pKSB7CgokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJG1hdGNoZXNbM10pOwokcHJldHR5VmVyc2lvbiA9ICdkZXYtJyAuICRtYXRjaGVzWzNdOwoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICcnLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1sxXSkpOwokcHJldHR5VmVyc2lvbiA9IHRyaW0oJG1hdGNoZXNbMV0pOwppZiAoJHByZXR0eVZlcnNpb24gPT09ICd0cnVuaycpIHsKJHZlcnNpb24gPSAnZGV2LXRydW5rJzsKfSBlbHNlIHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICcnLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcVmVyc2lvblBhcnNlciBhcyBTZW12ZXJWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFNlbXZlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgpjbGFzcyBWZXJzaW9uUGFyc2VyIGV4dGVuZHMgU2VtdmVyVmVyc2lvblBhcnNlcgp7CnB1YmxpYyBjb25zdCBERUZBVUxUX0JSQU5DSF9BTElBUyA9ICc5OTk5OTk5LWRldic7CgoKcHJpdmF0ZSBzdGF0aWMgJGNvbnN0cmFpbnRzID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludHMpOiBDb25zdHJhaW50SW50ZXJmYWNlCnsKaWYgKCFpc3NldChzZWxmOjokY29uc3RyYWludHNbJGNvbnN0cmFpbnRzXSkpIHsKc2VsZjo6JGNvbnN0cmFpbnRzWyRjb25zdHJhaW50c10gPSBwYXJlbnQ6OnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnRzKTsKfQoKcmV0dXJuIHNlbGY6OiRjb25zdHJhaW50c1skY29uc3RyYWludHNdOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlTmFtZVZlcnNpb25QYWlycyhhcnJheSAkcGFpcnMpOiBhcnJheQp7CiRwYWlycyA9IGFycmF5X3ZhbHVlcygkcGFpcnMpOwokcmVzdWx0ID0gW107Cgpmb3IgKCRpID0gMCwgJGNvdW50ID0gY291bnQoJHBhaXJzKTsgJGkgPCAkY291bnQ7ICRpKyspIHsKJHBhaXIgPSBQcmVnOjpyZXBsYWNlKCd7XihbXj06IF0rKVs9OiBdKC4qKSR9JywgJyQxICQyJywgdHJpbSgkcGFpcnNbJGldKSk7CmlmIChmYWxzZSA9PT0gc3RycG9zKCRwYWlyLCAnICcpICYmIGlzc2V0KCRwYWlyc1skaSArIDFdKSAmJiBmYWxzZSA9PT0gc3RycG9zKCRwYWlyc1skaSArIDFdLCAnLycpICYmICFQcmVnOjppc01hdGNoKCd7KD88PVthLXowLTlfLy1dKVwqfFwqKD89W2EtejAtOV8vLV0pfWknLCAkcGFpcnNbJGkgKyAxXSkgJiYgIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBhaXJzWyRpICsgMV0pKSB7CiRwYWlyIC49ICcgJy4kcGFpcnNbJGkgKyAxXTsKJGkrKzsKfQoKaWYgKHN0cnBvcygkcGFpciwgJyAnKSkgewpbJG5hbWUsICR2ZXJzaW9uXSA9IGV4cGxvZGUoJyAnLCAkcGFpciwgMik7CiRyZXN1bHRbXSA9IFsnbmFtZScgPT4gJG5hbWUsICd2ZXJzaW9uJyA9PiAkdmVyc2lvbl07Cn0gZWxzZSB7CiRyZXN1bHRbXSA9IFsnbmFtZScgPT4gJHBhaXJdOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVXBncmFkZShzdHJpbmcgJG5vcm1hbGl6ZWRGcm9tLCBzdHJpbmcgJG5vcm1hbGl6ZWRUbyk6IGJvb2wKewppZiAoJG5vcm1hbGl6ZWRGcm9tID09PSAkbm9ybWFsaXplZFRvKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaW5fYXJyYXkoJG5vcm1hbGl6ZWRGcm9tLCBbJ2Rldi1tYXN0ZXInLCAnZGV2LXRydW5rJywgJ2Rldi1kZWZhdWx0J10sIHRydWUpKSB7CiRub3JtYWxpemVkRnJvbSA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9CmlmIChpbl9hcnJheSgkbm9ybWFsaXplZFRvLCBbJ2Rldi1tYXN0ZXInLCAnZGV2LXRydW5rJywgJ2Rldi1kZWZhdWx0J10sIHRydWUpKSB7CiRub3JtYWxpemVkVG8gPSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUzsKfQoKaWYgKHN0cnBvcygkbm9ybWFsaXplZEZyb20sICdkZXYtJykgPT09IDAgfHwgc3RycG9zKCRub3JtYWxpemVkVG8sICdkZXYtJykgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KCiRzb3J0ZWQgPSBTZW12ZXI6OnNvcnQoWyRub3JtYWxpemVkVG8sICRub3JtYWxpemVkRnJvbV0pOwoKcmV0dXJuICRzb3J0ZWRbMF0gPT09ICRub3JtYWxpemVkRnJvbTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCgoKCmNsYXNzIFZlcnNpb25TZWxlY3Rvcgp7Cgpwcml2YXRlICRyZXBvc2l0b3J5U2V0OwoKCnByaXZhdGUgJHBsYXRmb3JtQ29uc3RyYWludHMgPSBbXTsKCgpwcml2YXRlICRwYXJzZXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgP1BsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvID0gbnVsbCkKewokdGhpcy0+cmVwb3NpdG9yeVNldCA9ICRyZXBvc2l0b3J5U2V0OwppZiAoJHBsYXRmb3JtUmVwbykgewpmb3JlYWNoICgkcGxhdGZvcm1SZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5wbGF0Zm9ybUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZEJlc3RDYW5kaWRhdGUoc3RyaW5nICRwYWNrYWdlTmFtZSwgP3N0cmluZyAkdGFyZ2V0UGFja2FnZVZlcnNpb24gPSBudWxsLCBzdHJpbmcgJHByZWZlcnJlZFN0YWJpbGl0eSA9ICdzdGFibGUnLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IG51bGwsIGludCAkcmVwb1NldEZsYWdzID0gMCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsICRzaG93V2FybmluZ3MgPSB0cnVlKQp7CmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllc1skcHJlZmVycmVkU3RhYmlsaXR5XSkpIHsKCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdFeHBlY3RlZCBhIHZhbGlkIHN0YWJpbGl0eSBuYW1lIGFzIDNyZCBhcmd1bWVudCwgZ290ICcuJHByZWZlcnJlZFN0YWJpbGl0eSk7Cn0KCmlmIChudWxsID09PSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7Cn0gZWxzZWlmICghKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSkpIHsKdHJpZ2dlcl9lcnJvcignVmVyc2lvblNlbGVjdG9yOjpmaW5kQmVzdENhbmRpZGF0ZSB3aXRoIGlnbm9yZWQgcGxhdGZvcm0gcmVxcyBhcyBib29sfGFycmF5IGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2UgYW4gaW5zdGFuY2Ugb2YgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6ZnJvbUJvb2xPckxpc3QoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwp9CgokY29uc3RyYWludCA9ICR0YXJnZXRQYWNrYWdlVmVyc2lvbiA/ICR0aGlzLT5nZXRQYXJzZXIoKS0+cGFyc2VDb25zdHJhaW50cygkdGFyZ2V0UGFja2FnZVZlcnNpb24pIDogbnVsbDsKJGNhbmRpZGF0ZXMgPSAkdGhpcy0+cmVwb3NpdG9yeVNldC0+ZmluZFBhY2thZ2VzKHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKSwgJGNvbnN0cmFpbnQsICRyZXBvU2V0RmxhZ3MpOwoKJG1pblByaW9yaXR5ID0gQmFzZVBhY2thZ2U6OiRzdGFiaWxpdGllc1skcHJlZmVycmVkU3RhYmlsaXR5XTsKdXNvcnQoJGNhbmRpZGF0ZXMsIHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkYSwgUGFja2FnZUludGVyZmFjZSAkYikgdXNlICgkbWluUHJpb3JpdHkpIHsKJGFQcmlvcml0eSA9ICRhLT5nZXRTdGFiaWxpdHlQcmlvcml0eSgpOwokYlByaW9yaXR5ID0gJGItPmdldFN0YWJpbGl0eVByaW9yaXR5KCk7CgoKCmlmICgkbWluUHJpb3JpdHkgPCAkYVByaW9yaXR5ICYmICRiUHJpb3JpdHkgPCAkYVByaW9yaXR5KSB7CnJldHVybiAxOwp9CgoKCmlmICgkbWluUHJpb3JpdHkgPCAkYVByaW9yaXR5ICYmICRhUHJpb3JpdHkgPCAkYlByaW9yaXR5KSB7CnJldHVybiAtMTsKfQoKCgppZiAoJG1pblByaW9yaXR5ID49ICRhUHJpb3JpdHkgJiYgJG1pblByaW9yaXR5IDwgJGJQcmlvcml0eSkgewpyZXR1cm4gLTE7Cn0KCgpyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCRiLT5nZXRWZXJzaW9uKCksICRhLT5nZXRWZXJzaW9uKCkpOwp9KTsKCmlmIChjb3VudCgkdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50cykgPiAwICYmICEoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSkgewoKJGFscmVhZHlXYXJuZWROYW1lcyA9IFtdOwoKJGFscmVhZHlTZWVuTmFtZXMgPSBbXTsKCmZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRwa2cpIHsKJHJlcXMgPSAkcGtnLT5nZXRSZXF1aXJlcygpOwpmb3JlYWNoICgkcmVxcyBhcyAkbmFtZSA9PiAkbGluaykgewppZiAoIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpIHx8ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJG5hbWUpKSB7CmNvbnRpbnVlOwp9CmlmIChpc3NldCgkdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50c1skbmFtZV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5wbGF0Zm9ybUNvbnN0cmFpbnRzWyRuYW1lXSBhcyAkcHJvdmlkZWRDb25zdHJhaW50KSB7CmlmICgkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCRwcm92aWRlZENvbnN0cmFpbnQpKSB7Cgpjb250aW51ZSAyOwp9Cn0KCgokcmVhc29uID0gJ2lzIG5vdCBzYXRpc2ZpZWQgYnkgeW91ciBwbGF0Zm9ybSc7Cn0gZWxzZSB7CgoKJHJlYXNvbiA9ICdpcyBtaXNzaW5nIGZyb20geW91ciBwbGF0Zm9ybSc7Cn0KCiRpc0xhdGVzdFZlcnNpb24gPSAhaXNzZXQoJGFscmVhZHlTZWVuTmFtZXNbJHBrZy0+Z2V0TmFtZSgpXSk7CiRhbHJlYWR5U2Vlbk5hbWVzWyRwa2ctPmdldE5hbWUoKV0gPSB0cnVlOwppZiAoJGlvICE9PSBudWxsICYmICgkc2hvd1dhcm5pbmdzID09PSB0cnVlIHx8IChpc19jYWxsYWJsZSgkc2hvd1dhcm5pbmdzKSAmJiAkc2hvd1dhcm5pbmdzKCRwa2cpKSkpIHsKJGlzRmlyc3RXYXJuaW5nID0gIWlzc2V0KCRhbHJlYWR5V2FybmVkTmFtZXNbJHBrZy0+Z2V0TmFtZSgpXSk7CiRhbHJlYWR5V2FybmVkTmFtZXNbJHBrZy0+Z2V0TmFtZSgpXSA9IHRydWU7CiRsYXRlc3QgPSAkaXNMYXRlc3RWZXJzaW9uID8gIidzIGxhdGVzdCB2ZXJzaW9uIiA6ICcnOwokaW8tPndyaXRlRXJyb3IoCic8d2FybmluZz5DYW5ub3QgdXNlICcuJHBrZy0+Z2V0UHJldHR5TmFtZSgpLiRsYXRlc3QuJyAnLiRwa2ctPmdldFByZXR0eVZlcnNpb24oKS4nIGFzIGl0ICcuJGxpbmstPmdldERlc2NyaXB0aW9uKCkuJyAnLiRsaW5rLT5nZXRUYXJnZXQoKS4nICcuJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nIHdoaWNoICcuJHJlYXNvbi4nLjwvPicsCnRydWUsCiRpc0ZpcnN0V2FybmluZyA/IElPSW50ZXJmYWNlOjpOT1JNQUwgOiBJT0ludGVyZmFjZTo6VkVSQk9TRQopOwp9CgoKY29udGludWUgMjsKfQoKJHBhY2thZ2UgPSAkcGtnOwpicmVhazsKfQp9IGVsc2UgewokcGFja2FnZSA9IGNvdW50KCRjYW5kaWRhdGVzKSA+IDAgPyAkY2FuZGlkYXRlc1swXSA6IG51bGw7Cn0KCmlmICghaXNzZXQoJHBhY2thZ2UpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRSZWNvbW1lbmRlZFJlcXVpcmVWZXJzaW9uKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewoKCmlmICgwID09PSBzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJ2V4dC0nKSkgewokcGhwVmVyc2lvbiA9IFBIUF9NQUpPUl9WRVJTSU9OIC4gJy4nIC4gUEhQX01JTk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfUkVMRUFTRV9WRVJTSU9OOwokZXh0VmVyc2lvbiA9IGltcGxvZGUoJy4nLCBhcnJheV9zbGljZShleHBsb2RlKCcuJywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSksIDAsIDMpKTsKaWYgKCRwaHBWZXJzaW9uID09PSAkZXh0VmVyc2lvbikgewpyZXR1cm4gJyonOwp9Cn0KCiR2ZXJzaW9uID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKCEkcGFja2FnZS0+aXNEZXYoKSkgewpyZXR1cm4gJHRoaXMtPnRyYW5zZm9ybVZlcnNpb24oJHZlcnNpb24sICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksICRwYWNrYWdlLT5nZXRTdGFiaWxpdHkoKSk7Cn0KCiRsb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIoJHRoaXMtPmdldFBhcnNlcigpKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwokZXh0cmEgPSAkbG9hZGVyLT5nZXRCcmFuY2hBbGlhcygkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKSk7CmlmICgkZXh0cmEgJiYgJGV4dHJhICE9PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokZXh0cmEgPSBQcmVnOjpyZXBsYWNlKCd7XihcZCtcLlxkK1wuXGQrKShcLjk5OTk5OTkpLWRldiR9JywgJyQxLjAnLCAkZXh0cmEsIC0xLCAkY291bnQpOwppZiAoJGNvdW50ID4gMCkgewokZXh0cmEgPSBzdHJfcmVwbGFjZSgnLjk5OTk5OTknLCAnLjAnLCAkZXh0cmEpOwoKcmV0dXJuICR0aGlzLT50cmFuc2Zvcm1WZXJzaW9uKCRleHRyYSwgJGV4dHJhLCAnZGV2Jyk7Cn0KfQoKcmV0dXJuICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdHJhbnNmb3JtVmVyc2lvbihzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbiwgc3RyaW5nICRzdGFiaWxpdHkpOiBzdHJpbmcKewoKCiRzZW1hbnRpY1ZlcnNpb25QYXJ0cyA9IGV4cGxvZGUoJy4nLCAkdmVyc2lvbik7CgoKaWYgKGNvdW50KCRzZW1hbnRpY1ZlcnNpb25QYXJ0cykgPT09IDQgJiYgUHJlZzo6aXNNYXRjaCgne14wXEQ/fScsICRzZW1hbnRpY1ZlcnNpb25QYXJ0c1szXSkpIHsKCmlmICgkc2VtYW50aWNWZXJzaW9uUGFydHNbMF0gPT09ICcwJykgewp1bnNldCgkc2VtYW50aWNWZXJzaW9uUGFydHNbM10pOwp9IGVsc2Ugewp1bnNldCgkc2VtYW50aWNWZXJzaW9uUGFydHNbMl0sICRzZW1hbnRpY1ZlcnNpb25QYXJ0c1szXSk7Cn0KJHZlcnNpb24gPSBpbXBsb2RlKCcuJywgJHNlbWFudGljVmVyc2lvblBhcnRzKTsKfSBlbHNlIHsKcmV0dXJuICRwcmV0dHlWZXJzaW9uOwp9CgoKaWYgKCRzdGFiaWxpdHkgIT09ICdzdGFibGUnKSB7CiR2ZXJzaW9uIC49ICdAJy4kc3RhYmlsaXR5Owp9CgoKcmV0dXJuICdeJyAuICR2ZXJzaW9uOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhcnNlcigpOiBWZXJzaW9uUGFyc2VyCnsKaWYgKCR0aGlzLT5wYXJzZXIgPT09IG51bGwpIHsKJHRoaXMtPnBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7Cn0KCnJldHVybiAkdGhpcy0+cGFyc2VyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKY2xhc3MgUGFydGlhbENvbXBvc2VyCnsKCgoKcHJpdmF0ZSAkcGFja2FnZTsKCgoKCnByaXZhdGUgJGxvb3A7CgoKCgpwcml2YXRlICRyZXBvc2l0b3J5TWFuYWdlcjsKCgoKCnByaXZhdGUgJGluc3RhbGxhdGlvbk1hbmFnZXI7CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFja2FnZShSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBSb290UGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZyhDb25maWcgJGNvbmZpZyk6IHZvaWQKewokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZygpOiBDb25maWcKewpyZXR1cm4gJHRoaXMtPmNvbmZpZzsKfQoKcHVibGljIGZ1bmN0aW9uIHNldExvb3AoTG9vcCAkbG9vcCk6IHZvaWQKewokdGhpcy0+bG9vcCA9ICRsb29wOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9vcCgpOiBMb29wCnsKcmV0dXJuICR0aGlzLT5sb29wOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeU1hbmFnZXIoUmVwb3NpdG9yeU1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5TWFuYWdlcigpOiBSZXBvc2l0b3J5TWFuYWdlcgp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25NYW5hZ2VyKEluc3RhbGxhdGlvbk1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTogSW5zdGFsbGF0aW9uTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEV2ZW50RGlzcGF0Y2hlcihFdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlcik6IHZvaWQKewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV2ZW50RGlzcGF0Y2hlcigpOiBFdmVudERpc3BhdGNoZXIKewpyZXR1cm4gJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbGF0Zm9ybTsKCnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CgpjbGFzcyBIaHZtRGV0ZWN0b3IKewoKcHJpdmF0ZSBzdGF0aWMgJGhodm1WZXJzaW9uID0gbnVsbDsKCnByaXZhdGUgJGV4ZWN1dGFibGVGaW5kZXI7Cgpwcml2YXRlICRwcm9jZXNzRXhlY3V0b3I7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0V4ZWN1dGFibGVGaW5kZXIgJGV4ZWN1dGFibGVGaW5kZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzRXhlY3V0b3IgPSBudWxsKQp7CiR0aGlzLT5leGVjdXRhYmxlRmluZGVyID0gJGV4ZWN1dGFibGVGaW5kZXI7CiR0aGlzLT5wcm9jZXNzRXhlY3V0b3IgPSAkcHJvY2Vzc0V4ZWN1dG9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CnNlbGY6OiRoaHZtVmVyc2lvbiA9IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6ID9zdHJpbmcKewppZiAobnVsbCAhPT0gc2VsZjo6JGhodm1WZXJzaW9uKSB7CnJldHVybiBzZWxmOjokaGh2bVZlcnNpb24gPzogbnVsbDsKfQoKc2VsZjo6JGhodm1WZXJzaW9uID0gZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgPyBISFZNX1ZFUlNJT04gOiBudWxsOwppZiAoc2VsZjo6JGhodm1WZXJzaW9uID09PSBudWxsICYmICFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKc2VsZjo6JGhodm1WZXJzaW9uID0gZmFsc2U7CiR0aGlzLT5leGVjdXRhYmxlRmluZGVyID0gJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXIgPzogbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKJGhodm1QYXRoID0gJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXItPmZpbmQoJ2hodm0nKTsKaWYgKCRoaHZtUGF0aCAhPT0gbnVsbCkgewokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCk7CiRleGl0Q29kZSA9ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3ItPmV4ZWN1dGUoClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRoaHZtUGF0aCkuCicgLS1waHAgLWQgaGh2bS5qaXQ9MCAtciAiZWNobyBISFZNX1ZFUlNJT047IiAyPi9kZXYvbnVsbCcsCnNlbGY6OiRoaHZtVmVyc2lvbgopOwppZiAoJGV4aXRDb2RlICE9PSAwKSB7CnNlbGY6OiRoaHZtVmVyc2lvbiA9IGZhbHNlOwp9Cn0KfQoKcmV0dXJuIHNlbGY6OiRoaHZtVmVyc2lvbiA/OiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsYXRmb3JtOwoKY2xhc3MgUnVudGltZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNDb25zdGFudChzdHJpbmcgJGNvbnN0YW50LCA/c3RyaW5nICRjbGFzcyA9IG51bGwpOiBib29sCnsKcmV0dXJuIGRlZmluZWQobHRyaW0oJGNsYXNzLic6OicuJGNvbnN0YW50LCAnOicpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uc3RhbnQoc3RyaW5nICRjb25zdGFudCwgP3N0cmluZyAkY2xhc3MgPSBudWxsKQp7CnJldHVybiBjb25zdGFudChsdHJpbSgkY2xhc3MuJzo6Jy4kY29uc3RhbnQsICc6JykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzRnVuY3Rpb24oc3RyaW5nICRmbik6IGJvb2wKewpyZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCRmbik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGludm9rZShjYWxsYWJsZSAkY2FsbGFibGUsIGFycmF5ICRhcmd1bWVudHMgPSBbXSkKewpyZXR1cm4gJGNhbGxhYmxlKC4uLiRhcmd1bWVudHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ2xhc3Moc3RyaW5nICRjbGFzcyk6IGJvb2wKewpyZXR1cm4gY2xhc3NfZXhpc3RzKCRjbGFzcywgZmFsc2UpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uc3RydWN0KHN0cmluZyAkY2xhc3MsIGFycmF5ICRhcmd1bWVudHMgPSBbXSk6IG9iamVjdAp7CmlmIChlbXB0eSgkYXJndW1lbnRzKSkgewpyZXR1cm4gbmV3ICRjbGFzczsKfQoKJHJlZmwgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOwoKcmV0dXJuICRyZWZsLT5uZXdJbnN0YW5jZUFyZ3MoJGFyZ3VtZW50cyk7Cn0KCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucygpOiBhcnJheQp7CnJldHVybiBnZXRfbG9hZGVkX2V4dGVuc2lvbnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4dGVuc2lvblZlcnNpb24oc3RyaW5nICRleHRlbnNpb24pOiBzdHJpbmcKewokdmVyc2lvbiA9IHBocHZlcnNpb24oJGV4dGVuc2lvbik7CmlmICgkdmVyc2lvbiA9PT0gZmFsc2UpIHsKJHZlcnNpb24gPSAnMCc7Cn0KCnJldHVybiAkdmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4dGVuc2lvbkluZm8oc3RyaW5nICRleHRlbnNpb24pOiBzdHJpbmcKewokcmVmbGVjdG9yID0gbmV3IFxSZWZsZWN0aW9uRXh0ZW5zaW9uKCRleHRlbnNpb24pOwoKb2Jfc3RhcnQoKTsKJHJlZmxlY3Rvci0+aW5mbygpOwoKcmV0dXJuIG9iX2dldF9jbGVhbigpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsYXRmb3JtOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIFZlcnNpb24KewoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlT3BlbnNzbChzdHJpbmcgJG9wZW5zc2xWZXJzaW9uLCA/Ym9vbCAmJGlzRmlwcyk6ID9zdHJpbmcKewokaXNGaXBzID0gZmFsc2U7CgppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eKD88dmVyc2lvbj5bMC05Ll0rKSg/PHBhdGNoPlthLXpdezAsMn0pKD88c3VmZml4Pig/Oi0/KD86ZGV2fHByZXxhbHBoYXxiZXRhfHJjfGZpcHMpW1xkXSopKikoPzotXHcrKT8oPzogXCguKz9cKSk/JC8nLCAkb3BlbnNzbFZlcnNpb24sICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKCiRwYXRjaCA9ICcnOwppZiAodmVyc2lvbl9jb21wYXJlKCRtYXRjaGVzWyd2ZXJzaW9uJ10sICczLjAuMCcsICc8JykpIHsKJHBhdGNoID0gJy4nLnNlbGY6OmNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oJG1hdGNoZXNbJ3BhdGNoJ10pOwp9CgokaXNGaXBzID0gc3RycG9zKCRtYXRjaGVzWydzdWZmaXgnXSwgJ2ZpcHMnKSAhPT0gZmFsc2U7CiRzdWZmaXggPSBzdHJ0cignLScubHRyaW0oJG1hdGNoZXNbJ3N1ZmZpeCddLCAnLScpLCBbJy1maXBzJyA9PiAnJywgJy1wcmUnID0+ICctYWxwaGEnXSk7CgpyZXR1cm4gcnRyaW0oJG1hdGNoZXNbJ3ZlcnNpb24nXS4kcGF0Y2guJHN1ZmZpeCwgJy0nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUxpYmpwZWcoc3RyaW5nICRsaWJqcGVnVmVyc2lvbik6ID9zdHJpbmcKewppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eKD88bWFqb3I+XGQrKSg/PG1pbm9yPlthLXpdKikkLycsICRsaWJqcGVnVmVyc2lvbiwgJG1hdGNoZXMpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ21ham9yJ10uJy4nLnNlbGY6OmNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oJG1hdGNoZXNbJ21pbm9yJ10pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlWm9uZWluZm9WZXJzaW9uKHN0cmluZyAkem9uZWluZm9WZXJzaW9uKTogP3N0cmluZwp7CmlmICghUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14oPzx5ZWFyPlxkezR9KSg/PHJldmlzaW9uPlthLXpdKikkLycsICR6b25laW5mb1ZlcnNpb24sICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRtYXRjaGVzWyd5ZWFyJ10uJy4nLnNlbGY6OmNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oJG1hdGNoZXNbJ3JldmlzaW9uJ10pOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0QWxwaGFWZXJzaW9uVG9JbnRWZXJzaW9uKHN0cmluZyAkYWxwaGEpOiBpbnQKewpyZXR1cm4gc3RybGVuKCRhbHBoYSkgKiAoLW9yZCgnYScpICsgMSkgKyBhcnJheV9zdW0oYXJyYXlfbWFwKCdvcmQnLCBzdHJfc3BsaXQoJGFscGhhKSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRMaWJ4cG1WZXJzaW9uSWQoaW50ICR2ZXJzaW9uSWQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Y29udmVydFZlcnNpb25JZCgkdmVyc2lvbklkLCAxMDApOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRPcGVubGRhcFZlcnNpb25JZChpbnQgJHZlcnNpb25JZCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpjb252ZXJ0VmVyc2lvbklkKCR2ZXJzaW9uSWQsIDEwMCk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uSWQoaW50ICR2ZXJzaW9uSWQsIGludCAkYmFzZSk6IHN0cmluZwp7CnJldHVybiBzcHJpbnRmKAonJWQuJWQuJWQnLAokdmVyc2lvbklkIC8gKCRiYXNlICogJGJhc2UpLAooaW50KSAoJHZlcnNpb25JZCAvICRiYXNlKSAlICRiYXNlLAokdmVyc2lvbklkICUgJGJhc2UKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW5cQ2FwYWJpbGl0eTsKCgoKCgoKCmludGVyZmFjZSBDYXBhYmlsaXR5CnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luXENhcGFiaWxpdHk7CgoKCgoKCgoKCgoKaW50ZXJmYWNlIENvbW1hbmRQcm92aWRlciBleHRlbmRzIENhcGFiaWxpdHkKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kcygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47CgoKCgoKCgoKaW50ZXJmYWNlIENhcGFibGUKewoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0aWVzKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBDb21tYW5kRXZlbnQgZXh0ZW5kcyBFdmVudAp7CgoKCnByaXZhdGUgJGNvbW1hbmROYW1lOwoKCgoKcHJpdmF0ZSAkaW5wdXQ7CgoKCgpwcml2YXRlICRvdXRwdXQ7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIHN0cmluZyAkY29tbWFuZE5hbWUsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGFycmF5ICRhcmdzID0gW10sIGFycmF5ICRmbGFncyA9IFtdKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUsICRhcmdzLCAkZmxhZ3MpOwokdGhpcy0+Y29tbWFuZE5hbWUgPSAkY29tbWFuZE5hbWU7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpOiBJbnB1dEludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW5wdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKTogT3V0cHV0SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmROYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb247CgpjbGFzcyBQbHVnaW5CbG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKCgoKCgpjbGFzcyBQbHVnaW5FdmVudHMKewoKCgoKCgoKCnB1YmxpYyBjb25zdCBJTklUID0gJ2luaXQnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgQ09NTUFORCA9ICdjb21tYW5kJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9GSUxFX0RPV05MT0FEID0gJ3ByZS1maWxlLWRvd25sb2FkJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfRklMRV9ET1dOTE9BRCA9ICdwb3N0LWZpbGUtZG93bmxvYWQnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0NPTU1BTkRfUlVOID0gJ3ByZS1jb21tYW5kLXJ1bic7CgoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1BPT0xfQ1JFQVRFID0gJ3ByZS1wb29sLWNyZWF0ZSc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgUGx1Z2luSW50ZXJmYWNlCnsKCgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQTFVHSU5fQVBJX1ZFUlNJT04gPSAnMi42LjAnOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWN0aXZhdGUoQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8pOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYWN0aXZhdGUoQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8pOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8pOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5XENhcGFiaWxpdHk7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CgoKCgoKCgpjbGFzcyBQbHVnaW5NYW5hZ2VyCnsKCnByb3RlY3RlZCAkY29tcG9zZXI7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRnbG9iYWxDb21wb3NlcjsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZTsKCgpwcm90ZWN0ZWQgJHBsdWdpbnMgPSBbXTsKCnByb3RlY3RlZCAkcmVnaXN0ZXJlZFBsdWdpbnMgPSBbXTsKCgoKCnByaXZhdGUgJGFsbG93UGx1Z2luUnVsZXM7CgoKCgpwcml2YXRlICRhbGxvd0dsb2JhbFBsdWdpblJ1bGVzOwoKCnByaXZhdGUgJHJ1bm5pbmdJbkdsb2JhbERpciA9IGZhbHNlOwoKCnByaXZhdGUgc3RhdGljICRjbGFzc0NvdW50ZXIgPSAwOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29tcG9zZXIgJGNvbXBvc2VyLCA/UGFydGlhbENvbXBvc2VyICRnbG9iYWxDb21wb3NlciA9IG51bGwsICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbXBvc2VyID0gJGNvbXBvc2VyOwokdGhpcy0+Z2xvYmFsQ29tcG9zZXIgPSAkZ2xvYmFsQ29tcG9zZXI7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHRoaXMtPmRpc2FibGVQbHVnaW5zID0gJGRpc2FibGVQbHVnaW5zOwokdGhpcy0+YWxsb3dQbHVnaW5SdWxlcyA9ICR0aGlzLT5wYXJzZUFsbG93ZWRQbHVnaW5zKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYWxsb3ctcGx1Z2lucycpLCAkY29tcG9zZXItPmdldExvY2tlcigpKTsKJHRoaXMtPmFsbG93R2xvYmFsUGx1Z2luUnVsZXMgPSAkdGhpcy0+cGFyc2VBbGxvd2VkUGx1Z2lucygkZ2xvYmFsQ29tcG9zZXIgIT09IG51bGwgPyAkZ2xvYmFsQ29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FsbG93LXBsdWdpbnMnKSA6IGZhbHNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJ1bm5pbmdJbkdsb2JhbERpcihib29sICRydW5uaW5nSW5HbG9iYWxEaXIpOiB2b2lkCnsKJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA9ICRydW5uaW5nSW5HbG9iYWxEaXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkSW5zdGFsbGVkUGx1Z2lucygpOiB2b2lkCnsKaWYgKCEkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCdsb2NhbCcpKSB7CiRyZXBvID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHRoaXMtPmxvYWRSZXBvc2l0b3J5KCRyZXBvLCBmYWxzZSk7Cn0KCmlmICgkdGhpcy0+Z2xvYmFsQ29tcG9zZXIgIT09IG51bGwgJiYgISR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJ2dsb2JhbCcpKSB7CiR0aGlzLT5sb2FkUmVwb3NpdG9yeSgkdGhpcy0+Z2xvYmFsQ29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLCB0cnVlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVhY3RpdmF0ZUluc3RhbGxlZFBsdWdpbnMoKTogdm9pZAp7CmlmICghJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgnbG9jYWwnKSkgewokcmVwbyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiR0aGlzLT5kZWFjdGl2YXRlUmVwb3NpdG9yeSgkcmVwbywgZmFsc2UpOwp9CgppZiAoJHRoaXMtPmdsb2JhbENvbXBvc2VyICE9PSBudWxsICYmICEkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCdnbG9iYWwnKSkgewokdGhpcy0+ZGVhY3RpdmF0ZVJlcG9zaXRvcnkoJHRoaXMtPmdsb2JhbENvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSwgdHJ1ZSk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2lucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGx1Z2luczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEdsb2JhbENvbXBvc2VyKCk6ID9QYXJ0aWFsQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmdsb2JhbENvbXBvc2VyOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWdpc3RlclBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkZmFpbE9uTWlzc2luZ0NsYXNzZXMgPSBmYWxzZSwgYm9vbCAkaXNHbG9iYWxQbHVnaW4gPSBmYWxzZSk6IHZvaWQKewppZiAoJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgkaXNHbG9iYWxQbHVnaW4gPyAnZ2xvYmFsJyA6ICdsb2NhbCcpKSB7CnJldHVybjsKfQoKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nKSB7CiRyZXF1aXJlc0NvbXBvc2VyID0gbnVsbDsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsgCmlmICgnY29tcG9zZXItcGx1Z2luLWFwaScgPT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewokcmVxdWlyZXNDb21wb3NlciA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCk7CmJyZWFrOwp9Cn0KCmlmICghJHJlcXVpcmVzQ29tcG9zZXIpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJQbHVnaW4gIi4kcGFja2FnZS0+Z2V0TmFtZSgpLiIgaXMgbWlzc2luZyBhIHJlcXVpcmUgc3RhdGVtZW50IGZvciBhIHZlcnNpb24gb2YgdGhlIGNvbXBvc2VyLXBsdWdpbi1hcGkgcGFja2FnZS4iKTsKfQoKJGN1cnJlbnRQbHVnaW5BcGlWZXJzaW9uID0gJHRoaXMtPmdldFBsdWdpbkFwaVZlcnNpb24oKTsKJGN1cnJlbnRQbHVnaW5BcGlDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkY3VycmVudFBsdWdpbkFwaVZlcnNpb24pKTsKCmlmICgkcmVxdWlyZXNDb21wb3Nlci0+Z2V0UHJldHR5U3RyaW5nKCkgPT09ICR0aGlzLT5nZXRQbHVnaW5BcGlWZXJzaW9uKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgcGx1Z2luIHJlcXVpcmVzIGNvbXBvc2VyLXBsdWdpbi1hcGkgJy4kdGhpcy0+Z2V0UGx1Z2luQXBpVmVyc2lvbigpLicsIHRoaXMgKldJTEwqIGJyZWFrIGluIHRoZSBmdXR1cmUgYW5kIGl0IHNob3VsZCBiZSBmaXhlZCBBU0FQIChyZXF1aXJlIF4nLiR0aGlzLT5nZXRQbHVnaW5BcGlWZXJzaW9uKCkuJyBpbnN0ZWFkIGZvciBleGFtcGxlKS48L3dhcm5pbmc+Jyk7Cn0gZWxzZWlmICghJHJlcXVpcmVzQ29tcG9zZXItPm1hdGNoZXMoJGN1cnJlbnRQbHVnaW5BcGlDb25zdHJhaW50KSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiBwbHVnaW4gJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nd2FzIHNraXBwZWQgYmVjYXVzZSBpdCByZXF1aXJlcyBhIFBsdWdpbiBBUEkgdmVyc2lvbiAoIicgLiAkcmVxdWlyZXNDb21wb3Nlci0+Z2V0UHJldHR5U3RyaW5nKCkgLiAnIikgdGhhdCBkb2VzIG5vdCBtYXRjaCB5b3VyIENvbXBvc2VyIGluc3RhbGxhdGlvbiAoIicgLiAkY3VycmVudFBsdWdpbkFwaVZlcnNpb24gLiAnIikuIFlvdSBtYXkgbmVlZCB0byBydW4gY29tcG9zZXIgdXBkYXRlIHdpdGggdGhlICItLW5vLXBsdWdpbnMiIG9wdGlvbi48L3dhcm5pbmc+Jyk7CgpyZXR1cm47Cn0KCmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAnc3ltZm9ueS9mbGV4JyAmJiBQcmVnOjppc01hdGNoKCd7XlswLTkuXSskfScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpICYmIHZlcnNpb25fY29tcGFyZSgkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAnMS45LjgnLCAnPCcpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICciIHBsdWdpbiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLid3YXMgc2tpcHBlZCBiZWNhdXNlIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQ29tcG9zZXIgMisuIE1ha2Ugc3VyZSB0byB1cGRhdGUgaXQgdG8gdmVyc2lvbiAxLjkuOCBvciBncmVhdGVyLjwvd2FybmluZz4nKTsKCnJldHVybjsKfQp9CgppZiAoISR0aGlzLT5pc1BsdWdpbkFsbG93ZWQoJHBhY2thZ2UtPmdldE5hbWUoKSwgJGlzR2xvYmFsUGx1Z2luLCB0cnVlID09PSAoJHBhY2thZ2UtPmdldEV4dHJhKClbJ3BsdWdpbi1vcHRpb25hbCddID8/IGZhbHNlKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdTa2lwcGVkIGxvYWRpbmcgIicuJHBhY2thZ2UtPmdldE5hbWUoKSAuICciICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyhpbnN0YWxsZWQgZ2xvYmFsbHkpICcgOiAnJykuJ2FzIGl0IGlzIG5vdCBpbiBjb25maWcuYWxsb3ctcGx1Z2lucycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm47Cn0KCiRvbGRJbnN0YWxsZXJQbHVnaW4gPSAoJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLWluc3RhbGxlcicpOwoKaWYgKGlzc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKcmV0dXJuOwp9CgokZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKTsKaWYgKGVtcHR5KCRleHRyYVsnY2xhc3MnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0Vycm9yIHdoaWxlIGluc3RhbGxpbmcgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicsIGNvbXBvc2VyLXBsdWdpbiBwYWNrYWdlcyBzaG91bGQgaGF2ZSBhIGNsYXNzIGRlZmluZWQgaW4gdGhlaXIgZXh0cmEga2V5IHRvIGJlIHVzYWJsZS4nKTsKfQokY2xhc3NlcyA9IGlzX2FycmF5KCRleHRyYVsnY2xhc3MnXSkgPyAkZXh0cmFbJ2NsYXNzJ10gOiBbJGV4dHJhWydjbGFzcyddXTsKCiRsb2NhbFJlcG8gPSAkdGhpcy0+Y29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokZ2xvYmFsUmVwbyA9ICR0aGlzLT5nbG9iYWxDb21wb3NlciAhPT0gbnVsbCA/ICR0aGlzLT5nbG9iYWxDb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCkgOiBudWxsOwoKJHJvb3RQYWNrYWdlID0gY2xvbmUgJHRoaXMtPmNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CgoKCiRyb290UGFja2FnZUF1dG9sb2FkcyA9ICRyb290UGFja2FnZS0+Z2V0QXV0b2xvYWQoKTsKJHJvb3RQYWNrYWdlQXV0b2xvYWRzWydmaWxlcyddID0gW107CiRyb290UGFja2FnZS0+c2V0QXV0b2xvYWQoJHJvb3RQYWNrYWdlQXV0b2xvYWRzKTsKJHJvb3RQYWNrYWdlQXV0b2xvYWRzID0gJHJvb3RQYWNrYWdlLT5nZXREZXZBdXRvbG9hZCgpOwokcm9vdFBhY2thZ2VBdXRvbG9hZHNbJ2ZpbGVzJ10gPSBbXTsKJHJvb3RQYWNrYWdlLT5zZXREZXZBdXRvbG9hZCgkcm9vdFBhY2thZ2VBdXRvbG9hZHMpOwp1bnNldCgkcm9vdFBhY2thZ2VBdXRvbG9hZHMpOwoKJHJvb3RQYWNrYWdlUmVwbyA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoJHJvb3RQYWNrYWdlKTsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2FsUmVwbywgJHJvb3RQYWNrYWdlUmVwb10pOwppZiAoJGdsb2JhbFJlcG8pIHsKJGluc3RhbGxlZFJlcG8tPmFkZFJlcG9zaXRvcnkoJGdsb2JhbFJlcG8pOwp9CgokYXV0b2xvYWRQYWNrYWdlcyA9IFskcGFja2FnZS0+Z2V0TmFtZSgpID0+ICRwYWNrYWdlXTsKJGF1dG9sb2FkUGFja2FnZXMgPSAkdGhpcy0+Y29sbGVjdERlcGVuZGVuY2llcygkaW5zdGFsbGVkUmVwbywgJGF1dG9sb2FkUGFja2FnZXMsICRwYWNrYWdlKTsKCiRnZW5lcmF0b3IgPSAkdGhpcy0+Y29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCk7CiRhdXRvbG9hZHMgPSBbWyRyb290UGFja2FnZSwgJyddXTsKZm9yZWFjaCAoJGF1dG9sb2FkUGFja2FnZXMgYXMgJGF1dG9sb2FkUGFja2FnZSkgewppZiAoJGF1dG9sb2FkUGFja2FnZSA9PT0gJHJvb3RQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJGF1dG9sb2FkUGFja2FnZSwgJGdsb2JhbFJlcG8gJiYgJGdsb2JhbFJlcG8tPmhhc1BhY2thZ2UoJGF1dG9sb2FkUGFja2FnZSkpOwppZiAoJGluc3RhbGxQYXRoID09PSBudWxsKSB7CmNvbnRpbnVlOwp9CiRhdXRvbG9hZHNbXSA9IFskYXV0b2xvYWRQYWNrYWdlLCAkaW5zdGFsbFBhdGhdOwp9CgokbWFwID0gJGdlbmVyYXRvci0+cGFyc2VBdXRvbG9hZHMoJGF1dG9sb2FkcywgJHJvb3RQYWNrYWdlKTsKJGNsYXNzTG9hZGVyID0gJGdlbmVyYXRvci0+Y3JlYXRlTG9hZGVyKCRtYXAsICR0aGlzLT5jb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpKTsKJGNsYXNzTG9hZGVyLT5yZWdpc3RlcihmYWxzZSk7Cgpmb3JlYWNoICgkbWFwWydmaWxlcyddIGFzICRmaWxlSWRlbnRpZmllciA9PiAkZmlsZSkgewoKCgppZiAoJGZpbGVJZGVudGlmaWVyID09PSAnN2U5YmQ2MTJjYzQ0NGIzZWVkNzg4ZWJiZTQ2MjYzYTAnKSB7CmNvbnRpbnVlOwp9ClxDb21wb3NlclxBdXRvbG9hZFxjb21wb3NlclJlcXVpcmUoJGZpbGVJZGVudGlmaWVyLCAkZmlsZSk7Cn0KCmZvcmVhY2ggKCRjbGFzc2VzIGFzICRjbGFzcykgewppZiAoY2xhc3NfZXhpc3RzKCRjbGFzcywgZmFsc2UpKSB7CiRjbGFzcyA9IHRyaW0oJGNsYXNzLCAnXFwnKTsKJHBhdGggPSAkY2xhc3NMb2FkZXItPmZpbmRGaWxlKCRjbGFzcyk7CiRjb2RlID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwokc2VwYXJhdG9yUG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpOwokY2xhc3NOYW1lID0gJGNsYXNzOwppZiAoJHNlcGFyYXRvclBvcykgewokY2xhc3NOYW1lID0gc3Vic3RyKCRjbGFzcywgJHNlcGFyYXRvclBvcyArIDEpOwp9CiRjb2RlID0gUHJlZzo6cmVwbGFjZSgne14oKD86KD86ZmluYWx8cmVhZG9ubHkpXHMrKSooPzpccyopKWNsYXNzXHMrKCcucHJlZ19xdW90ZSgkY2xhc3NOYW1lKS4nKX1taScsICckMWNsYXNzICQyX2NvbXBvc2VyX3RtcCcuc2VsZjo6JGNsYXNzQ291bnRlciwgJGNvZGUsIDEpOwokY29kZSA9IHN0cnRyKCRjb2RlLCBbCidfX0ZJTEVfXycgPT4gdmFyX2V4cG9ydCgkcGF0aCwgdHJ1ZSksCidfX0RJUl9fJyA9PiB2YXJfZXhwb3J0KGRpcm5hbWUoJHBhdGgpLCB0cnVlKSwKJ19fQ0xBU1NfXycgPT4gdmFyX2V4cG9ydCgkY2xhc3MsIHRydWUpLApdKTsKJGNvZGUgPSBQcmVnOjpyZXBsYWNlKCcvXlxzKjxcPyhwaHApPy9pJywgJycsICRjb2RlLCAxKTsKZXZhbCgkY29kZSk7CiRjbGFzcyAuPSAnX2NvbXBvc2VyX3RtcCcuc2VsZjo6JGNsYXNzQ291bnRlcjsKc2VsZjo6JGNsYXNzQ291bnRlcisrOwp9CgppZiAoJG9sZEluc3RhbGxlclBsdWdpbikgewppZiAoIWlzX2EoJGNsYXNzLCAnQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckludGVyZmFjZScsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGFjdGl2YXRlIHBsdWdpbiAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiciIGFzICInLiRjbGFzcy4nIiBkb2VzIG5vdCBpbXBsZW1lbnQgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckludGVyZmFjZScpOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+TG9hZGluZyAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nd2hpY2ggaXMgYSBsZWdhY3kgY29tcG9zZXItaW5zdGFsbGVyIGJ1aWx0IGZvciBDb21wb3NlciAxLngsIGl0IGlzIGxpa2VseSB0byBjYXVzZSBpc3N1ZXMgYXMgeW91IGFyZSBydW5uaW5nIENvbXBvc2VyIDIueC48L3dhcm5pbmc+Jyk7CiRpbnN0YWxsZXIgPSBuZXcgJGNsYXNzKCR0aGlzLT5pbywgJHRoaXMtPmNvbXBvc2VyKTsKJHRoaXMtPmNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmFkZEluc3RhbGxlcigkaW5zdGFsbGVyKTsKJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGluc3RhbGxlcjsKfSBlbHNlaWYgKGNsYXNzX2V4aXN0cygkY2xhc3MpKSB7CmlmICghaXNfYSgkY2xhc3MsICdDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlJywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgYWN0aXZhdGUgcGx1Z2luICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgYXMgIicuJGNsYXNzLiciIGRvZXMgbm90IGltcGxlbWVudCBDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlJyk7Cn0KJHBsdWdpbiA9IG5ldyAkY2xhc3MoKTsKJHRoaXMtPmFkZFBsdWdpbigkcGx1Z2luLCAkaXNHbG9iYWxQbHVnaW4sICRwYWNrYWdlKTsKJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBsdWdpbjsKfSBlbHNlaWYgKCRmYWlsT25NaXNzaW5nQ2xhc3Nlcykgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUGx1Z2luICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCwgY2xhc3Mgbm90IGZvdW5kOiAnLiRjbGFzcyk7Cn0KfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWFjdGl2YXRlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmlmICghaXNzZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpyZXR1cm47Cn0KCiRwbHVnaW4gPSAkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV07CnVuc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7CmlmICgkcGx1Z2luIGluc3RhbmNlb2YgSW5zdGFsbGVySW50ZXJmYWNlKSB7CiR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5yZW1vdmVJbnN0YWxsZXIoJHBsdWdpbik7Cn0gZWxzZSB7CiR0aGlzLT5yZW1vdmVQbHVnaW4oJHBsdWdpbik7Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmlmICghaXNzZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpyZXR1cm47Cn0KCiRwbHVnaW4gPSAkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV07CmlmICgkcGx1Z2luIGluc3RhbmNlb2YgSW5zdGFsbGVySW50ZXJmYWNlKSB7CiR0aGlzLT5kZWFjdGl2YXRlUGFja2FnZSgkcGFja2FnZSk7Cn0gZWxzZSB7CnVuc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7CiR0aGlzLT5yZW1vdmVQbHVnaW4oJHBsdWdpbik7CiR0aGlzLT51bmluc3RhbGxQbHVnaW4oJHBsdWdpbik7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBsdWdpbkFwaVZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuIFBsdWdpbkludGVyZmFjZTo6UExVR0lOX0FQSV9WRVJTSU9OOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBsdWdpbihQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbiwgYm9vbCAkaXNHbG9iYWxQbHVnaW4gPSBmYWxzZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHNvdXJjZVBhY2thZ2UgPSBudWxsKTogdm9pZAp7CmlmICgkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCRpc0dsb2JhbFBsdWdpbiA/ICdnbG9iYWwnIDogJ2xvY2FsJykpIHsKcmV0dXJuOwp9CgppZiAoJHNvdXJjZVBhY2thZ2UgPT09IG51bGwpIHsKdHJpZ2dlcl9lcnJvcignQ2FsbGluZyBQbHVnaW5NYW5hZ2VyOjphZGRQbHVnaW4gd2l0aG91dCAkc291cmNlUGFja2FnZSBpcyBkZXByZWNhdGVkLCBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgcGxlYXNlIGdldCBpbiB0b3VjaCB3aXRoIHVzIHRvIGV4cGxhaW4gdGhlIHVzZSBjYXNlJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9IGVsc2VpZiAoISR0aGlzLT5pc1BsdWdpbkFsbG93ZWQoJHNvdXJjZVBhY2thZ2UtPmdldE5hbWUoKSwgJGlzR2xvYmFsUGx1Z2luLCB0cnVlID09PSAoJHNvdXJjZVBhY2thZ2UtPmdldEV4dHJhKClbJ3BsdWdpbi1vcHRpb25hbCddID8/IGZhbHNlKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdTa2lwcGVkIGxvYWRpbmcgIicuZ2V0X2NsYXNzKCRwbHVnaW4pLicgZnJvbSAnLiRzb3VyY2VQYWNrYWdlLT5nZXROYW1lKCkgLiAnIiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLicgYXMgaXQgaXMgbm90IGluIGNvbmZpZy5hbGxvdy1wbHVnaW5zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybjsKfQoKJGRldGFpbHMgPSBbXTsKaWYgKCRzb3VyY2VQYWNrYWdlKSB7CiRkZXRhaWxzW10gPSAnZnJvbSAnLiRzb3VyY2VQYWNrYWdlLT5nZXROYW1lKCk7Cn0KaWYgKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyKSB7CiRkZXRhaWxzW10gPSAnaW5zdGFsbGVkIGdsb2JhbGx5JzsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgcGx1Z2luICcuZ2V0X2NsYXNzKCRwbHVnaW4pLigkZGV0YWlscyA/ICcgKCcuaW1wbG9kZSgnLCAnLCAkZGV0YWlscykuJyknIDogJycpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+cGx1Z2luc1tdID0gJHBsdWdpbjsKJHBsdWdpbi0+YWN0aXZhdGUoJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8pOwoKaWYgKCRwbHVnaW4gaW5zdGFuY2VvZiBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UpIHsKJHRoaXMtPmNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+YWRkU3Vic2NyaWJlcigkcGx1Z2luKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUGx1Z2luKFBsdWdpbkludGVyZmFjZSAkcGx1Z2luKTogdm9pZAp7CiRpbmRleCA9IGFycmF5X3NlYXJjaCgkcGx1Z2luLCAkdGhpcy0+cGx1Z2lucywgdHJ1ZSk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybjsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdVbmxvYWRpbmcgcGx1Z2luICcuZ2V0X2NsYXNzKCRwbHVnaW4pLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp1bnNldCgkdGhpcy0+cGx1Z2luc1skaW5kZXhdKTsKJHBsdWdpbi0+ZGVhY3RpdmF0ZSgkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbyk7CgokdGhpcy0+Y29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5yZW1vdmVMaXN0ZW5lcigkcGx1Z2luKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbFBsdWdpbihQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbik6IHZvaWQKewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1VuaW5zdGFsbGluZyBwbHVnaW4gJy5nZXRfY2xhc3MoJHBsdWdpbiksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRwbHVnaW4tPnVuaW5zdGFsbCgkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbyk7Cn0KCgoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGJvb2wgJGlzR2xvYmFsUmVwbyk6IHZvaWQKewokcGFja2FnZXMgPSAkcmVwby0+Z2V0UGFja2FnZXMoKTsKCiR3ZWlnaHRzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicpIHsKJGV4dHJhID0gJHBhY2thZ2UtPmdldEV4dHJhKCk7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAnY29tcG9zZXIvaW5zdGFsbGVycycgfHwgdHJ1ZSA9PT0gKCRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWluc3RhbGwtcGF0aCddID8/IGZhbHNlKSkgewokd2VpZ2h0c1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IC0xMDAwMDsKfQp9Cn0KCiRzb3J0ZWRQYWNrYWdlcyA9IFBhY2thZ2VTb3J0ZXI6OnNvcnRQYWNrYWdlcygkcGFja2FnZXMsICR3ZWlnaHRzKTsKZm9yZWFjaCAoJHNvcnRlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICghKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSkgewpjb250aW51ZTsKfQppZiAoJ2NvbXBvc2VyLXBsdWdpbicgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKJHRoaXMtPnJlZ2lzdGVyUGFja2FnZSgkcGFja2FnZSwgZmFsc2UsICRpc0dsb2JhbFJlcG8pOwoKfSBlbHNlaWYgKCdjb21wb3Nlci1pbnN0YWxsZXInID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CiR0aGlzLT5yZWdpc3RlclBhY2thZ2UoJHBhY2thZ2UsIGZhbHNlLCAkaXNHbG9iYWxSZXBvKTsKfQp9Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlYWN0aXZhdGVSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGJvb2wgJGlzR2xvYmFsUmVwbyk6IHZvaWQKewokcGFja2FnZXMgPSAkcmVwby0+Z2V0UGFja2FnZXMoKTsKJHNvcnRlZFBhY2thZ2VzID0gYXJyYXlfcmV2ZXJzZShQYWNrYWdlU29ydGVyOjpzb3J0UGFja2FnZXMoJHBhY2thZ2VzKSk7Cgpmb3JlYWNoICgkc29ydGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCEoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpKSB7CmNvbnRpbnVlOwp9CmlmICgnY29tcG9zZXItcGx1Z2luJyA9PT0gJHBhY2thZ2UtPmdldFR5cGUoKSkgewokdGhpcy0+ZGVhY3RpdmF0ZVBhY2thZ2UoJHBhY2thZ2UpOwoKfSBlbHNlaWYgKCdjb21wb3Nlci1pbnN0YWxsZXInID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CiR0aGlzLT5kZWFjdGl2YXRlUGFja2FnZSgkcGFja2FnZSk7Cn0KfQp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbGxlY3REZXBlbmRlbmNpZXMoSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgYXJyYXkgJGNvbGxlY3RlZCwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJHJlcXVpcmVMaW5rKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZXNXaXRoUmVwbGFjZXJzQW5kUHJvdmlkZXJzKCRyZXF1aXJlTGluay0+Z2V0VGFyZ2V0KCkpIGFzICRyZXF1aXJlZFBhY2thZ2UpIHsKaWYgKCFpc3NldCgkY29sbGVjdGVkWyRyZXF1aXJlZFBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRjb2xsZWN0ZWRbJHJlcXVpcmVkUGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRyZXF1aXJlZFBhY2thZ2U7CiRjb2xsZWN0ZWQgPSAkdGhpcy0+Y29sbGVjdERlcGVuZGVuY2llcygkaW5zdGFsbGVkUmVwbywgJGNvbGxlY3RlZCwgJHJlcXVpcmVkUGFja2FnZSk7Cn0KfQp9CgpyZXR1cm4gJGNvbGxlY3RlZDsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkZ2xvYmFsID0gZmFsc2UpOiA/c3RyaW5nCnsKaWYgKCEkZ2xvYmFsKSB7CnJldHVybiAkdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwp9Cgphc3NlcnQobnVsbCAhPT0gJHRoaXMtPmdsb2JhbENvbXBvc2VyKTsKCnJldHVybiAkdGhpcy0+Z2xvYmFsQ29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENhcGFiaWxpdHlJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbiwgc3RyaW5nICRjYXBhYmlsaXR5KTogP3N0cmluZwp7CmlmICghKCRwbHVnaW4gaW5zdGFuY2VvZiBDYXBhYmxlKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNhcGFiaWxpdGllcyA9IChhcnJheSkgJHBsdWdpbi0+Z2V0Q2FwYWJpbGl0aWVzKCk7CgppZiAoIWVtcHR5KCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSAmJiBpc19zdHJpbmcoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pICYmIHRyaW0oJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pKSB7CnJldHVybiB0cmltKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKTsKfQoKaWYgKAphcnJheV9rZXlfZXhpc3RzKCRjYXBhYmlsaXR5LCAkY2FwYWJpbGl0aWVzKQomJiAoZW1wdHkoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pIHx8ICFpc19zdHJpbmcoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pIHx8ICF0cmltKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSkKKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gJy5nZXRfY2xhc3MoJHBsdWdpbikuJyBwcm92aWRlZCBpbnZhbGlkIGNhcGFiaWxpdHkgY2xhc3MgbmFtZShzKSwgZ290ICcudmFyX2V4cG9ydCgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSwgdHJ1ZSkpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbkNhcGFiaWxpdHkoUGx1Z2luSW50ZXJmYWNlICRwbHVnaW4sICRjYXBhYmlsaXR5Q2xhc3NOYW1lLCBhcnJheSAkY3RvckFyZ3MgPSBbXSk6ID9DYXBhYmlsaXR5CnsKaWYgKCRjYXBhYmlsaXR5Q2xhc3MgPSAkdGhpcy0+Z2V0Q2FwYWJpbGl0eUltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCRwbHVnaW4sICRjYXBhYmlsaXR5Q2xhc3NOYW1lKSkgewppZiAoIWNsYXNzX2V4aXN0cygkY2FwYWJpbGl0eUNsYXNzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBDYXBhYmlsaXR5LCBhcyBjbGFzcyAkY2FwYWJpbGl0eUNsYXNzIGZyb20gcGx1Z2luICIuZ2V0X2NsYXNzKCRwbHVnaW4pLiIgZG9lcyBub3QgZXhpc3QuIik7Cn0KCiRjdG9yQXJnc1sncGx1Z2luJ10gPSAkcGx1Z2luOwokY2FwYWJpbGl0eU9iaiA9IG5ldyAkY2FwYWJpbGl0eUNsYXNzKCRjdG9yQXJncyk7CgoKaWYgKCEkY2FwYWJpbGl0eU9iaiBpbnN0YW5jZW9mIENhcGFiaWxpdHkgfHwgISRjYXBhYmlsaXR5T2JqIGluc3RhbmNlb2YgJGNhcGFiaWxpdHlDbGFzc05hbWUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonQ2xhc3MgJyAuICRjYXBhYmlsaXR5Q2xhc3MgLiAnIG11c3QgaW1wbGVtZW50IGJvdGggQ29tcG9zZXJcUGx1Z2luXENhcGFiaWxpdHlcQ2FwYWJpbGl0eSBhbmQgJy4gJGNhcGFiaWxpdHlDbGFzc05hbWUgLiAnLicKKTsKfQoKcmV0dXJuICRjYXBhYmlsaXR5T2JqOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2luQ2FwYWJpbGl0aWVzKCRjYXBhYmlsaXR5Q2xhc3NOYW1lLCBhcnJheSAkY3RvckFyZ3MgPSBbXSk6IGFycmF5CnsKJGNhcGFiaWxpdGllcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGx1Z2lucygpIGFzICRwbHVnaW4pIHsKJGNhcGFiaWxpdHkgPSAkdGhpcy0+Z2V0UGx1Z2luQ2FwYWJpbGl0eSgkcGx1Z2luLCAkY2FwYWJpbGl0eUNsYXNzTmFtZSwgJGN0b3JBcmdzKTsKaWYgKG51bGwgIT09ICRjYXBhYmlsaXR5KSB7CiRjYXBhYmlsaXRpZXNbXSA9ICRjYXBhYmlsaXR5Owp9Cn0KCnJldHVybiAkY2FwYWJpbGl0aWVzOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUFsbG93ZWRQbHVnaW5zKCRhbGxvd1BsdWdpbnNDb25maWcsID9Mb2NrZXIgJGxvY2tlciA9IG51bGwpOiA/YXJyYXkKewppZiAoW10gPT09ICRhbGxvd1BsdWdpbnNDb25maWcgJiYgJGxvY2tlciAhPT0gbnVsbCAmJiAkbG9ja2VyLT5pc0xvY2tlZCgpICYmIHZlcnNpb25fY29tcGFyZSgkbG9ja2VyLT5nZXRQbHVnaW5BcGkoKSwgJzIuMi4wJywgJzwnKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKHRydWUgPT09ICRhbGxvd1BsdWdpbnNDb25maWcpIHsKcmV0dXJuIFsne30nID0+IHRydWVdOwp9CgppZiAoZmFsc2UgPT09ICRhbGxvd1BsdWdpbnNDb25maWcpIHsKcmV0dXJuIFsne30nID0+IGZhbHNlXTsKfQoKJHJ1bGVzID0gW107CmZvcmVhY2ggKCRhbGxvd1BsdWdpbnNDb25maWcgYXMgJHBhdHRlcm4gPT4gJGFsbG93KSB7CiRydWxlc1tCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybildID0gJGFsbG93Owp9CgpyZXR1cm4gJHJ1bGVzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlUGx1Z2luc0Rpc2FibGVkKCR0eXBlKQp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVBsdWdpbnMgPT09IHRydWUgfHwgJHRoaXMtPmRpc2FibGVQbHVnaW5zID09PSAkdHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUGx1Z2luQWxsb3dlZChzdHJpbmcgJHBhY2thZ2UsIGJvb2wgJGlzR2xvYmFsUGx1Z2luLCBib29sICRvcHRpb25hbCA9IGZhbHNlKTogYm9vbAp7CmlmICgkaXNHbG9iYWxQbHVnaW4pIHsKJHJ1bGVzID0gJiR0aGlzLT5hbGxvd0dsb2JhbFBsdWdpblJ1bGVzOwp9IGVsc2UgewokcnVsZXMgPSAmJHRoaXMtPmFsbG93UGx1Z2luUnVsZXM7Cn0KCgoKaWYgKCRydWxlcyA9PT0gbnVsbCkgewppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Rm9yIGFkZGl0aW9uYWwgc2VjdXJpdHkgeW91IHNob3VsZCBkZWNsYXJlIHRoZSBhbGxvdy1wbHVnaW5zIGNvbmZpZyB3aXRoIGEgbGlzdCBvZiBwYWNrYWdlcyBuYW1lcyB0aGF0IGFyZSBhbGxvd2VkIHRvIHJ1biBjb2RlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvYWxsb3ctcGx1Z2luczwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGlzIHdhcm5pbmcgd2lsbCBiZWNvbWUgYW4gZXhjZXB0aW9uIG9uY2UgeW91IHJ1biBjb21wb3NlciB1cGRhdGUhPC93YXJuaW5nPicpOwoKJHJ1bGVzID0gWyd7fScgPT4gdHJ1ZV07CgoKcmV0dXJuIHRydWU7Cn0KCgokcnVsZXMgPSBbXTsKfQoKZm9yZWFjaCAoJHJ1bGVzIGFzICRwYXR0ZXJuID0+ICRhbGxvdykgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJHBhY2thZ2UpKSB7CnJldHVybiAkYWxsb3cgPT09IHRydWU7Cn0KfQoKaWYgKCRwYWNrYWdlID09PSAnY29tcG9zZXIvcGFja2FnZS12ZXJzaW9ucy1kZXByZWNhdGVkJykgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokY29tcG9zZXIgPSAkaXNHbG9iYWxQbHVnaW4gJiYgJHRoaXMtPmdsb2JhbENvbXBvc2VyICE9PSBudWxsID8gJHRoaXMtPmdsb2JhbENvbXBvc2VyIDogJHRoaXMtPmNvbXBvc2VyOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRwYWNrYWdlLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcgKGluc3RhbGxlZCBnbG9iYWxseSknIDogJycpLicgY29udGFpbnMgYSBDb21wb3NlciBwbHVnaW4gd2hpY2ggaXMgY3VycmVudGx5IG5vdCBpbiB5b3VyIGFsbG93LXBsdWdpbnMgY29uZmlnLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvYWxsb3ctcGx1Z2luczwvd2FybmluZz4nKTsKJGF0dGVtcHRzID0gMDsKd2hpbGUgKHRydWUpIHsKCgokZGVmYXVsdCA9ICc/JzsKaWYgKCRhdHRlbXB0cyA+IDUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUb28gbWFueSBmYWlsZWQgcHJvbXB0cywgYWJvcnRpbmcuJyk7CmJyZWFrOwp9Cgpzd2l0Y2ggKCRhbnN3ZXIgPSAkdGhpcy0+aW8tPmFzaygnRG8geW91IHRydXN0ICI8Zmc9Z3JlZW47b3B0aW9ucz1ib2xkPicuJHBhY2thZ2UuJzwvPiIgdG8gZXhlY3V0ZSBjb2RlIGFuZCB3aXNoIHRvIGVuYWJsZSBpdCBub3c/ICh3cml0ZXMgImFsbG93LXBsdWdpbnMiIHRvIGNvbXBvc2VyLmpzb24pIFs8Y29tbWVudD55LG4sZCw/PC9jb21tZW50Pl0gJywgJGRlZmF1bHQpKSB7CmNhc2UgJ3knOgpjYXNlICduJzoKY2FzZSAnZCc6CiRhbGxvdyA9ICRhbnN3ZXIgPT09ICd5JzsKCgokcnVsZXNbQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2UpXSA9ICRhbGxvdzsKCgppZiAoJGFuc3dlciA9PT0gJ3knIHx8ICRhbnN3ZXIgPT09ICduJykgewokY29tcG9zZXItPmdldENvbmZpZygpLT5nZXRDb25maWdTb3VyY2UoKS0+YWRkQ29uZmlnU2V0dGluZygnYWxsb3ctcGx1Z2lucy4nLiRwYWNrYWdlLCAkYWxsb3cpOwp9CgpyZXR1cm4gJGFsbG93OwoKY2FzZSAnPyc6CmRlZmF1bHQ6CiRhdHRlbXB0cysrOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwoneSAtIGFkZCBwYWNrYWdlIHRvIGFsbG93LXBsdWdpbnMgaW4gY29tcG9zZXIuanNvbiBhbmQgbGV0IGl0IHJ1biBpbW1lZGlhdGVseScsCiduIC0gYWRkIHBhY2thZ2UgKGFzIGRpc2FsbG93ZWQpIHRvIGFsbG93LXBsdWdpbnMgaW4gY29tcG9zZXIuanNvbiB0byBzdXBwcmVzcyBmdXJ0aGVyIHByb21wdHMnLAonZCAtIGRpc2NhcmQgdGhpcywgZG8gbm90IGNoYW5nZSBjb21wb3Nlci5qc29uIGFuZCBkbyBub3QgYWxsb3cgdGhlIHBsdWdpbiB0byBydW4nLAonPyAtIHByaW50IGhlbHAnLApdKTsKYnJlYWs7Cn0KfQp9IGVsc2VpZiAoJG9wdGlvbmFsKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFBsdWdpbkJsb2NrZWRFeGNlcHRpb24oCiRwYWNrYWdlLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcgKGluc3RhbGxlZCBnbG9iYWxseSknIDogJycpLicgY29udGFpbnMgYSBDb21wb3NlciBwbHVnaW4gd2hpY2ggaXMgYmxvY2tlZCBieSB5b3VyIGFsbG93LXBsdWdpbnMgY29uZmlnLiBZb3UgbWF5IGFkZCBpdCB0byB0aGUgbGlzdCBpZiB5b3UgY29uc2lkZXIgaXQgc2FmZS4nLlBIUF9FT0wuCidZb3UgY2FuIHJ1biAiY29tcG9zZXIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnZ2xvYmFsICcgOiAnJykuJ2NvbmZpZyAtLW5vLXBsdWdpbnMgYWxsb3ctcGx1Z2lucy4nLiRwYWNrYWdlLicgW3RydWV8ZmFsc2VdIiB0byBlbmFibGUgaXQgKHRydWUpIG9yIGRpc2FibGUgaXQgZXhwbGljaXRseSBhbmQgc3VwcHJlc3MgdGhpcyBleGNlcHRpb24gKGZhbHNlKScuUEhQX0VPTC4KJ1NlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9hbGxvdy1wbHVnaW5zJwopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFBvc3RGaWxlRG93bmxvYWRFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkZmlsZU5hbWU7CgoKCgpwcml2YXRlICRjaGVja3N1bTsKCgoKCnByaXZhdGUgJHVybDsKCgoKCnByaXZhdGUgJGNvbnRleHQ7CgoKCgpwcml2YXRlICR0eXBlOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsID9zdHJpbmcgJGZpbGVOYW1lLCA/c3RyaW5nICRjaGVja3N1bSwgc3RyaW5nICR1cmwsIHN0cmluZyAkdHlwZSwgJGNvbnRleHQgPSBudWxsKQp7CgppZiAoJGNvbnRleHQgPT09IG51bGwgJiYgJHR5cGUgaW5zdGFuY2VvZiBQYWNrYWdlSW50ZXJmYWNlKSB7CiRjb250ZXh0ID0gJHR5cGU7CiR0eXBlID0gJ3BhY2thZ2UnOwp0cmlnZ2VyX2Vycm9yKCdQb3N0RmlsZURvd25sb2FkRXZlbnQ6Ol9fY29uc3RydWN0IHNob3VsZCByZWNlaXZlIGEgJHR5cGU9cGFja2FnZSBhbmQgdGhlIHBhY2thZ2Ugb2JqZWN0IGluICRjb250ZXh0IHNpbmNlIENvbXBvc2VyIDIuMS4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUpOwokdGhpcy0+ZmlsZU5hbWUgPSAkZmlsZU5hbWU7CiR0aGlzLT5jaGVja3N1bSA9ICRjaGVja3N1bTsKJHRoaXMtPnVybCA9ICR1cmw7CiR0aGlzLT5jb250ZXh0ID0gJGNvbnRleHQ7CiR0aGlzLT50eXBlID0gJHR5cGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVOYW1lKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmZpbGVOYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW0oKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+Y2hlY2tzdW07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRleHQoKQp7CnJldHVybiAkdGhpcy0+Y29udGV4dDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiA/UGFja2FnZUludGVyZmFjZQp7CnRyaWdnZXJfZXJyb3IoJ1Bvc3RGaWxlRG93bmxvYWRFdmVudDo6Z2V0UGFja2FnZSBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMSwgdXNlIGdldENvbnRleHQgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CiRjb250ZXh0ID0gJHRoaXMtPmdldENvbnRleHQoKTsKCnJldHVybiAkY29udGV4dCBpbnN0YW5jZW9mIFBhY2thZ2VJbnRlcmZhY2UgPyAkY29udGV4dCA6IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dHlwZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgUHJlQ29tbWFuZFJ1bkV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRpbnB1dDsKCgoKCnByaXZhdGUgJGNvbW1hbmQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIHN0cmluZyAkY29tbWFuZCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKTogSW5wdXRJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CgoKCgoKCmNsYXNzIFByZUZpbGVEb3dubG9hZEV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCgoKCnByaXZhdGUgJHByb2Nlc3NlZFVybDsKCgoKCnByaXZhdGUgJGN1c3RvbUNhY2hlS2V5OwoKCgoKcHJpdmF0ZSAkdHlwZTsKCgoKCnByaXZhdGUgJGNvbnRleHQ7CgoKCgpwcml2YXRlICR0cmFuc3BvcnRPcHRpb25zID0gW107CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCBzdHJpbmcgJHByb2Nlc3NlZFVybCwgc3RyaW5nICR0eXBlLCAkY29udGV4dCA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPnByb2Nlc3NlZFVybCA9ICRwcm9jZXNzZWRVcmw7CiR0aGlzLT50eXBlID0gJHR5cGU7CiR0aGlzLT5jb250ZXh0ID0gJGNvbnRleHQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIdHRwRG93bmxvYWRlcigpOiBIdHRwRG93bmxvYWRlcgp7CnJldHVybiAkdGhpcy0+aHR0cERvd25sb2FkZXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3NlZFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3NlZFVybDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvY2Vzc2VkVXJsKHN0cmluZyAkcHJvY2Vzc2VkVXJsKTogdm9pZAp7CiR0aGlzLT5wcm9jZXNzZWRVcmwgPSAkcHJvY2Vzc2VkVXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VzdG9tQ2FjaGVLZXkoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+Y3VzdG9tQ2FjaGVLZXk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEN1c3RvbUNhY2hlS2V5KD9zdHJpbmcgJGN1c3RvbUNhY2hlS2V5KTogdm9pZAp7CiR0aGlzLT5jdXN0b21DYWNoZUtleSA9ICRjdXN0b21DYWNoZUtleTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50eXBlOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0KCkKewpyZXR1cm4gJHRoaXMtPmNvbnRleHQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dHJhbnNwb3J0T3B0aW9uczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT50cmFuc3BvcnRPcHRpb25zID0gJG9wdGlvbnM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgoKY2xhc3MgUHJlUG9vbENyZWF0ZUV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRyZXBvc2l0b3JpZXM7CgoKCnByaXZhdGUgJHJlcXVlc3Q7CgoKCgpwcml2YXRlICRhY2NlcHRhYmxlU3RhYmlsaXRpZXM7CgoKCgpwcml2YXRlICRzdGFiaWxpdHlGbGFnczsKCgoKCnByaXZhdGUgJHJvb3RBbGlhc2VzOwoKCgoKcHJpdmF0ZSAkcm9vdFJlZmVyZW5jZXM7CgoKCnByaXZhdGUgJHBhY2thZ2VzOwoKCgpwcml2YXRlICR1bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgYXJyYXkgJHJlcG9zaXRvcmllcywgUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkcm9vdEFsaWFzZXMsIGFycmF5ICRyb290UmVmZXJlbmNlcywgYXJyYXkgJHBhY2thZ2VzLCBhcnJheSAkdW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKCiR0aGlzLT5yZXBvc2l0b3JpZXMgPSAkcmVwb3NpdG9yaWVzOwokdGhpcy0+cmVxdWVzdCA9ICRyZXF1ZXN0OwokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gJGFjY2VwdGFibGVTdGFiaWxpdGllczsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdEFsaWFzZXMgPSAkcm9vdEFsaWFzZXM7CiR0aGlzLT5yb290UmVmZXJlbmNlcyA9ICRyb290UmVmZXJlbmNlczsKJHRoaXMtPnBhY2thZ2VzID0gJHBhY2thZ2VzOwokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcyA9ICR1bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1ZXN0KCk6IFJlcXVlc3QKewpyZXR1cm4gJHRoaXMtPnJlcXVlc3Q7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWNjZXB0YWJsZVN0YWJpbGl0aWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN0YWJpbGl0eUZsYWdzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RBbGlhc2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yb290QWxpYXNlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cm9vdFJlZmVyZW5jZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiR0aGlzLT5wYWNrYWdlcyA9ICRwYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzID0gJHBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFF1ZXN0aW9uOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CgoKCgoKCgoKY2xhc3MgU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb24gZXh0ZW5kcyBRdWVzdGlvbgp7Cgpwcml2YXRlICR0cnVlQW5zd2VyUmVnZXg7Cgpwcml2YXRlICRmYWxzZUFuc3dlclJlZ2V4OwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUsIHN0cmluZyAkdHJ1ZUFuc3dlclJlZ2V4ID0gJy9eeSg/OmVzKT8kL2knLCBzdHJpbmcgJGZhbHNlQW5zd2VyUmVnZXggPSAnL15ubz8kL2knKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHF1ZXN0aW9uLCAoYm9vbCkgJGRlZmF1bHQpOwoKJHRoaXMtPnRydWVBbnN3ZXJSZWdleCA9ICR0cnVlQW5zd2VyUmVnZXg7CiR0aGlzLT5mYWxzZUFuc3dlclJlZ2V4ID0gJGZhbHNlQW5zd2VyUmVnZXg7CiR0aGlzLT5zZXROb3JtYWxpemVyKCR0aGlzLT5nZXREZWZhdWx0Tm9ybWFsaXplcigpKTsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0Tm9ybWFsaXplcigpOiBjYWxsYWJsZQp7CiRkZWZhdWx0ID0gJHRoaXMtPmdldERlZmF1bHQoKTsKJHRydWVSZWdleCA9ICR0aGlzLT50cnVlQW5zd2VyUmVnZXg7CiRmYWxzZVJlZ2V4ID0gJHRoaXMtPmZhbHNlQW5zd2VyUmVnZXg7CgpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uICgkYW5zd2VyKSB1c2UgKCRkZWZhdWx0LCAkdHJ1ZVJlZ2V4LCAkZmFsc2VSZWdleCkgewppZiAoaXNfYm9vbCgkYW5zd2VyKSkgewpyZXR1cm4gJGFuc3dlcjsKfQppZiAoZW1wdHkoJGFuc3dlcikgJiYgIWVtcHR5KCRkZWZhdWx0KSkgewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCmlmIChQcmVnOjppc01hdGNoKCR0cnVlUmVnZXgsICRhbnN3ZXIpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgkZmFsc2VSZWdleCwgJGFuc3dlcikpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gbnVsbDsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0VmFsaWRhdG9yKCk6IGNhbGxhYmxlCnsKcmV0dXJuIHN0YXRpYyBmdW5jdGlvbiAoJGFuc3dlcik6IGJvb2wgewppZiAoIWlzX2Jvb2woJGFuc3dlcikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGxlYXNlIGFuc3dlciB5ZXMsIHksIG5vLCBvciBuLicpOwp9CgpyZXR1cm4gJGFuc3dlcjsKfTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CgoKCgoKCgppbnRlcmZhY2UgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBoYXNTZWN1cml0eUFkdmlzb3JpZXMoKTogYm9vbDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxTdGFiaWxpdHlGaWx0ZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgUmVwb3NpdG9yeUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHBhY2thZ2VzID0gbnVsbDsKCgoKCnByb3RlY3RlZCAkcGFja2FnZU1hcCA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhY2thZ2VzID0gW10pCnsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKQp7CnJldHVybiAnYXJyYXkgcmVwbyAoZGVmaW5pbmcgJy4kdGhpcy0+Y291bnQoKS4nIHBhY2thZ2UnLigkdGhpcy0+Y291bnQoKSA+IDEgPyAncycgOiAnJykuJyknOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKQp7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwoKJHJlc3VsdCA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKGFycmF5X2tleV9leGlzdHMoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHBhY2thZ2VOYW1lTWFwKSkgewppZiAoCighJHBhY2thZ2VOYW1lTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldIHx8ICRwYWNrYWdlTmFtZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkpCiYmIFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRwYWNrYWdlLT5nZXROYW1lcygpLCAkcGFja2FnZS0+Z2V0U3RhYmlsaXR5KCkpCiYmICFpc3NldCgkYWxyZWFkeUxvYWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSkKKSB7CgokcmVzdWx0W3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgIWlzc2V0KCRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSkpIHsKJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQp9CgokbmFtZXNGb3VuZFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KfQoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKaWYgKGlzc2V0KCRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSkpIHsKJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9Cn0KfQoKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gYXJyYXlfa2V5cygkbmFtZXNGb3VuZCksICdwYWNrYWdlcycgPT4gJHJlc3VsdF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZShzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KQp7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJG5hbWUgPT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKJHBrZ0NvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKaWYgKCRjb25zdHJhaW50LT5tYXRjaGVzKCRwa2dDb25zdHJhaW50KSkgewpyZXR1cm4gJHBhY2thZ2U7Cn0KfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCkKewoKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKJHBhY2thZ2VzID0gW107CgppZiAobnVsbCAhPT0gJGNvbnN0cmFpbnQgJiYgISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJG5hbWUgPT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKaWYgKG51bGwgPT09ICRjb25zdHJhaW50IHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCkKewppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9GVUxMVEVYVCkgewokcmVnZXggPSAneyg/OicuaW1wbG9kZSgnfCcsIFByZWc6OnNwbGl0KCd7XHMrfScsIHByZWdfcXVvdGUoJHF1ZXJ5KSkpLicpfWknOwp9IGVsc2UgewoKJHJlZ2V4ID0gJ3soPzonLmltcGxvZGUoJ3wnLCBQcmVnOjpzcGxpdCgne1xzK30nLCAkcXVlcnkpKS4nKX1pJzsKfQoKJG1hdGNoZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9WRU5ET1IpIHsKWyRuYW1lXSA9IGV4cGxvZGUoJy8nLCAkbmFtZSk7Cn0KaWYgKGlzc2V0KCRtYXRjaGVzWyRuYW1lXSkpIHsKY29udGludWU7Cn0KaWYgKG51bGwgIT09ICR0eXBlICYmICRwYWNrYWdlLT5nZXRUeXBlKCkgIT09ICR0eXBlKSB7CmNvbnRpbnVlOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICRuYW1lKQp8fCAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9GVUxMVEVYVCAmJiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiBQcmVnOjppc01hdGNoKCRyZWdleCwgaW1wbG9kZSgnICcsIChhcnJheSkgJHBhY2thZ2UtPmdldEtleXdvcmRzKCkpIC4gJyAnIC4gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkpKQopIHsKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfVkVORE9SKSB7CiRtYXRjaGVzWyRuYW1lXSA9IFsKJ25hbWUnID0+ICRuYW1lLAonZGVzY3JpcHRpb24nID0+IG51bGwsCl07Cn0gZWxzZSB7CiRtYXRjaGVzWyRuYW1lXSA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCidkZXNjcmlwdGlvbicgPT4gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSA6IG51bGwsCl07CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJG1hdGNoZXNbJG5hbWVdWydhYmFuZG9uZWQnXSA9ICRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSA/OiB0cnVlOwp9Cn0KfQp9CgpyZXR1cm4gYXJyYXlfdmFsdWVzKCRtYXRjaGVzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoJHRoaXMtPnBhY2thZ2VNYXAgPT09IG51bGwpIHsKJHRoaXMtPnBhY2thZ2VNYXAgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHJlcG9QYWNrYWdlKSB7CiR0aGlzLT5wYWNrYWdlTWFwWyRyZXBvUGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSA9ICRyZXBvUGFja2FnZTsKfQp9CgpyZXR1cm4gaXNzZXQoJHRoaXMtPnBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKV0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEJhc2VQYWNrYWdlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdPbmx5IHN1YmNsYXNzZXMgb2YgQmFzZVBhY2thZ2UgYXJlIHN1cHBvcnRlZCcpOwp9CmlmIChudWxsID09PSAkdGhpcy0+cGFja2FnZXMpIHsKJHRoaXMtPmluaXRpYWxpemUoKTsKfQokcGFja2FnZS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiR0aGlzLT5wYWNrYWdlc1tdID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGFsaWFzZWRQYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKaWYgKG51bGwgPT09ICRhbGlhc2VkUGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpKSB7CiR0aGlzLT5hZGRQYWNrYWdlKCRhbGlhc2VkUGFja2FnZSk7Cn0KfQoKCiR0aGlzLT5wYWNrYWdlTWFwID0gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycyhzdHJpbmcgJHBhY2thZ2VOYW1lKQp7CiRyZXN1bHQgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRjYW5kaWRhdGUpIHsKaWYgKGlzc2V0KCRyZXN1bHRbJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpXSkpIHsKY29udGludWU7Cn0KZm9yZWFjaCAoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSBhcyAkbGluaykgewppZiAoJHBhY2thZ2VOYW1lID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHJlc3VsdFskY2FuZGlkYXRlLT5nZXROYW1lKCldID0gWwonbmFtZScgPT4gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpLAonZGVzY3JpcHRpb24nID0+ICRjYW5kaWRhdGUgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkY2FuZGlkYXRlLT5nZXREZXNjcmlwdGlvbigpIDogbnVsbCwKJ3R5cGUnID0+ICRjYW5kaWRhdGUtPmdldFR5cGUoKSwKXTsKY29udGludWUgMjsKfQp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlQWxpYXNQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBzdHJpbmcgJGFsaWFzLCBzdHJpbmcgJHByZXR0eUFsaWFzKQp7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkgewpyZXR1cm4gbmV3IENvbXBsZXRlQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXMsICRwcmV0dHlBbGlhcyk7Cn0KCnJldHVybiBuZXcgQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXMsICRwcmV0dHlBbGlhcyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRwYWNrYWdlSWQgPSAkcGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpOwoKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJGtleSA9PiAkcmVwb1BhY2thZ2UpIHsKaWYgKCRwYWNrYWdlSWQgPT09ICRyZXBvUGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpKSB7CmFycmF5X3NwbGljZSgkdGhpcy0+cGFja2FnZXMsICRrZXksIDEpOwoKCiR0aGlzLT5wYWNrYWdlTWFwID0gbnVsbDsKCnJldHVybjsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wYWNrYWdlcykgewokdGhpcy0+aW5pdGlhbGl6ZSgpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnBhY2thZ2VzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2luaXRpYWxpemUgZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHBhY2thZ2VzIGFycmF5Jyk7Cn0KCnJldHVybiAkdGhpcy0+cGFja2FnZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CmlmIChudWxsID09PSAkdGhpcy0+cGFja2FnZXMpIHsKJHRoaXMtPmluaXRpYWxpemUoKTsKfQoKcmV0dXJuIGNvdW50KCR0aGlzLT5wYWNrYWdlcyk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKQp7CiR0aGlzLT5wYWNrYWdlcyA9IFtdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcTG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcVGFyOwp1c2UgQ29tcG9zZXJcVXRpbFxaaXA7CgoKCgpjbGFzcyBBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkbG9hZGVyOwoKCnByb3RlY3RlZCAkbG9va3VwOwoKcHJvdGVjdGVkICRyZXBvQ29uZmlnOwoKcHJpdmF0ZSAkaW87CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9Db25maWcsIElPSW50ZXJmYWNlICRpbykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnemlwJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSByZXF1aXJlcyBQSFBcJ3MgemlwIGV4dGVuc2lvbicpOwp9CgokdGhpcy0+bG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCk7CiR0aGlzLT5sb29rdXAgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yZXBvQ29uZmlnID0gJHJlcG9Db25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdhcnRpZmFjdCByZXBvICgnLiR0aGlzLT5sb29rdXAuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpCnsKcmV0dXJuICR0aGlzLT5yZXBvQ29uZmlnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokdGhpcy0+c2NhbkRpcmVjdG9yeSgkdGhpcy0+bG9va3VwKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzY2FuRGlyZWN0b3J5KHN0cmluZyAkcGF0aCk6IHZvaWQKewokaW8gPSAkdGhpcy0+aW87CgokZGlyZWN0b3J5ID0gbmV3IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcGF0aCwgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpGT0xMT1dfU1lNTElOS1MpOwokaXRlcmF0b3IgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGRpcmVjdG9yeSk7CiRyZWdleCA9IG5ldyBcUmVnZXhJdGVyYXRvcigkaXRlcmF0b3IsICcvXi4rXC4oemlwfHRhcnxnenx0Z3opJC9pJyk7CmZvcmVhY2ggKCRyZWdleCBhcyAkZmlsZSkgewoKaWYgKCEkZmlsZS0+aXNGaWxlKCkpIHsKY29udGludWU7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGZpbGUpOwppZiAoISRwYWNrYWdlKSB7CiRpby0+d3JpdGVFcnJvcigiRmlsZSA8Y29tbWVudD57JGZpbGUtPmdldEJhc2VuYW1lKCl9PC9jb21tZW50PiBkb2Vzbid0IHNlZW0gdG8gaG9sZCBhIHBhY2thZ2UiLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CmNvbnRpbnVlOwp9CgokdGVtcGxhdGUgPSAnRm91bmQgcGFja2FnZSA8aW5mbz4lczwvaW5mbz4gKDxjb21tZW50PiVzPC9jb21tZW50PikgaW4gZmlsZSA8aW5mbz4lczwvaW5mbz4nOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigkdGVtcGxhdGUsICRwYWNrYWdlLT5nZXROYW1lKCksICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksICRmaWxlLT5nZXRCYXNlbmFtZSgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihcU3BsRmlsZUluZm8gJGZpbGUpOiA/QmFzZVBhY2thZ2UKewokanNvbiA9IG51bGw7CiRmaWxlVHlwZSA9IG51bGw7CiRmaWxlRXh0ZW5zaW9uID0gcGF0aGluZm8oJGZpbGUtPmdldFBhdGhuYW1lKCksIFBBVEhJTkZPX0VYVEVOU0lPTik7CmlmIChpbl9hcnJheSgkZmlsZUV4dGVuc2lvbiwgWydneicsICd0YXInLCAndGd6J10sIHRydWUpKSB7CiRmaWxlVHlwZSA9ICd0YXInOwp9IGVsc2VpZiAoJGZpbGVFeHRlbnNpb24gPT09ICd6aXAnKSB7CiRmaWxlVHlwZSA9ICd6aXAnOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZpbGVzIHdpdGggIicuJGZpbGVFeHRlbnNpb24uJyIgZXh0ZW5zaW9ucyBhcmVuXCd0IHN1cHBvcnRlZC4gT25seSBaSVAgYW5kIFRBUi9UQVIuR1ovVEdaIGFyY2hpdmVzIGFyZSBzdXBwb3J0ZWQuJyk7Cn0KCnRyeSB7CmlmICgkZmlsZVR5cGUgPT09ICd0YXInKSB7CiRqc29uID0gVGFyOjpnZXRDb21wb3Nlckpzb24oJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9IGVsc2UgewokanNvbiA9IFppcDo6Z2V0Q29tcG9zZXJKc29uKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRleGNlcHRpb24pIHsKJHRoaXMtPmlvLT53cml0ZSgnRmFpbGVkIGxvYWRpbmcgcGFja2FnZSAnLiRmaWxlLT5nZXRQYXRobmFtZSgpLic6ICcuJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCBmYWxzZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CgppZiAobnVsbCA9PT0gJGpzb24pIHsKcmV0dXJuIG51bGw7Cn0KCiRwYWNrYWdlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkanNvbiwgJGZpbGUtPmdldFBhdGhuYW1lKCkuJyNjb21wb3Nlci5qc29uJyk7CiRwYWNrYWdlWydkaXN0J10gPSBbCid0eXBlJyA9PiAkZmlsZVR5cGUsCid1cmwnID0+IHN0cnRyKCRmaWxlLT5nZXRQYXRobmFtZSgpLCAnXFwnLCAnLycpLAonc2hhc3VtJyA9PiBzaGExX2ZpbGUoJGZpbGUtPmdldFJlYWxQYXRoKCkpLApdOwoKdHJ5IHsKJHBhY2thZ2UgPSAkdGhpcy0+bG9hZGVyLT5sb2FkKCRwYWNrYWdlKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRmFpbGVkIGxvYWRpbmcgcGFja2FnZSBpbiAnLiRmaWxlLic6ICcuJGUtPmdldE1lc3NhZ2UoKSwgMCwgJGUpOwp9CgpyZXR1cm4gJHBhY2thZ2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKdHJhaXQgQ2Fub25pY2FsUGFja2FnZXNUcmFpdAp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENhbm9uaWNhbFBhY2thZ2VzKCkKewokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXMoKTsKCgokcGFja2FnZXNCeU5hbWUgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICghaXNzZXQoJHBhY2thZ2VzQnlOYW1lWyRwYWNrYWdlLT5nZXROYW1lKCldKSB8fCAkcGFja2FnZXNCeU5hbWVbJHBhY2thZ2UtPmdldE5hbWUoKV0gaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2VzQnlOYW1lWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7Cn0KfQoKJGNhbm9uaWNhbFBhY2thZ2VzID0gW107CgoKZm9yZWFjaCAoJHBhY2thZ2VzQnlOYW1lIGFzICRwYWNrYWdlKSB7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCiRjYW5vbmljYWxQYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KCnJldHVybiAkY2Fub25pY2FsUGFja2FnZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFN0YWJpbGl0eUZpbHRlcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBvc3RGaWxlRG93bmxvYWRFdmVudDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb21waWxpbmdNYXRjaGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcTG9vcDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxQbHVnaW5cUHJlRmlsZURvd25sb2FkRXZlbnQ7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKdXNlIENvbXBvc2VyXE1ldGFkYXRhTWluaWZpZXJcTWV0YWRhdGFNaW5pZmllcjsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKY2xhc3MgQ29tcG9zZXJSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZSwgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZQp7CgoKCgpwcml2YXRlICRyZXBvQ29uZmlnOwoKcHJpdmF0ZSAkb3B0aW9uczsKCnByaXZhdGUgJHVybDsKCnByaXZhdGUgJGJhc2VVcmw7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGh0dHBEb3dubG9hZGVyOwoKcHJpdmF0ZSAkbG9vcDsKCnByb3RlY3RlZCAkY2FjaGU7Cgpwcm90ZWN0ZWQgJG5vdGlmeVVybCA9IG51bGw7Cgpwcm90ZWN0ZWQgJHNlYXJjaFVybCA9IG51bGw7Cgpwcm90ZWN0ZWQgJHByb3ZpZGVyc0FwaVVybCA9IG51bGw7Cgpwcm90ZWN0ZWQgJGhhc1Byb3ZpZGVycyA9IGZhbHNlOwoKcHJvdGVjdGVkICRwcm92aWRlcnNVcmwgPSBudWxsOwoKcHJvdGVjdGVkICRsaXN0VXJsID0gbnVsbDsKCnByb3RlY3RlZCAkaGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXZhaWxhYmxlUGFja2FnZXMgPSBudWxsOwoKcHJvdGVjdGVkICRhdmFpbGFibGVQYWNrYWdlUGF0dGVybnMgPSBudWxsOwoKcHJvdGVjdGVkICRsYXp5UHJvdmlkZXJzVXJsID0gbnVsbDsKCnByb3RlY3RlZCAkcHJvdmlkZXJMaXN0aW5nOwoKcHJvdGVjdGVkICRsb2FkZXI7Cgpwcml2YXRlICRhbGxvd1NzbERvd25ncmFkZSA9IGZhbHNlOwoKcHJpdmF0ZSAkZXZlbnREaXNwYXRjaGVyOwoKcHJpdmF0ZSAkc291cmNlTWlycm9yczsKCnByaXZhdGUgJGRpc3RNaXJyb3JzOwoKcHJpdmF0ZSAkZGVncmFkZWRNb2RlID0gZmFsc2U7Cgpwcml2YXRlICRyb290RGF0YTsKCnByaXZhdGUgJGhhc1BhcnRpYWxQYWNrYWdlcyA9IGZhbHNlOwoKcHJpdmF0ZSAkcGFydGlhbFBhY2thZ2VzQnlOYW1lID0gbnVsbDsKCnByaXZhdGUgJGRpc3BsYXllZFdhcm5pbmdBYm91dE5vbk1hdGNoaW5nUGFja2FnZUluZGV4ID0gZmFsc2U7Cgpwcml2YXRlICRzZWN1cml0eUFkdmlzb3J5Q29uZmlnID0gbnVsbDsKCgoKCgoKcHJpdmF0ZSAkZnJlc2hNZXRhZGF0YVVybHMgPSBbXTsKCgoKCgoKcHJpdmF0ZSAkcGFja2FnZXNOb3RGb3VuZENhY2hlID0gW107CgoKCgpwcml2YXRlICR2ZXJzaW9uUGFyc2VyOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKaWYgKCFQcmVnOjppc01hdGNoKCd7Xltcdy5dK1w/PzovL30nLCAkcmVwb0NvbmZpZ1sndXJsJ10pKSB7CmlmICgoJGxvY2FsRmlsZVBhdGggPSByZWFscGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pKSAhPT0gZmFsc2UpIHsKCiRyZXBvQ29uZmlnWyd1cmwnXSA9ICdmaWxlOi8vJy4kbG9jYWxGaWxlUGF0aDsKfSBlbHNlIHsKCiRyZXBvQ29uZmlnWyd1cmwnXSA9ICdodHRwOi8vJy4kcmVwb0NvbmZpZ1sndXJsJ107Cn0KfQokcmVwb0NvbmZpZ1sndXJsJ10gPSBydHJpbSgkcmVwb0NvbmZpZ1sndXJsJ10sICcvJyk7CmlmICgkcmVwb0NvbmZpZ1sndXJsJ10gPT09ICcnKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgcmVwb3NpdG9yeSB1cmwgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KCmlmIChzdHJfc3RhcnRzX3dpdGgoJHJlcG9Db25maWdbJ3VybCddLCAnaHR0cHM/JykpIHsKJHJlcG9Db25maWdbJ3VybCddID0gKGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSA/ICdodHRwcycgOiAnaHR0cCcpIC4gc3Vic3RyKCRyZXBvQ29uZmlnWyd1cmwnXSwgNik7Cn0KCiR1cmxCaXRzID0gcGFyc2VfdXJsKHN0cnRyKCRyZXBvQ29uZmlnWyd1cmwnXSwgJ1xcJywgJy8nKSk7CmlmICgkdXJsQml0cyA9PT0gZmFsc2UgfHwgZW1wdHkoJHVybEJpdHNbJ3NjaGVtZSddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignSW52YWxpZCB1cmwgZ2l2ZW4gZm9yIENvbXBvc2VyIHJlcG9zaXRvcnk6ICcuJHJlcG9Db25maWdbJ3VybCddKTsKfQoKaWYgKCFpc3NldCgkcmVwb0NvbmZpZ1snb3B0aW9ucyddKSkgewokcmVwb0NvbmZpZ1snb3B0aW9ucyddID0gW107Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydhbGxvd19zc2xfZG93bmdyYWRlJ10pICYmIHRydWUgPT09ICRyZXBvQ29uZmlnWydhbGxvd19zc2xfZG93bmdyYWRlJ10pIHsKJHRoaXMtPmFsbG93U3NsRG93bmdyYWRlID0gdHJ1ZTsKfQoKJHRoaXMtPm9wdGlvbnMgPSAkcmVwb0NvbmZpZ1snb3B0aW9ucyddOwokdGhpcy0+dXJsID0gJHJlcG9Db25maWdbJ3VybCddOwoKCmlmIChQcmVnOjppc01hdGNoKCd7Xig/UDxwcm90bz5odHRwcz8pOi8vcGFja2FnaXN0XC5vcmcvPyR9aScsICR0aGlzLT51cmwsICRtYXRjaCkpIHsKJHRoaXMtPnVybCA9ICRtYXRjaFsncHJvdG8nXS4nOi8vcmVwby5wYWNrYWdpc3Qub3JnJzsKfQoKJGJhc2VVcmwgPSBydHJpbShQcmVnOjpyZXBsYWNlKCd7KD86L1teL1xcXFxdK1wuanNvbik/KD86Wz8jXS4qKT8kfScsICcnLCAkdGhpcy0+dXJsKSwgJy8nKTsKYXNzZXJ0KCRiYXNlVXJsICE9PSAnJyk7CiR0aGlzLT5iYXNlVXJsID0gJGJhc2VVcmw7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCRpbywgJGNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR0aGlzLT51cmwpKSwgJ2EtejAtOS4kfl8nKTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkY29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKJHRoaXMtPnZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokdGhpcy0+bG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCR0aGlzLT52ZXJzaW9uUGFyc2VyKTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKJHRoaXMtPmxvb3AgPSBuZXcgTG9vcCgkdGhpcy0+aHR0cERvd25sb2FkZXIpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKQp7CnJldHVybiAnY29tcG9zZXIgcmVwbyAoJy5Vcmw6OnNhbml0aXplKCR0aGlzLT51cmwpLicpJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoKQp7CnJldHVybiAkdGhpcy0+cmVwb0NvbmZpZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQpCnsKCiRoYXNQcm92aWRlcnMgPSAkdGhpcy0+aGFzUHJvdmlkZXJzKCk7CgokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokY29uc3RyYWludCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KTsKfQoKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CmlmICgkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbmFtZV0pKSB7CnJldHVybiAkdGhpcy0+ZmlsdGVyUGFja2FnZXMoJHRoaXMtPndoYXRQcm92aWRlcygkbmFtZSksICRjb25zdHJhaW50LCB0cnVlKTsKfQoKaWYgKCR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCAmJiAhJHRoaXMtPmxhenlQcm92aWRlcnNSZXBvQ29udGFpbnMoJG5hbWUpKSB7CnJldHVybiBudWxsOwp9CgokcGFja2FnZXMgPSAkdGhpcy0+bG9hZEFzeW5jUGFja2FnZXMoWyRuYW1lID0+ICRjb25zdHJhaW50XSk7CgppZiAoY291bnQoJHBhY2thZ2VzWydwYWNrYWdlcyddKSA+IDApIHsKcmV0dXJuIHJlc2V0KCRwYWNrYWdlc1sncGFja2FnZXMnXSk7Cn0KCnJldHVybiBudWxsOwp9CgppZiAoJGhhc1Byb3ZpZGVycykgewpmb3JlYWNoICgkdGhpcy0+Z2V0UHJvdmlkZXJOYW1lcygpIGFzICRwcm92aWRlck5hbWUpIHsKaWYgKCRuYW1lID09PSAkcHJvdmlkZXJOYW1lKSB7CnJldHVybiAkdGhpcy0+ZmlsdGVyUGFja2FnZXMoJHRoaXMtPndoYXRQcm92aWRlcygkcHJvdmlkZXJOYW1lKSwgJGNvbnN0cmFpbnQsIHRydWUpOwp9Cn0KCnJldHVybiBudWxsOwp9CgpyZXR1cm4gcGFyZW50OjpmaW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQgPSBudWxsKQp7CgokaGFzUHJvdmlkZXJzID0gJHRoaXMtPmhhc1Byb3ZpZGVycygpOwoKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKaWYgKG51bGwgIT09ICRjb25zdHJhaW50ICYmICEkY29uc3RyYWludCBpbnN0YW5jZW9mIENvbnN0cmFpbnRJbnRlcmZhY2UpIHsKJGNvbnN0cmFpbnQgPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpICYmIGlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdKSkgewpyZXR1cm4gJHRoaXMtPmZpbHRlclBhY2thZ2VzKCR0aGlzLT53aGF0UHJvdmlkZXMoJG5hbWUpLCAkY29uc3RyYWludCk7Cn0KCmlmICgkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgJiYgISR0aGlzLT5sYXp5UHJvdmlkZXJzUmVwb0NvbnRhaW5zKCRuYW1lKSkgewpyZXR1cm4gW107Cn0KCiRyZXN1bHQgPSAkdGhpcy0+bG9hZEFzeW5jUGFja2FnZXMoWyRuYW1lID0+ICRjb25zdHJhaW50XSk7CgpyZXR1cm4gJHJlc3VsdFsncGFja2FnZXMnXTsKfQoKaWYgKCRoYXNQcm92aWRlcnMpIHsKZm9yZWFjaCAoJHRoaXMtPmdldFByb3ZpZGVyTmFtZXMoKSBhcyAkcHJvdmlkZXJOYW1lKSB7CmlmICgkbmFtZSA9PT0gJHByb3ZpZGVyTmFtZSkgewpyZXR1cm4gJHRoaXMtPmZpbHRlclBhY2thZ2VzKCR0aGlzLT53aGF0UHJvdmlkZXMoJHByb3ZpZGVyTmFtZSksICRjb25zdHJhaW50KTsKfQp9CgpyZXR1cm4gW107Cn0KCnJldHVybiBwYXJlbnQ6OmZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsdGVyUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwsIGJvb2wgJHJldHVybkZpcnN0TWF0Y2ggPSBmYWxzZSkKewppZiAobnVsbCA9PT0gJGNvbnN0cmFpbnQpIHsKaWYgKCRyZXR1cm5GaXJzdE1hdGNoKSB7CnJldHVybiByZXNldCgkcGFja2FnZXMpOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgokZmlsdGVyZWRQYWNrYWdlcyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwa2dDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7CgppZiAoJGNvbnN0cmFpbnQtPm1hdGNoZXMoJHBrZ0NvbnN0cmFpbnQpKSB7CmlmICgkcmV0dXJuRmlyc3RNYXRjaCkgewpyZXR1cm4gJHBhY2thZ2U7Cn0KCiRmaWx0ZXJlZFBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQp9CgppZiAoJHJldHVybkZpcnN0TWF0Y2gpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkZmlsdGVyZWRQYWNrYWdlczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCkKewokaGFzUHJvdmlkZXJzID0gJHRoaXMtPmhhc1Byb3ZpZGVycygpOwoKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CmlmIChpc19hcnJheSgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMpICYmICEkdGhpcy0+YXZhaWxhYmxlUGFja2FnZVBhdHRlcm5zKSB7CiRwYWNrYWdlTWFwID0gW107CmZvcmVhY2ggKCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcyBhcyAkbmFtZSkgewokcGFja2FnZU1hcFskbmFtZV0gPSBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCk7Cn0KCiRyZXN1bHQgPSAkdGhpcy0+bG9hZEFzeW5jUGFja2FnZXMoJHBhY2thZ2VNYXApOwoKcmV0dXJuIGFycmF5X3ZhbHVlcygkcmVzdWx0WydwYWNrYWdlcyddKTsKfQoKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSkgewppZiAoIWlzX2FycmF5KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2hhc1BhcnRpYWxQYWNrYWdlcyBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lJyk7Cn0KCnJldHVybiAkdGhpcy0+Y3JlYXRlUGFja2FnZXMoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSwgJ3BhY2thZ2VzLmpzb24gaW5saW5lIHBhY2thZ2VzJyk7Cn0KCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0NvbXBvc2VyIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbGF6eSBwcm92aWRlcnMgYW5kIG5vIGF2YWlsYWJsZS1wYWNrYWdlcyBsaXN0IGNhbiBub3QgbG9hZCB0aGUgY29tcGxldGUgbGlzdCBvZiBwYWNrYWdlcywgdXNlIGdldFBhY2thZ2VOYW1lcyBpbnN0ZWFkLicpOwp9CgppZiAoJGhhc1Byb3ZpZGVycykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDb21wb3NlciByZXBvc2l0b3JpZXMgdGhhdCBoYXZlIHByb3ZpZGVycyBjYW4gbm90IGxvYWQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcGFja2FnZXMsIHVzZSBnZXRQYWNrYWdlTmFtZXMgaW5zdGVhZC4nKTsKfQoKcmV0dXJuIHBhcmVudDo6Z2V0UGFja2FnZXMoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWVzKD9zdHJpbmcgJHBhY2thZ2VGaWx0ZXIgPSBudWxsKQp7CiRoYXNQcm92aWRlcnMgPSAkdGhpcy0+aGFzUHJvdmlkZXJzKCk7CgokZmlsdGVyUmVzdWx0cyA9CgoKCgpzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRyZXN1bHRzKTogYXJyYXkgewpyZXR1cm4gJHJlc3VsdHM7Cn0KOwppZiAobnVsbCAhPT0gJHBhY2thZ2VGaWx0ZXIgJiYgJycgIT09ICRwYWNrYWdlRmlsdGVyKSB7CiRwYWNrYWdlRmlsdGVyUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZUZpbHRlcik7CiRmaWx0ZXJSZXN1bHRzID0KCgoKCnN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHJlc3VsdHMpIHVzZSAoJHBhY2thZ2VGaWx0ZXJSZWdleCk6IGFycmF5IHsKCnJldHVybiBQcmVnOjpncmVwKCRwYWNrYWdlRmlsdGVyUmVnZXgsICRyZXN1bHRzKTsKfQo7Cn0KCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewppZiAoaXNfYXJyYXkoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzKSkgewpyZXR1cm4gJGZpbHRlclJlc3VsdHMoYXJyYXlfa2V5cygkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMpKTsKfQoKaWYgKCR0aGlzLT5saXN0VXJsKSB7CgpyZXR1cm4gJHRoaXMtPmxvYWRQYWNrYWdlTGlzdCgkcGFja2FnZUZpbHRlcik7Cn0KCmlmICgkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSAhPT0gbnVsbCkgewpyZXR1cm4gJGZpbHRlclJlc3VsdHMoYXJyYXlfa2V5cygkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lKSk7Cn0KCnJldHVybiBbXTsKfQoKaWYgKCRoYXNQcm92aWRlcnMpIHsKcmV0dXJuICRmaWx0ZXJSZXN1bHRzKCR0aGlzLT5nZXRQcm92aWRlck5hbWVzKCkpOwp9CgokbmFtZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJG5hbWVzW10gPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwp9CgpyZXR1cm4gJGZpbHRlclJlc3VsdHMoJG5hbWVzKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRWZW5kb3JOYW1lcygpOiBhcnJheQp7CiRjYWNoZUtleSA9ICd2ZW5kb3ItbGlzdC50eHQnOwokY2FjaGVBZ2UgPSAkdGhpcy0+Y2FjaGUtPmdldEFnZSgkY2FjaGVLZXkpOwppZiAoZmFsc2UgIT09ICRjYWNoZUFnZSAmJiAkY2FjaGVBZ2UgPCA2MDAgJiYgKCRjYWNoZWREYXRhID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSkpICE9PSBmYWxzZSkgewokY2FjaGVkRGF0YSA9IGV4cGxvZGUoIlxuIiwgJGNhY2hlZERhdGEpOwoKcmV0dXJuICRjYWNoZWREYXRhOwp9CgokbmFtZXMgPSAkdGhpcy0+Z2V0UGFja2FnZU5hbWVzKCk7CgokdW5pcXVlcyA9IFtdOwpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKCiR1bmlxdWVzW3N1YnN0cigkbmFtZSwgMCwgc3RycG9zKCRuYW1lLCAnLycpKV0gPSB0cnVlOwp9CgokdmVuZG9ycyA9IGFycmF5X2tleXMoJHVuaXF1ZXMpOwoKaWYgKCEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgaW1wbG9kZSgiXG4iLCAkdmVuZG9ycykpOwp9CgpyZXR1cm4gJHZlbmRvcnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFBhY2thZ2VMaXN0KD9zdHJpbmcgJHBhY2thZ2VGaWx0ZXIgPSBudWxsKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxpc3RVcmwpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTWFrZSBzdXJlIHRvIGNhbGwgbG9hZFJvb3RTZXJ2ZXJGaWxlIGJlZm9yZSBsb2FkUGFja2FnZUxpc3QnKTsKfQoKJHVybCA9ICR0aGlzLT5saXN0VXJsOwppZiAoaXNfc3RyaW5nKCRwYWNrYWdlRmlsdGVyKSAmJiAkcGFja2FnZUZpbHRlciAhPT0gJycpIHsKJHVybCAuPSAnP2ZpbHRlcj0nLnVybGVuY29kZSgkcGFja2FnZUZpbHRlcik7CiRyZXN1bHQgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCAkdGhpcy0+b3B0aW9ucyktPmRlY29kZUpzb24oKTsKCnJldHVybiAkcmVzdWx0WydwYWNrYWdlTmFtZXMnXTsKfQoKJGNhY2hlS2V5ID0gJ3BhY2thZ2UtbGlzdC50eHQnOwokY2FjaGVBZ2UgPSAkdGhpcy0+Y2FjaGUtPmdldEFnZSgkY2FjaGVLZXkpOwppZiAoZmFsc2UgIT09ICRjYWNoZUFnZSAmJiAkY2FjaGVBZ2UgPCA2MDAgJiYgKCRjYWNoZWREYXRhID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSkpICE9PSBmYWxzZSkgewokY2FjaGVkRGF0YSA9IGV4cGxvZGUoIlxuIiwgJGNhY2hlZERhdGEpOwoKcmV0dXJuICRjYWNoZWREYXRhOwp9CgokcmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CmlmICghJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkY2FjaGVLZXksIGltcGxvZGUoIlxuIiwgJHJlc3VsdFsncGFja2FnZU5hbWVzJ10pKTsKfQoKcmV0dXJuICRyZXN1bHRbJ3BhY2thZ2VOYW1lcyddOwp9CgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKQp7CgokaGFzUHJvdmlkZXJzID0gJHRoaXMtPmhhc1Byb3ZpZGVycygpOwoKaWYgKCEkaGFzUHJvdmlkZXJzICYmICEkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgbnVsbCA9PT0gJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKcmV0dXJuIHBhcmVudDo6bG9hZFBhY2thZ2VzKCRwYWNrYWdlTmFtZU1hcCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7Cn0KCiRwYWNrYWdlcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwoKaWYgKCRoYXNQcm92aWRlcnMgfHwgJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpKSB7CmZvcmVhY2ggKCRwYWNrYWdlTmFtZU1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewokbWF0Y2hlcyA9IFtdOwoKCgppZiAoISRoYXNQcm92aWRlcnMgJiYgIWlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdKSkgewpjb250aW51ZTsKfQoKJGNhbmRpZGF0ZXMgPSAkdGhpcy0+d2hhdFByb3ZpZGVzKCRuYW1lLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpICE9PSAkbmFtZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCd3aGF0UHJvdmlkZXMgc2hvdWxkIG5ldmVyIHJldHVybiBhIHBhY2thZ2Ugd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIHJlcXVlc3RlZCBvbmUnKTsKfQokbmFtZXNGb3VuZFskbmFtZV0gPSB0cnVlOwoKaWYgKCEkY29uc3RyYWludCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCkpKSkgewokbWF0Y2hlc1tzcGxfb2JqZWN0X2hhc2goJGNhbmRpZGF0ZSldID0gJGNhbmRpZGF0ZTsKaWYgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgIWlzc2V0KCRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlLT5nZXRBbGlhc09mKCkpXSkpIHsKJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKSldID0gJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpOwp9Cn0KfQoKCmZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKaWYgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKaWYgKGlzc2V0KCRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlLT5nZXRBbGlhc09mKCkpXSkpIHsKJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUpXSA9ICRjYW5kaWRhdGU7Cn0KfQp9CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJG1hdGNoZXMpOwoKdW5zZXQoJHBhY2thZ2VOYW1lTWFwWyRuYW1lXSk7Cn0KfQoKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsICYmIGNvdW50KCRwYWNrYWdlTmFtZU1hcCkpIHsKaWYgKCR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCkgewpmb3JlYWNoICgkcGFja2FnZU5hbWVNYXAgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCEkdGhpcy0+bGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyhzdHJ0b2xvd2VyKCRuYW1lKSkpIHsKdW5zZXQoJHBhY2thZ2VOYW1lTWFwWyRuYW1lXSk7Cn0KfQp9CgokcmVzdWx0ID0gJHRoaXMtPmxvYWRBc3luY1BhY2thZ2VzKCRwYWNrYWdlTmFtZU1hcCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHJlc3VsdFsncGFja2FnZXMnXSk7CiRuYW1lc0ZvdW5kID0gYXJyYXlfbWVyZ2UoJG5hbWVzRm91bmQsICRyZXN1bHRbJ25hbWVzRm91bmQnXSk7Cn0KCnJldHVybiBbJ25hbWVzRm91bmQnID0+IGFycmF5X2tleXMoJG5hbWVzRm91bmQpLCAncGFja2FnZXMnID0+ICRwYWNrYWdlc107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpCnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSg2MDApOwoKaWYgKCR0aGlzLT5zZWFyY2hVcmwgJiYgJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9GVUxMVEVYVCkgewokdXJsID0gc3RyX3JlcGxhY2UoWyclcXVlcnklJywgJyV0eXBlJSddLCBbdXJsZW5jb2RlKCRxdWVyeSksICR0eXBlXSwgJHRoaXMtPnNlYXJjaFVybCk7Cgokc2VhcmNoID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CgppZiAoZW1wdHkoJHNlYXJjaFsncmVzdWx0cyddKSkgewpyZXR1cm4gW107Cn0KCiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCRzZWFyY2hbJ3Jlc3VsdHMnXSBhcyAkcmVzdWx0KSB7CgppZiAoIWVtcHR5KCRyZXN1bHRbJ3ZpcnR1YWwnXSkpIHsKY29udGludWU7Cn0KCiRyZXN1bHRzW10gPSAkcmVzdWx0Owp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCmlmICgkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX1ZFTkRPUikgewokcmVzdWx0cyA9IFtdOwokcmVnZXggPSAneyg/OicuaW1wbG9kZSgnfCcsIFByZWc6OnNwbGl0KCd7XHMrfScsICRxdWVyeSkpLicpfWknOwoKJHZlbmRvck5hbWVzID0gJHRoaXMtPmdldFZlbmRvck5hbWVzKCk7CmZvcmVhY2ggKFByZWc6OmdyZXAoJHJlZ2V4LCAkdmVuZG9yTmFtZXMpIGFzICRuYW1lKSB7CiRyZXN1bHRzW10gPSBbJ25hbWUnID0+ICRuYW1lLCAnZGVzY3JpcHRpb24nID0+ICcnXTsKfQoKcmV0dXJuICRyZXN1bHRzOwp9CgppZiAoJHRoaXMtPmhhc1Byb3ZpZGVycygpIHx8ICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15cXig/UDxxdWVyeT4oP1A8dmVuZG9yPlthLXowLTlfLi1dKykvW2EtejAtOV8uLV0qKVwqPyR9aScsICRxdWVyeSwgJG1hdGNoKSAmJiAkdGhpcy0+bGlzdFVybCAhPT0gbnVsbCkgewokdXJsID0gJHRoaXMtPmxpc3RVcmwgLiAnP3ZlbmRvcj0nLnVybGVuY29kZSgkbWF0Y2hbJ3ZlbmRvciddKS4nJmZpbHRlcj0nLnVybGVuY29kZSgkbWF0Y2hbJ3F1ZXJ5J10uJyonKTsKJHJlc3VsdCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKJHJlc3VsdHMgPSBbXTsKZm9yZWFjaCAoJHJlc3VsdFsncGFja2FnZU5hbWVzJ10gYXMgJG5hbWUpIHsKJHJlc3VsdHNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICdkZXNjcmlwdGlvbicgPT4gJyddOwp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCiRyZXN1bHRzID0gW107CiRyZWdleCA9ICd7KD86Jy5pbXBsb2RlKCd8JywgUHJlZzo6c3BsaXQoJ3tccyt9JywgJHF1ZXJ5KSkuJyl9aSc7CgokcGFja2FnZU5hbWVzID0gJHRoaXMtPmdldFBhY2thZ2VOYW1lcygpOwpmb3JlYWNoIChQcmVnOjpncmVwKCRyZWdleCwgJHBhY2thZ2VOYW1lcykgYXMgJG5hbWUpIHsKJHJlc3VsdHNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICdkZXNjcmlwdGlvbicgPT4gJyddOwp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnJldHVybiBwYXJlbnQ6OnNlYXJjaCgkcXVlcnksICRtb2RlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlY3VyaXR5QWR2aXNvcmllcygpOiBib29sCnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSg2MDApOwoKcmV0dXJuICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnICE9PSBudWxsICYmICgkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snbWV0YWRhdGEnXSB8fCAkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snYXBpLXVybCddICE9PSBudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZUNvbnN0cmFpbnRNYXAsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSg2MDApOwppZiAobnVsbCA9PT0gJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWcpIHsKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gW10sICdhZHZpc29yaWVzJyA9PiBbXV07Cn0KCiRhZHZpc29yaWVzID0gW107CiRuYW1lc0ZvdW5kID0gW107CgokYXBpVXJsID0gJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ2FwaS11cmwnXTsKCiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwoKCgoKCiRjcmVhdGUgPSBmdW5jdGlvbiAoYXJyYXkgJGRhdGEsIHN0cmluZyAkbmFtZSkgdXNlICgkcGFyc2VyLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgJiRwYWNrYWdlQ29uc3RyYWludE1hcCk6ID9QYXJ0aWFsU2VjdXJpdHlBZHZpc29yeSB7CiRhZHZpc29yeSA9IFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5OjpjcmVhdGUoJG5hbWUsICRkYXRhLCAkcGFyc2VyKTsKaWYgKCEkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyAmJiAhJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0Fkdmlzb3J5IGZvciAnLiRuYW1lLicgY291bGQgbm90IGJlIGxvYWRlZCBhcyBhIGZ1bGwgYWR2aXNvcnkgZnJvbSAnLiR0aGlzLT5nZXRSZXBvTmFtZSgpIC4gUEhQX0VPTCAuIHZhcl9leHBvcnQoJGRhdGEsIHRydWUpKTsKfQppZiAoISRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+bWF0Y2hlcygkcGFja2FnZUNvbnN0cmFpbnRNYXBbJG5hbWVdKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRhZHZpc29yeTsKfTsKCmlmICgkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snbWV0YWRhdGEnXSAmJiAoJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgfHwgJGFwaVVybCA9PT0gbnVsbCkpIHsKJHByb21pc2VzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlQ29uc3RyYWludE1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwoKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSB8fCAnX19yb290X18nID09PSAkbmFtZSkgewpjb250aW51ZTsKfQoKJHByb21pc2VzW10gPSAkdGhpcy0+c3RhcnRDYWNoZWRBc3luY0Rvd25sb2FkKCRuYW1lLCAkbmFtZSkKLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHNwZWMpIHVzZSAoJiRhZHZpc29yaWVzLCAmJG5hbWVzRm91bmQsICYkcGFja2FnZUNvbnN0cmFpbnRNYXAsICRuYW1lLCAkY3JlYXRlKTogdm9pZCB7ClskcmVzcG9uc2UsIF0gPSAkc3BlYzsKCmlmICghaXNzZXQoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pIHx8ICFpc19hcnJheSgkcmVzcG9uc2VbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXSkpIHsKcmV0dXJuOwp9CgokbmFtZXNGb3VuZFskbmFtZV0gPSB0cnVlOwppZiAoY291bnQoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pID4gMCkgewokYWR2aXNvcmllc1skbmFtZV0gPSBhcnJheV9maWx0ZXIoYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRkYXRhKSB1c2UgKCRuYW1lLCAkY3JlYXRlKSB7CnJldHVybiAkY3JlYXRlKCRkYXRhLCAkbmFtZSk7Cn0sCiRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddCikpOwp9CnVuc2V0KCRwYWNrYWdlQ29uc3RyYWludE1hcFskbmFtZV0pOwp9KTsKfQoKJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzKTsKfQoKaWYgKCRhcGlVcmwgIT09IG51bGwgJiYgY291bnQoJHBhY2thZ2VDb25zdHJhaW50TWFwKSA+IDApIHsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKJG9wdGlvbnNbJ2h0dHAnXVsnbWV0aG9kJ10gPSAnUE9TVCc7CmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAoYXJyYXkpICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp9CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOwokb3B0aW9uc1snaHR0cCddWyd0aW1lb3V0J10gPSAxMDsKJG9wdGlvbnNbJ2h0dHAnXVsnY29udGVudCddID0gaHR0cF9idWlsZF9xdWVyeShbJ3BhY2thZ2VzJyA9PiBhcnJheV9rZXlzKCRwYWNrYWdlQ29uc3RyYWludE1hcCldKTsKCiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRhcGlVcmwsICRvcHRpb25zKTsKCmZvcmVhY2ggKCRyZXNwb25zZS0+ZGVjb2RlSnNvbigpWydhZHZpc29yaWVzJ10gYXMgJG5hbWUgPT4gJGxpc3QpIHsKaWYgKGNvdW50KCRsaXN0KSA+IDApIHsKJGFkdmlzb3JpZXNbJG5hbWVdID0gYXJyYXlfZmlsdGVyKGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkZGF0YSkgdXNlICgkbmFtZSwgJGNyZWF0ZSkgewpyZXR1cm4gJGNyZWF0ZSgkZGF0YSwgJG5hbWUpOwp9LAokbGlzdAopKTsKfQokbmFtZXNGb3VuZFskbmFtZV0gPSB0cnVlOwp9Cn0KCnJldHVybiBbJ25hbWVzRm91bmQnID0+IGFycmF5X2tleXMoJG5hbWVzRm91bmQpLCAnYWR2aXNvcmllcycgPT4gYXJyYXlfZmlsdGVyKCRhZHZpc29yaWVzKV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoc3RyaW5nICRwYWNrYWdlTmFtZSkKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CiRyZXN1bHQgPSBbXTsKCmlmICgkdGhpcy0+cHJvdmlkZXJzQXBpVXJsKSB7CnRyeSB7CiRhcGlSZXN1bHQgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldChzdHJfcmVwbGFjZSgnJXBhY2thZ2UlJywgJHBhY2thZ2VOYW1lLCAkdGhpcy0+cHJvdmlkZXJzQXBpVXJsKSwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CnJldHVybiAkcmVzdWx0Owp9CnRocm93ICRlOwp9Cgpmb3JlYWNoICgkYXBpUmVzdWx0Wydwcm92aWRlcnMnXSBhcyAkcHJvdmlkZXIpIHsKJHJlc3VsdFskcHJvdmlkZXJbJ25hbWUnXV0gPSAkcHJvdmlkZXI7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignaGFzUGFydGlhbFBhY2thZ2VzIGZhaWxlZCB0byBpbml0aWFsaXplICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUnKTsKfQpmb3JlYWNoICgkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lIGFzICR2ZXJzaW9ucykgewpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJGNhbmRpZGF0ZSkgewppZiAoaXNzZXQoJHJlc3VsdFskY2FuZGlkYXRlWyduYW1lJ11dKSB8fCAhaXNzZXQoJGNhbmRpZGF0ZVsncHJvdmlkZSddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CiRyZXN1bHRbJGNhbmRpZGF0ZVsnbmFtZSddXSA9IFsKJ25hbWUnID0+ICRjYW5kaWRhdGVbJ25hbWUnXSwKJ2Rlc2NyaXB0aW9uJyA9PiAkY2FuZGlkYXRlWydkZXNjcmlwdGlvbiddID8/ICcnLAondHlwZScgPT4gJGNhbmRpZGF0ZVsndHlwZSddID8/ICcnLApdOwp9Cn0KfQoKaWYgKCR0aGlzLT5wYWNrYWdlcykgewokcmVzdWx0ID0gYXJyYXlfbWVyZ2UoJHJlc3VsdCwgcGFyZW50OjpnZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKSk7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3ZpZGVyTmFtZXMoKTogYXJyYXkKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPnByb3ZpZGVyTGlzdGluZykgewokZGF0YSA9ICR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKaWYgKGlzX2FycmF5KCRkYXRhKSkgewokdGhpcy0+bG9hZFByb3ZpZGVyTGlzdGluZ3MoJGRhdGEpOwp9Cn0KCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewoKcmV0dXJuIFtdOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPnByb3ZpZGVyc1VybCAmJiBudWxsICE9PSAkdGhpcy0+cHJvdmlkZXJMaXN0aW5nKSB7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5wcm92aWRlckxpc3RpbmcpOwp9CgpyZXR1cm4gW107Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmVQYWNrYWdlVHJhbnNwb3J0T3B0aW9ucyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXREaXN0VXJscygpIGFzICR1cmwpIHsKaWYgKHN0cnBvcygkdXJsLCAkdGhpcy0+YmFzZVVybCkgPT09IDApIHsKJHBhY2thZ2UtPnNldFRyYW5zcG9ydE9wdGlvbnMoJHRoaXMtPm9wdGlvbnMpOwoKcmV0dXJuOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBoYXNQcm92aWRlcnMoKTogYm9vbAp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKCnJldHVybiAkdGhpcy0+aGFzUHJvdmlkZXJzOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3aGF0UHJvdmlkZXMoc3RyaW5nICRuYW1lLCA/YXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcyA9IG51bGwsID9hcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBudWxsLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKTogYXJyYXkKewokcGFja2FnZXNTb3VyY2UgPSBudWxsOwppZiAoISR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSB8fCAhaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbmFtZV0pKSB7CgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkgfHwgJ19fcm9vdF9fJyA9PT0gJG5hbWUpIHsKcmV0dXJuIFtdOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnByb3ZpZGVyTGlzdGluZykgewokZGF0YSA9ICR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKaWYgKGlzX2FycmF5KCRkYXRhKSkgewokdGhpcy0+bG9hZFByb3ZpZGVyTGlzdGluZ3MoJGRhdGEpOwp9Cn0KCiR1c2VMYXN0TW9kaWZpZWRDaGVjayA9IGZhbHNlOwppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgJiYgIWlzc2V0KCR0aGlzLT5wcm92aWRlckxpc3RpbmdbJG5hbWVdKSkgewokaGFzaCA9IG51bGw7CiR1cmwgPSBzdHJfcmVwbGFjZSgnJXBhY2thZ2UlJywgJG5hbWUsICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKTsKJGNhY2hlS2V5ID0gJ3Byb3ZpZGVyLScuc3RydHIoJG5hbWUsICcvJywgJyQnKS4nLmpzb24nOwokdXNlTGFzdE1vZGlmaWVkQ2hlY2sgPSB0cnVlOwp9IGVsc2VpZiAoJHRoaXMtPnByb3ZpZGVyc1VybCkgewoKaWYgKCFpc3NldCgkdGhpcy0+cHJvdmlkZXJMaXN0aW5nWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9CgokaGFzaCA9ICR0aGlzLT5wcm92aWRlckxpc3RpbmdbJG5hbWVdWydzaGEyNTYnXTsKJHVybCA9IHN0cl9yZXBsYWNlKFsnJXBhY2thZ2UlJywgJyVoYXNoJSddLCBbJG5hbWUsICRoYXNoXSwgJHRoaXMtPnByb3ZpZGVyc1VybCk7CiRjYWNoZUtleSA9ICdwcm92aWRlci0nLnN0cnRyKCRuYW1lLCAnLycsICckJykuJy5qc29uJzsKfSBlbHNlIHsKcmV0dXJuIFtdOwp9CgokcGFja2FnZXMgPSBudWxsOwppZiAoISR1c2VMYXN0TW9kaWZpZWRDaGVjayAmJiAkaGFzaCAmJiAkdGhpcy0+Y2FjaGUtPnNoYTI1NigkY2FjaGVLZXkpID09PSAkaGFzaCkgewokcGFja2FnZXMgPSBqc29uX2RlY29kZSgkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSwgdHJ1ZSk7CiRwYWNrYWdlc1NvdXJjZSA9ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7Cn0gZWxzZWlmICgkdXNlTGFzdE1vZGlmaWVkQ2hlY2spIHsKaWYgKCRjb250ZW50cyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSB7CiRjb250ZW50cyA9IGpzb25fZGVjb2RlKCRjb250ZW50cywgdHJ1ZSk7CgppZiAoaXNzZXQoJGFscmVhZHlMb2FkZWRbJG5hbWVdKSkgewokcGFja2FnZXMgPSAkY29udGVudHM7CiRwYWNrYWdlc1NvdXJjZSA9ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7Cn0gZWxzZWlmIChpc3NldCgkY29udGVudHNbJ2xhc3QtbW9kaWZpZWQnXSkpIHsKJHJlc3BvbnNlID0gJHRoaXMtPmZldGNoRmlsZUlmTGFzdE1vZGlmaWVkKCR1cmwsICRjYWNoZUtleSwgJGNvbnRlbnRzWydsYXN0LW1vZGlmaWVkJ10pOwokcGFja2FnZXMgPSB0cnVlID09PSAkcmVzcG9uc2UgPyAkY29udGVudHMgOiAkcmVzcG9uc2U7CiRwYWNrYWdlc1NvdXJjZSA9IHRydWUgPT09ICRyZXNwb25zZSA/ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKScgOiAnZG93bmxvYWRlZCBmaWxlICgnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9Cn0KfQoKaWYgKCEkcGFja2FnZXMpIHsKdHJ5IHsKJHBhY2thZ2VzID0gJHRoaXMtPmZldGNoRmlsZSgkdXJsLCAkY2FjaGVLZXksICRoYXNoLCAkdXNlTGFzdE1vZGlmaWVkQ2hlY2spOwokcGFja2FnZXNTb3VyY2UgPSAnZG93bmxvYWRlZCBmaWxlICgnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCAmJiBpbl9hcnJheSgkZS0+Z2V0U3RhdHVzQ29kZSgpLCBbNDA0LCA0OTldLCB0cnVlKSkgewokcGFja2FnZXMgPSBbJ3BhY2thZ2VzJyA9PiBbXV07CiRwYWNrYWdlc1NvdXJjZSA9ICdub3QtZm91bmQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKaWYgKCRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQ5OSkgewokdGhpcy0+aW8tPmVycm9yKCc8d2FybmluZz4nIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L3dhcm5pbmc+Jyk7Cn0KfSBlbHNlIHsKdGhyb3cgJGU7Cn0KfQp9CgokbG9hZGluZ1BhcnRpYWxQYWNrYWdlID0gZmFsc2U7Cn0gZWxzZSB7CiRwYWNrYWdlcyA9IFsncGFja2FnZXMnID0+IFsndmVyc2lvbnMnID0+ICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdXV07CiRwYWNrYWdlc1NvdXJjZSA9ICdyb290IGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCkpLicpJzsKJGxvYWRpbmdQYXJ0aWFsUGFja2FnZSA9IHRydWU7Cn0KCiRyZXN1bHQgPSBbXTsKJHZlcnNpb25zVG9Mb2FkID0gW107CmZvcmVhY2ggKCRwYWNrYWdlc1sncGFja2FnZXMnXSBhcyAkdmVyc2lvbnMpIHsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CiRub3JtYWxpemVkTmFtZSA9IHN0cnRvbG93ZXIoJHZlcnNpb25bJ25hbWUnXSk7CgoKaWYgKCRub3JtYWxpemVkTmFtZSAhPT0gJG5hbWUpIHsKY29udGludWU7Cn0KCmlmICghJGxvYWRpbmdQYXJ0aWFsUGFja2FnZSAmJiAkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbm9ybWFsaXplZE5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkdmVyc2lvbnNUb0xvYWRbJHZlcnNpb25bJ3VpZCddXSkpIHsKaWYgKCFpc3NldCgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSB7CiR2ZXJzaW9uWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb25bJ3ZlcnNpb24nXSk7Cn0gZWxzZWlmICgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CgokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9CgoKaWYgKGlzc2V0KCRhbHJlYWR5TG9hZGVkWyRuYW1lXVskdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ11dKSkgewpjb250aW51ZTsKfQoKaWYgKCR0aGlzLT5pc1ZlcnNpb25BY2NlcHRhYmxlKG51bGwsICRub3JtYWxpemVkTmFtZSwgJHZlcnNpb24sICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncykpIHsKJHZlcnNpb25zVG9Mb2FkWyR2ZXJzaW9uWyd1aWQnXV0gPSAkdmVyc2lvbjsKfQp9Cn0KfQoKCiRsb2FkZWRQYWNrYWdlcyA9ICR0aGlzLT5jcmVhdGVQYWNrYWdlcygkdmVyc2lvbnNUb0xvYWQsICRwYWNrYWdlc1NvdXJjZSk7CiR1aWRzID0gYXJyYXlfa2V5cygkdmVyc2lvbnNUb0xvYWQpOwoKZm9yZWFjaCAoJGxvYWRlZFBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewokcGFja2FnZS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiR1aWQgPSAkdWlkc1skaW5kZXhdOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRhbGlhc2VkID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKJGFsaWFzZWQtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwoKJHJlc3VsdFskdWlkXSA9ICRhbGlhc2VkOwokcmVzdWx0WyR1aWQuJy1hbGlhcyddID0gJHBhY2thZ2U7Cn0gZWxzZSB7CiRyZXN1bHRbJHVpZF0gPSAkcGFja2FnZTsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKQp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKJHJlcG9EYXRhID0gJHRoaXMtPmxvYWREYXRhRnJvbVNlcnZlcigpOwoKZm9yZWFjaCAoJHRoaXMtPmNyZWF0ZVBhY2thZ2VzKCRyZXBvRGF0YSwgJ3Jvb3QgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR0aGlzLT5nZXRQYWNrYWdlc0pzb25VcmwoKSkuJyknKSBhcyAkcGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpwYXJlbnQ6OmFkZFBhY2thZ2UoJHBhY2thZ2UpOwokdGhpcy0+Y29uZmlndXJlUGFja2FnZVRyYW5zcG9ydE9wdGlvbnMoJHBhY2thZ2UpOwp9CgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZEFzeW5jUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lcywgP2FycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSBudWxsLCA/YXJyYXkgJHN0YWJpbGl0eUZsYWdzID0gbnVsbCwgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSk6IGFycmF5CnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwoKJHBhY2thZ2VzID0gW107CiRuYW1lc0ZvdW5kID0gW107CiRwcm9taXNlcyA9IFtdOwoKaWYgKG51bGwgPT09ICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2xvYWRBc3luY1BhY2thZ2VzIG9ubHkgc3VwcG9ydHMgdjIgcHJvdG9jb2wgY29tcG9zZXIgcmVwb3Mgd2l0aCBhIG1ldGFkYXRhLXVybCcpOwp9CgoKZm9yZWFjaCAoJHBhY2thZ2VOYW1lcyBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJGFjY2VwdGFibGVTdGFiaWxpdGllcyA9PT0gbnVsbCB8fCAkc3RhYmlsaXR5RmxhZ3MgPT09IG51bGwgfHwgU3RhYmlsaXR5RmlsdGVyOjppc1BhY2thZ2VBY2NlcHRhYmxlKCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgWyRuYW1lXSwgJ2RldicpKSB7CiRwYWNrYWdlTmFtZXNbJG5hbWUuJ35kZXYnXSA9ICRjb25zdHJhaW50Owp9CgppZiAoaXNzZXQoJGFjY2VwdGFibGVTdGFiaWxpdGllc1snZGV2J10pICYmIGNvdW50KCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMpID09PSAxICYmIGNvdW50KCRzdGFiaWxpdHlGbGFncykgPT09IDApIHsKdW5zZXQoJHBhY2thZ2VOYW1lc1skbmFtZV0pOwp9Cn0KCmZvcmVhY2ggKCRwYWNrYWdlTmFtZXMgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCiRyZWFsTmFtZSA9IFByZWc6OnJlcGxhY2UoJ3t+ZGV2JH0nLCAnJywgJG5hbWUpOwoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlYWxOYW1lKSB8fCAnX19yb290X18nID09PSAkcmVhbE5hbWUpIHsKY29udGludWU7Cn0KCiRwcm9taXNlc1tdID0gJHRoaXMtPnN0YXJ0Q2FjaGVkQXN5bmNEb3dubG9hZCgkbmFtZSwgJHJlYWxOYW1lKQotPnRoZW4oZnVuY3Rpb24gKGFycmF5ICRzcGVjKSB1c2UgKCYkcGFja2FnZXMsICYkbmFtZXNGb3VuZCwgJHJlYWxOYW1lLCAkY29uc3RyYWludCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk6IHZvaWQgewpbJHJlc3BvbnNlLCAkcGFja2FnZXNTb3VyY2VdID0gJHNwZWM7CmlmIChudWxsID09PSAkcmVzcG9uc2UgfHwgIWlzc2V0KCRyZXNwb25zZVsncGFja2FnZXMnXVskcmVhbE5hbWVdKSkgewpyZXR1cm47Cn0KCiR2ZXJzaW9ucyA9ICRyZXNwb25zZVsncGFja2FnZXMnXVskcmVhbE5hbWVdOwoKaWYgKGlzc2V0KCRyZXNwb25zZVsnbWluaWZpZWQnXSkgJiYgJHJlc3BvbnNlWydtaW5pZmllZCddID09PSAnY29tcG9zZXIvMi4wJykgewokdmVyc2lvbnMgPSBNZXRhZGF0YU1pbmlmaWVyOjpleHBhbmQoJHZlcnNpb25zKTsKfQoKJG5hbWVzRm91bmRbJHJlYWxOYW1lXSA9IHRydWU7CiR2ZXJzaW9uc1RvTG9hZCA9IFtdOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKaWYgKCFpc3NldCgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSB7CiR2ZXJzaW9uWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb25bJ3ZlcnNpb24nXSk7Cn0gZWxzZWlmICgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CgokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9CgoKaWYgKGlzc2V0KCRhbHJlYWR5TG9hZGVkWyRyZWFsTmFtZV1bJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddXSkpIHsKY29udGludWU7Cn0KCmlmICgkdGhpcy0+aXNWZXJzaW9uQWNjZXB0YWJsZSgkY29uc3RyYWludCwgJHJlYWxOYW1lLCAkdmVyc2lvbiwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzKSkgewokdmVyc2lvbnNUb0xvYWRbXSA9ICR2ZXJzaW9uOwp9Cn0KCiRsb2FkZWRQYWNrYWdlcyA9ICR0aGlzLT5jcmVhdGVQYWNrYWdlcygkdmVyc2lvbnNUb0xvYWQsICRwYWNrYWdlc1NvdXJjZSk7CmZvcmVhY2ggKCRsb2FkZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcGFja2FnZS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiRwYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkcGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSkpIHsKJHBhY2thZ2UtPmdldEFsaWFzT2YoKS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiRwYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQp9Cn0pOwp9CgokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMpOwoKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gJG5hbWVzRm91bmQsICdwYWNrYWdlcycgPT4gJHBhY2thZ2VzXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdGFydENhY2hlZEFzeW5jRG93bmxvYWQoc3RyaW5nICRmaWxlTmFtZSwgP3N0cmluZyAkcGFja2FnZU5hbWUgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdzdGFydENhY2hlZEFzeW5jRG93bmxvYWQgb25seSBzdXBwb3J0cyB2MiBwcm90b2NvbCBjb21wb3NlciByZXBvcyB3aXRoIGEgbWV0YWRhdGEtdXJsJyk7Cn0KCiRuYW1lID0gc3RydG9sb3dlcigkZmlsZU5hbWUpOwokcGFja2FnZU5hbWUgPSAkcGFja2FnZU5hbWUgPz8gJG5hbWU7CgokdXJsID0gc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRuYW1lLCAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCk7CiRjYWNoZUtleSA9ICdwcm92aWRlci0nLnN0cnRyKCRuYW1lLCAnLycsICd+JykuJy5qc29uJzsKCiRsYXN0TW9kaWZpZWQgPSBudWxsOwppZiAoJGNvbnRlbnRzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSkpIHsKJGNvbnRlbnRzID0ganNvbl9kZWNvZGUoJGNvbnRlbnRzLCB0cnVlKTsKJGxhc3RNb2RpZmllZCA9ICRjb250ZW50c1snbGFzdC1tb2RpZmllZCddID8/IG51bGw7Cn0KCnJldHVybiAkdGhpcy0+YXN5bmNGZXRjaEZpbGUoJHVybCwgJGNhY2hlS2V5LCAkbGFzdE1vZGlmaWVkKQotPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgkcmVzcG9uc2UpIHVzZSAoJHVybCwgJGNhY2hlS2V5LCAkY29udGVudHMsICRwYWNrYWdlTmFtZSk6IGFycmF5IHsKJHBhY2thZ2VzU291cmNlID0gJ2Rvd25sb2FkZWQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKCmlmICh0cnVlID09PSAkcmVzcG9uc2UpIHsKJHBhY2thZ2VzU291cmNlID0gJ2NhY2hlZCBmaWxlICgnLiRjYWNoZUtleS4nIG9yaWdpbmF0aW5nIGZyb20gJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKJHJlc3BvbnNlID0gJGNvbnRlbnRzOwp9CgppZiAoIWlzc2V0KCRyZXNwb25zZVsncGFja2FnZXMnXVskcGFja2FnZU5hbWVdKSAmJiAhaXNzZXQoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pKSB7CnJldHVybiBbbnVsbCwgJHBhY2thZ2VzU291cmNlXTsKfQoKcmV0dXJuIFskcmVzcG9uc2UsICRwYWNrYWdlc1NvdXJjZV07Cn0pOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNWZXJzaW9uQWNjZXB0YWJsZSg/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwgc3RyaW5nICRuYW1lLCBhcnJheSAkdmVyc2lvbkRhdGEsID9hcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gbnVsbCwgP2FycmF5ICRzdGFiaWxpdHlGbGFncyA9IG51bGwpOiBib29sCnsKJHZlcnNpb25zID0gWyR2ZXJzaW9uRGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ11dOwoKaWYgKCRhbGlhcyA9ICR0aGlzLT5sb2FkZXItPmdldEJyYW5jaEFsaWFzKCR2ZXJzaW9uRGF0YSkpIHsKJHZlcnNpb25zW10gPSAkYWxpYXM7Cn0KCmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewppZiAobnVsbCAhPT0gJGFjY2VwdGFibGVTdGFiaWxpdGllcyAmJiBudWxsICE9PSAkc3RhYmlsaXR5RmxhZ3MgJiYgIVN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsIFskbmFtZV0sIFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKSkpIHsKY29udGludWU7Cn0KCmlmICgkY29uc3RyYWludCAmJiAhQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGNvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkdmVyc2lvbikpIHsKY29udGludWU7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZXNKc29uVXJsKCk6IHN0cmluZwp7CiRqc29uVXJsUGFydHMgPSBwYXJzZV91cmwoc3RydHIoJHRoaXMtPnVybCwgJ1xcJywgJy8nKSk7CgppZiAoaXNzZXQoJGpzb25VcmxQYXJ0c1sncGF0aCddKSAmJiBmYWxzZSAhPT0gc3RycG9zKCRqc29uVXJsUGFydHNbJ3BhdGgnXSwgJy5qc29uJykpIHsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCnJldHVybiAkdGhpcy0+dXJsIC4gJy9wYWNrYWdlcy5qc29uJzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxvYWRSb290U2VydmVyRmlsZSg/aW50ICRyb290TWF4QWdlID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHRoaXMtPnJvb3REYXRhKSB7CnJldHVybiAkdGhpcy0+cm9vdERhdGE7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIHN0cnBvcygkdGhpcy0+dXJsLCAnaHR0cHMnKSA9PT0gMCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24gaW4geW91ciBwaHAuaW5pIHRvIGxvYWQgaW5mb3JtYXRpb24gZnJvbSAnLiR0aGlzLT51cmwpOwp9CgppZiAoJGNhY2hlZERhdGEgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJ3BhY2thZ2VzLmpzb24nKSkgewokY2FjaGVkRGF0YSA9IGpzb25fZGVjb2RlKCRjYWNoZWREYXRhLCB0cnVlKTsKaWYgKCRyb290TWF4QWdlICE9PSBudWxsICYmICgkYWdlID0gJHRoaXMtPmNhY2hlLT5nZXRBZ2UoJ3BhY2thZ2VzLmpzb24nKSkgIT09IGZhbHNlICYmICRhZ2UgPD0gJHJvb3RNYXhBZ2UpIHsKJGRhdGEgPSAkY2FjaGVkRGF0YTsKfSBlbHNlaWYgKGlzc2V0KCRjYWNoZWREYXRhWydsYXN0LW1vZGlmaWVkJ10pKSB7CiRyZXNwb25zZSA9ICR0aGlzLT5mZXRjaEZpbGVJZkxhc3RNb2RpZmllZCgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCksICdwYWNrYWdlcy5qc29uJywgJGNhY2hlZERhdGFbJ2xhc3QtbW9kaWZpZWQnXSk7CiRkYXRhID0gdHJ1ZSA9PT0gJHJlc3BvbnNlID8gJGNhY2hlZERhdGEgOiAkcmVzcG9uc2U7Cn0KfQoKaWYgKCFpc3NldCgkZGF0YSkpIHsKJGRhdGEgPSAkdGhpcy0+ZmV0Y2hGaWxlKCR0aGlzLT5nZXRQYWNrYWdlc0pzb25VcmwoKSwgJ3BhY2thZ2VzLmpzb24nLCBudWxsLCB0cnVlKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnbm90aWZ5LWJhdGNoJ10pKSB7CiR0aGlzLT5ub3RpZnlVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydub3RpZnktYmF0Y2gnXSk7Cn0gZWxzZWlmICghZW1wdHkoJGRhdGFbJ25vdGlmeSddKSkgewokdGhpcy0+bm90aWZ5VXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsnbm90aWZ5J10pOwp9CgppZiAoIWVtcHR5KCRkYXRhWydzZWFyY2gnXSkpIHsKJHRoaXMtPnNlYXJjaFVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3NlYXJjaCddKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnbWlycm9ycyddKSkgewpmb3JlYWNoICgkZGF0YVsnbWlycm9ycyddIGFzICRtaXJyb3IpIHsKaWYgKCFlbXB0eSgkbWlycm9yWydnaXQtdXJsJ10pKSB7CiR0aGlzLT5zb3VyY2VNaXJyb3JzWydnaXQnXVtdID0gWyd1cmwnID0+ICRtaXJyb3JbJ2dpdC11cmwnXSwgJ3ByZWZlcnJlZCcgPT4gIWVtcHR5KCRtaXJyb3JbJ3ByZWZlcnJlZCddKV07Cn0KaWYgKCFlbXB0eSgkbWlycm9yWydoZy11cmwnXSkpIHsKJHRoaXMtPnNvdXJjZU1pcnJvcnNbJ2hnJ11bXSA9IFsndXJsJyA9PiAkbWlycm9yWydoZy11cmwnXSwgJ3ByZWZlcnJlZCcgPT4gIWVtcHR5KCRtaXJyb3JbJ3ByZWZlcnJlZCddKV07Cn0KaWYgKCFlbXB0eSgkbWlycm9yWydkaXN0LXVybCddKSkgewokdGhpcy0+ZGlzdE1pcnJvcnNbXSA9IFsKJ3VybCcgPT4gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkbWlycm9yWydkaXN0LXVybCddKSwKJ3ByZWZlcnJlZCcgPT4gIWVtcHR5KCRtaXJyb3JbJ3ByZWZlcnJlZCddKSwKXTsKfQp9Cn0KCmlmICghZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycy1sYXp5LXVybCddKSkgewokdGhpcy0+bGF6eVByb3ZpZGVyc1VybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3Byb3ZpZGVycy1sYXp5LXVybCddKTsKJHRoaXMtPmhhc1Byb3ZpZGVycyA9IHRydWU7CgokdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzID0gIWVtcHR5KCRkYXRhWydwYWNrYWdlcyddKSAmJiBpc19hcnJheSgkZGF0YVsncGFja2FnZXMnXSk7Cn0KCgoKCmlmICghZW1wdHkoJGRhdGFbJ21ldGFkYXRhLXVybCddKSkgewokdGhpcy0+bGF6eVByb3ZpZGVyc1VybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ21ldGFkYXRhLXVybCddKTsKJHRoaXMtPnByb3ZpZGVyc1VybCA9IG51bGw7CiR0aGlzLT5oYXNQcm92aWRlcnMgPSBmYWxzZTsKJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcyA9ICFlbXB0eSgkZGF0YVsncGFja2FnZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3BhY2thZ2VzJ10pOwokdGhpcy0+YWxsb3dTc2xEb3duZ3JhZGUgPSBmYWxzZTsKCgoKCmlmICghZW1wdHkoJGRhdGFbJ2F2YWlsYWJsZS1wYWNrYWdlcyddKSkgewokYXZhaWxQYWNrYWdlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsICRkYXRhWydhdmFpbGFibGUtcGFja2FnZXMnXSk7CiR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcyA9IGFycmF5X2NvbWJpbmUoJGF2YWlsUGFja2FnZXMsICRhdmFpbFBhY2thZ2VzKTsKJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ID0gdHJ1ZTsKfQoKCgoKaWYgKCFlbXB0eSgkZGF0YVsnYXZhaWxhYmxlLXBhY2thZ2UtcGF0dGVybnMnXSkpIHsKJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VQYXR0ZXJucyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwYXR0ZXJuKTogc3RyaW5nIHsKcmV0dXJuIEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKTsKfSwgJGRhdGFbJ2F2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zJ10pOwokdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgPSB0cnVlOwp9CgoKCnVuc2V0KCRkYXRhWydwcm92aWRlcnMtdXJsJ10sICRkYXRhWydwcm92aWRlcnMnXSwgJGRhdGFbJ3Byb3ZpZGVycy1pbmNsdWRlcyddKTsKCmlmIChpc3NldCgkZGF0YVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSAmJiBpc19hcnJheSgkZGF0YVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSkgewokdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZyA9IFsKJ21ldGFkYXRhJyA9PiAkZGF0YVsnc2VjdXJpdHktYWR2aXNvcmllcyddWydtZXRhZGF0YSddID8/IGZhbHNlLAonYXBpLXVybCcgPT4gJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXVsnYXBpLXVybCddID8/IG51bGwsCidxdWVyeS1hbGwnID0+ICRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ3F1ZXJ5LWFsbCddID8/IGZhbHNlLApdOwp9Cn0KCmlmICgkdGhpcy0+YWxsb3dTc2xEb3duZ3JhZGUpIHsKJHRoaXMtPnVybCA9IHN0cl9yZXBsYWNlKCdodHRwczovLycsICdodHRwOi8vJywgJHRoaXMtPnVybCk7CiR0aGlzLT5iYXNlVXJsID0gc3RyX3JlcGxhY2UoJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCAkdGhpcy0+YmFzZVVybCk7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycy11cmwnXSkpIHsKJHRoaXMtPnByb3ZpZGVyc1VybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3Byb3ZpZGVycy11cmwnXSk7CiR0aGlzLT5oYXNQcm92aWRlcnMgPSB0cnVlOwp9CgppZiAoIWVtcHR5KCRkYXRhWydsaXN0J10pKSB7CiR0aGlzLT5saXN0VXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsnbGlzdCddKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsncHJvdmlkZXJzJ10pIHx8ICFlbXB0eSgkZGF0YVsncHJvdmlkZXJzLWluY2x1ZGVzJ10pKSB7CiR0aGlzLT5oYXNQcm92aWRlcnMgPSB0cnVlOwp9CgppZiAoIWVtcHR5KCRkYXRhWydwcm92aWRlcnMtYXBpJ10pKSB7CiR0aGlzLT5wcm92aWRlcnNBcGlVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydwcm92aWRlcnMtYXBpJ10pOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3REYXRhID0gJGRhdGE7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVVybChzdHJpbmcgJHVybCk6IHN0cmluZwp7CmlmICgnLycgPT09ICR1cmxbMF0pIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW146XSsrOi8vW14vXSorfScsICR0aGlzLT51cmwsICRtYXRjaGVzKSkgewpyZXR1cm4gJG1hdGNoZXNbMF0gLiAkdXJsOwp9CgpyZXR1cm4gJHRoaXMtPnVybDsKfQoKcmV0dXJuICR1cmw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZERhdGFGcm9tU2VydmVyKCk6IGFycmF5CnsKJGRhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmICh0cnVlID09PSAkZGF0YSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdsb2FkUm9vdFNlcnZlckZpbGUgc2hvdWxkIG5vdCByZXR1cm4gdHJ1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24nKTsKfQoKcmV0dXJuICR0aGlzLT5sb2FkSW5jbHVkZXMoJGRhdGEpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGhhc1BhcnRpYWxQYWNrYWdlcygpOiBib29sCnsKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMgJiYgbnVsbCA9PT0gJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSkgewokdGhpcy0+aW5pdGlhbGl6ZVBhcnRpYWxQYWNrYWdlcygpOwp9CgpyZXR1cm4gJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkUHJvdmlkZXJMaXN0aW5ncygkZGF0YSk6IHZvaWQKewppZiAoaXNzZXQoJGRhdGFbJ3Byb3ZpZGVycyddKSkgewppZiAoIWlzX2FycmF5KCR0aGlzLT5wcm92aWRlckxpc3RpbmcpKSB7CiR0aGlzLT5wcm92aWRlckxpc3RpbmcgPSBbXTsKfQokdGhpcy0+cHJvdmlkZXJMaXN0aW5nID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnByb3ZpZGVyTGlzdGluZywgJGRhdGFbJ3Byb3ZpZGVycyddKTsKfQoKaWYgKCR0aGlzLT5wcm92aWRlcnNVcmwgJiYgaXNzZXQoJGRhdGFbJ3Byb3ZpZGVyLWluY2x1ZGVzJ10pKSB7CiRpbmNsdWRlcyA9ICRkYXRhWydwcm92aWRlci1pbmNsdWRlcyddOwpmb3JlYWNoICgkaW5jbHVkZXMgYXMgJGluY2x1ZGUgPT4gJG1ldGFkYXRhKSB7CiR1cmwgPSAkdGhpcy0+YmFzZVVybCAuICcvJyAuIHN0cl9yZXBsYWNlKCclaGFzaCUnLCAkbWV0YWRhdGFbJ3NoYTI1NiddLCAkaW5jbHVkZSk7CiRjYWNoZUtleSA9IHN0cl9yZXBsYWNlKFsnJWhhc2glJywnJCddLCAnJywgJGluY2x1ZGUpOwppZiAoJHRoaXMtPmNhY2hlLT5zaGEyNTYoJGNhY2hlS2V5KSA9PT0gJG1ldGFkYXRhWydzaGEyNTYnXSkgewokaW5jbHVkZWREYXRhID0ganNvbl9kZWNvZGUoJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSksIHRydWUpOwp9IGVsc2UgewokaW5jbHVkZWREYXRhID0gJHRoaXMtPmZldGNoRmlsZSgkdXJsLCAkY2FjaGVLZXksICRtZXRhZGF0YVsnc2hhMjU2J10pOwp9CgokdGhpcy0+bG9hZFByb3ZpZGVyTGlzdGluZ3MoJGluY2x1ZGVkRGF0YSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZEluY2x1ZGVzKGFycmF5ICRkYXRhKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKCgppZiAoIWlzc2V0KCRkYXRhWydwYWNrYWdlcyddKSAmJiAhaXNzZXQoJGRhdGFbJ2luY2x1ZGVzJ10pKSB7CmZvcmVhY2ggKCRkYXRhIGFzICRwa2cpIHsKaWYgKGlzc2V0KCRwa2dbJ3ZlcnNpb25zJ10pICYmIGlzX2FycmF5KCRwa2dbJ3ZlcnNpb25zJ10pKSB7CmZvcmVhY2ggKCRwa2dbJ3ZlcnNpb25zJ10gYXMgJG1ldGFkYXRhKSB7CiRwYWNrYWdlc1tdID0gJG1ldGFkYXRhOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKaWYgKGlzc2V0KCRkYXRhWydwYWNrYWdlcyddKSkgewpmb3JlYWNoICgkZGF0YVsncGFja2FnZXMnXSBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbnMpIHsKJHBhY2thZ2VOYW1lID0gc3RydG9sb3dlcigoc3RyaW5nKSAkcGFja2FnZSk7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbiA9PiAkbWV0YWRhdGEpIHsKJHBhY2thZ2VzW10gPSAkbWV0YWRhdGE7CmlmICghJHRoaXMtPmRpc3BsYXllZFdhcm5pbmdBYm91dE5vbk1hdGNoaW5nUGFja2FnZUluZGV4ICYmICRwYWNrYWdlTmFtZSAhPT0gc3RydG9sb3dlcigoc3RyaW5nKSAoJG1ldGFkYXRhWyduYW1lJ10gPz8gJycpKSkgewokdGhpcy0+ZGlzcGxheWVkV2FybmluZ0Fib3V0Tm9uTWF0Y2hpbmdQYWNrYWdlSW5kZXggPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigiPHdhcm5pbmc+V2FybmluZzogdGhlIHBhY2thZ2VzIGtleSAnJXMnIGRvZXNuJ3QgbWF0Y2ggdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSAnJXMnIGluIHJlcG9zaXRvcnkgJXM8L3dhcm5pbmc+IiwgJHBhY2thZ2UsICRtZXRhZGF0YVsnbmFtZSddID8/ICcnLCAkdGhpcy0+YmFzZVVybCkpOwp9Cn0KfQp9CgppZiAoaXNzZXQoJGRhdGFbJ2luY2x1ZGVzJ10pKSB7CmZvcmVhY2ggKCRkYXRhWydpbmNsdWRlcyddIGFzICRpbmNsdWRlID0+ICRtZXRhZGF0YSkgewppZiAoaXNzZXQoJG1ldGFkYXRhWydzaGExJ10pICYmICR0aGlzLT5jYWNoZS0+c2hhMSgoc3RyaW5nKSAkaW5jbHVkZSkgPT09ICRtZXRhZGF0YVsnc2hhMSddKSB7CiRpbmNsdWRlZERhdGEgPSBqc29uX2RlY29kZSgkdGhpcy0+Y2FjaGUtPnJlYWQoKHN0cmluZykgJGluY2x1ZGUpLCB0cnVlKTsKfSBlbHNlIHsKJGluY2x1ZGVkRGF0YSA9ICR0aGlzLT5mZXRjaEZpbGUoJGluY2x1ZGUpOwp9CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHRoaXMtPmxvYWRJbmNsdWRlcygkaW5jbHVkZWREYXRhKSk7Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcywgP3N0cmluZyAkc291cmNlID0gbnVsbCk6IGFycmF5CnsKaWYgKCEkcGFja2FnZXMpIHsKcmV0dXJuIFtdOwp9Cgp0cnkgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJiRkYXRhKSB7CmlmICghaXNzZXQoJGRhdGFbJ25vdGlmaWNhdGlvbi11cmwnXSkpIHsKJGRhdGFbJ25vdGlmaWNhdGlvbi11cmwnXSA9ICR0aGlzLT5ub3RpZnlVcmw7Cn0KfQoKJHBhY2thZ2VJbnN0YW5jZXMgPSAkdGhpcy0+bG9hZGVyLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VzKTsKCmZvcmVhY2ggKCRwYWNrYWdlSW5zdGFuY2VzIGFzICRwYWNrYWdlKSB7CmlmIChpc3NldCgkdGhpcy0+c291cmNlTWlycm9yc1skcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpXSkpIHsKJHBhY2thZ2UtPnNldFNvdXJjZU1pcnJvcnMoJHRoaXMtPnNvdXJjZU1pcnJvcnNbJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKV0pOwp9CiRwYWNrYWdlLT5zZXREaXN0TWlycm9ycygkdGhpcy0+ZGlzdE1pcnJvcnMpOwokdGhpcy0+Y29uZmlndXJlUGFja2FnZVRyYW5zcG9ydE9wdGlvbnMoJHBhY2thZ2UpOwp9CgpyZXR1cm4gJHBhY2thZ2VJbnN0YW5jZXM7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgbG9hZCBwYWNrYWdlcyAnLigkcGFja2FnZXNbMF1bJ25hbWUnXSA/PyBqc29uX2VuY29kZSgkcGFja2FnZXMpKS4nIGluICcuJHRoaXMtPmdldFJlcG9OYW1lKCkuKCRzb3VyY2UgPyAnIGZyb20gJy4kc291cmNlIDogJycpLic6IFsnLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpLCAwLCAkZSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoRmlsZShzdHJpbmcgJGZpbGVuYW1lLCA/c3RyaW5nICRjYWNoZUtleSA9IG51bGwsID9zdHJpbmcgJHNoYTI1NiA9IG51bGwsIGJvb2wgJHN0b3JlTGFzdE1vZGlmaWVkVGltZSA9IGZhbHNlKQp7CmlmICgnJyA9PT0gJGZpbGVuYW1lKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckZmlsZW5hbWUgc2hvdWxkIG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQoKaWYgKG51bGwgPT09ICRjYWNoZUtleSkgewokY2FjaGVLZXkgPSAkZmlsZW5hbWU7CiRmaWxlbmFtZSA9ICR0aGlzLT5iYXNlVXJsLicvJy4kZmlsZW5hbWU7Cn0KCgppZiAoKCRwb3MgPSBzdHJwb3MoJGZpbGVuYW1lLCAnJCcpKSAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL31pJywgJGZpbGVuYW1lKSkgewokZmlsZW5hbWUgPSBzdWJzdHIoJGZpbGVuYW1lLCAwLCAkcG9zKSAuICclMjQnIC4gc3Vic3RyKCRmaWxlbmFtZSwgJHBvcyArIDEpOwp9CgokcmV0cmllcyA9IDM7CndoaWxlICgkcmV0cmllcy0tKSB7CnRyeSB7CiRvcHRpb25zID0gJHRoaXMtPm9wdGlvbnM7CmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwcmVGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQcmVGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBSRV9GSUxFX0RPV05MT0FELCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICRmaWxlbmFtZSwgJ21ldGFkYXRhJywgWydyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokcHJlRmlsZURvd25sb2FkRXZlbnQtPnNldFRyYW5zcG9ydE9wdGlvbnMoJHRoaXMtPm9wdGlvbnMpOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHByZUZpbGVEb3dubG9hZEV2ZW50KTsKJGZpbGVuYW1lID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRQcm9jZXNzZWRVcmwoKTsKJG9wdGlvbnMgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKfQoKJHJlc3BvbnNlID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJGZpbGVuYW1lLCAkb3B0aW9ucyk7CiRqc29uID0gKHN0cmluZykgJHJlc3BvbnNlLT5nZXRCb2R5KCk7CmlmICgkc2hhMjU2ICYmICRzaGEyNTYgIT09IGhhc2goJ3NoYTI1NicsICRqc29uKSkgewoKaWYgKCR0aGlzLT5hbGxvd1NzbERvd25ncmFkZSkgewokdGhpcy0+dXJsID0gc3RyX3JlcGxhY2UoJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nLCAkdGhpcy0+dXJsKTsKJHRoaXMtPmJhc2VVcmwgPSBzdHJfcmVwbGFjZSgnaHR0cDovLycsICdodHRwczovLycsICR0aGlzLT5iYXNlVXJsKTsKJGZpbGVuYW1lID0gc3RyX3JlcGxhY2UoJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nLCAkZmlsZW5hbWUpOwp9CgppZiAoJHJldHJpZXMgPiAwKSB7CnVzbGVlcCgxMDAwMDApOwoKY29udGludWU7Cn0KCgp0aHJvdyBuZXcgUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uKCdUaGUgY29udGVudHMgb2YgJy4kZmlsZW5hbWUuJyBkbyBub3QgbWF0Y2ggaXRzIHNpZ25hdHVyZS4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFjayBvciBlLmcuIGFudGl2aXJ1cyBzb2Z0d2FyZSBjb3JydXB0aW5nIGZpbGVzLiBUcnkgcnVubmluZyBjb21wb3NlciBhZ2FpbiBhbmQgcmVwb3J0IHRoaXMgaWYgeW91IHRoaW5rIGl0IGlzIGEgbWlzdGFrZS4nKTsKfQoKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHBvc3RGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQb3N0RmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQT1NUX0ZJTEVfRE9XTkxPQUQsIG51bGwsICRzaGEyNTYsICRmaWxlbmFtZSwgJ21ldGFkYXRhJywgWydyZXNwb25zZScgPT4gJHJlc3BvbnNlLCAncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHBvc3RGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcG9zdEZpbGVEb3dubG9hZEV2ZW50KTsKfQoKJGRhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKSHR0cERvd25sb2FkZXI6Om91dHB1dFdhcm5pbmdzKCR0aGlzLT5pbywgJHRoaXMtPnVybCwgJGRhdGEpOwoKaWYgKCRjYWNoZUtleSAmJiAhJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKaWYgKCRzdG9yZUxhc3RNb2RpZmllZFRpbWUpIHsKJGxhc3RNb2RpZmllZERhdGUgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGFzdC1tb2RpZmllZCcpOwppZiAoJGxhc3RNb2RpZmllZERhdGUpIHsKJGRhdGFbJ2xhc3QtbW9kaWZpZWQnXSA9ICRsYXN0TW9kaWZpZWREYXRlOwokanNvbiA9IEpzb25GaWxlOjplbmNvZGUoJGRhdGEsIDApOwp9Cn0KJHRoaXMtPmNhY2hlLT53cml0ZSgkY2FjaGVLZXksICRqc29uKTsKfQoKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CgpicmVhazsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBcTG9naWNFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KCmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKdGhyb3cgJGU7Cn0KCmlmICgkZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnlTZWN1cml0eUV4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQoKaWYgKCRjYWNoZUtleSAmJiAoJGNvbnRlbnRzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSkpKSB7CmlmICghJHRoaXMtPmRlZ3JhZGVkTW9kZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJHRoaXMtPnVybC4nIGNvdWxkIG5vdCBiZSBmdWxseSBsb2FkZWQgKCcuJGUtPmdldE1lc3NhZ2UoKS4nKSwgcGFja2FnZSBpbmZvcm1hdGlvbiB3YXMgbG9hZGVkIGZyb20gdGhlIGxvY2FsIGNhY2hlIGFuZCBtYXkgYmUgb3V0IG9mIGRhdGU8L3dhcm5pbmc+Jyk7Cn0KJHRoaXMtPmRlZ3JhZGVkTW9kZSA9IHRydWU7CiRkYXRhID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkY29udGVudHMsICR0aGlzLT5jYWNoZS0+Z2V0Um9vdCgpLiRjYWNoZUtleSk7CgpicmVhazsKfQoKdGhyb3cgJGU7Cn0KfQoKaWYgKCFpc3NldCgkZGF0YSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigiQ29tcG9zZXJSZXBvc2l0b3J5OiBVbmRlZmluZWQgXCRkYXRhLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIpOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmV0Y2hGaWxlSWZMYXN0TW9kaWZpZWQoc3RyaW5nICRmaWxlbmFtZSwgc3RyaW5nICRjYWNoZUtleSwgc3RyaW5nICRsYXN0TW9kaWZpZWRUaW1lKQp7CmlmICgnJyA9PT0gJGZpbGVuYW1lKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckZmlsZW5hbWUgc2hvdWxkIG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQoKdHJ5IHsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHByZUZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFByZUZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UFJFX0ZJTEVfRE9XTkxPQUQsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiRwcmVGaWxlRG93bmxvYWRFdmVudC0+c2V0VHJhbnNwb3J0T3B0aW9ucygkdGhpcy0+b3B0aW9ucyk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwokZmlsZW5hbWUgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpOwokb3B0aW9ucyA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gKGFycmF5KSAkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXTsKfQokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gJ0lmLU1vZGlmaWVkLVNpbmNlOiAnLiRsYXN0TW9kaWZpZWRUaW1lOwokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkZmlsZW5hbWUsICRvcHRpb25zKTsKJGpzb24gPSAoc3RyaW5nKSAkcmVzcG9uc2UtPmdldEJvZHkoKTsKaWYgKCRqc29uID09PSAnJyAmJiAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSA9PT0gMzA0KSB7CnJldHVybiB0cnVlOwp9CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgbnVsbCwgbnVsbCwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3Jlc3BvbnNlJyA9PiAkcmVzcG9uc2UsICdyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcG9zdEZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwb3N0RmlsZURvd25sb2FkRXZlbnQpOwp9CgokZGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJHRoaXMtPmlvLCAkdGhpcy0+dXJsLCAkZGF0YSk7CgokbGFzdE1vZGlmaWVkRGF0ZSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsYXN0LW1vZGlmaWVkJyk7CiRyZXNwb25zZS0+Y29sbGVjdCgpOwppZiAoJGxhc3RNb2RpZmllZERhdGUpIHsKJGRhdGFbJ2xhc3QtbW9kaWZpZWQnXSA9ICRsYXN0TW9kaWZpZWREYXRlOwokanNvbiA9IEpzb25GaWxlOjplbmNvZGUoJGRhdGEsIDApOwp9CmlmICghJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkY2FjaGVLZXksICRqc29uKTsKfQoKcmV0dXJuICRkYXRhOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFxMb2dpY0V4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQoKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewp0aHJvdyAkZTsKfQoKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kdGhpcy0+dXJsLicgY291bGQgbm90IGJlIGZ1bGx5IGxvYWRlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpLCBwYWNrYWdlIGluZm9ybWF0aW9uIHdhcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgY2FjaGUgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZTwvd2FybmluZz4nKTsKfQokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKCnJldHVybiB0cnVlOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYXN5bmNGZXRjaEZpbGUoc3RyaW5nICRmaWxlbmFtZSwgc3RyaW5nICRjYWNoZUtleSwgP3N0cmluZyAkbGFzdE1vZGlmaWVkVGltZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCcnID09PSAkZmlsZW5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRmaWxlbmFtZSBzaG91bGQgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9CgppZiAoaXNzZXQoJHRoaXMtPnBhY2thZ2VzTm90Rm91bmRDYWNoZVskZmlsZW5hbWVdKSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShbJ3BhY2thZ2VzJyA9PiBbXV0pOwp9CgppZiAoaXNzZXQoJHRoaXMtPmZyZXNoTWV0YWRhdGFVcmxzWyRmaWxlbmFtZV0pICYmICRsYXN0TW9kaWZpZWRUaW1lKSB7CgoKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKHRydWUpOwoKcmV0dXJuICRwcm9taXNlOwp9CgokaHR0cERvd25sb2FkZXIgPSAkdGhpcy0+aHR0cERvd25sb2FkZXI7CiRvcHRpb25zID0gJHRoaXMtPm9wdGlvbnM7CmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwcmVGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQcmVGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBSRV9GSUxFX0RPV05MT0FELCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICRmaWxlbmFtZSwgJ21ldGFkYXRhJywgWydyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokcHJlRmlsZURvd25sb2FkRXZlbnQtPnNldFRyYW5zcG9ydE9wdGlvbnMoJHRoaXMtPm9wdGlvbnMpOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHByZUZpbGVEb3dubG9hZEV2ZW50KTsKJGZpbGVuYW1lID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRQcm9jZXNzZWRVcmwoKTsKJG9wdGlvbnMgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKfQoKaWYgKCRsYXN0TW9kaWZpZWRUaW1lKSB7CmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAoYXJyYXkpICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp9CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnSWYtTW9kaWZpZWQtU2luY2U6ICcuJGxhc3RNb2RpZmllZFRpbWU7Cn0KCiRpbyA9ICR0aGlzLT5pbzsKJHVybCA9ICR0aGlzLT51cmw7CiRjYWNoZSA9ICR0aGlzLT5jYWNoZTsKJGRlZ3JhZGVkTW9kZSA9ICYkdGhpcy0+ZGVncmFkZWRNb2RlOwokZXZlbnREaXNwYXRjaGVyID0gJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcjsKCgoKCiRhY2NlcHQgPSBmdW5jdGlvbiAoJHJlc3BvbnNlKSB1c2UgKCRpbywgJHVybCwgJGZpbGVuYW1lLCAkY2FjaGUsICRjYWNoZUtleSwgJGV2ZW50RGlzcGF0Y2hlcikgewoKaWYgKCRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKJHRoaXMtPnBhY2thZ2VzTm90Rm91bmRDYWNoZVskZmlsZW5hbWVdID0gdHJ1ZTsKCnJldHVybiBbJ3BhY2thZ2VzJyA9PiBbXV07Cn0KCiRqc29uID0gKHN0cmluZykgJHJlc3BvbnNlLT5nZXRCb2R5KCk7CmlmICgkanNvbiA9PT0gJycgJiYgJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDMwNCkgewokdGhpcy0+ZnJlc2hNZXRhZGF0YVVybHNbJGZpbGVuYW1lXSA9IHRydWU7CgpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCRldmVudERpc3BhdGNoZXIpIHsKJHBvc3RGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQb3N0RmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQT1NUX0ZJTEVfRE9XTkxPQUQsIG51bGwsIG51bGwsICRmaWxlbmFtZSwgJ21ldGFkYXRhJywgWydyZXNwb25zZScgPT4gJHJlc3BvbnNlLCAncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHBvc3RGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcG9zdEZpbGVEb3dubG9hZEV2ZW50KTsKfQoKJGRhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKSHR0cERvd25sb2FkZXI6Om91dHB1dFdhcm5pbmdzKCRpbywgJHVybCwgJGRhdGEpOwoKJGxhc3RNb2RpZmllZERhdGUgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGFzdC1tb2RpZmllZCcpOwokcmVzcG9uc2UtPmNvbGxlY3QoKTsKaWYgKCRsYXN0TW9kaWZpZWREYXRlKSB7CiRkYXRhWydsYXN0LW1vZGlmaWVkJ10gPSAkbGFzdE1vZGlmaWVkRGF0ZTsKJGpzb24gPSBKc29uRmlsZTo6ZW5jb2RlKCRkYXRhLCBKU09OX1VORVNDQVBFRF9TTEFTSEVTIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7Cn0KaWYgKCEkY2FjaGUtPmlzUmVhZE9ubHkoKSkgewokY2FjaGUtPndyaXRlKCRjYWNoZUtleSwgJGpzb24pOwp9CiR0aGlzLT5mcmVzaE1ldGFkYXRhVXJsc1skZmlsZW5hbWVdID0gdHJ1ZTsKCnJldHVybiAkZGF0YTsKfTsKCiRyZWplY3QgPSBmdW5jdGlvbiAoJGUpIHVzZSAoJGZpbGVuYW1lLCAkYWNjZXB0LCAkaW8sICR1cmwsICYkZGVncmFkZWRNb2RlLCAkbGFzdE1vZGlmaWVkVGltZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CiR0aGlzLT5wYWNrYWdlc05vdEZvdW5kQ2FjaGVbJGZpbGVuYW1lXSA9IHRydWU7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJGRlZ3JhZGVkTW9kZSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJHVybC4nIGNvdWxkIG5vdCBiZSBmdWxseSBsb2FkZWQgKCcuJGUtPmdldE1lc3NhZ2UoKS4nKSwgcGFja2FnZSBpbmZvcm1hdGlvbiB3YXMgbG9hZGVkIGZyb20gdGhlIGxvY2FsIGNhY2hlIGFuZCBtYXkgYmUgb3V0IG9mIGRhdGU8L3dhcm5pbmc+Jyk7Cn0KJGRlZ3JhZGVkTW9kZSA9IHRydWU7CgoKaWYgKCRsYXN0TW9kaWZpZWRUaW1lKSB7CnJldHVybiAkYWNjZXB0KG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJHVybF0sIDMwNCwgW10sICcnKSk7Cn0KCgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDk5KSB7CnJldHVybiAkYWNjZXB0KG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJHVybF0sIDQwNCwgW10sICcnKSk7Cn0KCnRocm93ICRlOwp9OwoKcmV0dXJuICRodHRwRG93bmxvYWRlci0+YWRkKCRmaWxlbmFtZSwgJG9wdGlvbnMpLT50aGVuKCRhY2NlcHQsICRyZWplY3QpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdGlhbGl6ZVBhcnRpYWxQYWNrYWdlcygpOiB2b2lkCnsKJHJvb3REYXRhID0gJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwppZiAoJHJvb3REYXRhID09PSB0cnVlKSB7CnJldHVybjsKfQoKJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSA9IFtdOwpmb3JlYWNoICgkcm9vdERhdGFbJ3BhY2thZ2VzJ10gYXMgJHBhY2thZ2UgPT4gJHZlcnNpb25zKSB7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewokdmVyc2lvblBhY2thZ2VOYW1lID0gc3RydG9sb3dlcigoc3RyaW5nKSAoJHZlcnNpb25bJ25hbWUnXSA/PyAnJykpOwokdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lWyR2ZXJzaW9uUGFja2FnZU5hbWVdW10gPSAkdmVyc2lvbjsKaWYgKCEkdGhpcy0+ZGlzcGxheWVkV2FybmluZ0Fib3V0Tm9uTWF0Y2hpbmdQYWNrYWdlSW5kZXggJiYgJHZlcnNpb25QYWNrYWdlTmFtZSAhPT0gc3RydG9sb3dlcigkcGFja2FnZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoIjx3YXJuaW5nPldhcm5pbmc6IHRoZSBwYWNrYWdlcyBrZXkgJyVzJyBkb2Vzbid0IG1hdGNoIHRoZSBuYW1lIGRlZmluZWQgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEgJyVzJyBpbiByZXBvc2l0b3J5ICVzPC93YXJuaW5nPiIsICRwYWNrYWdlLCAkdmVyc2lvblsnbmFtZSddID8/ICcnLCAkdGhpcy0+YmFzZVVybCkpOwokdGhpcy0+ZGlzcGxheWVkV2FybmluZ0Fib3V0Tm9uTWF0Y2hpbmdQYWNrYWdlSW5kZXggPSB0cnVlOwp9Cn0KfQoKCiR0aGlzLT5yb290RGF0YSA9IHRydWU7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxhenlQcm92aWRlcnNSZXBvQ29udGFpbnMoc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0KSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2xhenlQcm92aWRlcnNSZXBvQ29udGFpbnMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdW5sZXNzIGhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0IGlzIHRydWUnKTsKfQoKaWYgKGlzX2FycmF5KCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcykgJiYgaXNzZXQoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzWyRuYW1lXSkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19hcnJheSgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZVBhdHRlcm5zKSkgewpmb3JlYWNoICgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZVBhdHRlcm5zIGFzICRwcm92aWRlclJlZ2V4KSB7CmlmIChQcmVnOjppc01hdGNoKCRwcm92aWRlclJlZ2V4LCAkbmFtZSkpIHsKcmV0dXJuIHRydWU7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBDb21wb3NpdGVSZXBvc2l0b3J5IGltcGxlbWVudHMgUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCgpwcml2YXRlICRyZXBvc2l0b3JpZXM7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvc2l0b3JpZXMpCnsKJHRoaXMtPnJlcG9zaXRvcmllcyA9IFtdOwpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CiR0aGlzLT5hZGRSZXBvc2l0b3J5KCRyZXBvKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdjb21wb3NpdGUgcmVwbyAoJy5pbXBsb2RlKCcsICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRyZXBvKTogc3RyaW5nIHsKcmV0dXJuICRyZXBvLT5nZXRSZXBvTmFtZSgpOwp9LCAkdGhpcy0+cmVwb3NpdG9yaWVzKSkuJyknOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcmllczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgppZiAoJHJlcG9zaXRvcnktPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCk6ID9CYXNlUGFja2FnZQp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRwYWNrYWdlID0gJHJlcG9zaXRvcnktPmZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCk7CmlmIChudWxsICE9PSAkcGFja2FnZSkgewpyZXR1cm4gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRwYWNrYWdlc1tdID0gJHJlcG9zaXRvcnktPmZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQpOwp9CgpyZXR1cm4gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKJG5hbWVzRm91bmQgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHJlc3VsdCA9ICRyZXBvc2l0b3J5LT5sb2FkUGFja2FnZXMoJHBhY2thZ2VOYW1lTWFwLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKJHBhY2thZ2VzW10gPSAkcmVzdWx0WydwYWNrYWdlcyddOwokbmFtZXNGb3VuZFtdID0gJHJlc3VsdFsnbmFtZXNGb3VuZCddOwp9CgpyZXR1cm4gWwoncGFja2FnZXMnID0+ICRwYWNrYWdlcyA/IGFycmF5X21lcmdlKC4uLiRwYWNrYWdlcykgOiBbXSwKJ25hbWVzRm91bmQnID0+ICRuYW1lc0ZvdW5kID8gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKC4uLiRuYW1lc0ZvdW5kKSkgOiBbXSwKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCk6IGFycmF5CnsKJG1hdGNoZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJG1hdGNoZXNbXSA9ICRyZXBvc2l0b3J5LT5zZWFyY2goJHF1ZXJ5LCAkbW9kZSwgJHR5cGUpOwp9CgpyZXR1cm4gXGNvdW50KCRtYXRjaGVzKSA+IDAgPyBhcnJheV9tZXJnZSguLi4kbWF0Y2hlcykgOiBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRwYWNrYWdlc1tdID0gJHJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCk7Cn0KCnJldHVybiAkcGFja2FnZXMgPyBhcnJheV9tZXJnZSguLi4kcGFja2FnZXMpIDogW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKTogYXJyYXkKewokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokcmVzdWx0c1tdID0gJHJlcG9zaXRvcnktPmdldFByb3ZpZGVycygkcGFja2FnZU5hbWUpOwp9CgpyZXR1cm4gJHJlc3VsdHMgPyBhcnJheV9tZXJnZSguLi4kcmVzdWx0cykgOiBbXTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CmlmICgkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZSkgewokcmVwb3NpdG9yeS0+cmVtb3ZlUGFja2FnZSgkcGFja2FnZSk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKJHRvdGFsID0gMDsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHRvdGFsICs9ICRyZXBvc2l0b3J5LT5jb3VudCgpOwp9CgpyZXR1cm4gJHRvdGFsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmlmICgkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIHNlbGYpIHsKZm9yZWFjaCAoJHJlcG9zaXRvcnktPmdldFJlcG9zaXRvcmllcygpIGFzICRyZXBvKSB7CiR0aGlzLT5hZGRSZXBvc2l0b3J5KCRyZXBvKTsKfQp9IGVsc2UgewokdGhpcy0+cmVwb3NpdG9yaWVzW10gPSAkcmVwb3NpdG9yeTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgoKCgoKCmludGVyZmFjZSBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCgoKCgoKCmNsYXNzIEZpbGVzeXN0ZW1SZXBvc2l0b3J5IGV4dGVuZHMgV3JpdGFibGVBcnJheVJlcG9zaXRvcnkKewoKcHJvdGVjdGVkICRmaWxlOwoKcHJpdmF0ZSAkZHVtcFZlcnNpb25zOwoKcHJpdmF0ZSAkcm9vdFBhY2thZ2U7Cgpwcml2YXRlICRmaWxlc3lzdGVtOwoKcHJpdmF0ZSAkZGV2TW9kZSA9IG51bGw7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSnNvbkZpbGUgJHJlcG9zaXRvcnlGaWxlLCBib29sICRkdW1wVmVyc2lvbnMgPSBmYWxzZSwgP1Jvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSA9IG51bGwsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiR0aGlzLT5maWxlID0gJHJlcG9zaXRvcnlGaWxlOwokdGhpcy0+ZHVtcFZlcnNpb25zID0gJGR1bXBWZXJzaW9uczsKJHRoaXMtPnJvb3RQYWNrYWdlID0gJHJvb3RQYWNrYWdlOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtOwppZiAoJGR1bXBWZXJzaW9ucyAmJiAhJHJvb3RQYWNrYWdlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdFeHBlY3RlZCBhIHJvb3QgcGFja2FnZSBpbnN0YW5jZSBpZiAkZHVtcFZlcnNpb25zIGlzIHRydWUnKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2TW9kZSgpCnsKcmV0dXJuICR0aGlzLT5kZXZNb2RlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgppZiAoISR0aGlzLT5maWxlLT5leGlzdHMoKSkgewpyZXR1cm47Cn0KCnRyeSB7CiRkYXRhID0gJHRoaXMtPmZpbGUtPnJlYWQoKTsKaWYgKGlzc2V0KCRkYXRhWydwYWNrYWdlcyddKSkgewokcGFja2FnZXMgPSAkZGF0YVsncGFja2FnZXMnXTsKfSBlbHNlIHsKJHBhY2thZ2VzID0gJGRhdGE7Cn0KCmlmIChpc3NldCgkZGF0YVsnZGV2LXBhY2thZ2UtbmFtZXMnXSkpIHsKJHRoaXMtPnNldERldlBhY2thZ2VOYW1lcygkZGF0YVsnZGV2LXBhY2thZ2UtbmFtZXMnXSk7Cn0KaWYgKGlzc2V0KCRkYXRhWydkZXYnXSkpIHsKJHRoaXMtPmRldk1vZGUgPSAkZGF0YVsnZGV2J107Cn0KCmlmICghaXNfYXJyYXkoJHBhY2thZ2VzKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIHBhY2thZ2UgbGlzdCBmcm9tIHRoZSByZXBvc2l0b3J5Jyk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgSW52YWxpZFJlcG9zaXRvcnlFeGNlcHRpb24oJ0ludmFsaWQgcmVwb3NpdG9yeSBkYXRhIGluICcuJHRoaXMtPmZpbGUtPmdldFBhdGgoKS4nLCBwYWNrYWdlcyBjb3VsZCBub3QgYmUgbG9hZGVkOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSk7Cn0KCiRsb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSk7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZURhdGEpIHsKJHBhY2thZ2UgPSAkbG9hZGVyLT5sb2FkKCRwYWNrYWdlRGF0YSk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gcmVsb2FkKCkKewokdGhpcy0+cGFja2FnZXMgPSBudWxsOwokdGhpcy0+aW5pdGlhbGl6ZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYm9vbCAkZGV2TW9kZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlcikKewokZGF0YSA9IFsncGFja2FnZXMnID0+IFtdLCAnZGV2JyA9PiAkZGV2TW9kZSwgJ2Rldi1wYWNrYWdlLW5hbWVzJyA9PiBbXV07CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXIoKTsKCgoKCiRyZXBvRGlyID0gZGlybmFtZSgkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkcmVwb0Rpcik7CgokcmVwb0RpciA9ICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKHJlYWxwYXRoKCRyZXBvRGlyKSk7CiRpbnN0YWxsUGF0aHMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwa2dBcnJheSA9ICRkdW1wZXItPmR1bXAoJHBhY2thZ2UpOwokcGF0aCA9ICRpbnN0YWxsYXRpb25NYW5hZ2VyLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CiRpbnN0YWxsUGF0aCA9IG51bGw7CmlmICgnJyAhPT0gJHBhdGggJiYgbnVsbCAhPT0gJHBhdGgpIHsKJG5vcm1hbGl6ZWRQYXRoID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHRoaXMtPmZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRwYXRoKSA/ICRwYXRoIDogUGxhdGZvcm06OmdldEN3ZCgpIC4gJy8nIC4gJHBhdGgpOwokaW5zdGFsbFBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkcmVwb0RpciwgJG5vcm1hbGl6ZWRQYXRoLCB0cnVlKTsKfQokaW5zdGFsbFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGluc3RhbGxQYXRoOwoKJHBrZ0FycmF5WydpbnN0YWxsLXBhdGgnXSA9ICRpbnN0YWxsUGF0aDsKJGRhdGFbJ3BhY2thZ2VzJ11bXSA9ICRwa2dBcnJheTsKCgoKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICR0aGlzLT5kZXZQYWNrYWdlTmFtZXMsIHRydWUpKSB7CiRkYXRhWydkZXYtcGFja2FnZS1uYW1lcyddW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9Cn0KCnNvcnQoJGRhdGFbJ2Rldi1wYWNrYWdlLW5hbWVzJ10pOwp1c29ydCgkZGF0YVsncGFja2FnZXMnXSwgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpOiBpbnQgewpyZXR1cm4gc3RyY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOwp9KTsKCiR0aGlzLT5maWxlLT53cml0ZSgkZGF0YSk7CgppZiAoJHRoaXMtPmR1bXBWZXJzaW9ucykgewokdmVyc2lvbnMgPSAkdGhpcy0+Z2VuZXJhdGVJbnN0YWxsZWRWZXJzaW9ucygkaW5zdGFsbGF0aW9uTWFuYWdlciwgJGluc3RhbGxQYXRocywgJGRldk1vZGUsICRyZXBvRGlyKTsKCiR0aGlzLT5maWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCRyZXBvRGlyLicvaW5zdGFsbGVkLnBocCcsICc8P3BocCByZXR1cm4gJyAuICR0aGlzLT5kdW1wVG9QaHBDb2RlKCR2ZXJzaW9ucykgLiAnOycuIlxuIik7CiRpbnN0YWxsZWRWZXJzaW9uc0NsYXNzID0gZmlsZV9nZXRfY29udGVudHMoX19ESVJfXy4nLy4uL0luc3RhbGxlZFZlcnNpb25zLnBocCcpOwoKCmlmICgkaW5zdGFsbGVkVmVyc2lvbnNDbGFzcyAhPT0gZmFsc2UpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHJlcG9EaXIuJy9JbnN0YWxsZWRWZXJzaW9ucy5waHAnLCAkaW5zdGFsbGVkVmVyc2lvbnNDbGFzcyk7CgpcQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OnJlbG9hZCgkdmVyc2lvbnMpOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkdW1wVG9QaHBDb2RlKGFycmF5ICRhcnJheSA9IFtdLCBpbnQgJGxldmVsID0gMCk6IHN0cmluZwp7CiRsaW5lcyA9ICJhcnJheShcbiI7CiRsZXZlbCsrOwoKZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CiRsaW5lcyAuPSBzdHJfcmVwZWF0KCcgICAgJywgJGxldmVsKTsKJGxpbmVzIC49IGlzX2ludCgka2V5KSA/ICRrZXkgLiAnID0+ICcgOiAnXCcnIC4gJGtleSAuICdcJyA9PiAnOwoKaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKaWYgKCFlbXB0eSgkdmFsdWUpKSB7CiRsaW5lcyAuPSAkdGhpcy0+ZHVtcFRvUGhwQ29kZSgkdmFsdWUsICRsZXZlbCk7Cn0gZWxzZSB7CiRsaW5lcyAuPSAiYXJyYXkoKSxcbiI7Cn0KfSBlbHNlaWYgKCRrZXkgPT09ICdpbnN0YWxsX3BhdGgnICYmIGlzX3N0cmluZygkdmFsdWUpKSB7CmlmICgkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJHZhbHVlKSkgewokbGluZXMgLj0gdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpIC4gIixcbiI7Cn0gZWxzZSB7CiRsaW5lcyAuPSAiX19ESVJfXyAuICIgLiB2YXJfZXhwb3J0KCcvJyAuICR2YWx1ZSwgdHJ1ZSkgLiAiLFxuIjsKfQp9IGVsc2UgewokbGluZXMgLj0gdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpIC4gIixcbiI7Cn0KfQoKJGxpbmVzIC49IHN0cl9yZXBlYXQoJyAgICAnLCAkbGV2ZWwgLSAxKSAuICcpJyAuICgkbGV2ZWwgLSAxID09PSAwID8gJycgOiAiLFxuIik7CgpyZXR1cm4gJGxpbmVzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2VuZXJhdGVJbnN0YWxsZWRWZXJzaW9ucyhJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyLCBhcnJheSAkaW5zdGFsbFBhdGhzLCBib29sICRkZXZNb2RlLCBzdHJpbmcgJHJlcG9EaXIpOiBhcnJheQp7CiRkZXZQYWNrYWdlcyA9IGFycmF5X2ZsaXAoJHRoaXMtPmRldlBhY2thZ2VOYW1lcyk7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0l0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gZHVtcCBwYWNrYWdlcyBpZiBubyByb290IHBhY2thZ2UgaXMgZ2l2ZW4nKTsKfQokcGFja2FnZXNbXSA9ICRyb290UGFja2FnZSA9ICR0aGlzLT5yb290UGFja2FnZTsKCndoaWxlICgkcm9vdFBhY2thZ2UgaW5zdGFuY2VvZiBSb290QWxpYXNQYWNrYWdlKSB7CiRyb290UGFja2FnZSA9ICRyb290UGFja2FnZS0+Z2V0QWxpYXNPZigpOwokcGFja2FnZXNbXSA9ICRyb290UGFja2FnZTsKfQokdmVyc2lvbnMgPSBbCidyb290JyA9PiAkdGhpcy0+ZHVtcFJvb3RQYWNrYWdlKCRyb290UGFja2FnZSwgJGluc3RhbGxQYXRocywgJGRldk1vZGUsICRyZXBvRGlyLCAkZGV2UGFja2FnZXMpLAondmVyc2lvbnMnID0+IFtdLApdOwoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICR0aGlzLT5kdW1wSW5zdGFsbGVkUGFja2FnZSgkcGFja2FnZSwgJGluc3RhbGxQYXRocywgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyk7Cn0KCgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGlzRGV2UGFja2FnZSA9IGlzc2V0KCRkZXZQYWNrYWdlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVwbGFjZS0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSAkaXNEZXZQYWNrYWdlOwp9IGVsc2VpZiAoISRpc0RldlBhY2thZ2UpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddID0gZmFsc2U7Cn0KJHJlcGxhY2VkID0gJHJlcGxhY2UtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKaWYgKCRyZXBsYWNlZCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJHJlcGxhY2VkID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQppZiAoIWlzc2V0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldWydyZXBsYWNlZCddKSB8fCAhaW5fYXJyYXkoJHJlcGxhY2VkLCAkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsncmVwbGFjZWQnXSwgdHJ1ZSkpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ3JlcGxhY2VkJ11bXSA9ICRyZXBsYWNlZDsKfQp9CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRQcm92aWRlcygpIGFzICRwcm92aWRlKSB7CgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcHJvdmlkZS0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSAkaXNEZXZQYWNrYWdlOwp9IGVsc2VpZiAoISRpc0RldlBhY2thZ2UpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddID0gZmFsc2U7Cn0KJHByb3ZpZGVkID0gJHByb3ZpZGUtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKaWYgKCRwcm92aWRlZCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJHByb3ZpZGVkID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQppZiAoIWlzc2V0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcHJvdmlkZS0+Z2V0VGFyZ2V0KCldWydwcm92aWRlZCddKSB8fCAhaW5fYXJyYXkoJHByb3ZpZGVkLCAkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsncHJvdmlkZWQnXSwgdHJ1ZSkpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ3Byb3ZpZGVkJ11bXSA9ICRwcm92aWRlZDsKfQp9Cn0KCgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHBhY2thZ2UtPmdldE5hbWUoKV1bJ2FsaWFzZXMnXVtdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHZlcnNpb25zWydyb290J11bJ2FsaWFzZXMnXVtdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cgprc29ydCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ10pOwprc29ydCgkdmVyc2lvbnMpOwoKcmV0dXJuICR2ZXJzaW9uczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBJbnN0YWxsZWRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICRpbnN0YWxsUGF0aHMsIHN0cmluZyAkcmVwb0RpciwgYXJyYXkgJGRldlBhY2thZ2VzKTogYXJyYXkKewokcmVmZXJlbmNlID0gbnVsbDsKaWYgKCRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSkgewokcmVmZXJlbmNlID0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpID09PSAnc291cmNlJyA/ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSA6ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7Cn0KaWYgKG51bGwgPT09ICRyZWZlcmVuY2UpIHsKJHJlZmVyZW5jZSA9ICgkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgPzogJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSkgPzogbnVsbDsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHRvID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKSk7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRyZXBvRGlyLCAkdG8sIHRydWUpOwp9IGVsc2UgewokaW5zdGFsbFBhdGggPSAkaW5zdGFsbFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldOwp9CgokZGF0YSA9IFsKJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFZlcnNpb24oKSwKJ3JlZmVyZW5jZScgPT4gJHJlZmVyZW5jZSwKJ3R5cGUnID0+ICRwYWNrYWdlLT5nZXRUeXBlKCksCidpbnN0YWxsX3BhdGgnID0+ICRpbnN0YWxsUGF0aCwKJ2FsaWFzZXMnID0+IFtdLAonZGV2X3JlcXVpcmVtZW50JyA9PiBpc3NldCgkZGV2UGFja2FnZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pLApdOwoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZHVtcFJvb3RQYWNrYWdlKFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkaW5zdGFsbFBhdGhzLCBib29sICRkZXZNb2RlLCBzdHJpbmcgJHJlcG9EaXIsIGFycmF5ICRkZXZQYWNrYWdlcykKewokZGF0YSA9ICR0aGlzLT5kdW1wSW5zdGFsbGVkUGFja2FnZSgkcGFja2FnZSwgJGluc3RhbGxQYXRocywgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyk7CgpyZXR1cm4gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldE5hbWUoKSwKJ3ByZXR0eV92ZXJzaW9uJyA9PiAkZGF0YVsncHJldHR5X3ZlcnNpb24nXSwKJ3ZlcnNpb24nID0+ICRkYXRhWyd2ZXJzaW9uJ10sCidyZWZlcmVuY2UnID0+ICRkYXRhWydyZWZlcmVuY2UnXSwKJ3R5cGUnID0+ICRkYXRhWyd0eXBlJ10sCidpbnN0YWxsX3BhdGgnID0+ICRkYXRhWydpbnN0YWxsX3BhdGgnXSwKJ2FsaWFzZXMnID0+ICRkYXRhWydhbGlhc2VzJ10sCidkZXYnID0+ICRkZXZNb2RlLApdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgRmlsdGVyUmVwb3NpdG9yeSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJbnRlcmZhY2UsIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UKewoKcHJpdmF0ZSAkb25seSA9IG51bGw7Cgpwcml2YXRlICRleGNsdWRlID0gbnVsbDsKCnByaXZhdGUgJGNhbm9uaWNhbCA9IHRydWU7Cgpwcml2YXRlICRyZXBvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcHRpb25zKQp7CmlmIChpc3NldCgkb3B0aW9uc1snb25seSddKSkgewppZiAoIWlzX2FycmF5KCRvcHRpb25zWydvbmx5J10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCcib25seSIga2V5IGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkuJyBzaG91bGQgYmUgYW4gYXJyYXknKTsKfQokdGhpcy0+b25seSA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cCgkb3B0aW9uc1snb25seSddKTsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSkpIHsKaWYgKCFpc19hcnJheSgkb3B0aW9uc1snZXhjbHVkZSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignImV4Y2x1ZGUiIGtleSBmb3IgcmVwb3NpdG9yeSAnLiRyZXBvLT5nZXRSZXBvTmFtZSgpLicgc2hvdWxkIGJlIGFuIGFycmF5Jyk7Cn0KJHRoaXMtPmV4Y2x1ZGUgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSk7Cn0KaWYgKCR0aGlzLT5leGNsdWRlICYmICR0aGlzLT5vbmx5KSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdPbmx5IG9uZSBvZiAib25seSIgYW5kICJleGNsdWRlIiBjYW4gYmUgc3BlY2lmaWVkIGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkpOwp9CmlmIChpc3NldCgkb3B0aW9uc1snY2Fub25pY2FsJ10pKSB7CmlmICghaXNfYm9vbCgkb3B0aW9uc1snY2Fub25pY2FsJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCciY2Fub25pY2FsIiBrZXkgZm9yIHJlcG9zaXRvcnkgJy4kcmVwby0+Z2V0UmVwb05hbWUoKS4nIHNob3VsZCBiZSBhIGJvb2xlYW4nKTsKfQokdGhpcy0+Y2Fub25pY2FsID0gJG9wdGlvbnNbJ2Nhbm9uaWNhbCddOwp9CgokdGhpcy0+cmVwbyA9ICRyZXBvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5yZXBvLT5nZXRSZXBvTmFtZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeSgpOiBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZXBvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOiA/QmFzZVBhY2thZ2UKewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aXNBbGxvd2VkKCRuYW1lKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiAkdGhpcy0+cmVwby0+ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CmZvcmVhY2ggKCRwYWNrYWdlTmFtZU1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnVuc2V0KCRwYWNrYWdlTmFtZU1hcFskbmFtZV0pOwp9Cn0KCmlmICghJHBhY2thZ2VOYW1lTWFwKSB7CnJldHVybiBbJ25hbWVzRm91bmQnID0+IFtdLCAncGFja2FnZXMnID0+IFtdXTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5yZXBvLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VOYW1lTWFwLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKaWYgKCEkdGhpcy0+Y2Fub25pY2FsKSB7CiRyZXN1bHRbJ25hbWVzRm91bmQnXSA9IFtdOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCk6IGFycmF5CnsKJHJlc3VsdCA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnJlcG8tPnNlYXJjaCgkcXVlcnksICRtb2RlLCAkdHlwZSkgYXMgJHBhY2thZ2UpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHBhY2thZ2VbJ25hbWUnXSkpIHsKJHJlc3VsdFtdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKJHJlc3VsdFtdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKTogYXJyYXkKewokcmVzdWx0ID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvLT5nZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKSBhcyAkbmFtZSA9PiAkcHJvdmlkZXIpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHByb3ZpZGVyWyduYW1lJ10pKSB7CiRyZXN1bHRbJG5hbWVdID0gJHByb3ZpZGVyOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKaWYgKCR0aGlzLT5yZXBvLT5jb3VudCgpID4gMCkgewpyZXR1cm4gY291bnQoJHRoaXMtPmdldFBhY2thZ2VzKCkpOwp9CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlY3VyaXR5QWR2aXNvcmllcygpOiBib29sCnsKaWYgKCEkdGhpcy0+cmVwbyBpbnN0YW5jZW9mIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmhhc1NlY3VyaXR5QWR2aXNvcmllcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXkKewppZiAoISR0aGlzLT5yZXBvIGluc3RhbmNlb2YgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZSkgewpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBbXSwgJ2Fkdmlzb3JpZXMnID0+IFtdXTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VDb25zdHJhaW50TWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICghJHRoaXMtPmlzQWxsb3dlZCgkbmFtZSkpIHsKdW5zZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSk7Cn0KfQoKcmV0dXJuICR0aGlzLT5yZXBvLT5nZXRTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNBbGxvd2VkKHN0cmluZyAkbmFtZSk6IGJvb2wKewppZiAoISR0aGlzLT5vbmx5ICYmICEkdGhpcy0+ZXhjbHVkZSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCR0aGlzLT5vbmx5KSB7CnJldHVybiBQcmVnOjppc01hdGNoKCR0aGlzLT5vbmx5LCAkbmFtZSk7Cn0KCmlmICgkdGhpcy0+ZXhjbHVkZSA9PT0gbnVsbCkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuICFQcmVnOjppc01hdGNoKCR0aGlzLT5leGNsdWRlLCAkbmFtZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgpjbGFzcyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdpbnN0YWxsZWQgJy5wYXJlbnQ6OmdldFJlcG9OYW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCk6IGJvb2wKewoKCnJldHVybiAkdGhpcy0+Y291bnQoKSA9PT0gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBJbnN0YWxsZWRGaWxlc3lzdGVtUmVwb3NpdG9yeSBleHRlbmRzIEZpbGVzeXN0ZW1SZXBvc2l0b3J5IGltcGxlbWVudHMgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdpbnN0YWxsZWQgJy5wYXJlbnQ6OmdldFJlcG9OYW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCkKewpyZXR1cm4gISR0aGlzLT5maWxlLT5leGlzdHMoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKCgoKCgoKCgoKCmNsYXNzIEluc3RhbGxlZFJlcG9zaXRvcnkgZXh0ZW5kcyBDb21wb3NpdGVSZXBvc2l0b3J5CnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCmlmIChudWxsICE9PSAkY29uc3RyYWludCAmJiAhJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCiRtYXRjaGVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkY2FuZGlkYXRlKSB7CmlmICgkbmFtZSA9PT0gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpKSB7CmlmIChudWxsID09PSAkY29uc3RyYWludCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCkpKSkgewokbWF0Y2hlc1tdID0gJGNhbmRpZGF0ZTsKfQpjb250aW51ZTsKfQoKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0UmVwbGFjZXMoKSkgYXMgJGxpbmspIHsKaWYgKAokbmFtZSA9PT0gJGxpbmstPmdldFRhcmdldCgpCiYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkKKSB7CiRtYXRjaGVzW10gPSAkY2FuZGlkYXRlOwpjb250aW51ZSAyOwp9Cn0KfQp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXBlbmRlbnRzKCRuZWVkbGUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgYm9vbCAkaW52ZXJ0ID0gZmFsc2UsIGJvb2wgJHJlY3Vyc2UgPSB0cnVlLCA/YXJyYXkgJHBhY2thZ2VzRm91bmQgPSBudWxsKTogYXJyYXkKewokbmVlZGxlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsIChhcnJheSkgJG5lZWRsZSk7CiRyZXN1bHRzID0gW107CgoKaWYgKG51bGwgPT09ICRwYWNrYWdlc0ZvdW5kKSB7CiRwYWNrYWdlc0ZvdW5kID0gJG5lZWRsZXM7Cn0KCgokcm9vdFBhY2thZ2UgPSBudWxsOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokcm9vdFBhY2thZ2UgPSAkcGFja2FnZTsKYnJlYWs7Cn0KfQoKCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRsaW5rcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwoKCgokcGFja2FnZXNJblRyZWUgPSAkcGFja2FnZXNGb3VuZDsKCgppZiAoISRpbnZlcnQpIHsKJGxpbmtzICs9ICRwYWNrYWdlLT5nZXRSZXBsYWNlcygpOwoKCgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKZm9yZWFjaCAoJG5lZWRsZXMgYXMgJG5lZWRsZSkgewppZiAoJGxpbmstPmdldFNvdXJjZSgpID09PSAkbmVlZGxlKSB7CmlmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkY29uc3RyYWludCkgPT09IHRydWUpKSB7CgppZiAoaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkcGFja2FnZXNJblRyZWUpKSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07CmNvbnRpbnVlOwp9CiRwYWNrYWdlc0luVHJlZVtdID0gJGxpbmstPmdldFRhcmdldCgpOwokZGVwZW5kZW50cyA9ICRyZWN1cnNlID8gJHRoaXMtPmdldERlcGVuZGVudHMoJGxpbmstPmdldFRhcmdldCgpLCBudWxsLCBmYWxzZSwgdHJ1ZSwgJHBhY2thZ2VzSW5UcmVlKSA6IFtdOwokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgJGRlcGVuZGVudHNdOwokbmVlZGxlc1tdID0gJGxpbmstPmdldFRhcmdldCgpOwp9Cn0KfQp9Cn0KCgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokbGlua3MgKz0gJHBhY2thZ2UtPmdldERldlJlcXVpcmVzKCk7Cn0KCgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKZm9yZWFjaCAoJG5lZWRsZXMgYXMgJG5lZWRsZSkgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkbmVlZGxlKSB7CmlmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkY29uc3RyYWludCkgPT09ICEkaW52ZXJ0KSkgewoKaWYgKGluX2FycmF5KCRsaW5rLT5nZXRTb3VyY2UoKSwgJHBhY2thZ2VzSW5UcmVlKSkgewokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwpjb250aW51ZTsKfQokcGFja2FnZXNJblRyZWVbXSA9ICRsaW5rLT5nZXRTb3VyY2UoKTsKJGRlcGVuZGVudHMgPSAkcmVjdXJzZSA/ICR0aGlzLT5nZXREZXBlbmRlbnRzKCRsaW5rLT5nZXRTb3VyY2UoKSwgbnVsbCwgZmFsc2UsIHRydWUsICRwYWNrYWdlc0luVHJlZSkgOiBbXTsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssICRkZXBlbmRlbnRzXTsKfQp9Cn0KfQoKCmlmICgkaW52ZXJ0ICYmIGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRuZWVkbGVzKSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCkgYXMgJGxpbmspIHsKZm9yZWFjaCAoJHRoaXMtPmZpbmRQYWNrYWdlcygkbGluay0+Z2V0VGFyZ2V0KCkpIGFzICRwa2cpIHsKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPScsICRwa2ctPmdldFZlcnNpb24oKSk7CmlmICgkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCR2ZXJzaW9uKSA9PT0gJGludmVydCkgewokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwp9Cn0KfQp9CgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldENvbmZsaWN0cygpIGFzICRsaW5rKSB7CmlmIChpbl9hcnJheSgkbGluay0+Z2V0VGFyZ2V0KCksICRuZWVkbGVzKSkgewpmb3JlYWNoICgkdGhpcy0+ZmluZFBhY2thZ2VzKCRsaW5rLT5nZXRUYXJnZXQoKSkgYXMgJHBrZykgewokdmVyc2lvbiA9IG5ldyBDb25zdHJhaW50KCc9JywgJHBrZy0+Z2V0VmVyc2lvbigpKTsKaWYgKCRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJHZlcnNpb24pID09PSAkaW52ZXJ0KSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07Cn0KfQp9Cn0KCgppZiAoJGludmVydCAmJiAkY29uc3RyYWludCAmJiBpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkbmVlZGxlcykgJiYgJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpKSkgewppZiAoJHRoaXMtPmZpbmRQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSkpIHsKY29udGludWU7Cn0KCiRwbGF0Zm9ybVBrZyA9ICR0aGlzLT5maW5kUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCksICcqJyk7CiRkZXNjcmlwdGlvbiA9ICRwbGF0Zm9ybVBrZyA/ICdidXQgJy4kcGxhdGZvcm1Qa2ctPmdldFByZXR0eVZlcnNpb24oKS4nIGlzIGluc3RhbGxlZCcgOiAnYnV0IGl0IGlzIG1pc3NpbmcnOwokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCBuZXcgTGluaygkcGFja2FnZS0+Z2V0TmFtZSgpLCAkbGluay0+Z2V0VGFyZ2V0KCksIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQsIExpbms6OlRZUEVfUkVRVUlSRSwgJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nICcuJGRlc2NyaXB0aW9uKSwgZmFsc2VdOwoKY29udGludWU7Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwa2cpIHsKaWYgKCFpbl9hcnJheSgkbGluay0+Z2V0VGFyZ2V0KCksICRwa2ctPmdldE5hbWVzKCkpKSB7CmNvbnRpbnVlOwp9CgokdmVyc2lvbiA9IG5ldyBDb25zdHJhaW50KCc9JywgJHBrZy0+Z2V0VmVyc2lvbigpKTsKCmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgIT09ICRwa2ctPmdldE5hbWUoKSkgewpmb3JlYWNoIChhcnJheV9tZXJnZSgkcGtnLT5nZXRSZXBsYWNlcygpLCAkcGtnLT5nZXRQcm92aWRlcygpKSBhcyAkcHJvdikgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkcHJvdi0+Z2V0VGFyZ2V0KCkpIHsKJHZlcnNpb24gPSAkcHJvdi0+Z2V0Q29uc3RyYWludCgpOwpicmVhazsKfQp9Cn0KCmlmICghJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkdmVyc2lvbikpIHsKCgppZiAoJHJvb3RQYWNrYWdlKSB7CmZvcmVhY2ggKGFycmF5X21lcmdlKCRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwgJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKSBhcyAkcm9vdFJlcSkgewppZiAoaW5fYXJyYXkoJHJvb3RSZXEtPmdldFRhcmdldCgpLCAkcGtnLT5nZXROYW1lcygpKSAmJiAhJHJvb3RSZXEtPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkgewokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwokcmVzdWx0c1tdID0gWyRyb290UGFja2FnZSwgJHJvb3RSZXEsIGZhbHNlXTsKY29udGludWUgMzsKfQp9CgokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwokcmVzdWx0c1tdID0gWyRyb290UGFja2FnZSwgbmV3IExpbmsoJHJvb3RQYWNrYWdlLT5nZXROYW1lKCksICRsaW5rLT5nZXRUYXJnZXQoKSwgbmV3IE1hdGNoQWxsQ29uc3RyYWludCwgTGluazo6VFlQRV9ET0VTX05PVF9SRVFVSVJFLCAnYnV0ICcgLiAkcGtnLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnIGlzIGluc3RhbGxlZCcpLCBmYWxzZV07Cn0gZWxzZSB7CgokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwp9Cn0KCmNvbnRpbnVlIDI7Cn0KfQp9Cn0KCmtzb3J0KCRyZXN1bHRzKTsKCnJldHVybiAkcmVzdWx0czsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAnaW5zdGFsbGVkIHJlcG8gKCcuaW1wbG9kZSgnLCAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcmVwbyk6IHN0cmluZyB7CnJldHVybiAkcmVwby0+Z2V0UmVwb05hbWUoKTsKfSwgJHRoaXMtPmdldFJlcG9zaXRvcmllcygpKSkuJyknOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmlmICgKJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBMb2NrQXJyYXlSZXBvc2l0b3J5Cnx8ICRyZXBvc2l0b3J5IGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZQp8fCAkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlUmVwb3NpdG9yeQp8fCAkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeQopIHsKcGFyZW50OjphZGRSZXBvc2l0b3J5KCRyZXBvc2l0b3J5KTsKCnJldHVybjsKfQoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQW4gSW5zdGFsbGVkUmVwb3NpdG9yeSBjYW4gbm90IGNvbnRhaW4gYSByZXBvc2l0b3J5IG9mIHR5cGUgJy5nZXRfY2xhc3MoJHJlcG9zaXRvcnkpLicgKCcuJHJlcG9zaXRvcnktPmdldFJlcG9OYW1lKCkuJyknKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgoKCmludGVyZmFjZSBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlIGV4dGVuZHMgV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldk1vZGUoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgoKCgoKCmNsYXNzIEludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgoKCgoKCgoKY2xhc3MgTG9ja0FycmF5UmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeQp7CnVzZSBDYW5vbmljYWxQYWNrYWdlc1RyYWl0OwoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAnbG9jayByZXBvJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcVmFsaWRhdGluZ0FycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgpjbGFzcyBQYWNrYWdlUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeQp7Cgpwcml2YXRlICRjb25maWc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29uZmlnKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWdbJ3BhY2thZ2UnXTsKCgppZiAoIWlzX251bWVyaWMoa2V5KCR0aGlzLT5jb25maWcpKSkgewokdGhpcy0+Y29uZmlnID0gWyR0aGlzLT5jb25maWddOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiRsb2FkZXIgPSBuZXcgVmFsaWRhdGluZ0FycmF5TG9hZGVyKG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKSwgdHJ1ZSk7CmZvcmVhY2ggKCR0aGlzLT5jb25maWcgYXMgJHBhY2thZ2UpIHsKdHJ5IHsKJHBhY2thZ2UgPSAkbG9hZGVyLT5sb2FkKCRwYWNrYWdlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgSW52YWxpZFJlcG9zaXRvcnlFeGNlcHRpb24oJ0EgcmVwb3NpdG9yeSBvZiB0eXBlICJwYWNrYWdlIiBjb250YWlucyBhbiBpbnZhbGlkIHBhY2thZ2UgZGVmaW5pdGlvbjogJy4kZS0+Z2V0TWVzc2FnZSgpLiJcblxuSW52YWxpZCBwYWNrYWdlIGRlZmluaXRpb246XG4iLmpzb25fZW5jb2RlKCRwYWNrYWdlKSk7Cn0KCiR0aGlzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teYXJyYXkgfScsICdwYWNrYWdlICcsIHBhcmVudDo6Z2V0UmVwb05hbWUoKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkd1ZXNzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBQYXRoUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgpwcml2YXRlICRsb2FkZXI7CgoKCgpwcml2YXRlICR2ZXJzaW9uR3Vlc3NlcjsKCgoKCnByaXZhdGUgJHVybDsKCgoKCgpwcml2YXRlICRyZXBvQ29uZmlnOwoKCgoKcHJpdmF0ZSAkcHJvY2VzczsKCgoKCnByaXZhdGUgJG9wdGlvbnM7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwsID9FdmVudERpc3BhdGNoZXIgJGRpc3BhdGNoZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewppZiAoIWlzc2V0KCRyZXBvQ29uZmlnWyd1cmwnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBzcGVjaWZ5IHRoZSBgdXJsYCBjb25maWd1cmF0aW9uIGZvciB0aGUgcGF0aCByZXBvc2l0b3J5Jyk7Cn0KCiR0aGlzLT5sb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSk7CiR0aGlzLT51cmwgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPnZlcnNpb25HdWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb25maWcsICR0aGlzLT5wcm9jZXNzLCBuZXcgVmVyc2lvblBhcnNlcigpKTsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKJHRoaXMtPm9wdGlvbnMgPSAkcmVwb0NvbmZpZ1snb3B0aW9ucyddID8/IFtdOwppZiAoIWlzc2V0KCR0aGlzLT5vcHRpb25zWydyZWxhdGl2ZSddKSkgewokZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCk7CiR0aGlzLT5vcHRpb25zWydyZWxhdGl2ZSddID0gISRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkdGhpcy0+dXJsKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdwYXRoIHJlcG8gKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+cmVwb0NvbmZpZ1sndXJsJ10pLicpJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9Db25maWc7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKJHVybE1hdGNoZXMgPSAkdGhpcy0+Z2V0VXJsTWF0Y2hlcygpOwoKaWYgKGVtcHR5KCR1cmxNYXRjaGVzKSkgewppZiAoUHJlZzo6aXNNYXRjaCgne1sqe31dfScsICR0aGlzLT51cmwpKSB7CiR1cmwgPSAkdGhpcy0+dXJsOwp3aGlsZSAoUHJlZzo6aXNNYXRjaCgne1sqe31dfScsICR1cmwpKSB7CiR1cmwgPSBkaXJuYW1lKCR1cmwpOwp9CgppZiAoaXNfZGlyKCR1cmwpKSB7CnJldHVybjsKfQp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBgdXJsYCBzdXBwbGllZCBmb3IgdGhlIHBhdGggKCcgLiAkdGhpcy0+dXJsIC4gJykgcmVwb3NpdG9yeSBkb2VzIG5vdCBleGlzdCcpOwp9Cgpmb3JlYWNoICgkdXJsTWF0Y2hlcyBhcyAkdXJsKSB7CiRwYXRoID0gcmVhbHBhdGgoJHVybCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwokY29tcG9zZXJGaWxlUGF0aCA9ICRwYXRoLidjb21wb3Nlci5qc29uJzsKCmlmICghZmlsZV9leGlzdHMoJGNvbXBvc2VyRmlsZVBhdGgpKSB7CmNvbnRpbnVlOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wb3NlckZpbGVQYXRoKTsKJHBhY2thZ2UgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRqc29uLCAkY29tcG9zZXJGaWxlUGF0aCk7CiRwYWNrYWdlWydkaXN0J10gPSBbCid0eXBlJyA9PiAncGF0aCcsCid1cmwnID0+ICR1cmwsCl07CiRyZWZlcmVuY2UgPSAkdGhpcy0+b3B0aW9uc1sncmVmZXJlbmNlJ10gPz8gJ2F1dG8nOwppZiAoJ25vbmUnID09PSAkcmVmZXJlbmNlKSB7CiRwYWNrYWdlWydkaXN0J11bJ3JlZmVyZW5jZSddID0gbnVsbDsKfSBlbHNlaWYgKCdjb25maWcnID09PSAkcmVmZXJlbmNlIHx8ICdhdXRvJyA9PT0gJHJlZmVyZW5jZSkgewokcGFja2FnZVsnZGlzdCddWydyZWZlcmVuY2UnXSA9IHNoYTEoJGpzb24gLiBzZXJpYWxpemUoJHRoaXMtPm9wdGlvbnMpKTsKfQoKCiRwYWNrYWdlWyd0cmFuc3BvcnQtb3B0aW9ucyddID0gYXJyYXlfaW50ZXJzZWN0X2tleSgkdGhpcy0+b3B0aW9ucywgWydzeW1saW5rJyA9PiB0cnVlLCAncmVsYXRpdmUnID0+IHRydWVdKTsKCmlmIChpc3NldCgkcGFja2FnZVsnbmFtZSddLCAkdGhpcy0+b3B0aW9uc1sndmVyc2lvbnMnXVskcGFja2FnZVsnbmFtZSddXSkpIHsKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICR0aGlzLT5vcHRpb25zWyd2ZXJzaW9ucyddWyRwYWNrYWdlWyduYW1lJ11dOwp9CgoKaWYgKCFpc3NldCgkcGFja2FnZVsndmVyc2lvbiddKSAmJiAoJHJvb3RWZXJzaW9uID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJykpKSB7CmlmICgKMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCByZXYtcGFyc2UgSEVBRCcsICRyZWYxLCAkcGF0aCkKJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCByZXYtcGFyc2UgSEVBRCcsICRyZWYyKQomJiAkcmVmMSA9PT0gJHJlZjIKKSB7CiRwYWNrYWdlWyd2ZXJzaW9uJ10gPSAkcm9vdFZlcnNpb247Cn0KfQoKJG91dHB1dCA9ICcnOwppZiAoJ2F1dG8nID09PSAkcmVmZXJlbmNlICYmIGlzX2RpcigkcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnLmdpdCcpICYmIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgbG9nIC1uMSAtLXByZXR0eT0lSCcuR2l0VXRpbDo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZygkdGhpcy0+cHJvY2VzcyksICRvdXRwdXQsICRwYXRoKSkgewokcGFja2FnZVsnZGlzdCddWydyZWZlcmVuY2UnXSA9IHRyaW0oJG91dHB1dCk7Cn0KCmlmICghaXNzZXQoJHBhY2thZ2VbJ3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2UsICRwYXRoKTsKaWYgKGlzX2FycmF5KCR2ZXJzaW9uRGF0YSkgJiYgJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddKSB7CgppZiAoIWVtcHR5KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddKSkgewokcGFja2FnZVsndmVyc2lvbiddID0gJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ107CiR0aGlzLT5hZGRQYWNrYWdlKCR0aGlzLT5sb2FkZXItPmxvYWQoJHBhY2thZ2UpKTsKfQoKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXTsKfSBlbHNlIHsKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICdkZXYtbWFpbic7Cn0KfQoKdHJ5IHsKJHRoaXMtPmFkZFBhY2thZ2UoJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZSkpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIGxvYWRpbmcgdGhlIHBhY2thZ2UgaW4gJy4kY29tcG9zZXJGaWxlUGF0aCwgMCwgJGUpOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFVybE1hdGNoZXMoKTogYXJyYXkKewokZmxhZ3MgPSBHTE9CX01BUksgfCBHTE9CX09OTFlESVI7CgppZiAoZGVmaW5lZCgnR0xPQl9CUkFDRScpKSB7CiRmbGFncyB8PSBHTE9CX0JSQUNFOwp9IGVsc2VpZiAoc3RycG9zKCR0aGlzLT51cmwsICd7JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdGhpcy0+dXJsLCAnfScpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgR0xPQl9CUkFDRSB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHVybCAnLiAkdGhpcy0+dXJsKTsKfQoKCnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogc3RyaW5nIHsKcmV0dXJuIHJ0cmltKHN0cl9yZXBsYWNlKERJUkVDVE9SWV9TRVBBUkFUT1IsICcvJywgJHZhbCksICcvJyk7Cn0sIGdsb2IoJHRoaXMtPnVybCwgJGZsYWdzKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgoKCgoKY2xhc3MgUGVhclJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgUEVBUiByZXBvc2l0b3J5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBDb21wb3NlciAyLngnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cSGh2bURldGVjdG9yOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cUnVudGltZTsKdXNlIENvbXBvc2VyXFBsYXRmb3JtXFZlcnNpb247CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CgoKCgpjbGFzcyBQbGF0Zm9ybVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewoKCgoKcHVibGljIGNvbnN0IFBMQVRGT1JNX1BBQ0tBR0VfUkVHRVggPSAne14oPzpwaHAoPzotNjRiaXR8LWlwdjZ8LXp0c3wtZGVidWcpP3xoaHZtfCg/OmV4dHxsaWIpLVthLXowLTldKD86W18uLV0/W2EtejAtOV0rKSp8Y29tcG9zZXIoPzotKD86cGx1Z2lufHJ1bnRpbWUpLWFwaSk/KSR9aUQnOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGxhc3RTZWVuUGxhdGZvcm1QaHAgPSBudWxsOwoKCgoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCgoKCgoKCgpwcml2YXRlICRvdmVycmlkZXMgPSBbXTsKCgoKCgoKcHJpdmF0ZSAkZGlzYWJsZWRQYWNrYWdlcyA9IFtdOwoKCnByaXZhdGUgJHJ1bnRpbWU7Cgpwcml2YXRlICRoaHZtRGV0ZWN0b3I7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhY2thZ2VzID0gW10sIGFycmF5ICRvdmVycmlkZXMgPSBbXSwgP1J1bnRpbWUgJHJ1bnRpbWUgPSBudWxsLCA/SGh2bURldGVjdG9yICRoaHZtRGV0ZWN0b3IgPSBudWxsKQp7CiR0aGlzLT5ydW50aW1lID0gJHJ1bnRpbWUgPzogbmV3IFJ1bnRpbWUoKTsKJHRoaXMtPmhodm1EZXRlY3RvciA9ICRoaHZtRGV0ZWN0b3IgPzogbmV3IEhodm1EZXRlY3RvcigpOwpmb3JlYWNoICgkb3ZlcnJpZGVzIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CmlmICghaXNfc3RyaW5nKCR2ZXJzaW9uKSAmJiBmYWxzZSAhPT0gJHZlcnNpb24pIHsgCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdjb25maWcucGxhdGZvcm0uJy4kbmFtZS4nIHNob3VsZCBiZSBhIHN0cmluZyBvciBmYWxzZSwgYnV0IGdvdCAnLmdldHR5cGUoJHZlcnNpb24pLicgJy52YXJfZXhwb3J0KCR2ZXJzaW9uLCB0cnVlKSk7Cn0KaWYgKCRuYW1lID09PSAncGhwJyAmJiAkdmVyc2lvbiA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ2NvbmZpZy5wbGF0Zm9ybS4nLiRuYW1lLicgY2Fubm90IGJlIHNldCB0byBmYWxzZSBhcyB5b3UgY2Fubm90IGRpc2FibGUgcGhwIGVudGlyZWx5LicpOwp9CiR0aGlzLT5vdmVycmlkZXNbc3RydG9sb3dlcigkbmFtZSldID0gWyduYW1lJyA9PiAkbmFtZSwgJ3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfQpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYWNrYWdlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3BsYXRmb3JtIHJlcG8nOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNQbGF0Zm9ybVBhY2thZ2VEaXNhYmxlZChzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXNhYmxlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgoKCmZvcmVhY2ggKCR0aGlzLT5vdmVycmlkZXMgYXMgJG92ZXJyaWRlKSB7CgppZiAoIXNlbGY6OmlzUGxhdGZvcm1QYWNrYWdlKCRvdmVycmlkZVsnbmFtZSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBwbGF0Zm9ybSBwYWNrYWdlIG5hbWUgaW4gY29uZmlnLnBsYXRmb3JtOiAnLiRvdmVycmlkZVsnbmFtZSddKTsKfQoKaWYgKCRvdmVycmlkZVsndmVyc2lvbiddICE9PSBmYWxzZSkgewokdGhpcy0+YWRkT3ZlcnJpZGRlblBhY2thZ2UoJG92ZXJyaWRlKTsKfQp9CgokcHJldHR5VmVyc2lvbiA9IENvbXBvc2VyOjpnZXRWZXJzaW9uKCk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlciA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ2NvbXBvc2VyJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyLT5zZXREZXNjcmlwdGlvbignQ29tcG9zZXIgcGFja2FnZScpOwokdGhpcy0+YWRkUGFja2FnZSgkY29tcG9zZXIpOwoKJHByZXR0eVZlcnNpb24gPSBQbHVnaW5JbnRlcmZhY2U6OlBMVUdJTl9BUElfVkVSU0lPTjsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyUGx1Z2luQXBpID0gbmV3IENvbXBsZXRlUGFja2FnZSgnY29tcG9zZXItcGx1Z2luLWFwaScsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlclBsdWdpbkFwaS0+c2V0RGVzY3JpcHRpb24oJ1RoZSBDb21wb3NlciBQbHVnaW4gQVBJJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRjb21wb3NlclBsdWdpbkFwaSk7CgokcHJldHR5VmVyc2lvbiA9IENvbXBvc2VyOjpSVU5USU1FX0FQSV9WRVJTSU9OOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJSdW50aW1lQXBpID0gbmV3IENvbXBsZXRlUGFja2FnZSgnY29tcG9zZXItcnVudGltZS1hcGknLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJSdW50aW1lQXBpLT5zZXREZXNjcmlwdGlvbignVGhlIENvbXBvc2VyIFJ1bnRpbWUgQVBJJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRjb21wb3NlclJ1bnRpbWVBcGkpOwoKdHJ5IHsKJHByZXR0eVZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9WRVJTSU9OJyk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKJHByZXR0eVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCcjXihbXn4rLV0rKS4qJCMnLCAnJDEnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9WRVJTSU9OJykpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgokcGhwID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocC0+c2V0RGVzY3JpcHRpb24oJ1RoZSBQSFAgaW50ZXJwcmV0ZXInKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocCk7CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQSFBfREVCVUcnKSkgewokcGhwZGVidWcgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdwaHAtZGVidWcnLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokcGhwZGVidWctPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyLCB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwaHBkZWJ1Zyk7Cn0KCmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1BIUF9aVFMnKSAmJiAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9aVFMnKSkgewokcGhwenRzID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLXp0cycsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHB6dHMtPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyLCB3aXRoIFplbmQgVGhyZWFkIFNhZmV0eScpOwokdGhpcy0+YWRkUGFja2FnZSgkcGhwenRzKTsKfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnUEhQX0lOVF9TSVpFJykgPT09IDgpIHsKJHBocDY0ID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLTY0Yml0JywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocDY0LT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgNjRiaXQnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocDY0KTsKfQoKCgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdBRl9JTkVUNicpIHx8IFNpbGVuY2VyOjpjYWxsKFskdGhpcy0+cnVudGltZSwgJ2ludm9rZSddLCAnaW5ldF9wdG9uJywgWyc6OiddKSAhPT0gZmFsc2UpIHsKJHBocElwdjYgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdwaHAtaXB2NicsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHBJcHY2LT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgd2l0aCBJUHY2IHN1cHBvcnQnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocElwdjYpOwp9CgokbG9hZGVkRXh0ZW5zaW9ucyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25zKCk7CgoKZm9yZWFjaCAoJGxvYWRlZEV4dGVuc2lvbnMgYXMgJG5hbWUpIHsKaWYgKGluX2FycmF5KCRuYW1lLCBbJ3N0YW5kYXJkJywgJ0NvcmUnXSkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFeHRlbnNpb24oJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25WZXJzaW9uKCRuYW1lKSk7Cn0KCgppZiAoIWluX2FycmF5KCd4ZGVidWcnLCAkbG9hZGVkRXh0ZW5zaW9ucywgdHJ1ZSkgJiYgKCRwcmV0dHlWZXJzaW9uID0gWGRlYnVnSGFuZGxlcjo6Z2V0U2tpcHBlZFZlcnNpb24oKSkpIHsKJHRoaXMtPmFkZEV4dGVuc2lvbigneGRlYnVnJywgJHByZXR0eVZlcnNpb24pOwp9CgoKCgpmb3JlYWNoICgkbG9hZGVkRXh0ZW5zaW9ucyBhcyAkbmFtZSkgewpzd2l0Y2ggKCRuYW1lKSB7CmNhc2UgJ2FtcXAnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJyYWJiaXRtcSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGlicmFiYml0bXFNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYnJhYmJpdG1xJywgJGxpYnJhYmJpdG1xTWF0Y2hlc1sndmVyc2lvbiddLCAnQU1RUCBsaWJyYWJiaXRtcSB2ZXJzaW9uJyk7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15BTVFQIHByb3RvY29sIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRwcm90b2NvbE1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictcHJvdG9jb2wnLCBzdHJfcmVwbGFjZSgnLScsICcuJywgJHByb3RvY29sTWF0Y2hlc1sndmVyc2lvbiddKSwgJ0FNUVAgcHJvdG9jb2wgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnYnoyJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eQlppcDIgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4qKSwvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmNhc2UgJ2N1cmwnOgokY3VybFZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+aW52b2tlKCdjdXJsX3ZlcnNpb24nKTsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUsICRjdXJsVmVyc2lvblsndmVyc2lvbiddKTsKCiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlNTTCBWZXJzaW9uID0+ICg/PGxpYnJhcnk+W14vXSspLyg/PHZlcnNpb24+LispJH1pbScsICRpbmZvLCAkc3NsTWF0Y2hlcykpIHsKJGxpYnJhcnkgPSBzdHJ0b2xvd2VyKCRzc2xNYXRjaGVzWydsaWJyYXJ5J10pOwppZiAoJGxpYnJhcnkgPT09ICdvcGVuc3NsJykgewokcGFyc2VkVmVyc2lvbiA9IFZlcnNpb246OnBhcnNlT3BlbnNzbCgkc3NsTWF0Y2hlc1sndmVyc2lvbiddLCAkaXNGaXBzKTsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1vcGVuc3NsJy4oJGlzRmlwcyA/ICctZmlwcycgOiAnJyksICRwYXJzZWRWZXJzaW9uLCAnY3VybCBPcGVuU1NMIHZlcnNpb24gKCcuJHBhcnNlZFZlcnNpb24uJyknLCBbXSwgJGlzRmlwcyA/IFsnY3VybC1vcGVuc3NsJ10gOiBbXSk7Cn0gZWxzZSB7CmlmICgkbGlicmFyeSA9PT0gJyhzZWN1cmV0cmFuc3BvcnQpIG9wZW5zc2wnKSB7CiRzaG9ydGxpYiA9ICdzZWN1cmV0cmFuc3BvcnQnOwp9IGVsc2Ugewokc2hvcnRsaWIgPSAkbGlicmFyeTsKfQokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLScuJHNob3J0bGliLCAkc3NsTWF0Y2hlc1sndmVyc2lvbiddLCAnY3VybCAnLiRsaWJyYXJ5LicgdmVyc2lvbiAoJy4kc3NsTWF0Y2hlc1sndmVyc2lvbiddLicpJywgWydjdXJsLW9wZW5zc2wnXSk7Cn0KfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XmxpYlNTSCBWZXJzaW9uID0+ICg/PGxpYnJhcnk+W14vXSspLyg/PHZlcnNpb24+Lis/KSg/Oi8uKik/JH1pbScsICRpbmZvLCAkc3NoTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy0nLnN0cnRvbG93ZXIoJHNzaE1hdGNoZXNbJ2xpYnJhcnknXSksICRzc2hNYXRjaGVzWyd2ZXJzaW9uJ10sICdjdXJsICcuJHNzaE1hdGNoZXNbJ2xpYnJhcnknXS4nIHZlcnNpb24nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlpMaWIgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSR9aW0nLCAkaW5mbywgJHpsaWJNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLXpsaWInLCAkemxpYk1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2N1cmwgemxpYiB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdkYXRlJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9edGltZWxpYiB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkdGltZWxpYk1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictdGltZWxpYicsICR0aW1lbGliTWF0Y2hlc1sndmVyc2lvbiddLCAnZGF0ZSB0aW1lbGliIHZlcnNpb24nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlRpbWV6b25lIERhdGFiYXNlID0+ICg/PHNvdXJjZT5pbnRlcm5hbHxleHRlcm5hbCkkL2ltJywgJGluZm8sICR6b25laW5mb1NvdXJjZU1hdGNoZXMpKSB7CiRleHRlcm5hbCA9ICR6b25laW5mb1NvdXJjZU1hdGNoZXNbJ3NvdXJjZSddID09PSAnZXh0ZXJuYWwnOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14iT2xzb24iIFRpbWV6b25lIERhdGFiYXNlIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKz8pKD86XC5zeXN0ZW0pPyQvaW0nLCAkaW5mbywgJHpvbmVpbmZvTWF0Y2hlcykpIHsKCmlmICgkZXh0ZXJuYWwgJiYgaW5fYXJyYXkoJ3RpbWV6b25lZGInLCAkbG9hZGVkRXh0ZW5zaW9ucywgdHJ1ZSkpIHsKJHRoaXMtPmFkZExpYnJhcnkoJ3RpbWV6b25lZGItem9uZWluZm8nLCAkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGRhdGUgKHJlcGxhY2VkIGJ5IHRpbWV6b25lZGIpJywgWyRuYW1lLictem9uZWluZm8nXSk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictem9uZWluZm8nLCAkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGRhdGUnKTsKfQp9Cn0KYnJlYWs7CgpjYXNlICdmaWxlaW5mbyc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYm1hZ2ljID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWFnaWNNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYm1hZ2ljJywgJG1hZ2ljTWF0Y2hlc1sndmVyc2lvbiddLCAnZmlsZWluZm8gbGlibWFnaWMgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnZ2QnOgokdGhpcy0+YWRkTGlicmFyeSgkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdHRF9WRVJTSU9OJykpOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJKUEVHIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKz8pKD86IGNvbXBhdGlibGUpPyQvaW0nLCAkaW5mbywgJGxpYmpwZWdNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYmpwZWcnLCBWZXJzaW9uOjpwYXJzZUxpYmpwZWcoJGxpYmpwZWdNYXRjaGVzWyd2ZXJzaW9uJ10pLCAnbGlianBlZyB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJQTkcgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYnBuZ01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictbGlicG5nJywgJGxpYnBuZ01hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYnBuZyB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15GcmVlVHlwZSBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkZnJlZXR5cGVNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWZyZWV0eXBlJywgJGZyZWV0eXBlTWF0Y2hlc1sndmVyc2lvbiddLCAnZnJlZXR5cGUgdmVyc2lvbiBmb3IgZ2QnKTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGliWHBtIFZlcnNpb24gPT4gKD88dmVyc2lvbklkPlxkKykkL2ltJywgJGluZm8sICRsaWJ4cG1NYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYnhwbScsIFZlcnNpb246OmNvbnZlcnRMaWJ4cG1WZXJzaW9uSWQoKGludCkgJGxpYnhwbU1hdGNoZXNbJ3ZlcnNpb25JZCddKSwgJ2xpYnhwbSB2ZXJzaW9uIGZvciBnZCcpOwp9CgpicmVhazsKCmNhc2UgJ2dtcCc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0dNUF9WRVJTSU9OJykpOwpicmVhazsKCmNhc2UgJ2ljb252JzoKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnSUNPTlZfVkVSU0lPTicpKTsKYnJlYWs7CgpjYXNlICdpbnRsJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgokZGVzY3JpcHRpb24gPSAnVGhlIElDVSB1bmljb2RlIGFuZCBnbG9iYWxpemF0aW9uIHN1cHBvcnQgbGlicmFyeSc7CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdJTlRMX0lDVV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJ2ljdScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnSU5UTF9JQ1VfVkVSU0lPTicpLCAkZGVzY3JpcHRpb24pOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgnL15JQ1UgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCdpY3UnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAkZGVzY3JpcHRpb24pOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eSUNVIFRaRGF0YSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LiopJC9pbScsICRpbmZvLCAkem9uZWluZm9NYXRjaGVzKSAmJiBudWxsICE9PSAoJHZlcnNpb24gPSBWZXJzaW9uOjpwYXJzZVpvbmVpbmZvVmVyc2lvbigkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10pKSkgewokdGhpcy0+YWRkTGlicmFyeSgnaWN1LXpvbmVpbmZvJywgJHZlcnNpb24sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGljdScpOwp9CgoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDbGFzcygnUmVzb3VyY2VCdW5kbGUnKSkgewokcmVzb3VyY2VCdW5kbGUgPSAkdGhpcy0+cnVudGltZS0+aW52b2tlKFsnUmVzb3VyY2VCdW5kbGUnLCAnY3JlYXRlJ10sIFsncm9vdCcsICdJQ1VEQVRBJywgZmFsc2VdKTsKaWYgKCRyZXNvdXJjZUJ1bmRsZSAhPT0gbnVsbCkgewokdGhpcy0+YWRkTGlicmFyeSgnaWN1LWNsZHInLCAkcmVzb3VyY2VCdW5kbGUtPmdldCgnVmVyc2lvbicpLCAnSUNVIENMRFIgcHJvamVjdCB2ZXJzaW9uJyk7Cn0KfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDbGFzcygnSW50bENoYXInKSkgewokdGhpcy0+YWRkTGlicmFyeSgnaWN1LXVuaWNvZGUnLCBpbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoJHRoaXMtPnJ1bnRpbWUtPmludm9rZShbJ0ludGxDaGFyJywgJ2dldFVuaWNvZGVWZXJzaW9uJ10pLCAwLCAzKSksICdJQ1UgdW5pY29kZSB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdpbWFnaWNrJzoKJGltYWdlTWFnaWNrVmVyc2lvbiA9ICR0aGlzLT5ydW50aW1lLT5jb25zdHJ1Y3QoJ0ltYWdpY2snKS0+Z2V0VmVyc2lvbigpOwoKClByZWc6Om1hdGNoKCcvXkltYWdlTWFnaWNrICg/PHZlcnNpb24+W1xkLl0rKSg/Oi0oPzxwYXRjaD5cZCspKT8vJywgJGltYWdlTWFnaWNrVmVyc2lvblsndmVyc2lvblN0cmluZyddLCAkbWF0Y2hlcyk7CiR2ZXJzaW9uID0gJG1hdGNoZXNbJ3ZlcnNpb24nXTsKaWYgKGlzc2V0KCRtYXRjaGVzWydwYXRjaCddKSkgewokdmVyc2lvbiAuPSAnLicuJG1hdGNoZXNbJ3BhdGNoJ107Cn0KCiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictaW1hZ2VtYWdpY2snLCAkdmVyc2lvbiwgbnVsbCwgWydpbWFnaWNrJ10pOwpicmVhazsKCmNhc2UgJ2xkYXAnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlZlbmRvciBWZXJzaW9uID0+ICg/PHZlcnNpb25JZD5cZCspJC9pbScsICRpbmZvLCAkbWF0Y2hlcykgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15WZW5kb3IgTmFtZSA9PiAoPzx2ZW5kb3I+LispJC9pbScsICRpbmZvLCAkdmVuZG9yTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy0nLnN0cnRvbG93ZXIoJHZlbmRvck1hdGNoZXNbJ3ZlbmRvciddKSwgVmVyc2lvbjo6Y29udmVydE9wZW5sZGFwVmVyc2lvbklkKChpbnQpICRtYXRjaGVzWyd2ZXJzaW9uSWQnXSksICR2ZW5kb3JNYXRjaGVzWyd2ZW5kb3InXS4nIHZlcnNpb24gb2YgbGRhcCcpOwp9CmJyZWFrOwoKY2FzZSAnbGlieG1sJzoKCiRsaWJ4bWxQcm92aWRlcyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRleHRlbnNpb24pOiBzdHJpbmcgewpyZXR1cm4gJGV4dGVuc2lvbiAuICctbGlieG1sJzsKfSwgYXJyYXlfaW50ZXJzZWN0KCRsb2FkZWRFeHRlbnNpb25zLCBbJ2RvbScsICdzaW1wbGV4bWwnLCAneG1sJywgJ3htbHJlYWRlcicsICd4bWx3cml0ZXInXSkpOwokdGhpcy0+YWRkTGlicmFyeSgkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdMSUJYTUxfRE9UVEVEX1ZFUlNJT04nKSwgJ2xpYnhtbCBsaWJyYXJ5IHZlcnNpb24nLCBbXSwgJGxpYnhtbFByb3ZpZGVzKTsKCmJyZWFrOwoKY2FzZSAnbWJzdHJpbmcnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJtYmZsIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRsaWJtYmZsTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1saWJtYmZsJywgJGxpYm1iZmxNYXRjaGVzWyd2ZXJzaW9uJ10sICdtYnN0cmluZyBsaWJtYmZsIHZlcnNpb24nKTsKfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDb25zdGFudCgnTUJfT05JR1VSVU1BX1ZFUlNJT04nKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLW9uaWd1cnVtYScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnTUJfT05JR1VSVU1BX1ZFUlNJT04nKSwgJ21ic3RyaW5nIG9uaWd1cnVtYSB2ZXJzaW9uJyk7CgoKCn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcvXig/Om9uaWd1cnVtYXxNdWx0aWJ5dGUgcmVnZXggXChvbmlndXJ1bWFcKSkgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG9uaWd1cnVtYU1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictb25pZ3VydW1hJywgJG9uaWd1cnVtYU1hdGNoZXNbJ3ZlcnNpb24nXSwgJ21ic3RyaW5nIG9uaWd1cnVtYSB2ZXJzaW9uJyk7Cn0KCmJyZWFrOwoKY2FzZSAnbWVtY2FjaGVkJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlibWVtY2FjaGVkIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYm1lbWNhY2hlZCcsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJtZW1jYWNoZWQgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnb3BlbnNzbCc6CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpPcGVuU1NMfExpYnJlU1NMKT9ccyooPzx2ZXJzaW9uPlxTKyl9aScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnT1BFTlNTTF9WRVJTSU9OX1RFWFQnKSwgJG1hdGNoZXMpKSB7CiRwYXJzZWRWZXJzaW9uID0gVmVyc2lvbjo6cGFyc2VPcGVuc3NsKCRtYXRjaGVzWyd2ZXJzaW9uJ10sICRpc0ZpcHMpOwokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4oJGlzRmlwcyA/ICctZmlwcycgOiAnJyksICRwYXJzZWRWZXJzaW9uLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ09QRU5TU0xfVkVSU0lPTl9URVhUJyksIFtdLCAkaXNGaXBzID8gWyRuYW1lXSA6IFtdKTsKfQpicmVhazsKCmNhc2UgJ3BjcmUnOgokdGhpcy0+YWRkTGlicmFyeSgkbmFtZSwgUHJlZzo6cmVwbGFjZSgne14oXFMrKS4qfScsICckMScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnUENSRV9WRVJTSU9OJykpKTsKCiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlBDUkUgVW5pY29kZSBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkcGNyZVVuaWNvZGVNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLXVuaWNvZGUnLCAkcGNyZVVuaWNvZGVNYXRjaGVzWyd2ZXJzaW9uJ10sICdQQ1JFIFVuaWNvZGUgdmVyc2lvbiBzdXBwb3J0Jyk7Cn0KCmJyZWFrOwoKY2FzZSAnbXlzcWxuZCc6CmNhc2UgJ3Bkb19teXNxbCc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eKD86Q2xpZW50IEFQSSB2ZXJzaW9ufFZlcnNpb24pID0+IG15c3FsbmQgKD88dmVyc2lvbj4uKz8pIC9taScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1teXNxbG5kJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJ215c3FsbmQgbGlicmFyeSB2ZXJzaW9uIGZvciAnLiRuYW1lKTsKfQpicmVhazsKCmNhc2UgJ21vbmdvZGInOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXmxpYm1vbmdvYyBidW5kbGVkIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRsaWJtb25nb2NNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYm1vbmdvYycsICRsaWJtb25nb2NNYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJtb25nb2MgdmVyc2lvbiBvZiBtb25nb2RiJyk7Cn0KCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXmxpYmJzb24gYnVuZGxlZCB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGliYnNvbk1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictbGliYnNvbicsICRsaWJic29uTWF0Y2hlc1sndmVyc2lvbiddLCAnbGliYnNvbiB2ZXJzaW9uIG9mIG1vbmdvZGInKTsKfQpicmVhazsKCmNhc2UgJ3Bnc3FsJzoKY2FzZSAncGRvX3Bnc3FsJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15Qb3N0Z3JlU1FMXChsaWJwcVwpIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKikkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLWxpYnBxJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYnBxIGZvciAnLiRuYW1lKTsKfQpicmVhazsKCmNhc2UgJ3BxJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYnBxID0+ICg/PGNvbXBpbGVkPi4rKSA9PiAoPzxsaW5rZWQ+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1saWJwcScsICRtYXRjaGVzWydsaW5rZWQnXSwgJ2xpYnBxIGZvciAnLiRuYW1lKTsKfQpicmVhazsKCmNhc2UgJ3Jka2Fma2EnOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdSRF9LQUZLQV9WRVJTSU9OJykpIHsKCgoKCgoKCgoKJGxpYlJkS2Fma2FWZXJzaW9uSW50ID0gJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdSRF9LQUZLQV9WRVJTSU9OJyk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLictbGlicmRrYWZrYScsIHNwcmludGYoJyVkLiVkLiVkJywgKCRsaWJSZEthZmthVmVyc2lvbkludCAmIDB4RkYwMDAwMDApID4+IDI0LCAoJGxpYlJkS2Fma2FWZXJzaW9uSW50ICYgMHgwMEZGMDAwMCkgPj4gMTYsICgkbGliUmRLYWZrYVZlcnNpb25JbnQgJiAweDAwMDBGRjAwKSA+PiA4KSwgJ2xpYnJka2Fma2EgZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAnbGlic29kaXVtJzoKY2FzZSAnc29kaXVtJzoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDb25zdGFudCgnU09ESVVNX0xJQlJBUllfVkVSU0lPTicpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCdsaWJzb2RpdW0nLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1NPRElVTV9MSUJSQVJZX1ZFUlNJT04nKSk7Cn0KYnJlYWs7CgpjYXNlICdzcWxpdGUzJzoKY2FzZSAncGRvX3NxbGl0ZSc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2goJy9eU1FMaXRlIExpYnJhcnkgPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbmFtZS4nLXNxbGl0ZScsICRtYXRjaGVzWyd2ZXJzaW9uJ10pOwp9CmJyZWFrOwoKY2FzZSAnc3NoMic6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlic3NoMiB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1saWJzc2gyJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSk7Cn0KYnJlYWs7CgpjYXNlICd4c2wnOgokdGhpcy0+YWRkTGlicmFyeSgnbGlieHNsdCcsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnTElCWFNMVF9ET1RURURfVkVSU0lPTicpLCBudWxsLCBbJ3hzbCddKTsKCiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJ3hzbCcpOwppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJ4c2x0IGNvbXBpbGVkIGFnYWluc3QgbGlieG1sIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgnbGlieHNsdC1saWJ4bWwnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbGlieG1sIHZlcnNpb24gbGlieHNsdCBpcyBjb21waWxlZCBhZ2FpbnN0Jyk7Cn0KYnJlYWs7CgpjYXNlICd5YW1sJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygneWFtbCcpOwoKaWYgKFByZWc6OmlzTWF0Y2goJy9eTGliWUFNTCBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1saWJ5YW1sJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYnlhbWwgdmVyc2lvbiBvZiB5YW1sJyk7Cn0KYnJlYWs7CgpjYXNlICd6aXAnOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdMSUJaSVBfVkVSU0lPTicsICdaaXBBcmNoaXZlJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUuJy1saWJ6aXAnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0xJQlpJUF9WRVJTSU9OJywgJ1ppcEFyY2hpdmUnKSwgbnVsbCwgWyd6aXAnXSk7Cn0KYnJlYWs7CgpjYXNlICd6bGliJzoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDb25zdGFudCgnWkxJQl9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnWkxJQl9WRVJTSU9OJykpOwoKCn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcvXkxpbmtlZCBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKSwgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRuYW1lLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmRlZmF1bHQ6CmJyZWFrOwp9Cn0KCiRoaHZtVmVyc2lvbiA9ICR0aGlzLT5oaHZtRGV0ZWN0b3ItPmdldFZlcnNpb24oKTsKaWYgKCRoaHZtVmVyc2lvbikgewp0cnkgewokcHJldHR5VmVyc2lvbiA9ICRoaHZtVmVyc2lvbjsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokcHJldHR5VmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJyNeKFtefistXSspLiokIycsICckMScsICRoaHZtVmVyc2lvbik7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0KCiRoaHZtID0gbmV3IENvbXBsZXRlUGFja2FnZSgnaGh2bScsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRoaHZtLT5zZXREZXNjcmlwdGlvbignVGhlIEhIVk0gUnVudGltZSAoNjRiaXQpJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRoaHZtKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0V4cGVjdGVkIENvbXBsZXRlUGFja2FnZSBidXQgZ290ICcuZ2V0X2NsYXNzKCRwYWNrYWdlKSk7Cn0KCgppZiAoaXNzZXQoJHRoaXMtPm92ZXJyaWRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKaWYgKCR0aGlzLT5vdmVycmlkZXNbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ3ZlcnNpb24nXSA9PT0gZmFsc2UpIHsKJHRoaXMtPmFkZERpc2FibGVkUGFja2FnZSgkcGFja2FnZSk7CgpyZXR1cm47Cn0KCiRvdmVycmlkZXIgPSAkdGhpcy0+ZmluZFBhY2thZ2UoJHBhY2thZ2UtPmdldE5hbWUoKSwgJyonKTsKaWYgKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09ICRvdmVycmlkZXItPmdldFZlcnNpb24oKSkgewokYWN0dWFsVGV4dCA9ICdzYW1lIGFzIGFjdHVhbCc7Cn0gZWxzZSB7CiRhY3R1YWxUZXh0ID0gJ2FjdHVhbDogJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CmlmICgkb3ZlcnJpZGVyIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CiRvdmVycmlkZXItPnNldERlc2NyaXB0aW9uKCRvdmVycmlkZXItPmdldERlc2NyaXB0aW9uKCkuJywgJy4kYWN0dWFsVGV4dCk7Cn0KCnJldHVybjsKfQoKCmlmIChpc3NldCgkdGhpcy0+b3ZlcnJpZGVzWydwaHAnXSkgJiYgMCA9PT0gc3RycG9zKCRwYWNrYWdlLT5nZXROYW1lKCksICdwaHAtJykpIHsKJG92ZXJyaWRlciA9ICR0aGlzLT5hZGRPdmVycmlkZGVuUGFja2FnZSgkdGhpcy0+b3ZlcnJpZGVzWydwaHAnXSwgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSk7CmlmICgkcGFja2FnZS0+Z2V0VmVyc2lvbigpID09PSAkb3ZlcnJpZGVyLT5nZXRWZXJzaW9uKCkpIHsKJGFjdHVhbFRleHQgPSAnc2FtZSBhcyBhY3R1YWwnOwp9IGVsc2UgewokYWN0dWFsVGV4dCA9ICdhY3R1YWw6ICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQokb3ZlcnJpZGVyLT5zZXREZXNjcmlwdGlvbigkb3ZlcnJpZGVyLT5nZXREZXNjcmlwdGlvbigpLicsICcuJGFjdHVhbFRleHQpOwoKcmV0dXJuOwp9CgpwYXJlbnQ6OmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZE92ZXJyaWRkZW5QYWNrYWdlKGFycmF5ICRvdmVycmlkZSwgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBDb21wbGV0ZVBhY2thZ2UKewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJG92ZXJyaWRlWyd2ZXJzaW9uJ10pOwokcGFja2FnZSA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJG5hbWUgPzogJG92ZXJyaWRlWyduYW1lJ10sICR2ZXJzaW9uLCAkb3ZlcnJpZGVbJ3ZlcnNpb24nXSk7CiRwYWNrYWdlLT5zZXREZXNjcmlwdGlvbignUGFja2FnZSBvdmVycmlkZGVuIHZpYSBjb25maWcucGxhdGZvcm0nKTsKJHBhY2thZ2UtPnNldEV4dHJhKFsnY29uZmlnLnBsYXRmb3JtJyA9PiB0cnVlXSk7CnBhcmVudDo6YWRkUGFja2FnZSgkcGFja2FnZSk7CgppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJ3BocCcpIHsKc2VsZjo6JGxhc3RTZWVuUGxhdGZvcm1QaHAgPSBpbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoZXhwbG9kZSgnLicsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpLCAwLCAzKSk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBhZGREaXNhYmxlZFBhY2thZ2UoQ29tcGxldGVQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CiRwYWNrYWdlLT5zZXREZXNjcmlwdGlvbigkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKS4nLiA8d2FybmluZz5QYWNrYWdlIGRpc2FibGVkIHZpYSBjb25maWcucGxhdGZvcm08L3dhcm5pbmc+Jyk7CiRwYWNrYWdlLT5zZXRFeHRyYShbJ2NvbmZpZy5wbGF0Zm9ybScgPT4gdHJ1ZV0pOwoKJHRoaXMtPmRpc2FibGVkUGFja2FnZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRFeHRlbnNpb24oc3RyaW5nICRuYW1lLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pOiB2b2lkCnsKJGV4dHJhRGVzY3JpcHRpb24gPSBudWxsOwoKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokZXh0cmFEZXNjcmlwdGlvbiA9ICcgKGFjdHVhbCB2ZXJzaW9uOiAnLiRwcmV0dHlWZXJzaW9uLicpJzsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFxkK1wuXGQrXC5cZCsoPzpcLlxkKyk/KX0nLCAkcHJldHR5VmVyc2lvbiwgJG1hdGNoKSkgewokcHJldHR5VmVyc2lvbiA9ICRtYXRjaFsxXTsKfSBlbHNlIHsKJHByZXR0eVZlcnNpb24gPSAnMCc7Cn0KJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfQoKJHBhY2thZ2VOYW1lID0gJHRoaXMtPmJ1aWxkUGFja2FnZU5hbWUoJG5hbWUpOwokZXh0ID0gbmV3IENvbXBsZXRlUGFja2FnZSgkcGFja2FnZU5hbWUsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRleHQtPnNldERlc2NyaXB0aW9uKCdUaGUgJy4kbmFtZS4nIFBIUCBleHRlbnNpb24nLiRleHRyYURlc2NyaXB0aW9uKTsKCmlmICgkbmFtZSA9PT0gJ3V1aWQnKSB7CiRleHQtPnNldFJlcGxhY2VzKFsKJ2xpYi11dWlkJyA9PiBuZXcgTGluaygnZXh0LXV1aWQnLCAnbGliLXV1aWQnLCBuZXcgQ29uc3RyYWludCgnPScsICR2ZXJzaW9uKSwgTGluazo6VFlQRV9SRVBMQUNFLCAkZXh0LT5nZXRQcmV0dHlWZXJzaW9uKCkpLApdKTsKfQoKJHRoaXMtPmFkZFBhY2thZ2UoJGV4dCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYnVpbGRQYWNrYWdlTmFtZShzdHJpbmcgJG5hbWUpOiBzdHJpbmcKewpyZXR1cm4gJ2V4dC0nIC4gc3RyX3JlcGxhY2UoJyAnLCAnLScsIHN0cnRvbG93ZXIoJG5hbWUpKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkTGlicmFyeShzdHJpbmcgJG5hbWUsID9zdHJpbmcgJHByZXR0eVZlcnNpb24sID9zdHJpbmcgJGRlc2NyaXB0aW9uID0gbnVsbCwgYXJyYXkgJHJlcGxhY2VzID0gW10sIGFycmF5ICRwcm92aWRlcyA9IFtdKTogdm9pZAp7CmlmIChudWxsID09PSAkcHJldHR5VmVyc2lvbikgewpyZXR1cm47Cn0KdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm47Cn0KCmlmICgkZGVzY3JpcHRpb24gPT09IG51bGwpIHsKJGRlc2NyaXB0aW9uID0gJ1RoZSAnLiRuYW1lLicgbGlicmFyeSc7Cn0KCiRsaWIgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdsaWItJy4kbmFtZSwgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGxpYi0+c2V0RGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uKTsKCiRyZXBsYWNlTGlua3MgPSBbXTsKZm9yZWFjaCAoJHJlcGxhY2VzIGFzICRyZXBsYWNlKSB7CiRyZXBsYWNlID0gc3RydG9sb3dlcigkcmVwbGFjZSk7CiRyZXBsYWNlTGlua3NbJHJlcGxhY2VdID0gbmV3IExpbmsoJ2xpYi0nLiRuYW1lLCAnbGliLScuJHJlcGxhY2UsIG5ldyBDb25zdHJhaW50KCc9JywgJHZlcnNpb24pLCBMaW5rOjpUWVBFX1JFUExBQ0UsICRsaWItPmdldFByZXR0eVZlcnNpb24oKSk7Cn0KJHByb3ZpZGVMaW5rcyA9IFtdOwpmb3JlYWNoICgkcHJvdmlkZXMgYXMgJHByb3ZpZGUpIHsKJHByb3ZpZGUgPSBzdHJ0b2xvd2VyKCRwcm92aWRlKTsKJHByb3ZpZGVMaW5rc1skcHJvdmlkZV0gPSBuZXcgTGluaygnbGliLScuJG5hbWUsICdsaWItJy4kcHJvdmlkZSwgbmV3IENvbnN0cmFpbnQoJz0nLCAkdmVyc2lvbiksIExpbms6OlRZUEVfUFJPVklERSwgJGxpYi0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQokbGliLT5zZXRSZXBsYWNlcygkcmVwbGFjZUxpbmtzKTsKJGxpYi0+c2V0UHJvdmlkZXMoJHByb3ZpZGVMaW5rcyk7CgokdGhpcy0+YWRkUGFja2FnZSgkbGliKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1BsYXRmb3JtUGFja2FnZShzdHJpbmcgJG5hbWUpOiBib29sCnsKc3RhdGljICRjYWNoZSA9IFtdOwoKaWYgKGlzc2V0KCRjYWNoZVskbmFtZV0pKSB7CnJldHVybiAkY2FjaGVbJG5hbWVdOwp9CgpyZXR1cm4gJGNhY2hlWyRuYW1lXSA9IFByZWc6OmlzTWF0Y2goUGxhdGZvcm1SZXBvc2l0b3J5OjpQTEFURk9STV9QQUNLQUdFX1JFR0VYLCAkbmFtZSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1QaHBWZXJzaW9uKCk6ID9zdHJpbmcKewpyZXR1cm4gc2VsZjo6JGxhc3RTZWVuUGxhdGZvcm1QaHA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpOiBhcnJheQp7CgppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9WRU5ET1IpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gcGFyZW50OjpzZWFyY2goJHF1ZXJ5LCAkbW9kZSwgJHR5cGUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CgoKCgpjbGFzcyBSZXBvc2l0b3J5RmFjdG9yeQp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHJlcG9zaXRvcnksIGJvb2wgJGFsbG93RmlsZXN5c3RlbSA9IGZhbHNlKQp7CmlmICgwID09PSBzdHJwb3MoJHJlcG9zaXRvcnksICdodHRwJykpIHsKJHJlcG9Db25maWcgPSBbJ3R5cGUnID0+ICdjb21wb3NlcicsICd1cmwnID0+ICRyZXBvc2l0b3J5XTsKfSBlbHNlaWYgKCJqc29uIiA9PT0gcGF0aGluZm8oJHJlcG9zaXRvcnksIFBBVEhJTkZPX0VYVEVOU0lPTikpIHsKJGpzb24gPSBuZXcgSnNvbkZpbGUoJHJlcG9zaXRvcnksIEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZykpOwokZGF0YSA9ICRqc29uLT5yZWFkKCk7CmlmICghZW1wdHkoJGRhdGFbJ3BhY2thZ2VzJ10pIHx8ICFlbXB0eSgkZGF0YVsnaW5jbHVkZXMnXSkgfHwgIWVtcHR5KCRkYXRhWydwcm92aWRlci1pbmNsdWRlcyddKSkgewokcmVwb0NvbmZpZyA9IFsndHlwZScgPT4gJ2NvbXBvc2VyJywgJ3VybCcgPT4gJ2ZpbGU6Ly8nIC4gc3RydHIocmVhbHBhdGgoJHJlcG9zaXRvcnkpLCAnXFwnLCAnLycpXTsKfSBlbHNlaWYgKCRhbGxvd0ZpbGVzeXN0ZW0pIHsKJHJlcG9Db25maWcgPSBbJ3R5cGUnID0+ICdmaWxlc3lzdGVtJywgJ2pzb24nID0+ICRqc29uXTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcmVwb3NpdG9yeSBVUkwgKCRyZXBvc2l0b3J5KSBnaXZlbi4gVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjb21wb3NlciByZXBvc2l0b3J5LiIpOwp9Cn0gZWxzZWlmIChzdHJwb3MoJHJlcG9zaXRvcnksICd7JykgPT09IDApIHsKCiRyZXBvQ29uZmlnID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVwb3NpdG9yeSk7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlcG9zaXRvcnkgdXJsICgkcmVwb3NpdG9yeSkgZ2l2ZW4uIEhhcyB0byBiZSBhIC5qc29uIGZpbGUsIGFuIGh0dHAgdXJsIG9yIGEgSlNPTiBvYmplY3QuIik7Cn0KCnJldHVybiAkcmVwb0NvbmZpZzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU3RyaW5nKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkcmVwb3NpdG9yeSwgYm9vbCAkYWxsb3dGaWxlc3lzdGVtID0gZmFsc2UsID9SZXBvc2l0b3J5TWFuYWdlciAkcm0gPSBudWxsKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CiRyZXBvQ29uZmlnID0gc3RhdGljOjpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG9zaXRvcnksICRhbGxvd0ZpbGVzeXN0ZW0pOwoKcmV0dXJuIHN0YXRpYzo6Y3JlYXRlUmVwbygkaW8sICRjb25maWcsICRyZXBvQ29uZmlnLCAkcm0pOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVJlcG8oSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJHJlcG9Db25maWcsID9SZXBvc2l0b3J5TWFuYWdlciAkcm0gPSBudWxsKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CmlmICghJHJtKSB7CkB0cmlnZ2VyX2Vycm9yKCdOb3QgcGFzc2luZyBhIHJlcG9zaXRvcnkgbWFuYWdlciB3aGVuIGNhbGxpbmcgY3JlYXRlUmVwbyBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMy42JywgRV9VU0VSX0RFUFJFQ0FURUQpOwokcm0gPSBzdGF0aWM6Om1hbmFnZXIoJGlvLCAkY29uZmlnKTsKfQokcmVwb3MgPSBzZWxmOjpjcmVhdGVSZXBvcygkcm0sIFskcmVwb0NvbmZpZ10pOwoKcmV0dXJuIHJlc2V0KCRyZXBvcyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVmYXVsdFJlcG9zKD9JT0ludGVyZmFjZSAkaW8gPSBudWxsLCA/Q29uZmlnICRjb25maWcgPSBudWxsLCA/UmVwb3NpdG9yeU1hbmFnZXIgJHJtID0gbnVsbCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICRybSkgewpAdHJpZ2dlcl9lcnJvcignTm90IHBhc3NpbmcgYSByZXBvc2l0b3J5IG1hbmFnZXIgd2hlbiBjYWxsaW5nIGRlZmF1bHRSZXBvcyBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMy42LCB1c2UgZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCkgaW5zdGVhZCBpZiB5b3UgY2Fubm90IGdldCBhIG1hbmFnZXIuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgppZiAobnVsbCA9PT0gJGNvbmZpZykgewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCRpbyk7Cn0KaWYgKG51bGwgIT09ICRpbykgewokaW8tPmxvYWRDb25maWd1cmF0aW9uKCRjb25maWcpOwp9CmlmIChudWxsID09PSAkcm0pIHsKaWYgKG51bGwgPT09ICRpbykgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBlaXRoZXIgYW4gSU9JbnRlcmZhY2Ugb3IgYSBSZXBvc2l0b3J5TWFuYWdlcicpOwp9CiRybSA9IHN0YXRpYzo6bWFuYWdlcigkaW8sICRjb25maWcsIEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZykpOwp9CgpyZXR1cm4gc2VsZjo6Y3JlYXRlUmVwb3MoJHJtLCAkY29uZmlnLT5nZXRSZXBvc2l0b3JpZXMoKSk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hbmFnZXIoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwsID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKTogUmVwb3NpdG9yeU1hbmFnZXIKewppZiAoJGh0dHBEb3dubG9hZGVyID09PSBudWxsKSB7CiRodHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7Cn0KaWYgKCRwcm9jZXNzID09PSBudWxsKSB7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokcHJvY2Vzcy0+ZW5hYmxlQXN5bmMoKTsKfQoKJHJtID0gbmV3IFJlcG9zaXRvcnlNYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkcHJvY2Vzcyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdjb21wb3NlcicsICdDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2VyUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygndmNzJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygncGFja2FnZScsICdDb21wb3NlclxSZXBvc2l0b3J5XFBhY2thZ2VSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdwZWFyJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcUGVhclJlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2dpdCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2JpdGJ1Y2tldCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2dpdC1iaXRidWNrZXQnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdnaXRodWInLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdnaXRsYWInLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdzdm4nLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdmb3NzaWwnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdwZXJmb3JjZScsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2hnJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnYXJ0aWZhY3QnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxBcnRpZmFjdFJlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3BhdGgnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxQYXRoUmVwb3NpdG9yeScpOwoKcmV0dXJuICRybTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoSU9JbnRlcmZhY2UgJGlvKTogYXJyYXkKewokbWFuYWdlciA9IFJlcG9zaXRvcnlGYWN0b3J5OjptYW5hZ2VyKCRpbywgJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pKTsKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKCnJldHVybiBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zKCRpbywgJGNvbmZpZywgJG1hbmFnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVJlcG9zKFJlcG9zaXRvcnlNYW5hZ2VyICRybSwgYXJyYXkgJHJlcG9Db25maWdzKTogYXJyYXkKewokcmVwb3MgPSBbXTsKCmZvcmVhY2ggKCRyZXBvQ29uZmlncyBhcyAkaW5kZXggPT4gJHJlcG8pIHsKaWYgKGlzX3N0cmluZygkcmVwbykpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJyJyZXBvc2l0b3JpZXMiIHNob3VsZCBiZSBhbiBhcnJheSBvZiByZXBvc2l0b3J5IGRlZmluaXRpb25zLCBvbmx5IGEgc2luZ2xlIHJlcG9zaXRvcnkgd2FzIGdpdmVuJyk7Cn0KaWYgKCFpc19hcnJheSgkcmVwbykpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1JlcG9zaXRvcnkgIicuJGluZGV4LiciICgnLmpzb25fZW5jb2RlKCRyZXBvKS4nKSBzaG91bGQgYmUgYW4gYXJyYXksICcuZ2V0dHlwZSgkcmVwbykuJyBnaXZlbicpOwp9CmlmICghaXNzZXQoJHJlcG9bJ3R5cGUnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1JlcG9zaXRvcnkgIicuJGluZGV4LiciICgnLmpzb25fZW5jb2RlKCRyZXBvKS4nKSBtdXN0IGhhdmUgYSB0eXBlIGRlZmluZWQnKTsKfQoKJG5hbWUgPSBzZWxmOjpnZW5lcmF0ZVJlcG9zaXRvcnlOYW1lKCRpbmRleCwgJHJlcG8sICRyZXBvcyk7CmlmICgkcmVwb1sndHlwZSddID09PSAnZmlsZXN5c3RlbScpIHsKJHJlcG9zWyRuYW1lXSA9IG5ldyBGaWxlc3lzdGVtUmVwb3NpdG9yeSgkcmVwb1snanNvbiddKTsKfSBlbHNlIHsKJHJlcG9zWyRuYW1lXSA9ICRybS0+Y3JlYXRlUmVwb3NpdG9yeSgkcmVwb1sndHlwZSddLCAkcmVwbywgKHN0cmluZykgJGluZGV4KTsKfQp9CgpyZXR1cm4gJHJlcG9zOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TmFtZSgkaW5kZXgsIGFycmF5ICRyZXBvLCBhcnJheSAkZXhpc3RpbmdSZXBvcyk6IHN0cmluZwp7CiRuYW1lID0gaXNfaW50KCRpbmRleCkgJiYgaXNzZXQoJHJlcG9bJ3VybCddKSA/IFByZWc6OnJlcGxhY2UoJ3teaHR0cHM/Oi8vfWknLCAnJywgJHJlcG9bJ3VybCddKSA6IChzdHJpbmcpICRpbmRleDsKd2hpbGUgKGlzc2V0KCRleGlzdGluZ1JlcG9zWyRuYW1lXSkpIHsKJG5hbWUgLj0gJzInOwp9CgpyZXR1cm4gJG5hbWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCgoKCgppbnRlcmZhY2UgUmVwb3NpdG9yeUludGVyZmFjZSBleHRlbmRzIFxDb3VudGFibGUKewpwdWJsaWMgY29uc3QgU0VBUkNIX0ZVTExURVhUID0gMDsKcHVibGljIGNvbnN0IFNFQVJDSF9OQU1FID0gMTsKcHVibGljIGNvbnN0IFNFQVJDSF9WRU5ET1IgPSAyOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2Uoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTsKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKHN0cmluZyAkcGFja2FnZU5hbWUpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgoKCgpjbGFzcyBSZXBvc2l0b3J5TWFuYWdlcgp7Cgpwcml2YXRlICRsb2NhbFJlcG9zaXRvcnk7Cgpwcml2YXRlICRyZXBvc2l0b3JpZXMgPSBbXTsKCnByaXZhdGUgJHJlcG9zaXRvcnlDbGFzc2VzID0gW107Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGh0dHBEb3dubG9hZGVyOwoKcHJpdmF0ZSAkZXZlbnREaXNwYXRjaGVyOwoKcHJpdmF0ZSAkcHJvY2VzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2Uoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCk6ID9QYWNrYWdlSW50ZXJmYWNlCnsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKaWYgKCRwYWNrYWdlID0gJHJlcG9zaXRvcnktPmZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCkpIHsKcmV0dXJuICRwYWNrYWdlOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG9zaXRvcnkpIHsKJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHBhY2thZ2VzLCAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCkpOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkCnsKJHRoaXMtPnJlcG9zaXRvcmllc1tdID0gJHJlcG9zaXRvcnk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewphcnJheV91bnNoaWZ0KCR0aGlzLT5yZXBvc2l0b3JpZXMsICRyZXBvc2l0b3J5KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUmVwb3NpdG9yeShzdHJpbmcgJHR5cGUsIGFycmF5ICRjb25maWcsID9zdHJpbmcgJG5hbWUgPSBudWxsKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CmlmICghaXNzZXQoJHRoaXMtPnJlcG9zaXRvcnlDbGFzc2VzWyR0eXBlXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1JlcG9zaXRvcnkgdHlwZSBpcyBub3QgcmVnaXN0ZXJlZDogJy4kdHlwZSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydwYWNrYWdpc3QnXSkgJiYgZmFsc2UgPT09ICRjb25maWdbJ3BhY2thZ2lzdCddKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UmVwb3NpdG9yeSAiJy4kbmFtZS4nIiAoJy5qc29uX2VuY29kZSgkY29uZmlnKS4nKSBoYXMgYSBwYWNrYWdpc3Qga2V5IHdoaWNoIHNob3VsZCBiZSBpbiBpdHMgb3duIHJlcG9zaXRvcnkgZGVmaW5pdGlvbjwvd2FybmluZz4nKTsKfQoKJGNsYXNzID0gJHRoaXMtPnJlcG9zaXRvcnlDbGFzc2VzWyR0eXBlXTsKCmlmIChpc3NldCgkY29uZmlnWydvbmx5J10pIHx8IGlzc2V0KCRjb25maWdbJ2V4Y2x1ZGUnXSkgfHwgaXNzZXQoJGNvbmZpZ1snY2Fub25pY2FsJ10pKSB7CiRmaWx0ZXJDb25maWcgPSAkY29uZmlnOwp1bnNldCgkY29uZmlnWydvbmx5J10sICRjb25maWdbJ2V4Y2x1ZGUnXSwgJGNvbmZpZ1snY2Fub25pY2FsJ10pOwp9CgokcmVwb3NpdG9yeSA9IG5ldyAkY2xhc3MoJGNvbmZpZywgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICR0aGlzLT5ldmVudERpc3BhdGNoZXIsICR0aGlzLT5wcm9jZXNzKTsKCmlmIChpc3NldCgkZmlsdGVyQ29uZmlnKSkgewokcmVwb3NpdG9yeSA9IG5ldyBGaWx0ZXJSZXBvc2l0b3J5KCRyZXBvc2l0b3J5LCAkZmlsdGVyQ29uZmlnKTsKfQoKcmV0dXJuICRyZXBvc2l0b3J5Owp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeUNsYXNzKHN0cmluZyAkdHlwZSwgJGNsYXNzKTogdm9pZAp7CiR0aGlzLT5yZXBvc2l0b3J5Q2xhc3Nlc1skdHlwZV0gPSAkY2xhc3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yaWVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NhbFJlcG9zaXRvcnkoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewokdGhpcy0+bG9jYWxSZXBvc2l0b3J5ID0gJHJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbFJlcG9zaXRvcnkoKTogSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+bG9jYWxSZXBvc2l0b3J5Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgoKCgoKCmNsYXNzIFJlcG9zaXRvcnlTZWN1cml0eUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sT3B0aW1pemVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvb2w7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbEJ1aWxkZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUmVxdWVzdDsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxBZHZpc29yeVxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFN0YWJpbGl0eUZpbHRlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgUmVwb3NpdG9yeVNldAp7CgoKCnB1YmxpYyBjb25zdCBBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMgPSAxOwoKCgpwdWJsaWMgY29uc3QgQUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTID0gMjsKCgoKCgpwcml2YXRlICRyb290QWxpYXNlczsKCgoKCgpwcml2YXRlICRyb290UmVmZXJlbmNlczsKCgpwcml2YXRlICRyZXBvc2l0b3JpZXMgPSBbXTsKCgoKCgpwcml2YXRlICRhY2NlcHRhYmxlU3RhYmlsaXRpZXM7CgoKCgoKcHJpdmF0ZSAkc3RhYmlsaXR5RmxhZ3M7CgoKCgoKcHJpdmF0ZSAkcm9vdFJlcXVpcmVzOwoKCgoKcHJpdmF0ZSAkdGVtcG9yYXJ5Q29uc3RyYWludHM7CgoKcHJpdmF0ZSAkbG9ja2VkID0gZmFsc2U7Cgpwcml2YXRlICRhbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcyA9IGZhbHNlOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSA9ICdzdGFibGUnLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBbXSwgYXJyYXkgJHJvb3RBbGlhc2VzID0gW10sIGFycmF5ICRyb290UmVmZXJlbmNlcyA9IFtdLCBhcnJheSAkcm9vdFJlcXVpcmVzID0gW10sIGFycmF5ICR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdKQp7CiR0aGlzLT5yb290QWxpYXNlcyA9IHNlbGY6OmdldFJvb3RBbGlhc2VzUGVyUGFja2FnZSgkcm9vdEFsaWFzZXMpOwokdGhpcy0+cm9vdFJlZmVyZW5jZXMgPSAkcm9vdFJlZmVyZW5jZXM7CgokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gW107CmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXMgYXMgJHN0YWJpbGl0eSA9PiAkdmFsdWUpIHsKaWYgKCR2YWx1ZSA8PSBCYXNlUGFja2FnZTo6JHN0YWJpbGl0aWVzWyRtaW5pbXVtU3RhYmlsaXR5XSkgewokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzWyRzdGFiaWxpdHldID0gJHZhbHVlOwp9Cn0KJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdFJlcXVpcmVzID0gJHJvb3RSZXF1aXJlczsKZm9yZWFjaCAoJHJvb3RSZXF1aXJlcyBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkpIHsKdW5zZXQoJHRoaXMtPnJvb3RSZXF1aXJlc1skbmFtZV0pOwp9Cn0KCiR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cyA9ICR0ZW1wb3JhcnlDb25zdHJhaW50czsKfQoKcHVibGljIGZ1bmN0aW9uIGFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKGJvb2wgJGFsbG93ID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMgPSAkYWxsb3c7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yb290UmVxdWlyZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUZW1wb3JhcnlDb25zdHJhaW50cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbyk6IHZvaWQKewppZiAoJHRoaXMtPmxvY2tlZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlBvb2wgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGZyb20gdGhpcyByZXBvc2l0b3J5IHNldCwgaXQgY2Fubm90IGJlIG1vZGlmaWVkIGFueW1vcmUuIik7Cn0KCmlmICgkcmVwbyBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlcG9zaXRvcnkpIHsKJHJlcG9zID0gJHJlcG8tPmdldFJlcG9zaXRvcmllcygpOwp9IGVsc2UgewokcmVwb3MgPSBbJHJlcG9dOwp9Cgpmb3JlYWNoICgkcmVwb3MgYXMgJHJlcG8pIHsKJHRoaXMtPnJlcG9zaXRvcmllc1tdID0gJHJlcG87Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsLCBpbnQgJGZsYWdzID0gMCk6IGFycmF5CnsKJGlnbm9yZVN0YWJpbGl0eSA9ICgkZmxhZ3MgJiBzZWxmOjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpICE9PSAwOwokbG9hZEZyb21BbGxSZXBvcyA9ICgkZmxhZ3MgJiBzZWxmOjpBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMpICE9PSAwOwoKJHBhY2thZ2VzID0gW107CmlmICgkbG9hZEZyb21BbGxSZXBvcykgewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CiRwYWNrYWdlc1tdID0gJHJlcG9zaXRvcnktPmZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQpID86IFtdOwp9Cn0gZWxzZSB7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKJHJlc3VsdCA9ICRyZXBvc2l0b3J5LT5sb2FkUGFja2FnZXMoWyRuYW1lID0+ICRjb25zdHJhaW50XSwgJGlnbm9yZVN0YWJpbGl0eSA/IEJhc2VQYWNrYWdlOjokc3RhYmlsaXRpZXMgOiAkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkaWdub3JlU3RhYmlsaXR5ID8gW10gOiAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MpOwoKJHBhY2thZ2VzW10gPSAkcmVzdWx0WydwYWNrYWdlcyddOwpmb3JlYWNoICgkcmVzdWx0WyduYW1lc0ZvdW5kJ10gYXMgJG5hbWVGb3VuZCkgewoKaWYgKCRuYW1lID09PSAkbmFtZUZvdW5kKSB7CmJyZWFrIDI7Cn0KfQp9Cn0KCiRjYW5kaWRhdGVzID0gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdOwoKCmlmICgkaWdub3JlU3RhYmlsaXR5IHx8ICEkbG9hZEZyb21BbGxSZXBvcykgewpyZXR1cm4gJGNhbmRpZGF0ZXM7Cn0KCiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJHRoaXMtPmlzUGFja2FnZUFjY2VwdGFibGUoJGNhbmRpZGF0ZS0+Z2V0TmFtZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0U3RhYmlsaXR5KCkpKSB7CiRyZXN1bHRbXSA9ICRjYW5kaWRhdGU7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlTmFtZXMsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKJG1hcCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRuYW1lKSB7CiRtYXBbJG5hbWVdID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgpyZXR1cm4gJHRoaXMtPmdldFNlY3VyaXR5QWR2aXNvcmllc0ZvckNvbnN0cmFpbnRzKCRtYXAsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZXMsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKJG1hcCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJG1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0U2VjdXJpdHlBZHZpc29yaWVzRm9yQ29uc3RyYWludHMoJG1hcCwgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTZWN1cml0eUFkdmlzb3JpZXNGb3JDb25zdHJhaW50cyhhcnJheSAkcGFja2FnZUNvbnN0cmFpbnRNYXAsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMpOiBhcnJheQp7CiRyZXBvQWR2aXNvcmllcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CmlmICghJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlIHx8ICEkcmVwb3NpdG9yeS0+aGFzU2VjdXJpdHlBZHZpc29yaWVzKCkpIHsKY29udGludWU7Cn0KCiRyZXBvQWR2aXNvcmllc1tdID0gJHJlcG9zaXRvcnktPmdldFNlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZUNvbnN0cmFpbnRNYXAsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzKVsnYWR2aXNvcmllcyddOwp9CgokYWR2aXNvcmllcyA9IGFycmF5X21lcmdlX3JlY3Vyc2l2ZShbXSwgLi4uJHJlcG9BZHZpc29yaWVzKTsKa3NvcnQoJGFkdmlzb3JpZXMpOwoKcmV0dXJuICRhZHZpc29yaWVzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycyhzdHJpbmcgJHBhY2thZ2VOYW1lKTogYXJyYXkKewokcHJvdmlkZXJzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKaWYgKCRyZXBvUHJvdmlkZXJzID0gJHJlcG9zaXRvcnktPmdldFByb3ZpZGVycygkcGFja2FnZU5hbWUpKSB7CiRwcm92aWRlcnMgPSBhcnJheV9tZXJnZSgkcHJvdmlkZXJzLCAkcmVwb1Byb3ZpZGVycyk7Cn0KfQoKcmV0dXJuICRwcm92aWRlcnM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1BhY2thZ2VBY2NlcHRhYmxlKGFycmF5ICRuYW1lcywgc3RyaW5nICRzdGFiaWxpdHkpOiBib29sCnsKcmV0dXJuIFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MsICRuYW1lcywgJHN0YWJpbGl0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sKFJlcXVlc3QgJHJlcXVlc3QsIElPSW50ZXJmYWNlICRpbywgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Bvb2xPcHRpbWl6ZXIgJHBvb2xPcHRpbWl6ZXIgPSBudWxsKTogUG9vbAp7CiRwb29sQnVpbGRlciA9IG5ldyBQb29sQnVpbGRlcigkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MsICR0aGlzLT5yb290QWxpYXNlcywgJHRoaXMtPnJvb3RSZWZlcmVuY2VzLCAkaW8sICRldmVudERpc3BhdGNoZXIsICRwb29sT3B0aW1pemVyLCAkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMpOwoKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwbykgewppZiAoKCRyZXBvIGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSB8fCAkcmVwbyBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnkpICYmICEkdGhpcy0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIHBvb2wgY2FuIG5vdCBhY2NlcHQgcGFja2FnZXMgZnJvbSBhbiBpbnN0YWxsZWQgcmVwb3NpdG9yeScpOwp9Cn0KCiR0aGlzLT5sb2NrZWQgPSB0cnVlOwoKcmV0dXJuICRwb29sQnVpbGRlci0+YnVpbGRQb29sKCR0aGlzLT5yZXBvc2l0b3JpZXMsICRyZXF1ZXN0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVBvb2xXaXRoQWxsUGFja2FnZXMoKTogUG9vbAp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKaWYgKCgkcmVwbyBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgfHwgJHJlcG8gaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5KSAmJiAhJHRoaXMtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBwb29sIGNhbiBub3QgYWNjZXB0IHBhY2thZ2VzIGZyb20gYW4gaW5zdGFsbGVkIHJlcG9zaXRvcnknKTsKfQp9CgokdGhpcy0+bG9ja2VkID0gdHJ1ZTsKCiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7CgppZiAoaXNzZXQoJHRoaXMtPnJvb3RBbGlhc2VzWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldKSkgewokYWxpYXMgPSAkdGhpcy0+cm9vdEFsaWFzZXNbJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV07CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CiRhbGlhc1BhY2thZ2UgPSBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLCAkYWxpYXNbJ2FsaWFzJ10pOwp9IGVsc2UgewokYWxpYXNQYWNrYWdlID0gbmV3IEFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzWydhbGlhc19ub3JtYWxpemVkJ10sICRhbGlhc1snYWxpYXMnXSk7Cn0KJGFsaWFzUGFja2FnZS0+c2V0Um9vdFBhY2thZ2VBbGlhcyh0cnVlKTsKJHBhY2thZ2VzW10gPSAkYWxpYXNQYWNrYWdlOwp9Cn0KfQoKcmV0dXJuIG5ldyBQb29sKCRwYWNrYWdlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sRm9yUGFja2FnZShzdHJpbmcgJHBhY2thZ2VOYW1lLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwbyA9IG51bGwpOiBQb29sCnsKCnJldHVybiAkdGhpcy0+Y3JlYXRlUG9vbEZvclBhY2thZ2VzKFskcGFja2FnZU5hbWVdLCAkbG9ja2VkUmVwbyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sRm9yUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lcywgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG8gPSBudWxsKTogUG9vbAp7CiRyZXF1ZXN0ID0gbmV3IFJlcXVlc3QoJGxvY2tlZFJlcG8pOwoKJGFsbG93ZWRQYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRwYWNrYWdlTmFtZSkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZU5hbWUpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2NyZWF0ZVBvb2xGb3JQYWNrYWdlKHMpIGNhbiBub3QgYmUgdXNlZCBmb3IgcGxhdGZvcm0gcGFja2FnZXMsIGFzIHRoZXkgYXJlIG5ldmVyIGxvYWRlZCBieSB0aGUgUG9vbEJ1aWxkZXIgd2hpY2ggZXhwZWN0cyB0aGVtIHRvIGJlIGZpeGVkLiBVc2UgY3JlYXRlUG9vbFdpdGhBbGxQYWNrYWdlcyBvciBwYXNzIGluIGEgcHJvcGVyIHJlcXVlc3Qgd2l0aCB0aGUgcGxhdGZvcm0gcGFja2FnZXMgeW91IG5lZWQgZml4ZWQgaW4gaXQuJyk7Cn0KCiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkcGFja2FnZU5hbWUpOwokYWxsb3dlZFBhY2thZ2VzW10gPSBzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSk7Cn0KCmlmIChjb3VudCgkYWxsb3dlZFBhY2thZ2VzKSA+IDApIHsKJHJlcXVlc3QtPnJlc3RyaWN0UGFja2FnZXMoJGFsbG93ZWRQYWNrYWdlcyk7Cn0KCnJldHVybiAkdGhpcy0+Y3JlYXRlUG9vbCgkcmVxdWVzdCwgbmV3IE51bGxJTygpKTsKfQoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Um9vdEFsaWFzZXNQZXJQYWNrYWdlKGFycmF5ICRhbGlhc2VzKTogYXJyYXkKewokbm9ybWFsaXplZEFsaWFzZXMgPSBbXTsKCmZvcmVhY2ggKCRhbGlhc2VzIGFzICRhbGlhcykgewokbm9ybWFsaXplZEFsaWFzZXNbJGFsaWFzWydwYWNrYWdlJ11dWyRhbGlhc1sndmVyc2lvbiddXSA9IFsKJ2FsaWFzJyA9PiAkYWxpYXNbJ2FsaWFzJ10sCidhbGlhc19ub3JtYWxpemVkJyA9PiAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwKXTsKfQoKcmV0dXJuICRub3JtYWxpemVkQWxpYXNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgUmVwb3NpdG9yeVV0aWxzCnsKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmlsdGVyUmVxdWlyZWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMsIFBhY2thZ2VJbnRlcmZhY2UgJHJlcXVpcmVyLCBhcnJheSAkYnVja2V0ID0gW10pOiBhcnJheQp7CiRyZXF1aXJlcyA9ICRyZXF1aXJlci0+Z2V0UmVxdWlyZXMoKTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkY2FuZGlkYXRlKSB7CmZvcmVhY2ggKCRjYW5kaWRhdGUtPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCRyZXF1aXJlc1skbmFtZV0pKSB7CmlmICghaW5fYXJyYXkoJGNhbmRpZGF0ZSwgJGJ1Y2tldCwgdHJ1ZSkpIHsKJGJ1Y2tldFtdID0gJGNhbmRpZGF0ZTsKJGJ1Y2tldCA9IHNlbGY6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJHBhY2thZ2VzLCAkY2FuZGlkYXRlLCAkYnVja2V0KTsKfQpicmVhazsKfQp9Cn0KCnJldHVybiAkYnVja2V0Owp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmxhdHRlblJlcG9zaXRvcmllcyhSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBib29sICR1bndyYXBGaWx0ZXJSZXBvcyA9IHRydWUpOiBhcnJheQp7CgppZiAoJHVud3JhcEZpbHRlclJlcG9zICYmICRyZXBvIGluc3RhbmNlb2YgRmlsdGVyUmVwb3NpdG9yeSkgewokcmVwbyA9ICRyZXBvLT5nZXRSZXBvc2l0b3J5KCk7Cn0KCmlmICghJHJlcG8gaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CnJldHVybiBbJHJlcG9dOwp9CgokcmVwb3MgPSBbXTsKZm9yZWFjaCAoJHJlcG8tPmdldFJlcG9zaXRvcmllcygpIGFzICRyKSB7CmZvcmVhY2ggKHNlbGY6OmZsYXR0ZW5SZXBvc2l0b3JpZXMoJHIsICR1bndyYXBGaWx0ZXJSZXBvcykgYXMgJHIyKSB7CiRyZXBvc1tdID0gJHIyOwp9Cn0KCnJldHVybiAkcmVwb3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgoKCmNsYXNzIFJvb3RQYWNrYWdlUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeQp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KFskcGFja2FnZV0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdyb290IHBhY2thZ2UgcmVwbyc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKY2xhc3MgRm9zc2lsRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyID0gbnVsbDsKCnByb3RlY3RlZCAkcmVwb0ZpbGUgPSBudWxsOwoKcHJvdGVjdGVkICRjaGVja291dERpcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewoKJHRoaXMtPmNoZWNrRm9zc2lsKCk7CgoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdGhpcy0+dXJsLCAkdGhpcy0+aW8pOwoKCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHRoaXMtPnVybCkgJiYgaXNfZGlyKCR0aGlzLT51cmwpKSB7CiR0aGlzLT5jaGVja291dERpciA9ICR0aGlzLT51cmw7Cn0gZWxzZSB7CmlmICghQ2FjaGU6OmlzVXNhYmxlKCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSkgfHwgIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGb3NzaWxEcml2ZXIgcmVxdWlyZXMgYSB1c2FibGUgY2FjaGUgZGlyZWN0b3J5LCBhbmQgaXQgbG9va3MgbGlrZSB5b3Ugc2V0IGl0IHRvIGJlIGRpc2FibGVkJyk7Cn0KCiRsb2NhbE5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTldfWknLCAnLScsICR0aGlzLT51cmwpOwokdGhpcy0+cmVwb0ZpbGUgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykgLiAnLycgLiAkbG9jYWxOYW1lIC4gJy5mb3NzaWwnOwokdGhpcy0+Y2hlY2tvdXREaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSAuICcvJyAuICRsb2NhbE5hbWUgLiAnLyc7CgokdGhpcy0+dXBkYXRlTG9jYWxSZXBvKCk7Cn0KCiR0aGlzLT5nZXRUYWdzKCk7CiR0aGlzLT5nZXRCcmFuY2hlcygpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tGb3NzaWwoKTogdm9pZAp7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIHZlcnNpb24nLCAkaWdub3JlZE91dHB1dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJmb3NzaWwgd2FzIG5vdCBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWQgYW5kIGluIHlvdXIgUEFUSCBlbnYuXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsUmVwbygpOiB2b2lkCnsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRoaXMtPmNoZWNrb3V0RGlyKTsKCmlmICghaXNfd3JpdGFibGUoZGlybmFtZSgkdGhpcy0+Y2hlY2tvdXREaXIpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NhbiBub3QgY2xvbmUgJy4kdGhpcy0+dXJsLicgdG8gYWNjZXNzIHBhY2thZ2UgaW5mb3JtYXRpb24uIFRoZSAiJy4kdGhpcy0+Y2hlY2tvdXREaXIuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgoKaWYgKGlzX2ZpbGUoJHRoaXMtPnJlcG9GaWxlKSAmJiBpc19kaXIoJHRoaXMtPmNoZWNrb3V0RGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIGluZm8nLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpKSB7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIHB1bGwnLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byB1cGRhdGUgJy4kdGhpcy0+dXJsLicsIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHJlcG9zaXRvcnkgbWF5IGJlIG91dGRhdGVkICgnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLicpPC9lcnJvcj4nKTsKfQp9IGVsc2UgewoKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHRoaXMtPmNoZWNrb3V0RGlyKTsKJGZzLT5yZW1vdmUoJHRoaXMtPnJlcG9GaWxlKTsKCiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0aGlzLT5jaGVja291dERpcik7CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoc3ByaW50ZignZm9zc2lsIGNsb25lIC0tICVzICVzJywgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHRoaXMtPnVybCksIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0aGlzLT5yZXBvRmlsZSkpLCAkb3V0cHV0KSkgewokb3V0cHV0ID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBjbG9uZSAnLiR0aGlzLT51cmwuJyB0byByZXBvc2l0b3J5ICcgLiAkdGhpcy0+cmVwb0ZpbGUgLiAiXG5cbiIgLiRvdXRwdXQpOwp9CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoc3ByaW50ZignZm9zc2lsIG9wZW4gLS1uZXN0ZWQgLS0gJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdGhpcy0+cmVwb0ZpbGUpKSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKSkgewokb3V0cHV0ID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBvcGVuIHJlcG9zaXRvcnkgJy4kdGhpcy0+cmVwb0ZpbGUuJyBpbiAnIC4gJHRoaXMtPmNoZWNrb3V0RGlyIC4gIlxuXG4iIC4kb3V0cHV0KTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICd0cnVuayc7Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnZm9zc2lsJywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKJGNvbW1hbmQgPSBzcHJpbnRmKCdmb3NzaWwgY2F0IC1yICVzIC0tICVzJywgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGlkZW50aWZpZXIpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkZmlsZSkpOwokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGNvbnRlbnQsICR0aGlzLT5jaGVja291dERpcik7CgppZiAoIXRyaW0oJGNvbnRlbnQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIGZpbmZvIC1iIC1uIDEgY29tcG9zZXIuanNvbicsICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcik7ClssICRkYXRlXSA9IGV4cGxvZGUoJyAnLCB0cmltKCRvdXRwdXQpLCAzKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRkYXRlLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2Zvc3NpbCB0YWcgbGlzdCcsICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICR0YWcpIHsKJHRhZ3NbJHRhZ10gPSAkdGFnOwp9CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZm9zc2lsIGJyYW5jaCBsaXN0JywgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewokYnJhbmNoID0gdHJpbShQcmVnOjpyZXBsYWNlKCcvXlwqLycsICcnLCB0cmltKCRicmFuY2gpKSk7CiRicmFuY2hlc1skYnJhbmNoXSA9ICRicmFuY2g7Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmIChQcmVnOjppc01hdGNoKCcjKF4oPzpodHRwcz98c3NoKTovLyg/OlteQF1AKT8oPzpjaGlzZWxhcHBcLmNvbXxmb3NzaWxcLikpI2knLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJyEvZm9zc2lsL3xcLmZvc3NpbCEnLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewokdXJsID0gRmlsZXN5c3RlbTo6Z2V0UGxhdGZvcm1QYXRoKCR1cmwpOwppZiAoIWlzX2RpcigkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwoKaWYgKCRwcm9jZXNzLT5leGVjdXRlKCdmb3NzaWwgaW5mbycsICRvdXRwdXQsICR1cmwpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxCaXRidWNrZXQ7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgoKCgpjbGFzcyBHaXRCaXRidWNrZXREcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICRvd25lcjsKCnByb3RlY3RlZCAkcmVwb3NpdG9yeTsKCnByaXZhdGUgJGhhc0lzc3VlcyA9IGZhbHNlOwoKcHJpdmF0ZSAkcm9vdElkZW50aWZpZXI7Cgpwcml2YXRlICR0YWdzOwoKcHJpdmF0ZSAkYnJhbmNoZXM7Cgpwcml2YXRlICRicmFuY2hlc1VybCA9ICcnOwoKcHJpdmF0ZSAkdGFnc1VybCA9ICcnOwoKcHJpdmF0ZSAkaG9tZVVybCA9ICcnOwoKcHJpdmF0ZSAkd2Vic2l0ZSA9ICcnOwoKcHJpdmF0ZSAkY2xvbmVIdHRwc1VybCA9ICcnOwoKcHJpdmF0ZSAkcmVwb0RhdGE7CgoKCgpwcm90ZWN0ZWQgJGZhbGxiYWNrRHJpdmVyID0gbnVsbDsKCnByaXZhdGUgJHZjc1R5cGU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXmh0dHBzPzovL2JpdGJ1Y2tldFwub3JnLyhbXi9dKykvKFteL10rPykoPzpcLmdpdHwvPyk/JCNpJywgJHRoaXMtPnVybCwgJG1hdGNoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgQml0YnVja2V0IHJlcG9zaXRvcnkgVVJMICVzIGlzIGludmFsaWQuIEl0IG11c3QgYmUgdGhlIEhUVFBTIFVSTCBvZiBhIEJpdGJ1Y2tldCByZXBvc2l0b3J5LicsICR0aGlzLT51cmwpKTsKfQoKJHRoaXMtPm93bmVyID0gJG1hdGNoWzFdOwokdGhpcy0+cmVwb3NpdG9yeSA9ICRtYXRjaFsyXTsKJHRoaXMtPm9yaWdpblVybCA9ICdiaXRidWNrZXQub3JnJzsKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKAokdGhpcy0+aW8sCmltcGxvZGUoJy8nLCBbCiR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSwKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKXSkKKTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFVybCgpOwp9CgpyZXR1cm4gJHRoaXMtPmNsb25lSHR0cHNVcmw7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZXBvRGF0YSgpOiBib29sCnsKJHJlc291cmNlID0gc3ByaW50ZigKJ2h0dHBzOi8vYXBpLmJpdGJ1Y2tldC5vcmcvMi4wL3JlcG9zaXRvcmllcy8lcy8lcz8lcycsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCmh0dHBfYnVpbGRfcXVlcnkoClsnZmllbGRzJyA9PiAnLXByb2plY3QsLW93bmVyJ10sCicnLAonJicKKQopOwoKJHJlcG9EYXRhID0gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlLCB0cnVlKS0+ZGVjb2RlSnNvbigpOwppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiBmYWxzZTsKfQokdGhpcy0+cGFyc2VDbG9uZVVybHMoJHJlcG9EYXRhWydsaW5rcyddWydjbG9uZSddKTsKCiR0aGlzLT5oYXNJc3N1ZXMgPSAhZW1wdHkoJHJlcG9EYXRhWydoYXNfaXNzdWVzJ10pOwokdGhpcy0+YnJhbmNoZXNVcmwgPSAkcmVwb0RhdGFbJ2xpbmtzJ11bJ2JyYW5jaGVzJ11bJ2hyZWYnXTsKJHRoaXMtPnRhZ3NVcmwgPSAkcmVwb0RhdGFbJ2xpbmtzJ11bJ3RhZ3MnXVsnaHJlZiddOwokdGhpcy0+aG9tZVVybCA9ICRyZXBvRGF0YVsnbGlua3MnXVsnaHRtbCddWydocmVmJ107CiR0aGlzLT53ZWJzaXRlID0gJHJlcG9EYXRhWyd3ZWJzaXRlJ107CiR0aGlzLT52Y3NUeXBlID0gJHJlcG9EYXRhWydzY20nXTsKCiR0aGlzLT5yZXBvRGF0YSA9ICRyZXBvRGF0YTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyKSkgewokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9IGVsc2UgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllciwganNvbl9lbmNvZGUoJGNvbXBvc2VyKSk7Cn0KfQoKaWYgKCRjb21wb3NlciAhPT0gbnVsbCkgewoKaWYgKGlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddKSAmJiAhaXNfYXJyYXkoJGNvbXBvc2VyWydzdXBwb3J0J10pKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddID0gW107Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10pKSB7CiRsYWJlbCA9IGFycmF5X3NlYXJjaCgKJGlkZW50aWZpZXIsCiR0aGlzLT5nZXRUYWdzKCkKKSA/OiBhcnJheV9zZWFyY2goCiRpZGVudGlmaWVyLAokdGhpcy0+Z2V0QnJhbmNoZXMoKQopID86ICRpZGVudGlmaWVyOwoKaWYgKGFycmF5X2tleV9leGlzdHMoJGxhYmVsLCAkdGFncyA9ICR0aGlzLT5nZXRUYWdzKCkpKSB7CiRoYXNoID0gJHRhZ3NbJGxhYmVsXTsKfSBlbHNlaWYgKGFycmF5X2tleV9leGlzdHMoJGxhYmVsLCAkYnJhbmNoZXMgPSAkdGhpcy0+Z2V0QnJhbmNoZXMoKSkpIHsKJGhhc2ggPSAkYnJhbmNoZXNbJGxhYmVsXTsKfQoKaWYgKCFpc3NldCgkaGFzaCkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gc3ByaW50ZigKJ2h0dHBzOi8vJXMvJXMvJXMvc3JjJywKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeQopOwp9IGVsc2UgewokY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10gPSBzcHJpbnRmKAonaHR0cHM6Ly8lcy8lcy8lcy9zcmMvJXMvP2F0PSVzJywKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGhhc2gsCiRsYWJlbAopOwp9Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10pICYmICR0aGlzLT5oYXNJc3N1ZXMpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddID0gc3ByaW50ZigKJ2h0dHBzOi8vJXMvJXMvJXMvaXNzdWVzJywKJHRoaXMtPm9yaWdpblVybCwKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeQopOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydob21lcGFnZSddKSkgewokY29tcG9zZXJbJ2hvbWVwYWdlJ10gPSBlbXB0eSgkdGhpcy0+d2Vic2l0ZSkgPyAkdGhpcy0+aG9tZVVybCA6ICR0aGlzLT53ZWJzaXRlOwp9Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldEZpbGVDb250ZW50KCRmaWxlLCAkaWRlbnRpZmllcik7Cn0KCmlmIChzdHJwb3MoJGlkZW50aWZpZXIsICcvJykgIT09IGZhbHNlKSB7CiRicmFuY2hlcyA9ICR0aGlzLT5nZXRCcmFuY2hlcygpOwppZiAoaXNzZXQoJGJyYW5jaGVzWyRpZGVudGlmaWVyXSkpIHsKJGlkZW50aWZpZXIgPSAkYnJhbmNoZXNbJGlkZW50aWZpZXJdOwp9Cn0KCiRyZXNvdXJjZSA9IHNwcmludGYoCidodHRwczovL2FwaS5iaXRidWNrZXQub3JnLzIuMC9yZXBvc2l0b3JpZXMvJXMvJXMvc3JjLyVzLyVzJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGlkZW50aWZpZXIsCiRmaWxlCik7CgpyZXR1cm4gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlKS0+Z2V0Qm9keSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXRDaGFuZ2VEYXRlKCRpZGVudGlmaWVyKTsKfQoKaWYgKHN0cnBvcygkaWRlbnRpZmllciwgJy8nKSAhPT0gZmFsc2UpIHsKJGJyYW5jaGVzID0gJHRoaXMtPmdldEJyYW5jaGVzKCk7CmlmIChpc3NldCgkYnJhbmNoZXNbJGlkZW50aWZpZXJdKSkgewokaWRlbnRpZmllciA9ICRicmFuY2hlc1skaWRlbnRpZmllcl07Cn0KfQoKJHJlc291cmNlID0gc3ByaW50ZigKJ2h0dHBzOi8vYXBpLmJpdGJ1Y2tldC5vcmcvMi4wL3JlcG9zaXRvcmllcy8lcy8lcy9jb21taXQvJXM/ZmllbGRzPWRhdGUnLAokdGhpcy0+b3duZXIsCiR0aGlzLT5yZXBvc2l0b3J5LAokaWRlbnRpZmllcgopOwokY29tbWl0ID0gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlKS0+ZGVjb2RlSnNvbigpOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJGNvbW1pdFsnZGF0ZSddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0U291cmNlKCRpZGVudGlmaWVyKTsKfQoKcmV0dXJuIFsndHlwZScgPT4gJHRoaXMtPnZjc1R5cGUsICd1cmwnID0+ICR0aGlzLT5nZXRVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldERpc3QoJGlkZW50aWZpZXIpOwp9CgokdXJsID0gc3ByaW50ZigKJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy8lcy8lcy9nZXQvJXMuemlwJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGlkZW50aWZpZXIKKTsKCnJldHVybiBbJ3R5cGUnID0+ICd6aXAnLCAndXJsJyA9PiAkdXJsLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllciwgJ3NoYXN1bScgPT4gJyddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0VGFncygpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKJHJlc291cmNlID0gc3ByaW50ZigKJyVzPyVzJywKJHRoaXMtPnRhZ3NVcmwsCmh0dHBfYnVpbGRfcXVlcnkoClsKJ3BhZ2VsZW4nID0+IDEwMCwKJ2ZpZWxkcycgPT4gJ3ZhbHVlcy5uYW1lLHZhbHVlcy50YXJnZXQuaGFzaCxuZXh0JywKJ3NvcnQnID0+ICctdGFyZ2V0LmRhdGUnLApdLAonJywKJyYnCikKKTsKJGhhc05leHQgPSB0cnVlOwp3aGlsZSAoJGhhc05leHQpIHsKJHRhZ3NEYXRhID0gJHRoaXMtPmZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoJHJlc291cmNlKS0+ZGVjb2RlSnNvbigpOwpmb3JlYWNoICgkdGFnc0RhdGFbJ3ZhbHVlcyddIGFzICRkYXRhKSB7CiR0YWdzWyRkYXRhWyduYW1lJ11dID0gJGRhdGFbJ3RhcmdldCddWydoYXNoJ107Cn0KaWYgKGVtcHR5KCR0YWdzRGF0YVsnbmV4dCddKSkgewokaGFzTmV4dCA9IGZhbHNlOwp9IGVsc2UgewokcmVzb3VyY2UgPSAkdGFnc0RhdGFbJ25leHQnXTsKfQp9CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0QnJhbmNoZXMoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKJHJlc291cmNlID0gc3ByaW50ZigKJyVzPyVzJywKJHRoaXMtPmJyYW5jaGVzVXJsLApodHRwX2J1aWxkX3F1ZXJ5KApbCidwYWdlbGVuJyA9PiAxMDAsCidmaWVsZHMnID0+ICd2YWx1ZXMubmFtZSx2YWx1ZXMudGFyZ2V0Lmhhc2gsdmFsdWVzLmhlYWRzLG5leHQnLAonc29ydCcgPT4gJy10YXJnZXQuZGF0ZScsCl0sCicnLAonJicKKQopOwokaGFzTmV4dCA9IHRydWU7CndoaWxlICgkaGFzTmV4dCkgewokYnJhbmNoRGF0YSA9ICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJGJyYW5jaERhdGFbJ3ZhbHVlcyddIGFzICRkYXRhKSB7CiRicmFuY2hlc1skZGF0YVsnbmFtZSddXSA9ICRkYXRhWyd0YXJnZXQnXVsnaGFzaCddOwp9CmlmIChlbXB0eSgkYnJhbmNoRGF0YVsnbmV4dCddKSkgewokaGFzTmV4dCA9IGZhbHNlOwp9IGVsc2UgewokcmVzb3VyY2UgPSAkYnJhbmNoRGF0YVsnbmV4dCddOwp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoV2l0aE9BdXRoQ3JlZGVudGlhbHMoc3RyaW5nICR1cmwsIGJvb2wgJGZldGNoaW5nUmVwb0RhdGEgPSBmYWxzZSk6IFJlc3BvbnNlCnsKdHJ5IHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokYml0YnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCmlmIChpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAzLCA0MDRdLCB0cnVlKSB8fCAoNDAxID09PSAkZS0+Z2V0Q29kZSgpICYmIHN0cnBvcygkZS0+Z2V0TWVzc2FnZSgpLCAnQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0JykgPT09IDApKSB7CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKQomJiAkYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkKKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpICYmICRmZXRjaGluZ1JlcG9EYXRhKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KfQoKdGhyb3cgJGU7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonIC4gJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhdHRlbXB0Q2xvbmVGYWxsYmFjaygpOiBib29sCnsKdHJ5IHsKJHRoaXMtPnNldHVwRmFsbGJhY2tEcml2ZXIoJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5mYWxsYmFja0RyaXZlciA9IG51bGw7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoCic8ZXJyb3I+RmFpbGVkIHRvIGNsb25lIHRoZSAnIC4gJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkgLiAnIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUnCi4gJyBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBCaXRidWNrZXQgT0F1dGggY29uc3VtZXIgY3JlZGVudGlhbHM8L2Vycm9yPicKKTsKdGhyb3cgJGU7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwRmFsbGJhY2tEcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmZhbGxiYWNrRHJpdmVyID0gbmV3IEdpdERyaXZlcigKWyd1cmwnID0+ICR1cmxdLAokdGhpcy0+aW8sCiR0aGlzLT5jb25maWcsCiR0aGlzLT5odHRwRG93bmxvYWRlciwKJHRoaXMtPnByb2Nlc3MKKTsKJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5pbml0aWFsaXplKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUNsb25lVXJscyhhcnJheSAkY2xvbmVMaW5rcyk6IHZvaWQKewpmb3JlYWNoICgkY2xvbmVMaW5rcyBhcyAkY2xvbmVMaW5rKSB7CmlmICgkY2xvbmVMaW5rWyduYW1lJ10gPT09ICdodHRwcycpIHsKCgokdGhpcy0+Y2xvbmVIdHRwc1VybCA9IFByZWc6OnJlcGxhY2UoJy9odHRwczpcL1wvKFteQF0rQCk/LycsICdodHRwczovLycsICRjbG9uZUxpbmtbJ2hyZWYnXSk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CmlmICghJHRoaXMtPmdldFJlcG9EYXRhKCkpIHsKaWYgKCEkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQSBmYWxsYmFjayBkcml2ZXIgc2hvdWxkIGJlIHNldHVwIGlmIGdldFJlcG9EYXRhIHJldHVybnMgZmFsc2UnKTsKfQoKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKTsKfQoKaWYgKCR0aGlzLT52Y3NUeXBlICE9PSAnZ2l0Jykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiR0aGlzLT51cmwuJyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBnaXQgcmVwb3NpdG9yeSwgdXNlICcuCiR0aGlzLT5jbG9uZUh0dHBzVXJsLicgYnV0IHJlbWVtYmVyIHRoYXQgQml0YnVja2V0IG5vIGxvbmdlciBzdXBwb3J0cyB0aGUgbWVyY3VyaWFsIHJlcG9zaXRvcmllcy4gJy4KJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy9ibG9nL3N1bnNldHRpbmctbWVyY3VyaWFsLXN1cHBvcnQtaW4tYml0YnVja2V0JwopOwp9CgokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkdGhpcy0+cmVwb0RhdGFbJ21haW5icmFuY2gnXVsnbmFtZSddID8/ICdtYXN0ZXInOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKaWYgKCFQcmVnOjppc01hdGNoKCcjXmh0dHBzPzovL2JpdGJ1Y2tldFwub3JnLyhbXi9dKykvKFteL10rPykoXC5naXR8Lz8pPyQjaScsICR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGlvLT53cml0ZUVycm9yKCdTa2lwcGluZyBCaXRidWNrZXQgZ2l0IGRyaXZlciBmb3IgJy4kdXJsLicgYmVjYXVzZSB0aGUgT3BlblNTTCBQSFAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CgoKCgpjbGFzcyBHaXREcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXI7Cgpwcm90ZWN0ZWQgJHJlcG9EaXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR0aGlzLT51cmwpKSB7CiR0aGlzLT51cmwgPSBQcmVnOjpyZXBsYWNlKCd7W1xcL11cLmdpdC8/JH0nLCAnJywgJHRoaXMtPnVybCk7CmlmICghaXNfZGlyKCR0aGlzLT51cmwpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIHJlYWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tICcuJHRoaXMtPnVybC4nIGFzIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0Jyk7Cn0KJHRoaXMtPnJlcG9EaXIgPSAkdGhpcy0+dXJsOwokY2FjaGVVcmwgPSByZWFscGF0aCgkdGhpcy0+dXJsKTsKfSBlbHNlIHsKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignR2l0RHJpdmVyIHJlcXVpcmVzIGEgdXNhYmxlIGNhY2hlIGRpcmVjdG9yeSwgYW5kIGl0IGxvb2tzIGxpa2UgeW91IHNldCBpdCB0byBiZSBkaXNhYmxlZCcpOwp9CgokdGhpcy0+cmVwb0RpciA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpIC4gJy8nIC4gUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgJHRoaXMtPnVybCkgLiAnLyc7CgpHaXRVdGlsOjpjbGVhbkVudigpOwoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGhpcy0+cmVwb0RpcikpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5yZXBvRGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuZGlybmFtZSgkdGhpcy0+cmVwb0RpcikuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15zc2g6Ly9bXkBdK0BbXjpdKzpbXjAtOV0rfScsICR0aGlzLT51cmwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgc291cmNlIFVSTCAnLiR0aGlzLT51cmwuJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nLiJcbiIuJ1VzZSBzc2g6Ly9naXRAZXhhbXBsZS5jb206MjIvcGF0aCBvciBqdXN0IGdpdEBleGFtcGxlLmNvbTpwYXRoIGlmIHlvdSBkbyBub3Qgd2FudCB0byBwcm92aWRlIGEgcGFzc3dvcmQgb3IgY3VzdG9tIHBvcnQuJyk7Cn0KCiRnaXRVdGlsID0gbmV3IEdpdFV0aWwoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJGZzKTsKaWYgKCEkZ2l0VXRpbC0+c3luY01pcnJvcigkdGhpcy0+dXJsLCAkdGhpcy0+cmVwb0RpcikpIHsKaWYgKCFpc19kaXIoJHRoaXMtPnJlcG9EaXIpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcuJHRoaXMtPnVybC4nIHRvIHJlYWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIGl0Jyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIHVwZGF0ZSAnLiR0aGlzLT51cmwuJywgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcmVwb3NpdG9yeSBtYXkgYmUgb3V0ZGF0ZWQ8L2Vycm9yPicpOwp9CgokY2FjaGVVcmwgPSAkdGhpcy0+dXJsOwp9CgokdGhpcy0+Z2V0VGFncygpOwokdGhpcy0+Z2V0QnJhbmNoZXMoKTsKCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkY2FjaGVVcmwpKSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICdtYXN0ZXInOwoKJGdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCBuZXcgRmlsZXN5c3RlbSgpKTsKaWYgKCFGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSkgewokZGVmYXVsdEJyYW5jaCA9ICRnaXRVdGlsLT5nZXRNaXJyb3JEZWZhdWx0QnJhbmNoKCR0aGlzLT51cmwsICR0aGlzLT5yZXBvRGlyLCBmYWxzZSk7CmlmICgkZGVmYXVsdEJyYW5jaCAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJGRlZmF1bHRCcmFuY2g7Cn0KfQoKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgYnJhbmNoIC0tbm8tY29sb3InLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CiRicmFuY2hlcyA9ICR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpOwppZiAoIWluX2FycmF5KCcqIG1hc3RlcicsICRicmFuY2hlcykpIHsKZm9yZWFjaCAoJGJyYW5jaGVzIGFzICRicmFuY2gpIHsKaWYgKCRicmFuY2ggJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15cKiArKFxTKyl9JywgJGJyYW5jaCwgJG1hdGNoKSkgewokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkbWF0Y2hbMV07CmJyZWFrOwp9Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsndHlwZScgPT4gJ2dpdCcsICd1cmwnID0+ICR0aGlzLT5nZXRVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CmlmIChpc3NldCgkaWRlbnRpZmllclswXSkgJiYgJGlkZW50aWZpZXJbMF0gPT09ICctJykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgZ2l0IGlkZW50aWZpZXIgZGV0ZWN0ZWQuIElkZW50aWZpZXIgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIC0sIGdpdmVuOiAnIC4gJGlkZW50aWZpZXIpOwp9CgokcmVzb3VyY2UgPSBzcHJpbnRmKCclczolcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRpZGVudGlmaWVyKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGZpbGUpKTsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoc3ByaW50ZignZ2l0IHNob3cgJXMnLCAkcmVzb3VyY2UpLCAkY29udGVudCwgJHRoaXMtPnJlcG9EaXIpOwoKaWYgKCF0cmltKCRjb250ZW50KSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoc3ByaW50ZigKJ2dpdCAtYyBsb2cuc2hvd1NpZ25hdHVyZT1mYWxzZSBsb2cgLTEgLS1mb3JtYXQ9JSVhdCAlcycsClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRpZGVudGlmaWVyKQopLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CgpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgnQCcudHJpbSgkb3V0cHV0KSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRoaXMtPnRhZ3MgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgc2hvdy1yZWYgLS10YWdzIC0tZGVyZWZlcmVuY2UnLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CmZvcmVhY2ggKCRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkdGFnKSB7CmlmICgkdGFnICYmIFByZWc6OmlzTWF0Y2goJ3teKFthLWYwLTldezQwfSkgcmVmcy90YWdzLyhcUys/KShcXlx7XH0pPyR9JywgJHRhZywgJG1hdGNoKSkgewokdGhpcy0+dGFnc1skbWF0Y2hbMl1dID0gKHN0cmluZykgJG1hdGNoWzFdOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBicmFuY2ggLS1uby1jb2xvciAtLW5vLWFiYnJldiAtdicsICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiAhUHJlZzo6aXNNYXRjaCgne14gKlteL10rL0hFQUQgfScsICRicmFuY2gpKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OlwqICk/ICooXFMrKSAqKFthLWYwLTldKykoPzogLiopPyR9JywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYnJhbmNoZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmIChQcmVnOjppc01hdGNoKCcjKF5naXQ6Ly98XC5naXQvPyR8Z2l0KD86b2xpdGUpP0B8Ly9naXRcLnwvL2dpdGh1Yi5jb20vKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKJHVybCA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkdXJsKTsKaWYgKCFpc19kaXIoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKCmlmICgkcHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IHRhZycsICRvdXRwdXQsICR1cmwpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCmlmICghJGRlZXApIHsKcmV0dXJuIGZhbHNlOwp9CgokZ2l0VXRpbCA9IG5ldyBHaXRVdGlsKCRpbywgJGNvbmZpZywgbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pLCBuZXcgRmlsZXN5c3RlbSgpKTsKR2l0VXRpbDo6Y2xlYW5FbnYoKTsKCnRyeSB7CiRnaXRVdGlsLT5ydW5Db21tYW5kKHN0YXRpYyBmdW5jdGlvbiAoJHVybCk6IHN0cmluZyB7CnJldHVybiAnZ2l0IGxzLXJlbW90ZSAtLWhlYWRzIC0tICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdXJsKTsKfSwgJHVybCwgc3lzX2dldF90ZW1wX2RpcigpKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXRIdWI7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgoKCgpjbGFzcyBHaXRIdWJEcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICRvd25lcjsKCnByb3RlY3RlZCAkcmVwb3NpdG9yeTsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyOwoKcHJvdGVjdGVkICRyZXBvRGF0YTsKCnByb3RlY3RlZCAkaGFzSXNzdWVzID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGlzUHJpdmF0ZSA9IGZhbHNlOwoKcHJpdmF0ZSAkaXNBcmNoaXZlZCA9IGZhbHNlOwoKcHJpdmF0ZSAkZnVuZGluZ0luZm87CgoKCgoKCnByb3RlY3RlZCAkZ2l0RHJpdmVyID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoIVByZWc6OmlzTWF0Y2goJyNeKD86KD86aHR0cHM/fGdpdCk6Ly8oW14vXSspL3xnaXRAKFteOl0rKTovPykoW14vXSspLyhbXi9dKz8pKD86XC5naXR8Lyk/JCMnLCAkdGhpcy0+dXJsLCAkbWF0Y2gpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBHaXRIdWIgcmVwb3NpdG9yeSBVUkwgJXMgaXMgaW52YWxpZC4nLCAkdGhpcy0+dXJsKSk7Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoWzNdKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWzRdKSk7CiR0aGlzLT5vd25lciA9ICRtYXRjaFszXTsKJHRoaXMtPnJlcG9zaXRvcnkgPSAkbWF0Y2hbNF07CiR0aGlzLT5vcmlnaW5VcmwgPSBzdHJ0b2xvd2VyKCRtYXRjaFsxXSA/PyAoc3RyaW5nKSAkbWF0Y2hbMl0pOwppZiAoJHRoaXMtPm9yaWdpblVybCA9PT0gJ3d3dy5naXRodWIuY29tJykgewokdGhpcy0+b3JpZ2luVXJsID0gJ2dpdGh1Yi5jb20nOwp9CiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7CgppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCd1c2UtZ2l0aHViLWFwaScpID09PSBmYWxzZSB8fCAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ25vLWFwaSddKSAmJiAkdGhpcy0+cmVwb0NvbmZpZ1snbm8tYXBpJ10pKSB7CiR0aGlzLT5zZXR1cEdpdERyaXZlcigkdGhpcy0+dXJsKTsKCnJldHVybjsKfQoKJHRoaXMtPmZldGNoUm9vdElkZW50aWZpZXIoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnlVcmwoKTogc3RyaW5nCnsKcmV0dXJuICdodHRwczovLycuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRVcmwoKTsKfQoKcmV0dXJuICdodHRwczovLycgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXBpVXJsKCk6IHN0cmluZwp7CmlmICgnZ2l0aHViLmNvbScgPT09ICR0aGlzLT5vcmlnaW5VcmwpIHsKJGFwaVVybCA9ICdhcGkuZ2l0aHViLmNvbSc7Cn0gZWxzZSB7CiRhcGlVcmwgPSAkdGhpcy0+b3JpZ2luVXJsIC4gJy9hcGkvdjMnOwp9CgpyZXR1cm4gJ2h0dHBzOi8vJyAuICRhcGlVcmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0U291cmNlKCRpZGVudGlmaWVyKTsKfQppZiAoJHRoaXMtPmlzUHJpdmF0ZSkgewoKCiR1cmwgPSAkdGhpcy0+Z2VuZXJhdGVTc2hVcmwoKTsKfSBlbHNlIHsKJHVybCA9ICR0aGlzLT5nZXRVcmwoKTsKfQoKcmV0dXJuIFsndHlwZScgPT4gJ2dpdCcsICd1cmwnID0+ICR1cmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJHVybCA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvemlwYmFsbC8nLiRpZGVudGlmaWVyOwoKcmV0dXJuIFsndHlwZScgPT4gJ3ppcCcsICd1cmwnID0+ICR1cmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyLCAnc2hhc3VtJyA9PiAnJ107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfQoKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpIHsKJGNvbXBvc2VyID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfSBlbHNlIHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIsIGpzb25fZW5jb2RlKCRjb21wb3NlcikpOwp9Cn0KCmlmICgkY29tcG9zZXIgIT09IG51bGwpIHsKCmlmIChpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXSkgJiYgIWlzX2FycmF5KCRjb21wb3Nlclsnc3VwcG9ydCddKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXSA9IFtdOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddKSkgewokbGFiZWwgPSBhcnJheV9zZWFyY2goJGlkZW50aWZpZXIsICR0aGlzLT5nZXRUYWdzKCkpID86IGFycmF5X3NlYXJjaCgkaWRlbnRpZmllciwgJHRoaXMtPmdldEJyYW5jaGVzKCkpID86ICRpZGVudGlmaWVyOwokY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10gPSBzcHJpbnRmKCdodHRwczovLyVzLyVzLyVzL3RyZWUvJXMnLCAkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+b3duZXIsICR0aGlzLT5yZXBvc2l0b3J5LCAkbGFiZWwpOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddKSAmJiAkdGhpcy0+aGFzSXNzdWVzKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSA9IHNwcmludGYoJ2h0dHBzOi8vJXMvJXMvJXMvaXNzdWVzJywgJHRoaXMtPm9yaWdpblVybCwgJHRoaXMtPm93bmVyLCAkdGhpcy0+cmVwb3NpdG9yeSk7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ2FiYW5kb25lZCddKSAmJiAkdGhpcy0+aXNBcmNoaXZlZCkgewokY29tcG9zZXJbJ2FiYW5kb25lZCddID0gdHJ1ZTsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnZnVuZGluZyddKSAmJiAkZnVuZGluZyA9ICR0aGlzLT5nZXRGdW5kaW5nSW5mbygpKSB7CiRjb21wb3NlclsnZnVuZGluZyddID0gJGZ1bmRpbmc7Cn0KfQoKJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0gPSAkY29tcG9zZXI7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRGdW5kaW5nSW5mbygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5mdW5kaW5nSW5mbykgewpyZXR1cm4gJHRoaXMtPmZ1bmRpbmdJbmZvOwp9CgppZiAoJHRoaXMtPm9yaWdpblVybCAhPT0gJ2dpdGh1Yi5jb20nKSB7CnJldHVybiAkdGhpcy0+ZnVuZGluZ0luZm8gPSBmYWxzZTsKfQoKZm9yZWFjaCAoWyR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvY29udGVudHMvLmdpdGh1Yi9GVU5ESU5HLnltbCcsICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8uZ2l0aHViL2NvbnRlbnRzL0ZVTkRJTkcueW1sJ10gYXMgJGZpbGUpIHsKdHJ5IHsKJHJlc3BvbnNlID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJGZpbGUsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pLT5kZWNvZGVKc29uKCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewpjb250aW51ZTsKfQppZiAoZW1wdHkoJHJlc3BvbnNlWydjb250ZW50J10pIHx8ICRyZXNwb25zZVsnZW5jb2RpbmcnXSAhPT0gJ2Jhc2U2NCcgfHwgISgkZnVuZGluZyA9IGJhc2U2NF9kZWNvZGUoJHJlc3BvbnNlWydjb250ZW50J10pKSkgewpjb250aW51ZTsKfQpicmVhazsKfQppZiAoZW1wdHkoJGZ1bmRpbmcpKSB7CnJldHVybiAkdGhpcy0+ZnVuZGluZ0luZm8gPSBmYWxzZTsKfQoKJHJlc3VsdCA9IFtdOwoka2V5ID0gbnVsbDsKZm9yZWFjaCAoUHJlZzo6c3BsaXQoJ3tccj9cbn0nLCAkZnVuZGluZykgYXMgJGxpbmUpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFx3Kylccyo6XHMqKC4rKSR9JywgJGxpbmUsICRtYXRjaCkpIHsKaWYgKCRtYXRjaFsyXSA9PT0gJ1snKSB7CiRrZXkgPSAkbWF0Y2hbMV07CmNvbnRpbnVlOwp9CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlxbKC4qKVxdKD86XHMqIy4qKT8kfScsICRtYXRjaFsyXSwgJG1hdGNoMikpIHsKZm9yZWFjaCAoYXJyYXlfbWFwKCd0cmltJywgUHJlZzo6c3BsaXQoJ3tbXCciXT9ccyosXHMqW1wnIl0/fScsICRtYXRjaDJbMV0pKSBhcyAkaXRlbSkgewokcmVzdWx0W10gPSBbJ3R5cGUnID0+ICRtYXRjaFsxXSwgJ3VybCcgPT4gdHJpbSgkaXRlbSwgJyJcJyAnKV07Cn0KfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFteI10uKj8pKD86XHMrIy4qKT8kfScsICRtYXRjaFsyXSwgJG1hdGNoMikpIHsKJHJlc3VsdFtdID0gWyd0eXBlJyA9PiAkbWF0Y2hbMV0sICd1cmwnID0+IHRyaW0oJG1hdGNoMlsxXSwgJyJcJyAnKV07Cn0KJGtleSA9IG51bGw7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihcdyspXHMqOlxzKiNccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CiRrZXkgPSAkbWF0Y2hbMV07Cn0gZWxzZWlmICgka2V5ICE9PSBudWxsICYmICgKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14tXHMqKC4rKSg/OlxzKyMuKik/JH0nLCAkbGluZSwgJG1hdGNoKQp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiguKyksKD86XHMqIy4qKT8kfScsICRsaW5lLCAkbWF0Y2gpCikpIHsKJHJlc3VsdFtdID0gWyd0eXBlJyA9PiAka2V5LCAndXJsJyA9PiB0cmltKCRtYXRjaFsxXSwgJyJcJyAnKV07Cn0gZWxzZWlmICgka2V5ICE9PSBudWxsICYmICRsaW5lID09PSAnXScpIHsKJGtleSA9IG51bGw7Cn0KfQoKZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICRpdGVtKSB7CnN3aXRjaCAoJGl0ZW1bJ3R5cGUnXSkgewpjYXNlICd0aWRlbGlmdCc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViLycgLiAkaXRlbVsndXJsJ107CmJyZWFrOwpjYXNlICdnaXRodWInOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2dpdGh1Yi5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdwYXRyZW9uJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly93d3cucGF0cmVvbi5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdvdGVjaGllJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9vdGVjaGllLmNvbS8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ29wZW5fY29sbGVjdGl2ZSc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAnbGliZXJhcGF5JzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9saWJlcmFwYXkuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAna29fZmknOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2tvLWZpLmNvbS8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ2lzc3VlaHVudCc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vaXNzdWVodW50LmlvL3IvJyAuICRpdGVtWyd1cmwnXTsKYnJlYWs7CmNhc2UgJ2NvbW11bml0eV9icmlkZ2UnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2Z1bmRpbmcuY29tbXVuaXR5YnJpZGdlLm9yZy9wcm9qZWN0cy8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7Cn0KfQoKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbyA9ICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0RmlsZUNvbnRlbnQoJGZpbGUsICRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9jb250ZW50cy8nIC4gJGZpbGUgLiAnP3JlZj0nLnVybGVuY29kZSgkaWRlbnRpZmllcik7CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CgoKCmlmICgoIWlzc2V0KCRyZXNvdXJjZVsnY29udGVudCddKSB8fCAkcmVzb3VyY2VbJ2NvbnRlbnQnXSA9PT0gJycpICYmICRyZXNvdXJjZVsnZW5jb2RpbmcnXSA9PT0gJ25vbmUnICYmIGlzc2V0KCRyZXNvdXJjZVsnZ2l0X3VybCddKSkgewokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlWydnaXRfdXJsJ10pLT5kZWNvZGVKc29uKCk7Cn0KCmlmICghaXNzZXQoJHJlc291cmNlWydjb250ZW50J10pIHx8ICRyZXNvdXJjZVsnZW5jb2RpbmcnXSAhPT0gJ2Jhc2U2NCcgfHwgZmFsc2UgPT09ICgkY29udGVudCA9IGJhc2U2NF9kZWNvZGUoJHJlc291cmNlWydjb250ZW50J10pKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZXRyaWV2ZSAnIC4gJGZpbGUgLiAnIGZvciAnLiRpZGVudGlmaWVyKTsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENoYW5nZURhdGUoJGlkZW50aWZpZXIpOwp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nL2NvbW1pdHMvJy51cmxlbmNvZGUoJGlkZW50aWZpZXIpOwokY29tbWl0ID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRjb21taXRbJ2NvbW1pdCddWydjb21taXR0ZXInXVsnZGF0ZSddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0VGFncygpOwp9CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nL3RhZ3M/cGVyX3BhZ2U9MTAwJzsKCmRvIHsKJHJlc3BvbnNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSk7CiR0YWdzRGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpmb3JlYWNoICgkdGFnc0RhdGEgYXMgJHRhZykgewokdGFnc1skdGFnWyduYW1lJ11dID0gJHRhZ1snY29tbWl0J11bJ3NoYSddOwp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSB3aGlsZSAoJHJlc291cmNlKTsKCiR0aGlzLT50YWdzID0gJHRhZ3M7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEJyYW5jaGVzKCk7Cn0KaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9naXQvcmVmcy9oZWFkcz9wZXJfcGFnZT0xMDAnOwoKZG8gewokcmVzcG9uc2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKTsKJGJyYW5jaERhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJGJyYW5jaERhdGEgYXMgJGJyYW5jaCkgewokbmFtZSA9IHN1YnN0cigkYnJhbmNoWydyZWYnXSwgMTEpOwppZiAoJG5hbWUgIT09ICdnaC1wYWdlcycpIHsKJGJyYW5jaGVzWyRuYW1lXSA9ICRicmFuY2hbJ29iamVjdCddWydzaGEnXTsKfQp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSB3aGlsZSAoJHJlc291cmNlKTsKCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICghUHJlZzo6aXNNYXRjaCgnI14oKD86aHR0cHM/fGdpdCk6Ly8oW14vXSspL3xnaXRAKFteOl0rKTovPykoW14vXSspLyhbXi9dKz8pKD86XC5naXR8Lyk/JCMnLCAkdXJsLCAkbWF0Y2hlcykpIHsKcmV0dXJuIGZhbHNlOwp9Cgokb3JpZ2luVXJsID0gJG1hdGNoZXNbMl0gPz8gKHN0cmluZykgJG1hdGNoZXNbM107CmlmICghaW5fYXJyYXkoc3RydG9sb3dlcihQcmVnOjpyZXBsYWNlKCd7Xnd3d1wufWknLCAnJywgJG9yaWdpblVybCkpLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGlvLT53cml0ZUVycm9yKCdTa2lwcGluZyBHaXRIdWIgZHJpdmVyIGZvciAnLiR1cmwuJyBiZWNhdXNlIHRoZSBPcGVuU1NMIFBIUCBleHRlbnNpb24gaXMgbWlzc2luZy4nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvRGF0YSgpOiA/YXJyYXkKewokdGhpcy0+ZmV0Y2hSb290SWRlbnRpZmllcigpOwoKcmV0dXJuICR0aGlzLT5yZXBvRGF0YTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CmlmIChmYWxzZSAhPT0gc3RycG9zKCR0aGlzLT5vcmlnaW5VcmwsICc6JykpIHsKcmV0dXJuICdzc2g6Ly9naXRAJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICR1cmwsIGJvb2wgJGZldGNoaW5nUmVwb0RhdGEgPSBmYWxzZSk6IFJlc3BvbnNlCnsKdHJ5IHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCnN3aXRjaCAoJGUtPmdldENvZGUoKSkgewpjYXNlIDQwMToKY2FzZSA0MDQ6CgppZiAoISRmZXRjaGluZ1JlcG9EYXRhKSB7CnRocm93ICRlOwp9CgppZiAoJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KCiRzY29wZXNJc3N1ZWQgPSBbXTsKJHNjb3Blc05lZWRlZCA9IFtdOwppZiAoJGhlYWRlcnMgPSAkZS0+Z2V0SGVhZGVycygpKSB7CmlmICgkc2NvcGVzID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaGVhZGVycywgJ1gtT0F1dGgtU2NvcGVzJykpIHsKJHNjb3Blc0lzc3VlZCA9IGV4cGxvZGUoJyAnLCAkc2NvcGVzKTsKfQppZiAoJHNjb3BlcyA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGhlYWRlcnMsICdYLUFjY2VwdGVkLU9BdXRoLVNjb3BlcycpKSB7CiRzY29wZXNOZWVkZWQgPSBleHBsb2RlKCcgJywgJHNjb3Blcyk7Cn0KfQokc2NvcGVzRmFpbGVkID0gYXJyYXlfZGlmZigkc2NvcGVzTmVlZGVkLCAkc2NvcGVzSXNzdWVkKTsKCgppZiAoISRoZWFkZXJzIHx8ICFjb3VudCgkc2NvcGVzTmVlZGVkKSB8fCBjb3VudCgkc2NvcGVzRmFpbGVkKSkgewokZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCR0aGlzLT5vcmlnaW5VcmwsICdZb3VyIEdpdEh1YiBjcmVkZW50aWFscyBhcmUgcmVxdWlyZWQgdG8gZmV0Y2ggcHJpdmF0ZSByZXBvc2l0b3J5IG1ldGFkYXRhICg8aW5mbz4nLiR0aGlzLT51cmwuJzwvaW5mbz4pJyk7Cn0KCnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwoKY2FzZSA0MDM6CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKSAmJiAkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkpIHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJGZldGNoaW5nUmVwb0RhdGEpIHsKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCk7CgpyZXR1cm4gbmV3IFJlc3BvbnNlKFsndXJsJyA9PiAnZHVtbXknXSwgMjAwLCBbXSwgJ251bGwnKTsKfQoKJHJhdGVMaW1pdGVkID0gJGdpdEh1YlV0aWwtPmlzUmF0ZUxpbWl0ZWQoKGFycmF5KSAkZS0+Z2V0SGVhZGVycygpKTsKCmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKSkgewppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkdpdEh1YiBBUEkgbGltaXQgZXhoYXVzdGVkLiBGYWlsZWQgdG8gZ2V0IG1ldGFkYXRhIGZvciB0aGUgJy4kdGhpcy0+dXJsLicgcmVwb3NpdG9yeSwgdHJ5IHJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZSBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHMgdG8gaW5jcmVhc2UgdGhlIEFQSSBsaW1pdDwvZXJyb3I+Jyk7CnRocm93ICRlOwp9CgokZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCR0aGlzLT5vcmlnaW5VcmwsICdBUEkgbGltaXQgZXhoYXVzdGVkLiBFbnRlciB5b3VyIEdpdEh1YiBjcmVkZW50aWFscyB0byBnZXQgYSBsYXJnZXIgQVBJIGxpbWl0ICg8aW5mbz4nLiR0aGlzLT51cmwuJzwvaW5mbz4pJyk7CgpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCRyYXRlTGltaXRlZCkgewokcmF0ZUxpbWl0ID0gJGdpdEh1YlV0aWwtPmdldFJhdGVMaW1pdCgkZS0+Z2V0SGVhZGVycygpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoCic8ZXJyb3I+R2l0SHViIEFQSSBsaW1pdCAoJWQgY2FsbHMvaHIpIGlzIGV4aGF1c3RlZC4gWW91IGFyZSBhbHJlYWR5IGF1dGhvcml6ZWQgc28geW91IGhhdmUgdG8gd2FpdCB1bnRpbCAlcyBiZWZvcmUgZG9pbmcgbW9yZSByZXF1ZXN0czwvZXJyb3I+JywKJHJhdGVMaW1pdFsnbGltaXQnXSwKJHJhdGVMaW1pdFsncmVzZXQnXQopKTsKfQoKdGhyb3cgJGU7CgpkZWZhdWx0Ogp0aHJvdyAkZTsKfQp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoUm9vdElkZW50aWZpZXIoKTogdm9pZAp7CmlmICgkdGhpcy0+cmVwb0RhdGEpIHsKcmV0dXJuOwp9CgokcmVwb0RhdGFVcmwgPSAkdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeTsKCnRyeSB7CiR0aGlzLT5yZXBvRGF0YSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVwb0RhdGFVcmwsIHRydWUpLT5kZWNvZGVKc29uKCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gNDk5KSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwp9IGVsc2Ugewp0aHJvdyAkZTsKfQp9CmlmIChudWxsID09PSAkdGhpcy0+cmVwb0RhdGEgJiYgbnVsbCAhPT0gJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm47Cn0KCiR0aGlzLT5vd25lciA9ICR0aGlzLT5yZXBvRGF0YVsnb3duZXInXVsnbG9naW4nXTsKJHRoaXMtPnJlcG9zaXRvcnkgPSAkdGhpcy0+cmVwb0RhdGFbJ25hbWUnXTsKCiR0aGlzLT5pc1ByaXZhdGUgPSAhZW1wdHkoJHRoaXMtPnJlcG9EYXRhWydwcml2YXRlJ10pOwppZiAoaXNzZXQoJHRoaXMtPnJlcG9EYXRhWydkZWZhdWx0X2JyYW5jaCddKSkgewokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkdGhpcy0+cmVwb0RhdGFbJ2RlZmF1bHRfYnJhbmNoJ107Cn0gZWxzZWlmIChpc3NldCgkdGhpcy0+cmVwb0RhdGFbJ21hc3Rlcl9icmFuY2gnXSkpIHsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJHRoaXMtPnJlcG9EYXRhWydtYXN0ZXJfYnJhbmNoJ107Cn0gZWxzZSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICdtYXN0ZXInOwp9CiR0aGlzLT5oYXNJc3N1ZXMgPSAhZW1wdHkoJHRoaXMtPnJlcG9EYXRhWydoYXNfaXNzdWVzJ10pOwokdGhpcy0+aXNBcmNoaXZlZCA9ICFlbXB0eSgkdGhpcy0+cmVwb0RhdGFbJ2FyY2hpdmVkJ10pOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0ZW1wdENsb25lRmFsbGJhY2soKTogYm9vbAp7CiR0aGlzLT5pc1ByaXZhdGUgPSB0cnVlOwoKdHJ5IHsKCgoKCiR0aGlzLT5zZXR1cEdpdERyaXZlcigkdGhpcy0+Z2VuZXJhdGVTc2hVcmwoKSk7CgpyZXR1cm4gdHJ1ZTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmdpdERyaXZlciA9IG51bGw7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gY2xvbmUgdGhlICcuJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkuJyByZXBvc2l0b3J5LCB0cnkgcnVubmluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlIHNvIHRoYXQgeW91IGNhbiBlbnRlciB5b3VyIEdpdEh1YiBjcmVkZW50aWFsczwvZXJyb3I+Jyk7CnRocm93ICRlOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzZXR1cEdpdERyaXZlcihzdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+Z2l0RHJpdmVyID0gbmV3IEdpdERyaXZlcigKWyd1cmwnID0+ICR1cmxdLAokdGhpcy0+aW8sCiR0aGlzLT5jb25maWcsCiR0aGlzLT5odHRwRG93bmxvYWRlciwKJHRoaXMtPnByb2Nlc3MKKTsKJHRoaXMtPmdpdERyaXZlci0+aW5pdGlhbGl6ZSgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TmV4dFBhZ2UoUmVzcG9uc2UgJHJlc3BvbnNlKTogP3N0cmluZwp7CiRoZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGluaycpOwppZiAoISRoZWFkZXIpIHsKcmV0dXJuIG51bGw7Cn0KCiRsaW5rcyA9IGV4cGxvZGUoJywnLCAkaGVhZGVyKTsKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CmlmIChQcmVnOjppc01hdGNoKCd7PCguKz8pPjsgKnJlbD0ibmV4dCJ9JywgJGxpbmssICRtYXRjaCkpIHsKcmV0dXJuICRtYXRjaFsxXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcR2l0TGFiOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKCgoKY2xhc3MgR2l0TGFiRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCgoKCnByaXZhdGUgJHNjaGVtZTsKCnByaXZhdGUgJG5hbWVzcGFjZTsKCnByaXZhdGUgJHJlcG9zaXRvcnk7CgoKCgpwcml2YXRlICRwcm9qZWN0OwoKCgoKcHJpdmF0ZSAkY29tbWl0cyA9IFtdOwoKCnByaXZhdGUgJHRhZ3M7CgoKcHJpdmF0ZSAkYnJhbmNoZXM7CgoKCgoKCnByb3RlY3RlZCAkZ2l0RHJpdmVyID0gbnVsbDsKCgoKCgoKcHJvdGVjdGVkICRwcm90b2NvbDsKCgoKCgoKcHJpdmF0ZSAkaXNQcml2YXRlID0gdHJ1ZTsKCgoKCnByaXZhdGUgJGhhc05vbnN0YW5kYXJkT3JpZ2luID0gZmFsc2U7CgpwdWJsaWMgY29uc3QgVVJMX1JFR0VYID0gJyNeKD86KD9QPHNjaGVtZT5odHRwcz8pOi8vKD9QPGRvbWFpbj4uKz8pKD86Oig/UDxwb3J0PlswLTldKykpPy98Z2l0QCg/UDxkb21haW4yPlteOl0rKTopKD9QPHBhcnRzPi4rKS8oP1A8cmVwbz5bXi9dKz8pKD86XC5naXR8Lyk/JCMnOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoIVByZWc6OmlzTWF0Y2goc2VsZjo6VVJMX1JFR0VYLCAkdGhpcy0+dXJsLCAkbWF0Y2gpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBHaXRMYWIgcmVwb3NpdG9yeSBVUkwgJXMgaXMgaW52YWxpZC4gSXQgbXVzdCBiZSB0aGUgSFRUUCBVUkwgb2YgYSBHaXRMYWIgcHJvamVjdC4nLCAkdGhpcy0+dXJsKSk7Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydwYXJ0cyddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydyZXBvJ10pKTsKJGd1ZXNzZWREb21haW4gPSAkbWF0Y2hbJ2RvbWFpbiddID8/IChzdHJpbmcpICRtYXRjaFsnZG9tYWluMiddOwokY29uZmlndXJlZERvbWFpbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyk7CiR1cmxQYXJ0cyA9IGV4cGxvZGUoJy8nLCAkbWF0Y2hbJ3BhcnRzJ10pOwoKJHRoaXMtPnNjaGVtZSA9IGluX2FycmF5KCRtYXRjaFsnc2NoZW1lJ10sIFsnaHR0cHMnLCAnaHR0cCddLCB0cnVlKQo/ICRtYXRjaFsnc2NoZW1lJ10KOiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ3NlY3VyZS1odHRwJ10pICYmICR0aGlzLT5yZXBvQ29uZmlnWydzZWN1cmUtaHR0cCddID09PSBmYWxzZSA/ICdodHRwJyA6ICdodHRwcycpCjsKJG9yaWdpbiA9IHNlbGY6OmRldGVybWluZU9yaWdpbigkY29uZmlndXJlZERvbWFpbnMsICRndWVzc2VkRG9tYWluLCAkdXJsUGFydHMsICRtYXRjaFsncG9ydCddKTsKaWYgKGZhbHNlID09PSAkb3JpZ2luKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0l0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGEgZ2l0bGFiIGRyaXZlciB3aXRoIGFuIHVucGFyc2VhYmxlIG9yaWdpbiBVUkwgKCcuJHRoaXMtPnVybC4nKScpOwp9CiR0aGlzLT5vcmlnaW5VcmwgPSAkb3JpZ2luOwoKaWYgKGlzX3N0cmluZygkcHJvdG9jb2wgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1wcm90b2NvbCcpKSkgewoKaWYgKCFpbl9hcnJheSgkcHJvdG9jb2wsIFsnZ2l0JywgJ2h0dHAnLCAnaHR0cHMnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdnaXRsYWItcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2YgZ2l0LCBodHRwLicpOwp9CiR0aGlzLT5wcm90b2NvbCA9ICRwcm90b2NvbCA9PT0gJ2dpdCcgPyAnc3NoJyA6ICdodHRwJzsKfQoKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHRoaXMtPm9yaWdpblVybCwgJzonKSB8fCBmYWxzZSAhPT0gc3RycG9zKCR0aGlzLT5vcmlnaW5VcmwsICcvJykpIHsKJHRoaXMtPmhhc05vbnN0YW5kYXJkT3JpZ2luID0gdHJ1ZTsKfQoKJHRoaXMtPm5hbWVzcGFjZSA9IGltcGxvZGUoJy8nLCAkdXJsUGFydHMpOwokdGhpcy0+cmVwb3NpdG9yeSA9IFByZWc6OnJlcGxhY2UoJyMoXC5naXQpJCMnLCAnJywgJG1hdGNoWydyZXBvJ10pOwoKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLicvJy4kdGhpcy0+b3JpZ2luVXJsLicvJy4kdGhpcy0+bmFtZXNwYWNlLicvJy4kdGhpcy0+cmVwb3NpdG9yeSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7CgokdGhpcy0+ZmV0Y2hQcm9qZWN0KCk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIdHRwRG93bmxvYWRlcihIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIpOiB2b2lkCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpICYmICRyZXMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGlkZW50aWZpZXIpKSB7CiRjb21wb3NlciA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0gZWxzZSB7CiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLCBqc29uX2VuY29kZSgkY29tcG9zZXIpKTsKfQp9CgppZiAobnVsbCAhPT0gJGNvbXBvc2VyKSB7CgppZiAoaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J10pICYmICFpc19hcnJheSgkY29tcG9zZXJbJ3N1cHBvcnQnXSkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J10gPSBbXTsKfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSkgJiYgaXNzZXQoJHRoaXMtPnByb2plY3RbJ3dlYl91cmwnXSkpIHsKJGxhYmVsID0gYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0VGFncygpLCB0cnVlKSA/OiBhcnJheV9zZWFyY2goJGlkZW50aWZpZXIsICR0aGlzLT5nZXRCcmFuY2hlcygpLCB0cnVlKSA/OiAkaWRlbnRpZmllcjsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gc3ByaW50ZignJXMvLS90cmVlLyVzJywgJHRoaXMtPnByb2plY3RbJ3dlYl91cmwnXSwgJGxhYmVsKTsKfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSkgJiYgIWVtcHR5KCR0aGlzLT5wcm9qZWN0Wydpc3N1ZXNfZW5hYmxlZCddKSAmJiBpc3NldCgkdGhpcy0+cHJvamVjdFsnd2ViX3VybCddKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10gPSBzcHJpbnRmKCclcy8tL2lzc3VlcycsICR0aGlzLT5wcm9qZWN0Wyd3ZWJfdXJsJ10pOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydhYmFuZG9uZWQnXSkgJiYgIWVtcHR5KCR0aGlzLT5wcm9qZWN0WydhcmNoaXZlZCddKSkgewokY29tcG9zZXJbJ2FiYW5kb25lZCddID0gdHJ1ZTsKfQp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEZpbGVDb250ZW50KCRmaWxlLCAkaWRlbnRpZmllcik7Cn0KCgppZiAoIVByZWc6OmlzTWF0Y2goJ3tbYS1mMC05XXs0MH19aScsICRpZGVudGlmaWVyKSkgewokYnJhbmNoZXMgPSAkdGhpcy0+Z2V0QnJhbmNoZXMoKTsKaWYgKGlzc2V0KCRicmFuY2hlc1skaWRlbnRpZmllcl0pKSB7CiRpZGVudGlmaWVyID0gJGJyYW5jaGVzWyRpZGVudGlmaWVyXTsKfQp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCkuJy9yZXBvc2l0b3J5L2ZpbGVzLycuJHRoaXMtPnVybEVuY29kZUFsbCgkZmlsZSkuJy9yYXc/cmVmPScuJGlkZW50aWZpZXI7Cgp0cnkgewokY29udGVudCA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5nZXRCb2R5KCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSAhPT0gNDA0KSB7CnRocm93ICRlOwp9CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENoYW5nZURhdGUoJGlkZW50aWZpZXIpOwp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbW1pdHNbJGlkZW50aWZpZXJdKSkgewpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkdGhpcy0+Y29tbWl0c1skaWRlbnRpZmllcl1bJ2NvbW1pdHRlZF9kYXRlJ10pOwp9CgpyZXR1cm4gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnlVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5wcm90b2NvbCkgewpyZXR1cm4gJHRoaXMtPnByb2plY3RbInskdGhpcy0+cHJvdG9jb2x9X3VybF90b19yZXBvIl07Cn0KCnJldHVybiAkdGhpcy0+aXNQcml2YXRlID8gJHRoaXMtPnByb2plY3RbJ3NzaF91cmxfdG9fcmVwbyddIDogJHRoaXMtPnByb2plY3RbJ2h0dHBfdXJsX3RvX3JlcG8nXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0VXJsKCk7Cn0KCnJldHVybiAkdGhpcy0+cHJvamVjdFsnd2ViX3VybCddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokdXJsID0gJHRoaXMtPmdldEFwaVVybCgpLicvcmVwb3NpdG9yeS9hcmNoaXZlLnppcD9zaGE9Jy4kaWRlbnRpZmllcjsKCnJldHVybiBbJ3R5cGUnID0+ICd6aXAnLCAndXJsJyA9PiAkdXJsLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllciwgJ3NoYXN1bScgPT4gJyddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFNvdXJjZSgkaWRlbnRpZmllcik7Cn0KCnJldHVybiBbJ3R5cGUnID0+ICdnaXQnLCAndXJsJyA9PiAkdGhpcy0+Z2V0UmVwb3NpdG9yeVVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9qZWN0WydkZWZhdWx0X2JyYW5jaCddOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0QnJhbmNoZXMoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokdGhpcy0+YnJhbmNoZXMgPSAkdGhpcy0+Z2V0UmVmZXJlbmNlcygnYnJhbmNoZXMnKTsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0VGFncygpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRoaXMtPnRhZ3MgPSAkdGhpcy0+Z2V0UmVmZXJlbmNlcygndGFncycpOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcGlVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zY2hlbWUuJzovLycuJHRoaXMtPm9yaWdpblVybC4nL2FwaS92NC9wcm9qZWN0cy8nLiR0aGlzLT51cmxFbmNvZGVBbGwoJHRoaXMtPm5hbWVzcGFjZSkuJyUyRicuJHRoaXMtPnVybEVuY29kZUFsbCgkdGhpcy0+cmVwb3NpdG9yeSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdXJsRW5jb2RlQWxsKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKJGVuY29kZWQgPSAnJzsKZm9yICgkaSA9IDA7IGlzc2V0KCRzdHJpbmdbJGldKTsgJGkrKykgewokY2hhcmFjdGVyID0gJHN0cmluZ1skaV07CmlmICghY3R5cGVfYWxudW0oJGNoYXJhY3RlcikgJiYgIWluX2FycmF5KCRjaGFyYWN0ZXIsIFsnLScsICdfJ10sIHRydWUpKSB7CiRjaGFyYWN0ZXIgPSAnJScgLiBzcHJpbnRmKCclMDJYJywgb3JkKCRjaGFyYWN0ZXIpKTsKfQokZW5jb2RlZCAuPSAkY2hhcmFjdGVyOwp9CgpyZXR1cm4gJGVuY29kZWQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKHN0cmluZyAkdHlwZSk6IGFycmF5CnsKJHBlclBhZ2UgPSAxMDA7CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKS4nL3JlcG9zaXRvcnkvJy4kdHlwZS4nP3Blcl9wYWdlPScuJHBlclBhZ2U7CgokcmVmZXJlbmNlcyA9IFtdOwpkbyB7CiRyZXNwb25zZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpOwokZGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwoKZm9yZWFjaCAoJGRhdGEgYXMgJGRhdHVtKSB7CiRyZWZlcmVuY2VzWyRkYXR1bVsnbmFtZSddXSA9ICRkYXR1bVsnY29tbWl0J11bJ2lkJ107CgoKCiR0aGlzLT5jb21taXRzWyRkYXR1bVsnY29tbWl0J11bJ2lkJ11dID0gJGRhdHVtWydjb21taXQnXTsKfQoKaWYgKGNvdW50KCRkYXRhKSA+PSAkcGVyUGFnZSkgewokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSBlbHNlIHsKJHJlc291cmNlID0gZmFsc2U7Cn0KfSB3aGlsZSAoJHJlc291cmNlKTsKCnJldHVybiAkcmVmZXJlbmNlczsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoUHJvamVjdCgpOiB2b2lkCnsKCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKTsKJHRoaXMtPnByb2plY3QgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlLCB0cnVlKS0+ZGVjb2RlSnNvbigpOwppZiAoaXNzZXQoJHRoaXMtPnByb2plY3RbJ3Zpc2liaWxpdHknXSkpIHsKJHRoaXMtPmlzUHJpdmF0ZSA9ICR0aGlzLT5wcm9qZWN0Wyd2aXNpYmlsaXR5J10gIT09ICdwdWJsaWMnOwp9IGVsc2UgewoKJHRoaXMtPmlzUHJpdmF0ZSA9IGZhbHNlOwp9Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhdHRlbXB0Q2xvbmVGYWxsYmFjaygpOiBib29sCnsKaWYgKCR0aGlzLT5pc1ByaXZhdGUgPT09IGZhbHNlKSB7CiR1cmwgPSAkdGhpcy0+Z2VuZXJhdGVQdWJsaWNVcmwoKTsKfSBlbHNlIHsKJHVybCA9ICR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpOwp9Cgp0cnkgewoKCgokdGhpcy0+c2V0dXBHaXREcml2ZXIoJHVybCk7CgpyZXR1cm4gdHJ1ZTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmdpdERyaXZlciA9IG51bGw7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gY2xvbmUgdGhlICcuJHVybC4nIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgY3JlZGVudGlhbHM8L2Vycm9yPicpOwp0aHJvdyAkZTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVTc2hVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5oYXNOb25zdGFuZGFyZE9yaWdpbikgewpyZXR1cm4gJ3NzaDovL2dpdEAnLiR0aGlzLT5vcmlnaW5VcmwuJy8nLiR0aGlzLT5uYW1lc3BhY2UuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicuZ2l0JzsKfQoKcmV0dXJuICdnaXRAJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnOicuJHRoaXMtPm5hbWVzcGFjZS4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQdWJsaWNVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zY2hlbWUgLiAnOi8vJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnLycuJHRoaXMtPm5hbWVzcGFjZS4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXBHaXREcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmdpdERyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5naXREcml2ZXItPmluaXRpYWxpemUoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsLCBib29sICRmZXRjaGluZ1JlcG9EYXRhID0gZmFsc2UpOiBSZXNwb25zZQp7CnRyeSB7CiRyZXNwb25zZSA9IHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7CgppZiAoJGZldGNoaW5nUmVwb0RhdGEpIHsKJGpzb24gPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKCgoKCmlmICghaXNzZXQoJGpzb25bJ2RlZmF1bHRfYnJhbmNoJ10pICYmIGlzc2V0KCRqc29uWydwZXJtaXNzaW9ucyddKSkgewokdGhpcy0+aXNQcml2YXRlID0gJGpzb25bJ3Zpc2liaWxpdHknXSAhPT0gJ3B1YmxpYyc7CgokbW9yZVRoYW5HdWVzdEFjY2VzcyA9IGZhbHNlOwoKCgpmb3JlYWNoICgkanNvblsncGVybWlzc2lvbnMnXSBhcyAkcGVybWlzc2lvbikgewppZiAoJHBlcm1pc3Npb24gJiYgJHBlcm1pc3Npb25bJ2FjY2Vzc19sZXZlbCddID4gMTApIHsKJG1vcmVUaGFuR3Vlc3RBY2Nlc3MgPSB0cnVlOwp9Cn0KCmlmICghJG1vcmVUaGFuR3Vlc3RBY2Nlc3MpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5HaXRMYWIgdG9rZW4gd2l0aCBHdWVzdCBvbmx5IGFjY2VzcyBkZXRlY3RlZDwvd2FybmluZz4nKTsKCiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KfQoKCmlmICghaXNzZXQoJGpzb25bJ2RlZmF1bHRfYnJhbmNoJ10pKSB7CgppZiAoaXNzZXQoJGpzb25bJ3JlcG9zaXRvcnlfYWNjZXNzX2xldmVsJ10pICYmICRqc29uWydyZXBvc2l0b3J5X2FjY2Vzc19sZXZlbCddID09PSAnZGlzYWJsZWQnKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSBHaXRMYWIgcmVwb3NpdG9yeSBpcyBkaXNhYmxlZCBpbiB0aGUgcHJvamVjdCcsIDQwMCk7Cn0KCmlmICghZW1wdHkoJGpzb25bJ2lkJ10pKSB7CiR0aGlzLT5pc1ByaXZhdGUgPSBmYWxzZTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignR2l0TGFiIEFQSSBzZWVtcyB0byBub3QgYmUgYXV0aGVudGljYXRlZCBhcyBpdCBkaWQgbm90IHJldHVybiBhIGRlZmF1bHRfYnJhbmNoJywgNDAxKTsKfQp9CgpyZXR1cm4gJHJlc3BvbnNlOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGdpdExhYlV0aWwgPSBuZXcgR2l0TGFiKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7Cgpzd2l0Y2ggKCRlLT5nZXRDb2RlKCkpIHsKY2FzZSA0MDE6CmNhc2UgNDA0OgoKaWYgKCEkZmV0Y2hpbmdSZXBvRGF0YSkgewp0aHJvdyAkZTsKfQoKaWYgKCRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aCgkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCRnaXRMYWJVdGlsLT5pc09BdXRoRXhwaXJlZCgkdGhpcy0+b3JpZ2luVXJsKSAmJiAkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGhSZWZyZXNoKCR0aGlzLT5zY2hlbWUsICR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5GYWlsZWQgdG8gZG93bmxvYWQgJyAuICR0aGlzLT5uYW1lc3BhY2UgLiAnLycgLiAkdGhpcy0+cmVwb3NpdG9yeSAuICc6JyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC93YXJuaW5nPicpOwokZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCR0aGlzLT5zY2hlbWUsICR0aGlzLT5vcmlnaW5VcmwsICdZb3VyIGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCB0byBmZXRjaCBwcml2YXRlIHJlcG9zaXRvcnkgbWV0YWRhdGEgKDxpbmZvPicuJHRoaXMtPnVybC4nPC9pbmZvPiknKTsKCnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwoKY2FzZSA0MDM6CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKSAmJiAkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkpIHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJGZldGNoaW5nUmVwb0RhdGEpIHsKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCk7CgpyZXR1cm4gbmV3IFJlc3BvbnNlKFsndXJsJyA9PiAnZHVtbXknXSwgMjAwLCBbXSwgJ251bGwnKTsKfQoKdGhyb3cgJGU7CgpkZWZhdWx0Ogp0aHJvdyAkZTsKfQp9Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoIVByZWc6OmlzTWF0Y2goc2VsZjo6VVJMX1JFR0VYLCAkdXJsLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQoKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ3BhcnRzJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ3JlcG8nXSkpOwokc2NoZW1lID0gJG1hdGNoWydzY2hlbWUnXTsKJGd1ZXNzZWREb21haW4gPSAkbWF0Y2hbJ2RvbWFpbiddID8/IChzdHJpbmcpICRtYXRjaFsnZG9tYWluMiddOwokdXJsUGFydHMgPSBleHBsb2RlKCcvJywgJG1hdGNoWydwYXJ0cyddKTsKCmlmIChmYWxzZSA9PT0gc2VsZjo6ZGV0ZXJtaW5lT3JpZ2luKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgJGd1ZXNzZWREb21haW4sICR1cmxQYXJ0cywgJG1hdGNoWydwb3J0J10pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCdodHRwcycgPT09ICRzY2hlbWUgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewokaW8tPndyaXRlRXJyb3IoJ1NraXBwaW5nIEdpdExhYiBkcml2ZXIgZm9yICcuJHVybC4nIGJlY2F1c2UgdGhlIE9wZW5TU0wgUEhQIGV4dGVuc2lvbiBpcyBtaXNzaW5nLicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXROZXh0UGFnZShSZXNwb25zZSAkcmVzcG9uc2UpOiA/c3RyaW5nCnsKJGhlYWRlciA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsaW5rJyk7CgokbGlua3MgPSBleHBsb2RlKCcsJywgJGhlYWRlcik7CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnezwoLis/KT47ICpyZWw9Im5leHQifScsICRsaW5rLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkZXRlcm1pbmVPcmlnaW4oYXJyYXkgJGNvbmZpZ3VyZWREb21haW5zLCBzdHJpbmcgJGd1ZXNzZWREb21haW4sIGFycmF5ICYkdXJsUGFydHMsID9zdHJpbmcgJHBvcnROdW1iZXIpCnsKJGd1ZXNzZWREb21haW4gPSBzdHJ0b2xvd2VyKCRndWVzc2VkRG9tYWluKTsKCmlmIChpbl9hcnJheSgkZ3Vlc3NlZERvbWFpbiwgJGNvbmZpZ3VyZWREb21haW5zKSB8fCAobnVsbCAhPT0gJHBvcnROdW1iZXIgJiYgaW5fYXJyYXkoJGd1ZXNzZWREb21haW4uJzonLiRwb3J0TnVtYmVyLCAkY29uZmlndXJlZERvbWFpbnMpKSkgewppZiAobnVsbCAhPT0gJHBvcnROdW1iZXIpIHsKcmV0dXJuICRndWVzc2VkRG9tYWluLic6Jy4kcG9ydE51bWJlcjsKfQoKcmV0dXJuICRndWVzc2VkRG9tYWluOwp9CgppZiAobnVsbCAhPT0gJHBvcnROdW1iZXIpIHsKJGd1ZXNzZWREb21haW4gLj0gJzonLiRwb3J0TnVtYmVyOwp9Cgp3aGlsZSAobnVsbCAhPT0gKCRwYXJ0ID0gYXJyYXlfc2hpZnQoJHVybFBhcnRzKSkpIHsKJGd1ZXNzZWREb21haW4gLj0gJy8nIC4gJHBhcnQ7CgppZiAoaW5fYXJyYXkoJGd1ZXNzZWREb21haW4sICRjb25maWd1cmVkRG9tYWlucykgfHwgKG51bGwgIT09ICRwb3J0TnVtYmVyICYmIGluX2FycmF5KFByZWc6OnJlcGxhY2UoJ3s6XGQrfScsICcnLCAkZ3Vlc3NlZERvbWFpbiksICRjb25maWd1cmVkRG9tYWlucykpKSB7CnJldHVybiAkZ3Vlc3NlZERvbWFpbjsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEhnIGFzIEhnVXRpbHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKY2xhc3MgSGdEcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXI7Cgpwcm90ZWN0ZWQgJHJlcG9EaXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR0aGlzLT51cmwpKSB7CiR0aGlzLT5yZXBvRGlyID0gJHRoaXMtPnVybDsKfSBlbHNlIHsKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSGdEcml2ZXIgcmVxdWlyZXMgYSB1c2FibGUgY2FjaGUgZGlyZWN0b3J5LCBhbmQgaXQgbG9va3MgbGlrZSB5b3Ugc2V0IGl0IHRvIGJlIGRpc2FibGVkJyk7Cn0KCiRjYWNoZURpciA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpOwokdGhpcy0+cmVwb0RpciA9ICRjYWNoZURpciAuICcvJyAuIFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOV19aScsICctJywgJHRoaXMtPnVybCkgLiAnLyc7CgokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokZnMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkY2FjaGVEaXIpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5yZXBvRGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuJGNhY2hlRGlyLiciIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUgYnkgdGhlIGN1cnJlbnQgdXNlci4nKTsKfQoKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHRoaXMtPnVybCwgJHRoaXMtPmlvKTsKCiRoZ1V0aWxzID0gbmV3IEhnVXRpbHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CgoKaWYgKGlzX2RpcigkdGhpcy0+cmVwb0RpcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2hnIHN1bW1hcnknLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0RpcikpIHsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdoZyBwdWxsJywgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byB1cGRhdGUgJy4kdGhpcy0+dXJsLicsIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHJlcG9zaXRvcnkgbWF5IGJlIG91dGRhdGVkICgnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLicpPC9lcnJvcj4nKTsKfQp9IGVsc2UgewoKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHRoaXMtPnJlcG9EaXIpOwoKJHJlcG9EaXIgPSAkdGhpcy0+cmVwb0RpcjsKJGNvbW1hbmQgPSBzdGF0aWMgZnVuY3Rpb24gKCR1cmwpIHVzZSAoJHJlcG9EaXIpOiBzdHJpbmcgewpyZXR1cm4gc3ByaW50ZignaGcgY2xvbmUgLS1ub3VwZGF0ZSAtLSAlcyAlcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR1cmwpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcmVwb0RpcikpOwp9OwoKJGhnVXRpbHMtPnJ1bkNvbW1hbmQoJGNvbW1hbmQsICR0aGlzLT51cmwsIG51bGwpOwp9Cn0KCiR0aGlzLT5nZXRUYWdzKCk7CiR0aGlzLT5nZXRCcmFuY2hlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT5yb290SWRlbnRpZmllcikgewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnaGcgdGlwIC0tdGVtcGxhdGUgIntub2RlfSInLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CiRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KTsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJG91dHB1dFswXTsKfQoKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CnJldHVybiBbJ3R5cGUnID0+ICdoZycsICd1cmwnID0+ICR0aGlzLT5nZXRVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CmlmIChpc3NldCgkaWRlbnRpZmllclswXSkgJiYgJGlkZW50aWZpZXJbMF0gPT09ICctJykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgaGcgaWRlbnRpZmllciBkZXRlY3RlZC4gSWRlbnRpZmllciBtdXN0IG5vdCBzdGFydCB3aXRoIGEgLSwgZ2l2ZW46ICcgLiAkaWRlbnRpZmllcik7Cn0KCiRyZXNvdXJjZSA9IHNwcmludGYoJ2hnIGNhdCAtciAlcyAtLSAlcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRpZGVudGlmaWVyKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGZpbGUpKTsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJHJlc291cmNlLCAkY29udGVudCwgJHRoaXMtPnJlcG9EaXIpOwoKaWYgKCF0cmltKCRjb250ZW50KSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoCnNwcmludGYoCidoZyBsb2cgLS10ZW1wbGF0ZSAie2RhdGV8cmZjMzMzOWRhdGV9IiAtciAlcycsClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRpZGVudGlmaWVyKQopLAokb3V0cHV0LAokdGhpcy0+cmVwb0RpcgopOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUodHJpbSgkb3V0cHV0KSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdoZyB0YWdzJywgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkdGFnKSB7CmlmICgkdGFnICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyheKFteXHNdKylccytcZCs6KC4qKSQpJywgJHRhZywgJG1hdGNoKSkgewokdGFnc1skbWF0Y2hbMV1dID0gJG1hdGNoWzJdOwp9Cn0KdW5zZXQoJHRhZ3NbJ3RpcCddKTsKCiR0aGlzLT50YWdzID0gJHRhZ3M7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKJGJvb2ttYXJrcyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2hnIGJyYW5jaGVzJywgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyheKFteXHNdKylccytcZCs6KFthLWYwLTldKykpJywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYnJhbmNoZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnaGcgYm9va21hcmtzJywgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyheKD86W1xzKl0qKShbXlxzXSspXHMrXGQrOiguKikkKScsICRicmFuY2gsICRtYXRjaCkgJiYgJG1hdGNoWzFdWzBdICE9PSAnLScpIHsKJGJvb2ttYXJrc1skbWF0Y2hbMV1dID0gJG1hdGNoWzJdOwp9Cn0KCgokdGhpcy0+YnJhbmNoZXMgPSBhcnJheV9tZXJnZSgkYm9va21hcmtzLCAkYnJhbmNoZXMpOwp9CgpyZXR1cm4gJHRoaXMtPmJyYW5jaGVzOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKaWYgKFByZWc6OmlzTWF0Y2goJyMoXig/Omh0dHBzP3xzc2gpOi8vKD86W15AXStAKT9iaXRidWNrZXQub3JnfGh0dHBzOi8vKD86Lio/KVwua2lsbmhnLmNvbSkjaScsICR1cmwpKSB7CnJldHVybiB0cnVlOwp9CgoKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR1cmwpKSB7CiR1cmwgPSBGaWxlc3lzdGVtOjpnZXRQbGF0Zm9ybVBhdGgoJHVybCk7CmlmICghaXNfZGlyKCR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CgppZiAoJHByb2Nlc3MtPmV4ZWN1dGUoJ2hnIHN1bW1hcnknLCAkb3V0cHV0LCAkdXJsKSA9PT0gMCkgewpyZXR1cm4gdHJ1ZTsKfQp9CgppZiAoISRkZWVwKSB7CnJldHVybiBmYWxzZTsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRleGl0ID0gJHByb2Nlc3MtPmV4ZWN1dGUoc3ByaW50ZignaGcgaWRlbnRpZnkgLS0gJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdXJsKSksICRpZ25vcmVkKTsKCnJldHVybiAkZXhpdCA9PT0gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBlcmZvcmNlOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKY2xhc3MgUGVyZm9yY2VEcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICRkZXBvdDsKCnByb3RlY3RlZCAkYnJhbmNoOwoKcHJvdGVjdGVkICRwZXJmb3JjZSA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKJHRoaXMtPmRlcG90ID0gJHRoaXMtPnJlcG9Db25maWdbJ2RlcG90J107CiR0aGlzLT5icmFuY2ggPSAnJzsKaWYgKCFlbXB0eSgkdGhpcy0+cmVwb0NvbmZpZ1snYnJhbmNoJ10pKSB7CiR0aGlzLT5icmFuY2ggPSAkdGhpcy0+cmVwb0NvbmZpZ1snYnJhbmNoJ107Cn0KCiR0aGlzLT5pbml0UGVyZm9yY2UoJHRoaXMtPnJlcG9Db25maWcpOwokdGhpcy0+cGVyZm9yY2UtPnA0TG9naW4oKTsKJHRoaXMtPnBlcmZvcmNlLT5jaGVja1N0cmVhbSgpOwoKJHRoaXMtPnBlcmZvcmNlLT53cml0ZVA0Q2xpZW50U3BlYygpOwokdGhpcy0+cGVyZm9yY2UtPmNvbm5lY3RDbGllbnQoKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0UGVyZm9yY2UoYXJyYXkgJHJlcG9Db25maWcpOiB2b2lkCnsKaWYgKCFlbXB0eSgkdGhpcy0+cGVyZm9yY2UpKSB7CnJldHVybjsKfQoKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUGVyZm9yY2VEcml2ZXIgcmVxdWlyZXMgYSB1c2FibGUgY2FjaGUgZGlyZWN0b3J5LCBhbmQgaXQgbG9va3MgbGlrZSB5b3Ugc2V0IGl0IHRvIGJlIGRpc2FibGVkJyk7Cn0KCiRyZXBvRGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykgLiAnLycgLiAkdGhpcy0+ZGVwb3Q7CiR0aGlzLT5wZXJmb3JjZSA9IFBlcmZvcmNlOjpjcmVhdGUoJHJlcG9Db25maWcsICR0aGlzLT5nZXRVcmwoKSwgJHJlcG9EaXIsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+aW8pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0RmlsZUNvbnRlbnQoJGZpbGUsICRpZGVudGlmaWVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5icmFuY2g7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGVyZm9yY2UtPmdldEJyYW5jaGVzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0VGFncygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CnJldHVybiBbCid0eXBlJyA9PiAncGVyZm9yY2UnLAondXJsJyA9PiAkdGhpcy0+cmVwb0NvbmZpZ1sndXJsJ10sCidyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyLAoncDR1c2VyJyA9PiAkdGhpcy0+cGVyZm9yY2UtPmdldFVzZXIoKSwKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBvc2VyRmlsZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKJGNvbXBvc2VySW5mbyA9ICR0aGlzLT5wZXJmb3JjZS0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbignLy8nIC4gJHRoaXMtPmRlcG90IC4gJy8nIC4gJGlkZW50aWZpZXIpOwoKcmV0dXJuICFlbXB0eSgkY29tcG9zZXJJbmZvKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsKTogUmVzcG9uc2UKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ05vdCBpbXBsZW1lbnRlZC91c2VkIGluIFBlcmZvcmNlRHJpdmVyJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoJGRlZXAgfHwgUHJlZzo6aXNNYXRjaCgnI1xiKHBlcmZvcmNlfHA0KVxiI2knLCAkdXJsKSkgewpyZXR1cm4gUGVyZm9yY2U6OmNoZWNrU2VydmVyRXhpc3RzKCR1cmwsIG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKSk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZAp7CiR0aGlzLT5wZXJmb3JjZS0+Y2xlYW51cENsaWVudFNwZWMoKTsKJHRoaXMtPnBlcmZvcmNlID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlcG90KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVwb3Q7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2goKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5icmFuY2g7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwoKCgoKCmNsYXNzIFN2bkRyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJGJhc2VVcmw7Cgpwcm90ZWN0ZWQgJHRhZ3M7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzOwoKcHJvdGVjdGVkICRyb290SWRlbnRpZmllcjsKCgpwcm90ZWN0ZWQgJHRydW5rUGF0aCA9ICd0cnVuayc7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzUGF0aCA9ICdicmFuY2hlcyc7Cgpwcm90ZWN0ZWQgJHRhZ3NQYXRoID0gJ3RhZ3MnOwoKcHJvdGVjdGVkICRwYWNrYWdlUGF0aCA9ICcnOwoKcHJvdGVjdGVkICRjYWNoZUNyZWRlbnRpYWxzID0gdHJ1ZTsKCgoKCnByaXZhdGUgJHV0aWw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKJHRoaXMtPnVybCA9ICR0aGlzLT5iYXNlVXJsID0gcnRyaW0oc2VsZjo6bm9ybWFsaXplVXJsKCR0aGlzLT51cmwpLCAnLycpOwoKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKCmlmIChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1sndHJ1bmstcGF0aCddKSkgewokdGhpcy0+dHJ1bmtQYXRoID0gJHRoaXMtPnJlcG9Db25maWdbJ3RydW5rLXBhdGgnXTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ2JyYW5jaGVzLXBhdGgnXSkpIHsKJHRoaXMtPmJyYW5jaGVzUGF0aCA9ICR0aGlzLT5yZXBvQ29uZmlnWydicmFuY2hlcy1wYXRoJ107Cn0KaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWyd0YWdzLXBhdGgnXSkpIHsKJHRoaXMtPnRhZ3NQYXRoID0gJHRoaXMtPnJlcG9Db25maWdbJ3RhZ3MtcGF0aCddOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdzdm4tY2FjaGUtY3JlZGVudGlhbHMnLCAkdGhpcy0+cmVwb0NvbmZpZykpIHsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAoYm9vbCkgJHRoaXMtPnJlcG9Db25maWdbJ3N2bi1jYWNoZS1jcmVkZW50aWFscyddOwp9CmlmIChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1sncGFja2FnZS1wYXRoJ10pKSB7CiR0aGlzLT5wYWNrYWdlUGF0aCA9ICcvJyAuIHRyaW0oJHRoaXMtPnJlcG9Db25maWdbJ3BhY2thZ2UtcGF0aCddLCAnLycpOwp9CgppZiAoZmFsc2UgIT09ICgkcG9zID0gc3RycnBvcygkdGhpcy0+dXJsLCAnLycgLiAkdGhpcy0+dHJ1bmtQYXRoKSkpIHsKJHRoaXMtPmJhc2VVcmwgPSBzdWJzdHIoJHRoaXMtPnVybCwgMCwgJHBvcyk7Cn0KCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdGhpcy0+YmFzZVVybCkpKTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKCiR0aGlzLT5nZXRCcmFuY2hlcygpOwokdGhpcy0+Z2V0VGFncygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllciA/OiAkdGhpcy0+dHJ1bmtQYXRoOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsndHlwZScgPT4gJ3N2bicsICd1cmwnID0+ICR0aGlzLT5iYXNlVXJsLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2hvdWxkQ2FjaGUoc3RyaW5nICRpZGVudGlmaWVyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y2FjaGUgJiYgUHJlZzo6aXNNYXRjaCgne0BcZCskfScsICRpZGVudGlmaWVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllci4nLmpzb24nKSkgewoKCmlmICgkcmVzID09PSAnIiInKSB7CiRyZXMgPSAnbnVsbCc7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIuJy5qc29uJywganNvbl9lbmNvZGUobnVsbCkpOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0gPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9Cgp0cnkgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJG1lc3NhZ2UgPSAkZS0+Z2V0TWVzc2FnZSgpOwppZiAoc3RyaXBvcygkbWVzc2FnZSwgJ3BhdGggbm90IGZvdW5kJykgPT09IGZhbHNlICYmIHN0cmlwb3MoJG1lc3NhZ2UsICdzdm46IHdhcm5pbmc6IFcxNjAwMTMnKSA9PT0gZmFsc2UpIHsKdGhyb3cgJGU7Cn0KCiRjb21wb3NlciA9IG51bGw7Cn0KCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIuJy5qc29uJywganNvbl9lbmNvZGUoJGNvbXBvc2VyKSk7Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgoKaWYgKCFpc19hcnJheSgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CiRpZGVudGlmaWVyID0gJy8nIC4gdHJpbSgkaWRlbnRpZmllciwgJy8nKSAuICcvJzsKClByZWc6Om1hdGNoKCd7XiguKz8pKEBcZCspPy8kfScsICRpZGVudGlmaWVyLCAkbWF0Y2gpOwppZiAoIWVtcHR5KCRtYXRjaFsyXSkpIHsKJHBhdGggPSAkbWF0Y2hbMV07CiRyZXYgPSAkbWF0Y2hbMl07Cn0gZWxzZSB7CiRwYXRoID0gJGlkZW50aWZpZXI7CiRyZXYgPSAnJzsKfQoKdHJ5IHsKJHJlc291cmNlID0gJHBhdGguJGZpbGU7CiRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZSgnc3ZuIGNhdCcsICR0aGlzLT5iYXNlVXJsIC4gJHJlc291cmNlIC4gJHJldik7CmlmICghdHJpbSgkb3V0cHV0KSkgewpyZXR1cm4gbnVsbDsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCkpOwp9CgpyZXR1cm4gJG91dHB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CiRpZGVudGlmaWVyID0gJy8nIC4gdHJpbSgkaWRlbnRpZmllciwgJy8nKSAuICcvJzsKClByZWc6Om1hdGNoKCd7XiguKz8pKEBcZCspPy8kfScsICRpZGVudGlmaWVyLCAkbWF0Y2gpOwppZiAobnVsbCAhPT0gJG1hdGNoWzJdICYmIG51bGwgIT09ICRtYXRjaFsxXSkgewokcGF0aCA9ICRtYXRjaFsxXTsKJHJldiA9ICRtYXRjaFsyXTsKfSBlbHNlIHsKJHBhdGggPSAkaWRlbnRpZmllcjsKJHJldiA9ICcnOwp9Cgokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoJ3N2biBpbmZvJywgJHRoaXMtPmJhc2VVcmwgLiAkcGF0aCAuICRyZXYpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkbGluZSkgewppZiAoJGxpbmUgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15MYXN0IENoYW5nZWQgRGF0ZTogKFteKF0rKX0nLCAkbGluZSwgJG1hdGNoKSkgewpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkbWF0Y2hbMV0sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CgppZiAoJHRoaXMtPnRhZ3NQYXRoICE9PSBmYWxzZSkgewokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoJ3N2biBscyAtLXZlcmJvc2UnLCAkdGhpcy0+YmFzZVVybCAuICcvJyAuICR0aGlzLT50YWdzUGF0aCk7CmlmICgkb3V0cHV0KSB7CiRsYXN0UmV2ID0gMDsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGxpbmUpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKaWYgKCRsaW5lICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxTKykuKj8oXFMrKVxzKiR9JywgJGxpbmUsICRtYXRjaCkpIHsKaWYgKGlzc2V0KCRtYXRjaFsxXSwgJG1hdGNoWzJdKSkgewppZiAoJG1hdGNoWzJdID09PSAnLi8nKSB7CiRsYXN0UmV2ID0gKGludCkgJG1hdGNoWzFdOwp9IGVsc2UgewokdGFnc1tydHJpbSgkbWF0Y2hbMl0sICcvJyldID0gJHRoaXMtPmJ1aWxkSWRlbnRpZmllcigKJy8nIC4gJHRoaXMtPnRhZ3NQYXRoIC4gJy8nIC4gJG1hdGNoWzJdLAptYXgoJGxhc3RSZXYsIChpbnQpICRtYXRjaFsxXSkKKTsKfQp9Cn0KfQp9Cn0KCiR0aGlzLT50YWdzID0gJHRhZ3M7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKCmlmIChmYWxzZSA9PT0gJHRoaXMtPnRydW5rUGF0aCkgewokdHJ1bmtQYXJlbnQgPSAkdGhpcy0+YmFzZVVybCAuICcvJzsKfSBlbHNlIHsKJHRydW5rUGFyZW50ID0gJHRoaXMtPmJhc2VVcmwgLiAnLycgLiAkdGhpcy0+dHJ1bmtQYXRoOwp9Cgokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoJ3N2biBscyAtLXZlcmJvc2UnLCAkdHJ1bmtQYXJlbnQpOwppZiAoJG91dHB1dCkgewpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkbGluZSkgewokbGluZSA9IHRyaW0oJGxpbmUpOwppZiAoJGxpbmUgJiYgUHJlZzo6aXNNYXRjaCgne15ccyooXFMrKS4qPyhcUyspXHMqJH0nLCAkbGluZSwgJG1hdGNoKSkgewppZiAoaXNzZXQoJG1hdGNoWzFdLCAkbWF0Y2hbMl0pICYmICRtYXRjaFsyXSA9PT0gJy4vJykgewokYnJhbmNoZXNbJ3RydW5rJ10gPSAkdGhpcy0+YnVpbGRJZGVudGlmaWVyKAonLycgLiAkdGhpcy0+dHJ1bmtQYXRoLAooaW50KSAkbWF0Y2hbMV0KKTsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJGJyYW5jaGVzWyd0cnVuayddOwpicmVhazsKfQp9Cn0KfQp1bnNldCgkb3V0cHV0KTsKCmlmICgkdGhpcy0+YnJhbmNoZXNQYXRoICE9PSBmYWxzZSkgewokb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGUoJ3N2biBscyAtLXZlcmJvc2UnLCAkdGhpcy0+YmFzZVVybCAuICcvJyAuICR0aGlzLT5icmFuY2hlc1BhdGgpOwppZiAoJG91dHB1dCkgewokbGFzdFJldiA9IDA7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKHRyaW0oJG91dHB1dCkpIGFzICRsaW5lKSB7CiRsaW5lID0gdHJpbSgkbGluZSk7CmlmICgkbGluZSAmJiBQcmVnOjppc01hdGNoKCd7XlxzKihcUyspLio/KFxTKylccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CmlmIChpc3NldCgkbWF0Y2hbMV0sICRtYXRjaFsyXSkpIHsKaWYgKCRtYXRjaFsyXSA9PT0gJy4vJykgewokbGFzdFJldiA9IChpbnQpICRtYXRjaFsxXTsKfSBlbHNlIHsKJGJyYW5jaGVzW3J0cmltKCRtYXRjaFsyXSwgJy8nKV0gPSAkdGhpcy0+YnVpbGRJZGVudGlmaWVyKAonLycgLiAkdGhpcy0+YnJhbmNoZXNQYXRoIC4gJy8nIC4gJG1hdGNoWzJdLAptYXgoJGxhc3RSZXYsIChpbnQpICRtYXRjaFsxXSkKKTsKfQp9Cn0KfQp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CiR1cmwgPSBzZWxmOjpub3JtYWxpemVVcmwoJHVybCk7CmlmIChQcmVnOjppc01hdGNoKCcjKF5zdm46Ly98XnN2blwrc3NoOi8vfHN2blwuKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoISRkZWVwICYmICFGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZXhpdCA9ICRwcm9jZXNzLT5leGVjdXRlKAoic3ZuIGluZm8gLS1ub24taW50ZXJhY3RpdmUgLS0gIi5Qcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdXJsKSwKJGlnbm9yZWRPdXRwdXQKKTsKCmlmICgkZXhpdCA9PT0gMCkgewoKcmV0dXJuIHRydWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cmlwb3MoJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICdhdXRob3JpemF0aW9uIGZhaWxlZDonKSkgewoKCnJldHVybiB0cnVlOwp9CgoKaWYgKGZhbHNlICE9PSBzdHJpcG9zKCRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAnQXV0aGVudGljYXRpb24gZmFpbGVkJykpIHsKCgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVVybChzdHJpbmcgJHVybCk6IHN0cmluZwp7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CmlmICgkZnMtPmlzQWJzb2x1dGVQYXRoKCR1cmwpKSB7CnJldHVybiAnZmlsZTovLycgLiBzdHJ0cigkdXJsLCAnXFwnLCAnLycpOwp9CgpyZXR1cm4gJHVybDsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShzdHJpbmcgJGNvbW1hbmQsIHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT51dGlsKSB7CiR0aGlzLT51dGlsID0gbmV3IFN2blV0aWwoJHRoaXMtPmJhc2VVcmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokdGhpcy0+dXRpbC0+c2V0Q2FjaGVDcmVkZW50aWFscygkdGhpcy0+Y2FjaGVDcmVkZW50aWFscyk7Cn0KCnRyeSB7CnJldHVybiAkdGhpcy0+dXRpbC0+ZXhlY3V0ZSgkY29tbWFuZCwgJHVybCk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmIChudWxsID09PSAkdGhpcy0+dXRpbC0+YmluYXJ5VmVyc2lvbigpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGxvYWQgJy4kdGhpcy0+dXJsLicsIHN2biB3YXMgbm90IGZvdW5kLCBjaGVjayB0aGF0IGl0IGlzIGluc3RhbGxlZCBhbmQgaW4geW91ciBQQVRIIGVudi4nIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidSZXBvc2l0b3J5ICcuJHRoaXMtPnVybC4nIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQsICcuJGUtPmdldE1lc3NhZ2UoKQopOwp9Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBidWlsZElkZW50aWZpZXIoc3RyaW5nICRiYXNlRGlyLCBpbnQgJHJldmlzaW9uKTogc3RyaW5nCnsKcmV0dXJuIHJ0cmltKCRiYXNlRGlyLCAnLycpIC4gJHRoaXMtPnBhY2thZ2VQYXRoIC4gJy9AJyAuICRyZXZpc2lvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBWY3NEcml2ZXIgaW1wbGVtZW50cyBWY3NEcml2ZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkICR1cmw7Cgpwcm90ZWN0ZWQgJG9yaWdpblVybDsKCnByb3RlY3RlZCAkcmVwb0NvbmZpZzsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7Cgpwcm90ZWN0ZWQgJGluZm9DYWNoZSA9IFtdOwoKcHJvdGVjdGVkICRjYWNoZTsKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MpCnsKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSkpIHsKJHJlcG9Db25maWdbJ3VybCddID0gRmlsZXN5c3RlbTo6Z2V0UGxhdGZvcm1QYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSk7Cn0KCiR0aGlzLT51cmwgPSAkcmVwb0NvbmZpZ1sndXJsJ107CiR0aGlzLT5vcmlnaW5VcmwgPSAkcmVwb0NvbmZpZ1sndXJsJ107CiR0aGlzLT5yZXBvQ29uZmlnID0gJHJlcG9Db25maWc7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNob3VsZENhY2hlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmNhY2hlICYmIFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH1pRCcsICRpZGVudGlmaWVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpIHsKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIsIEpzb25GaWxlOjplbmNvZGUoJGNvbXBvc2VyLCAwKSk7Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokY29tcG9zZXJGaWxlQ29udGVudCA9ICR0aGlzLT5nZXRGaWxlQ29udGVudCgnY29tcG9zZXIuanNvbicsICRpZGVudGlmaWVyKTsKCmlmICghJGNvbXBvc2VyRmlsZUNvbnRlbnQpIHsKcmV0dXJuIG51bGw7Cn0KCiRjb21wb3NlciA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGNvbXBvc2VyRmlsZUNvbnRlbnQsICRpZGVudGlmaWVyIC4gJzpjb21wb3Nlci5qc29uJyk7CgppZiAoW10gPT09ICRjb21wb3NlciB8fCAhaXNfYXJyYXkoJGNvbXBvc2VyKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKGVtcHR5KCRjb21wb3NlclsndGltZSddKSAmJiBudWxsICE9PSAoJGNoYW5nZURhdGUgPSAkdGhpcy0+Z2V0Q2hhbmdlRGF0ZSgkaWRlbnRpZmllcikpKSB7CiRjb21wb3NlclsndGltZSddID0gJGNoYW5nZURhdGUtPmZvcm1hdChEQVRFX1JGQzMzMzkpOwp9CgpyZXR1cm4gJGNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zZXJGaWxlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2wKewp0cnkgewpyZXR1cm4gbnVsbCAhPT0gJHRoaXMtPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNjaGVtZSgpOiBzdHJpbmcKewppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CnJldHVybiAnaHR0cHMnOwp9CgpyZXR1cm4gJ2h0dHAnOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsKTogUmVzcG9uc2UKewokb3B0aW9ucyA9ICR0aGlzLT5yZXBvQ29uZmlnWydvcHRpb25zJ10gPz8gW107CgpyZXR1cm4gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJG9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkCnsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgppbnRlcmZhY2UgVmNzRHJpdmVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZzsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zZXJGaWxlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2w7CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcVmNzRHJpdmVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEludmFsaWRQYWNrYWdlRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcTG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKCgoKCmNsYXNzIFZjc1JlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkdXJsOwoKcHJvdGVjdGVkICRwYWNrYWdlTmFtZTsKCnByb3RlY3RlZCAkaXNWZXJib3NlOwoKcHJvdGVjdGVkICRpc1ZlcnlWZXJib3NlOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICR2ZXJzaW9uUGFyc2VyOwoKcHJvdGVjdGVkICR0eXBlOwoKcHJvdGVjdGVkICRsb2FkZXI7Cgpwcm90ZWN0ZWQgJHJlcG9Db25maWc7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKcHJvdGVjdGVkICRwcm9jZXNzRXhlY3V0b3I7Cgpwcm90ZWN0ZWQgJGJyYW5jaEVycm9yT2NjdXJyZWQgPSBmYWxzZTsKCnByaXZhdGUgJGRyaXZlcnM7Cgpwcml2YXRlICRkcml2ZXI7Cgpwcml2YXRlICR2ZXJzaW9uQ2FjaGU7Cgpwcml2YXRlICRlbXB0eVJlZmVyZW5jZXMgPSBbXTsKCnByaXZhdGUgJHZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zID0gW107CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvQ29uZmlnLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9FdmVudERpc3BhdGNoZXIgJGRpc3BhdGNoZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP2FycmF5ICRkcml2ZXJzID0gbnVsbCwgP1ZlcnNpb25DYWNoZUludGVyZmFjZSAkdmVyc2lvbkNhY2hlID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiR0aGlzLT5kcml2ZXJzID0gJGRyaXZlcnMgPzogWwonZ2l0aHViJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcR2l0SHViRHJpdmVyJywKJ2dpdGxhYicgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEdpdExhYkRyaXZlcicsCidiaXRidWNrZXQnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXRCaXRidWNrZXREcml2ZXInLAonZ2l0LWJpdGJ1Y2tldCcgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEdpdEJpdGJ1Y2tldERyaXZlcicsCidnaXQnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXREcml2ZXInLAonaGcnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xIZ0RyaXZlcicsCidwZXJmb3JjZScgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXFBlcmZvcmNlRHJpdmVyJywKJ2Zvc3NpbCcgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEZvc3NpbERyaXZlcicsCgonc3ZuJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcU3ZuRHJpdmVyJywKXTsKCiR0aGlzLT51cmwgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT50eXBlID0gJHJlcG9Db25maWdbJ3R5cGUnXSA/PyAndmNzJzsKJHRoaXMtPmlzVmVyYm9zZSA9ICRpby0+aXNWZXJib3NlKCk7CiR0aGlzLT5pc1ZlcnlWZXJib3NlID0gJGlvLT5pc1ZlcnlWZXJib3NlKCk7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cmVwb0NvbmZpZyA9ICRyZXBvQ29uZmlnOwokdGhpcy0+dmVyc2lvbkNhY2hlID0gJHZlcnNpb25DYWNoZTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKQp7CiRkcml2ZXJDbGFzcyA9IGdldF9jbGFzcygkdGhpcy0+Z2V0RHJpdmVyKCkpOwokZHJpdmVyVHlwZSA9IGFycmF5X3NlYXJjaCgkZHJpdmVyQ2xhc3MsICR0aGlzLT5kcml2ZXJzKTsKaWYgKCEkZHJpdmVyVHlwZSkgewokZHJpdmVyVHlwZSA9ICRkcml2ZXJDbGFzczsKfQoKcmV0dXJuICd2Y3MgcmVwbyAoJy4kZHJpdmVyVHlwZS4nICcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+dXJsKS4nKSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvQ29uZmlnKCkKewpyZXR1cm4gJHRoaXMtPnJlcG9Db25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2FkZXIoTG9hZGVySW50ZXJmYWNlICRsb2FkZXIpOiB2b2lkCnsKJHRoaXMtPmxvYWRlciA9ICRsb2FkZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREcml2ZXIoKTogP1Zjc0RyaXZlckludGVyZmFjZQp7CmlmICgkdGhpcy0+ZHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZHJpdmVyOwp9CgppZiAoaXNzZXQoJHRoaXMtPmRyaXZlcnNbJHRoaXMtPnR5cGVdKSkgewokY2xhc3MgPSAkdGhpcy0+ZHJpdmVyc1skdGhpcy0+dHlwZV07CiR0aGlzLT5kcml2ZXIgPSBuZXcgJGNsYXNzKCR0aGlzLT5yZXBvQ29uZmlnLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJHRoaXMtPnByb2Nlc3NFeGVjdXRvcik7CiR0aGlzLT5kcml2ZXItPmluaXRpYWxpemUoKTsKCnJldHVybiAkdGhpcy0+ZHJpdmVyOwp9Cgpmb3JlYWNoICgkdGhpcy0+ZHJpdmVycyBhcyAkZHJpdmVyKSB7CmlmICgkZHJpdmVyOjpzdXBwb3J0cygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT51cmwpKSB7CiR0aGlzLT5kcml2ZXIgPSBuZXcgJGRyaXZlcigkdGhpcy0+cmVwb0NvbmZpZywgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpOwokdGhpcy0+ZHJpdmVyLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPmRyaXZlcjsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+ZHJpdmVycyBhcyAkZHJpdmVyKSB7CmlmICgkZHJpdmVyOjpzdXBwb3J0cygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT51cmwsIHRydWUpKSB7CiR0aGlzLT5kcml2ZXIgPSBuZXcgJGRyaXZlcigkdGhpcy0+cmVwb0NvbmZpZywgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpOwokdGhpcy0+ZHJpdmVyLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPmRyaXZlcjsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhZEludmFsaWRCcmFuY2hlcygpOiBib29sCnsKcmV0dXJuICR0aGlzLT5icmFuY2hFcnJvck9jY3VycmVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW1wdHlSZWZlcmVuY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5lbXB0eVJlZmVyZW5jZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uVHJhbnNwb3J0RXhjZXB0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnM7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiRpc1ZlcmJvc2UgPSAkdGhpcy0+aXNWZXJib3NlOwokaXNWZXJ5VmVyYm9zZSA9ICR0aGlzLT5pc1ZlcnlWZXJib3NlOwoKJGRyaXZlciA9ICR0aGlzLT5nZXREcml2ZXIoKTsKaWYgKCEkZHJpdmVyKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdObyBkcml2ZXIgZm91bmQgdG8gaGFuZGxlIFZDUyByZXBvc2l0b3J5ICcuJHRoaXMtPnVybCk7Cn0KCiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CmlmICghJHRoaXMtPmxvYWRlcikgewokdGhpcy0+bG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCR0aGlzLT52ZXJzaW9uUGFyc2VyKTsKfQoKJGhhc1Jvb3RJZGVudGlmaWVyQ29tcG9zZXJKc29uID0gZmFsc2U7CnRyeSB7CiRoYXNSb290SWRlbnRpZmllckNvbXBvc2VySnNvbiA9ICRkcml2ZXItPmhhc0NvbXBvc2VyRmlsZSgkZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpKTsKaWYgKCRoYXNSb290SWRlbnRpZmllckNvbXBvc2VySnNvbikgewokZGF0YSA9ICRkcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSk7CiR0aGlzLT5wYWNrYWdlTmFtZSA9ICFlbXB0eSgkZGF0YVsnbmFtZSddKSA/ICRkYXRhWyduYW1lJ10gOiBudWxsOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICR0aGlzLT5zaG91bGRSZXRocm93VHJhbnNwb3J0RXhjZXB0aW9uKCRlKSkgewp0aHJvdyAkZTsKfQoKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPlNraXBwZWQgcGFyc2luZyAnLiRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCkuJywgJy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicpOwp9Cn0KCmZvcmVhY2ggKCRkcml2ZXItPmdldFRhZ3MoKSBhcyAkdGFnID0+ICRpZGVudGlmaWVyKSB7CiR0YWcgPSAoc3RyaW5nKSAkdGFnOwokbXNnID0gJ1JlYWRpbmcgY29tcG9zZXIuanNvbiBvZiA8aW5mbz4nIC4gKCR0aGlzLT5wYWNrYWdlTmFtZSA/OiAkdGhpcy0+dXJsKSAuICc8L2luZm8+ICg8Y29tbWVudD4nIC4gJHRhZyAuICc8L2NvbW1lbnQ+KSc7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9CgoKJHRhZyA9IHN0cl9yZXBsYWNlKCdyZWxlYXNlLScsICcnLCAkdGFnKTsKCiRjYWNoZWRQYWNrYWdlID0gJHRoaXMtPmdldENhY2hlZFBhY2thZ2VWZXJzaW9uKCR0YWcsICRpZGVudGlmaWVyLCAkaXNWZXJib3NlLCAkaXNWZXJ5VmVyYm9zZSk7CmlmICgkY2FjaGVkUGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkY2FjaGVkUGFja2FnZSk7Cgpjb250aW51ZTsKfQppZiAoJGNhY2hlZFBhY2thZ2UgPT09IGZhbHNlKSB7CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwoKY29udGludWU7Cn0KCmlmICghJHBhcnNlZFRhZyA9ICR0aGlzLT52YWxpZGF0ZVRhZygkdGFnKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgaW52YWxpZCB0YWcgbmFtZTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfQoKdHJ5IHsKJGRhdGEgPSAkZHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKaWYgKG51bGwgPT09ICRkYXRhKSB7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgdGFnICcuJHRhZy4nLCBubyBjb21wb3NlciBmaWxlPC93YXJuaW5nPicpOwp9CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwpjb250aW51ZTsKfQoKCmlmIChpc3NldCgkZGF0YVsndmVyc2lvbiddKSkgewokZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRkYXRhWyd2ZXJzaW9uJ10pOwp9IGVsc2UgewoKJGRhdGFbJ3ZlcnNpb24nXSA9ICR0YWc7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICRwYXJzZWRUYWc7Cn0KCgokZGF0YVsndmVyc2lvbiddID0gUHJlZzo6cmVwbGFjZSgne1suLV0/ZGV2JH1pJywgJycsICRkYXRhWyd2ZXJzaW9uJ10pOwokZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSBQcmVnOjpyZXBsYWNlKCd7KF5kZXYtfFsuLV0/ZGV2JCl9aScsICcnLCAkZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10pOwoKCnVuc2V0KCRkYXRhWydkZWZhdWx0LWJyYW5jaCddKTsKCgppZiAoJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddICE9PSAkcGFyc2VkVGFnKSB7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewppZiAoUHJlZzo6aXNNYXRjaCgneyheZGV2LXxbLi1dP2RldiQpfWknLCAkcGFyc2VkVGFnKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgdGFnICcuJHRhZy4nLCBpbnZhbGlkIHRhZyBuYW1lLCB0YWdzIGNhbiBub3QgdXNlIGRldiBwcmVmaXhlcyBvciBzdWZmaXhlczwvd2FybmluZz4nKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgdGFnICgnLiRwYXJzZWRUYWcuJykgZG9lcyBub3QgbWF0Y2ggdmVyc2lvbiAoJy4kZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10uJykgaW4gY29tcG9zZXIuanNvbjwvd2FybmluZz4nKTsKfQp9CmNvbnRpbnVlOwp9CgokdGFnUGFja2FnZU5hbWUgPSAkdGhpcy0+cGFja2FnZU5hbWUgPzogKCRkYXRhWyduYW1lJ10gPz8gJycpOwppZiAoJGV4aXN0aW5nUGFja2FnZSA9ICR0aGlzLT5maW5kUGFja2FnZSgkdGFnUGFja2FnZU5hbWUsICRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIGl0IGNvbmZsaWN0cyB3aXRoIGFuIGFub3RoZXIgdGFnICgnLiRleGlzdGluZ1BhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nKSBhcyBib3RoIHJlc29sdmUgdG8gJy4kZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10uJyBpbnRlcm5hbGx5PC93YXJuaW5nPicpOwp9CmNvbnRpbnVlOwp9CgppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdJbXBvcnRpbmcgdGFnICcuJHRhZy4nICgnLiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nKScpOwp9CgokdGhpcy0+YWRkUGFja2FnZSgkdGhpcy0+bG9hZGVyLT5sb2FkKCR0aGlzLT5wcmVQcm9jZXNzKCRkcml2ZXIsICRkYXRhLCAkaWRlbnRpZmllcikpKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKJHRoaXMtPnZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zWyd0YWdzJ11bJHRhZ10gPSAkZTsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQwNCkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKfQppZiAoJHRoaXMtPnNob3VsZFJldGhyb3dUcmFuc3BvcnRFeGNlcHRpb24oJGUpKSB7CnRocm93ICRlOwp9Cn0KaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsICcuKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uID8gJ25vIGNvbXBvc2VyIGZpbGUgd2FzIGZvdW5kICgnIC4gJGUtPmdldENvZGUoKSAuICcgSFRUUCBzdGF0dXMgY29kZSknIDogJGUtPmdldE1lc3NhZ2UoKSkuJzwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfQp9CgppZiAoISRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJycsIGZhbHNlKTsKfQoKJGJyYW5jaGVzID0gJGRyaXZlci0+Z2V0QnJhbmNoZXMoKTsKCmlmICgkaGFzUm9vdElkZW50aWZpZXJDb21wb3Nlckpzb24gJiYgaXNzZXQoJGJyYW5jaGVzWyRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCldKSkgewokYnJhbmNoZXMgPSBbJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSA9PiAkYnJhbmNoZXNbJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKV1dICsgJGJyYW5jaGVzOwp9Cgpmb3JlYWNoICgkYnJhbmNoZXMgYXMgJGJyYW5jaCA9PiAkaWRlbnRpZmllcikgewokYnJhbmNoID0gKHN0cmluZykgJGJyYW5jaDsKJG1zZyA9ICdSZWFkaW5nIGNvbXBvc2VyLmpzb24gb2YgPGluZm8+JyAuICgkdGhpcy0+cGFja2FnZU5hbWUgPzogJHRoaXMtPnVybCkgLiAnPC9pbmZvPiAoPGNvbW1lbnQ+JyAuICRicmFuY2ggLiAnPC9jb21tZW50PiknOwppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtc2cpOwp9IGVsc2VpZiAoJGlzVmVyYm9zZSkgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCRtc2csIGZhbHNlKTsKfQoKaWYgKCEkcGFyc2VkQnJhbmNoID0gJHRoaXMtPnZhbGlkYXRlQnJhbmNoKCRicmFuY2gpKSB7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgYnJhbmNoICcuJGJyYW5jaC4nLCBpbnZhbGlkIG5hbWU8L3dhcm5pbmc+Jyk7Cn0KY29udGludWU7Cn0KCgppZiAoc3RycG9zKCRwYXJzZWRCcmFuY2gsICdkZXYtJykgPT09IDAgfHwgVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMgPT09ICRwYXJzZWRCcmFuY2gpIHsKJHZlcnNpb24gPSAnZGV2LScgLiAkYnJhbmNoOwp9IGVsc2UgewokcHJlZml4ID0gc3RycG9zKCRicmFuY2gsICd2JykgPT09IDAgPyAndicgOiAnJzsKJHZlcnNpb24gPSAkcHJlZml4IC4gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkcGFyc2VkQnJhbmNoKTsKfQoKJGNhY2hlZFBhY2thZ2UgPSAkdGhpcy0+Z2V0Q2FjaGVkUGFja2FnZVZlcnNpb24oJHZlcnNpb24sICRpZGVudGlmaWVyLCAkaXNWZXJib3NlLCAkaXNWZXJ5VmVyYm9zZSwgJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSA9PT0gJGJyYW5jaCk7CmlmICgkY2FjaGVkUGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkY2FjaGVkUGFja2FnZSk7Cgpjb250aW51ZTsKfQppZiAoJGNhY2hlZFBhY2thZ2UgPT09IGZhbHNlKSB7CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwoKY29udGludWU7Cn0KCnRyeSB7CiRkYXRhID0gJGRyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CmlmIChudWxsID09PSAkZGF0YSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgbm8gY29tcG9zZXIgZmlsZTwvd2FybmluZz4nKTsKfQokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKY29udGludWU7Cn0KCgokZGF0YVsndmVyc2lvbiddID0gJHZlcnNpb247CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICRwYXJzZWRCcmFuY2g7Cgp1bnNldCgkZGF0YVsnZGVmYXVsdC1icmFuY2gnXSk7CmlmICgkZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpID09PSAkYnJhbmNoKSB7CiRkYXRhWydkZWZhdWx0LWJyYW5jaCddID0gdHJ1ZTsKfQoKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignSW1wb3J0aW5nIGJyYW5jaCAnLiRicmFuY2guJyAoJy4kZGF0YVsndmVyc2lvbiddLicpJyk7Cn0KCiRwYWNrYWdlRGF0YSA9ICR0aGlzLT5wcmVQcm9jZXNzKCRkcml2ZXIsICRkYXRhLCAkaWRlbnRpZmllcik7CiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZURhdGEpOwppZiAoJHRoaXMtPmxvYWRlciBpbnN0YW5jZW9mIFZhbGlkYXRpbmdBcnJheUxvYWRlciAmJiBcY291bnQoJHRoaXMtPmxvYWRlci0+Z2V0V2FybmluZ3MoKSkgPiAwKSB7CnRocm93IG5ldyBJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbigkdGhpcy0+bG9hZGVyLT5nZXRFcnJvcnMoKSwgJHRoaXMtPmxvYWRlci0+Z2V0V2FybmluZ3MoKSwgJHBhY2thZ2VEYXRhKTsKfQokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+dmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnNbJ2JyYW5jaGVzJ11bJGJyYW5jaF0gPSAkZTsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQwNCkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKfQppZiAoJHRoaXMtPnNob3VsZFJldGhyb3dUcmFuc3BvcnRFeGNlcHRpb24oJGUpKSB7CnRocm93ICRlOwp9CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgYnJhbmNoICcuJGJyYW5jaC4nLCBubyBjb21wb3NlciBmaWxlIHdhcyBmb3VuZCAoJyAuICRlLT5nZXRDb2RlKCkgLiAnIEhUVFAgc3RhdHVzIGNvZGUpPC93YXJuaW5nPicpOwp9CmNvbnRpbnVlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnKTsKfQokdGhpcy0+YnJhbmNoRXJyb3JPY2N1cnJlZCA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPlNraXBwZWQgYnJhbmNoICcuJGJyYW5jaC4nLCAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CmNvbnRpbnVlOwp9Cn0KJGRyaXZlci0+Y2xlYW51cCgpOwoKaWYgKCEkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCcnLCBmYWxzZSk7Cn0KCmlmICghJHRoaXMtPmdldFBhY2thZ2VzKCkpIHsKdGhyb3cgbmV3IEludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uKCdObyB2YWxpZCBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBpbiBhbnkgYnJhbmNoIG9yIHRhZyBvZiAnLiR0aGlzLT51cmwuJywgY291bGQgbm90IGxvYWQgYSBwYWNrYWdlIGZyb20gaXQuJyk7Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJlUHJvY2VzcyhWY3NEcml2ZXJJbnRlcmZhY2UgJGRyaXZlciwgYXJyYXkgJGRhdGEsIHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKCgoKJGRhdGFQYWNrYWdlTmFtZSA9ICRkYXRhWyduYW1lJ10gPz8gbnVsbDsKJGRhdGFbJ25hbWUnXSA9ICR0aGlzLT5wYWNrYWdlTmFtZSA/OiAkZGF0YVBhY2thZ2VOYW1lOwoKaWYgKCFpc3NldCgkZGF0YVsnZGlzdCddKSkgewokZGF0YVsnZGlzdCddID0gJGRyaXZlci0+Z2V0RGlzdCgkaWRlbnRpZmllcik7Cn0KaWYgKCFpc3NldCgkZGF0YVsnc291cmNlJ10pKSB7CiRkYXRhWydzb3VyY2UnXSA9ICRkcml2ZXItPmdldFNvdXJjZSgkaWRlbnRpZmllcik7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUJyYW5jaChzdHJpbmcgJGJyYW5jaCkKewp0cnkgewokbm9ybWFsaXplZEJyYW5jaCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGJyYW5jaCk7CgoKJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJG5vcm1hbGl6ZWRCcmFuY2gpOwoKcmV0dXJuICRub3JtYWxpemVkQnJhbmNoOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVRhZyhzdHJpbmcgJHZlcnNpb24pCnsKdHJ5IHsKcmV0dXJuICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb24pOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDYWNoZWRQYWNrYWdlVmVyc2lvbihzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkaWRlbnRpZmllciwgYm9vbCAkaXNWZXJib3NlLCBib29sICRpc1ZlcnlWZXJib3NlLCBib29sICRpc0RlZmF1bHRCcmFuY2ggPSBmYWxzZSkKewppZiAoISR0aGlzLT52ZXJzaW9uQ2FjaGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRjYWNoZWRQYWNrYWdlID0gJHRoaXMtPnZlcnNpb25DYWNoZS0+Z2V0VmVyc2lvblBhY2thZ2UoJHZlcnNpb24sICRpZGVudGlmaWVyKTsKaWYgKCRjYWNoZWRQYWNrYWdlID09PSBmYWxzZSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkICcuJHZlcnNpb24uJywgbm8gY29tcG9zZXIgZmlsZSAoY2FjaGVkIGZyb20gcmVmICcuJGlkZW50aWZpZXIuJyk8L3dhcm5pbmc+Jyk7Cn0KCnJldHVybiBmYWxzZTsKfQoKaWYgKCRjYWNoZWRQYWNrYWdlKSB7CiRtc2cgPSAnRm91bmQgY2FjaGVkIGNvbXBvc2VyLmpzb24gb2YgPGluZm8+JyAuICgkdGhpcy0+cGFja2FnZU5hbWUgPzogJHRoaXMtPnVybCkgLiAnPC9pbmZvPiAoPGNvbW1lbnQ+JyAuICR2ZXJzaW9uIC4gJzwvY29tbWVudD4pJzsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKfSBlbHNlaWYgKCRpc1ZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcigkbXNnLCBmYWxzZSk7Cn0KCnVuc2V0KCRjYWNoZWRQYWNrYWdlWydkZWZhdWx0LWJyYW5jaCddKTsKaWYgKCRpc0RlZmF1bHRCcmFuY2gpIHsKJGNhY2hlZFBhY2thZ2VbJ2RlZmF1bHQtYnJhbmNoJ10gPSB0cnVlOwp9CgppZiAoJGV4aXN0aW5nUGFja2FnZSA9ICR0aGlzLT5maW5kUGFja2FnZSgkY2FjaGVkUGFja2FnZVsnbmFtZSddLCBuZXcgQ29uc3RyYWludCgnPScsICRjYWNoZWRQYWNrYWdlWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkpKSB7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgY2FjaGVkIHZlcnNpb24gJy4kdmVyc2lvbi4nLCBpdCBjb25mbGljdHMgd2l0aCBhbiBhbm90aGVyIHRhZyAoJy4kZXhpc3RpbmdQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJykgYXMgYm90aCByZXNvbHZlIHRvICcuJGNhY2hlZFBhY2thZ2VbJ3ZlcnNpb25fbm9ybWFsaXplZCddLicgaW50ZXJuYWxseTwvd2FybmluZz4nKTsKfQokY2FjaGVkUGFja2FnZSA9IG51bGw7Cn0KfQoKaWYgKCRjYWNoZWRQYWNrYWdlKSB7CnJldHVybiAkdGhpcy0+bG9hZGVyLT5sb2FkKCRjYWNoZWRQYWNrYWdlKTsKfQoKcmV0dXJuIG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2hvdWxkUmV0aHJvd1RyYW5zcG9ydEV4Y2VwdGlvbihUcmFuc3BvcnRFeGNlcHRpb24gJGUpOiBib29sCnsKcmV0dXJuIGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDEsIDQwMywgNDI5XSwgdHJ1ZSkgfHwgJGUtPmdldENvZGUoKSA+PSA1MDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCmludGVyZmFjZSBWZXJzaW9uQ2FjaGVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvblBhY2thZ2Uoc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJGlkZW50aWZpZXIpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwoKCgoKCgpjbGFzcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7CnVzZSBDYW5vbmljYWxQYWNrYWdlc1RyYWl0OwoKCgoKcHJvdGVjdGVkICRkZXZQYWNrYWdlTmFtZXMgPSBbXTsKCgpwcml2YXRlICRkZXZNb2RlID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZNb2RlKCkKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZQYWNrYWdlTmFtZXMoYXJyYXkgJGRldlBhY2thZ2VOYW1lcykKewokdGhpcy0+ZGV2UGFja2FnZU5hbWVzID0gJGRldlBhY2thZ2VOYW1lczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlBhY2thZ2VOYW1lcygpCnsKcmV0dXJuICR0aGlzLT5kZXZQYWNrYWdlTmFtZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShib29sICRkZXZNb2RlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyKQp7CiR0aGlzLT5kZXZNb2RlID0gJGRldk1vZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZWxvYWQoKQp7CiR0aGlzLT5kZXZNb2RlID0gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwoKCgoKCgppbnRlcmZhY2UgV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlIGV4dGVuZHMgUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShib29sICRkZXZNb2RlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDYW5vbmljYWxQYWNrYWdlcygpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVsb2FkKCk7CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldlBhY2thZ2VOYW1lcyhhcnJheSAkZGV2UGFja2FnZU5hbWVzKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZQYWNrYWdlTmFtZXMoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2NyaXB0OwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQgYXMgQmFzZUV2ZW50OwoKCgoKCgoKY2xhc3MgRXZlbnQgZXh0ZW5kcyBCYXNlRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJG9yaWdpbmF0aW5nRXZlbnQ7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sIGJvb2wgJGRldk1vZGUgPSBmYWxzZSwgYXJyYXkgJGFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSwgJGFyZ3MsICRmbGFncyk7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+ZGV2TW9kZSA9ICRkZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoKTogQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXZNb2RlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9yaWdpbmF0aW5nRXZlbnQoKTogP0Jhc2VFdmVudAp7CnJldHVybiAkdGhpcy0+b3JpZ2luYXRpbmdFdmVudDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3JpZ2luYXRpbmdFdmVudChCYXNlRXZlbnQgJGV2ZW50KTogc2VsZgp7CiR0aGlzLT5vcmlnaW5hdGluZ0V2ZW50ID0gJHRoaXMtPmNhbGN1bGF0ZU9yaWdpbmF0aW5nRXZlbnQoJGV2ZW50KTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxjdWxhdGVPcmlnaW5hdGluZ0V2ZW50KEJhc2VFdmVudCAkZXZlbnQpOiBCYXNlRXZlbnQKewppZiAoJGV2ZW50IGluc3RhbmNlb2YgRXZlbnQgJiYgJGV2ZW50LT5nZXRPcmlnaW5hdGluZ0V2ZW50KCkpIHsKcmV0dXJuICR0aGlzLT5jYWxjdWxhdGVPcmlnaW5hdGluZ0V2ZW50KCRldmVudC0+Z2V0T3JpZ2luYXRpbmdFdmVudCgpKTsKfQoKcmV0dXJuICRldmVudDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTY3JpcHQ7CgoKCgoKCgpjbGFzcyBTY3JpcHRFdmVudHMKewoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9JTlNUQUxMX0NNRCA9ICdwcmUtaW5zdGFsbC1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX0lOU1RBTExfQ01EID0gJ3Bvc3QtaW5zdGFsbC1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfVVBEQVRFX0NNRCA9ICdwcmUtdXBkYXRlLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfVVBEQVRFX0NNRCA9ICdwb3N0LXVwZGF0ZS1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfU1RBVFVTX0NNRCA9ICdwcmUtc3RhdHVzLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfU1RBVFVTX0NNRCA9ICdwb3N0LXN0YXR1cy1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfQVVUT0xPQURfRFVNUCA9ICdwcmUtYXV0b2xvYWQtZHVtcCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfQVVUT0xPQURfRFVNUCA9ICdwb3N0LWF1dG9sb2FkLWR1bXAnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1JPT1RfUEFDS0FHRV9JTlNUQUxMID0gJ3Bvc3Qtcm9vdC1wYWNrYWdlLWluc3RhbGwnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9DUkVBVEVfUFJPSkVDVF9DTUQgPSAncG9zdC1jcmVhdGUtcHJvamVjdC1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfQVJDSElWRV9DTUQgPSAncHJlLWFyY2hpdmUtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9BUkNISVZFX0NNRCA9ICdwb3N0LWFyY2hpdmUtY21kJzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VsZlVwZGF0ZTsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBLZXlzCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5nZXJwcmludChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokaGFzaCA9IHN0cnRvdXBwZXIoaGFzaCgnc2hhMjU2JywgUHJlZzo6cmVwbGFjZSgne1xzfScsICcnLCBmaWxlX2dldF9jb250ZW50cygkcGF0aCkpKSk7CgpyZXR1cm4gaW1wbG9kZSgnICcsIFsKc3Vic3RyKCRoYXNoLCAwLCA4KSwKc3Vic3RyKCRoYXNoLCA4LCA4KSwKc3Vic3RyKCRoYXNoLCAxNiwgOCksCnN1YnN0cigkaGFzaCwgMjQsIDgpLAonJywgCnN1YnN0cigkaGFzaCwgMzIsIDgpLApzdWJzdHIoJGhhc2gsIDQwLCA4KSwKc3Vic3RyKCRoYXNoLCA0OCwgOCksCnN1YnN0cigkaGFzaCwgNTYsIDgpLApdKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZWxmVXBkYXRlOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXENvbmZpZzsKCgoKCmNsYXNzIFZlcnNpb25zCnsKCgoKCnB1YmxpYyBzdGF0aWMgJGNoYW5uZWxzID0gc2VsZjo6Q0hBTk5FTFM7CgpwdWJsaWMgY29uc3QgQ0hBTk5FTFMgPSBbJ3N0YWJsZScsICdwcmV2aWV3JywgJ3NuYXBzaG90JywgJzEnLCAnMicsICcyLjInXTsKCgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGNoYW5uZWw7Cgpwcml2YXRlICR2ZXJzaW9uc0RhdGEgPSBudWxsOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIpCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5uZWwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5jaGFubmVsKSB7CnJldHVybiAkdGhpcy0+Y2hhbm5lbDsKfQoKJGNoYW5uZWxGaWxlID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykuJy91cGRhdGUtY2hhbm5lbCc7CmlmIChmaWxlX2V4aXN0cygkY2hhbm5lbEZpbGUpKSB7CiRjaGFubmVsID0gdHJpbShmaWxlX2dldF9jb250ZW50cygkY2hhbm5lbEZpbGUpKTsKaWYgKGluX2FycmF5KCRjaGFubmVsLCBbJ3N0YWJsZScsICdwcmV2aWV3JywgJ3NuYXBzaG90JywgJzIuMiddLCB0cnVlKSkgewpyZXR1cm4gJHRoaXMtPmNoYW5uZWwgPSAkY2hhbm5lbDsKfQp9CgpyZXR1cm4gJHRoaXMtPmNoYW5uZWwgPSAnc3RhYmxlJzsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENoYW5uZWwoc3RyaW5nICRjaGFubmVsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCk6IHZvaWQKewppZiAoIWluX2FycmF5KCRjaGFubmVsLCBzZWxmOjpDSEFOTkVMUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgY2hhbm5lbCAnLiRjaGFubmVsLicsIG11c3QgYmUgb25lIG9mOiAnIC4gaW1wbG9kZSgnLCAnLCBzZWxmOjpDSEFOTkVMUykpOwp9CgokY2hhbm5lbEZpbGUgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2hvbWUnKS4nL3VwZGF0ZS1jaGFubmVsJzsKJHRoaXMtPmNoYW5uZWwgPSAkY2hhbm5lbDsKCgokc3RvcmVkQ2hhbm5lbCA9IFByZWc6OmlzTWF0Y2goJ3teXGQrJH1EJywgJGNoYW5uZWwpID8gJ3N0YWJsZScgOiAkY2hhbm5lbDsKJHByZXZpb3VzbHlTdG9yZWQgPSBmaWxlX2V4aXN0cygkY2hhbm5lbEZpbGUpID8gdHJpbSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkY2hhbm5lbEZpbGUpKSA6IG51bGw7CmZpbGVfcHV0X2NvbnRlbnRzKCRjaGFubmVsRmlsZSwgJHN0b3JlZENoYW5uZWwuUEhQX0VPTCk7CgppZiAoJGlvICE9PSBudWxsICYmICRwcmV2aW91c2x5U3RvcmVkICE9PSAkc3RvcmVkQ2hhbm5lbCkgewokaW8tPndyaXRlRXJyb3IoJ1N0b3JpbmcgIjxpbmZvPicuJHN0b3JlZENoYW5uZWwuJzwvaW5mbz4iIGFzIGRlZmF1bHQgdXBkYXRlIGNoYW5uZWwgZm9yIHRoZSBuZXh0IHNlbGYtdXBkYXRlIHJ1bi4nKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGF0ZXN0KD9zdHJpbmcgJGNoYW5uZWwgPSBudWxsKTogYXJyYXkKewokdmVyc2lvbnMgPSAkdGhpcy0+Z2V0VmVyc2lvbnNEYXRhKCk7Cgpmb3JlYWNoICgkdmVyc2lvbnNbJGNoYW5uZWwgPzogJHRoaXMtPmdldENoYW5uZWwoKV0gYXMgJHZlcnNpb24pIHsKaWYgKCR2ZXJzaW9uWydtaW4tcGhwJ10gPD0gUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuICR2ZXJzaW9uOwp9Cn0KCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdUaGVyZSBpcyBubyB2ZXJzaW9uIG9mIENvbXBvc2VyIGF2YWlsYWJsZSBmb3IgeW91ciBQSFAgdmVyc2lvbiAoJy5QSFBfVkVSU0lPTi4nKScpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFZlcnNpb25zRGF0YSgpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dmVyc2lvbnNEYXRhKSB7CmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKJHByb3RvY29sID0gJ2h0dHAnOwp9IGVsc2UgewokcHJvdG9jb2wgPSAnaHR0cHMnOwp9CgokdGhpcy0+dmVyc2lvbnNEYXRhID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvY29sIC4gJzovL2dldGNvbXBvc2VyLm9yZy92ZXJzaW9ucycpLT5kZWNvZGVKc29uKCk7Cn0KCnJldHVybiAkdGhpcy0+dmVyc2lvbnNEYXRhOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEF1dGhIZWxwZXIKewoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJpdmF0ZSAkZGlzcGxheWVkT3JpZ2luQXV0aGVudGljYXRpb25zID0gW107Cgpwcml2YXRlICRiaXRidWNrZXRSZXRyeSA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN0b3JlQXV0aChzdHJpbmcgJG9yaWdpbiwgJHN0b3JlQXV0aCk6IHZvaWQKewokc3RvcmUgPSBmYWxzZTsKJGNvbmZpZ1NvdXJjZSA9ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKaWYgKCRzdG9yZUF1dGggPT09IHRydWUpIHsKJHN0b3JlID0gJGNvbmZpZ1NvdXJjZTsKfSBlbHNlaWYgKCRzdG9yZUF1dGggPT09ICdwcm9tcHQnKSB7CiRhbnN3ZXIgPSAkdGhpcy0+aW8tPmFza0FuZFZhbGlkYXRlKAonRG8geW91IHdhbnQgdG8gc3RvcmUgY3JlZGVudGlhbHMgZm9yICcuJG9yaWdpbi4nIGluICcuJGNvbmZpZ1NvdXJjZS0+Z2V0TmFtZSgpLicgPyBbWW5dICcsCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKTogc3RyaW5nIHsKJGlucHV0ID0gc3RydG9sb3dlcihzdWJzdHIodHJpbSgkdmFsdWUpLCAwLCAxKSk7CmlmIChpbl9hcnJheSgkaW5wdXQsIFsneScsJ24nXSkpIHsKcmV0dXJuICRpbnB1dDsKfQp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1BsZWFzZSBhbnN3ZXIgKHkpZXMgb3IgKG4pbycpOwp9LApudWxsLAoneScKKTsKCmlmICgkYW5zd2VyID09PSAneScpIHsKJHN0b3JlID0gJGNvbmZpZ1NvdXJjZTsKfQp9CmlmICgkc3RvcmUpIHsKJHN0b3JlLT5hZGRDb25maWdTZXR0aW5nKAonaHR0cC1iYXNpYy4nLiRvcmlnaW4sCiR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG9yaWdpbikKKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvbXB0QXV0aElmTmVlZGVkKHN0cmluZyAkdXJsLCBzdHJpbmcgJG9yaWdpbiwgaW50ICRzdGF0dXNDb2RlLCA/c3RyaW5nICRyZWFzb24gPSBudWxsLCBhcnJheSAkaGVhZGVycyA9IFtdLCBpbnQgJHJldHJ5Q291bnQgPSAwKTogYXJyYXkKewokc3RvcmVBdXRoID0gZmFsc2U7CgppZiAoaW5fYXJyYXkoJG9yaWdpbiwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpLCB0cnVlKSkgewokZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCBudWxsKTsKJG1lc3NhZ2UgPSAiXG4iOwoKJHJhdGVMaW1pdGVkID0gJGdpdEh1YlV0aWwtPmlzUmF0ZUxpbWl0ZWQoJGhlYWRlcnMpOwokcmVxdWlyZXNTc28gPSAkZ2l0SHViVXRpbC0+cmVxdWlyZXNTc28oJGhlYWRlcnMpOwoKaWYgKCRyZXF1aXJlc1Nzbykgewokc3NvVXJsID0gJGdpdEh1YlV0aWwtPmdldFNzb1VybCgkaGVhZGVycyk7CiRtZXNzYWdlID0gJ0dpdEh1YiBBUEkgdG9rZW4gcmVxdWlyZXMgU1NPIGF1dGhvcml6YXRpb24uIEF1dGhvcml6ZSB0aGlzIHRva2VuIGF0ICcgLiAkc3NvVXJsIC4gIlxuIjsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJyAuICRvcmlnaW4sIDQwMyk7Cn0KJHRoaXMtPmlvLT5hc2soJ0FmdGVyIGF1dGhvcml6aW5nIHlvdXIgdG9rZW4sIGNvbmZpcm0gdGhhdCB5b3Ugd291bGQgbGlrZSB0byByZXRyeSB0aGUgcmVxdWVzdCcpOwoKcmV0dXJuIFsncmV0cnknID0+IHRydWUsICdzdG9yZUF1dGgnID0+ICRzdG9yZUF1dGhdOwp9CgppZiAoJHJhdGVMaW1pdGVkKSB7CiRyYXRlTGltaXQgPSAkZ2l0SHViVXRpbC0+Z2V0UmF0ZUxpbWl0KCRoZWFkZXJzKTsKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKJG1lc3NhZ2UgPSAnUmV2aWV3IHlvdXIgY29uZmlndXJlZCBHaXRIdWIgT0F1dGggdG9rZW4gb3IgZW50ZXIgYSBuZXcgb25lIHRvIGdvIG92ZXIgdGhlIEFQSSByYXRlIGxpbWl0Lic7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJ0NyZWF0ZSBhIEdpdEh1YiBPQXV0aCB0b2tlbiB0byBnbyBvdmVyIHRoZSBBUEkgcmF0ZSBsaW1pdC4nOwp9CgokbWVzc2FnZSA9IHNwcmludGYoCidHaXRIdWIgQVBJIGxpbWl0ICglZCBjYWxscy9ocikgaXMgZXhoYXVzdGVkLCBjb3VsZCBub3QgZmV0Y2ggJy4kdXJsLicuICcuJG1lc3NhZ2UuJyBZb3UgY2FuIGFsc28gd2FpdCB1bnRpbCAlcyBmb3IgdGhlIHJhdGUgbGltaXQgdG8gcmVzZXQuJywKJHJhdGVMaW1pdFsnbGltaXQnXSwKJHJhdGVMaW1pdFsncmVzZXQnXQopLiJcbiI7Cn0gZWxzZSB7CiRtZXNzYWdlIC49ICdDb3VsZCBub3QgZmV0Y2ggJy4kdXJsLicsIHBsZWFzZSAnOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokbWVzc2FnZSAuPSAncmV2aWV3IHlvdXIgY29uZmlndXJlZCBHaXRIdWIgT0F1dGggdG9rZW4gb3IgZW50ZXIgYSBuZXcgb25lIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKfSBlbHNlIHsKJG1lc3NhZ2UgLj0gJ2NyZWF0ZSBhIEdpdEh1YiBPQXV0aCB0b2tlbiB0byBhY2Nlc3MgcHJpdmF0ZSByZXBvcyc7Cn0KfQoKaWYgKCEkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGgoJG9yaWdpbikKJiYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSB8fCAhJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkb3JpZ2luLCAkbWVzc2FnZSkpCikgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJy4kb3JpZ2luLCA0MDEpOwp9Cn0gZWxzZWlmIChpbl9hcnJheSgkb3JpZ2luLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpKSB7CiRtZXNzYWdlID0gIlxuIi4nQ291bGQgbm90IGZldGNoICcuJHVybC4nLCBlbnRlciB5b3VyICcgLiAkb3JpZ2luIC4gJyBjcmVkZW50aWFscyAnIC4oJHN0YXR1c0NvZGUgPT09IDQwMSA/ICd0byBhY2Nlc3MgcHJpdmF0ZSByZXBvcycgOiAndG8gZ28gb3ZlciB0aGUgQVBJIHJhdGUgbGltaXQnKTsKJGdpdExhYlV0aWwgPSBuZXcgR2l0TGFiKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgbnVsbCk7CgokYXV0aCA9IG51bGw7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKTsKaWYgKGluX2FycmF5KCRhdXRoWydwYXNzd29yZCddLCBbJ2dpdGxhYi1jaS10b2tlbicsICdwcml2YXRlLXRva2VuJywgJ29hdXRoMiddLCB0cnVlKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnZhbGlkIGNyZWRlbnRpYWxzIGZvciAnIiAuICR1cmwgLiAiJywgYWJvcnRpbmcuIiwgJHN0YXR1c0NvZGUpOwp9Cn0KCmlmICghJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoKCRvcmlnaW4pCiYmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgISRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkocGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfU0NIRU1FKSwgJG9yaWdpbiwgJG1lc3NhZ2UpKQopIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0ICcuJG9yaWdpbiwgNDAxKTsKfQoKaWYgKCRhdXRoICE9PSBudWxsICYmICR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKaWYgKCRhdXRoID09PSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY3JlZGVudGlhbHMgZm9yICciIC4gJHVybCAuICInLCBhYm9ydGluZy4iLCAkc3RhdHVzQ29kZSk7Cn0KfQp9IGVsc2VpZiAoJG9yaWdpbiA9PT0gJ2JpdGJ1Y2tldC5vcmcnIHx8ICRvcmlnaW4gPT09ICdhcGkuYml0YnVja2V0Lm9yZycpIHsKJGFza0Zvck9BdXRoVG9rZW4gPSB0cnVlOwokb3JpZ2luID0gJ2JpdGJ1Y2tldC5vcmcnOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG9yaWdpbik7CmlmICgkYXV0aFsndXNlcm5hbWUnXSAhPT0gJ3gtdG9rZW4tYXV0aCcpIHsKJGJpdGJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZyk7CiRhY2Nlc3NUb2tlbiA9ICRiaXRidWNrZXRVdGlsLT5yZXF1ZXN0VG9rZW4oJG9yaWdpbiwgJGF1dGhbJ3VzZXJuYW1lJ10sICRhdXRoWydwYXNzd29yZCddKTsKaWYgKCFlbXB0eSgkYWNjZXNzVG9rZW4pKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpbiwgJ3gtdG9rZW4tYXV0aCcsICRhY2Nlc3NUb2tlbik7CiRhc2tGb3JPQXV0aFRva2VuID0gZmFsc2U7Cn0KfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+Yml0YnVja2V0UmV0cnlbJHVybF0pKSB7CgoKCiRhc2tGb3JPQXV0aFRva2VuID0gZmFsc2U7CiR0aGlzLT5iaXRidWNrZXRSZXRyeVskdXJsXSA9IHRydWU7Cn0gZWxzZSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnIC4gJG9yaWdpbiwgNDAxKTsKfQp9CgppZiAoJGFza0Zvck9BdXRoVG9rZW4pIHsKJG1lc3NhZ2UgPSAiXG4iLidDb3VsZCBub3QgZmV0Y2ggJyAuICR1cmwgLiAnLCBwbGVhc2UgY3JlYXRlIGEgYml0YnVja2V0IE9BdXRoIHRva2VuIHRvICcgLiAoKCRzdGF0dXNDb2RlID09PSA0MDEgfHwgJHN0YXR1c0NvZGUgPT09IDQwMykgPyAnYWNjZXNzIHByaXZhdGUgcmVwb3MnIDogJ2dvIG92ZXIgdGhlIEFQSSByYXRlIGxpbWl0Jyk7CiRiaXRCdWNrZXRVdGlsID0gbmV3IEJpdGJ1Y2tldCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcpOwppZiAoISRiaXRCdWNrZXRVdGlsLT5hdXRob3JpemVPQXV0aCgkb3JpZ2luKQomJiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpIHx8ICEkYml0QnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRvcmlnaW4sICRtZXNzYWdlKSkKKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnIC4gJG9yaWdpbiwgNDAxKTsKfQp9Cn0gZWxzZSB7CgppZiAoJHN0YXR1c0NvZGUgPT09IDQwNCkgewpyZXR1cm4gWydyZXRyeScgPT4gZmFsc2UsICdzdG9yZUF1dGgnID0+IGZhbHNlXTsKfQoKCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCRzdGF0dXNDb2RlID09PSA0MDEpIHsKJG1lc3NhZ2UgPSAiVGhlICciIC4gJHVybCAuICInIFVSTCByZXF1aXJlZCBhdXRoZW50aWNhdGlvbiAoSFRUUCA0MDEpLlxuWW91IG11c3QgYmUgdXNpbmcgdGhlIGludGVyYWN0aXZlIGNvbnNvbGUgdG8gYXV0aGVudGljYXRlIjsKfSBlbHNlaWYgKCRzdGF0dXNDb2RlID09PSA0MDMpIHsKJG1lc3NhZ2UgPSAiVGhlICciIC4gJHVybCAuICInIFVSTCBjb3VsZCBub3QgYmUgYWNjZXNzZWQgKEhUVFAgNDAzKTogIiAuICRyZWFzb247Cn0gZWxzZSB7CiRtZXNzYWdlID0gIlVua25vd24gZXJyb3IgY29kZSAnIiAuICRzdGF0dXNDb2RlIC4gIicsIHJlYXNvbjogIiAuICRyZWFzb247Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJG1lc3NhZ2UsICRzdGF0dXNDb2RlKTsKfQoKCmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CgoKaWYgKCRyZXRyeUNvdW50ID09PSAwKSB7CnJldHVybiBbJ3JldHJ5JyA9PiB0cnVlLCAnc3RvcmVBdXRoJyA9PiBmYWxzZV07Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY3JlZGVudGlhbHMgKEhUVFAgJHN0YXR1c0NvZGUpIGZvciAnJHVybCcsIGFib3J0aW5nLiIsICRzdGF0dXNDb2RlKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgQXV0aGVudGljYXRpb24gcmVxdWlyZWQgKDxpbmZvPicuJG9yaWdpbi4nPC9pbmZvPik6Jyk7CiR1c2VybmFtZSA9ICR0aGlzLT5pby0+YXNrKCcgICAgICBVc2VybmFtZTogJyk7CiRwYXNzd29yZCA9ICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignICAgICAgUGFzc3dvcmQ6ICcpOwokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4sICR1c2VybmFtZSwgJHBhc3N3b3JkKTsKJHN0b3JlQXV0aCA9ICR0aGlzLT5jb25maWctPmdldCgnc3RvcmUtYXV0aHMnKTsKfQoKcmV0dXJuIFsncmV0cnknID0+IHRydWUsICdzdG9yZUF1dGgnID0+ICRzdG9yZUF1dGhdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBdXRoZW50aWNhdGlvbkhlYWRlcihhcnJheSAkaGVhZGVycywgc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdXJsKTogYXJyYXkKewppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9IG51bGw7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKTsKaWYgKCRhdXRoWydwYXNzd29yZCddID09PSAnYmVhcmVyJykgewokaGVhZGVyc1tdID0gJ0F1dGhvcml6YXRpb246IEJlYXJlciAnLiRhdXRoWyd1c2VybmFtZSddOwp9IGVsc2VpZiAoJ2dpdGh1Yi5jb20nID09PSAkb3JpZ2luICYmICd4LW9hdXRoLWJhc2ljJyA9PT0gJGF1dGhbJ3Bhc3N3b3JkJ10pIHsKCmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL2FwaVwuZ2l0aHViXC5jb20vfScsICR1cmwpKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogdG9rZW4gJy4kYXV0aFsndXNlcm5hbWUnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgR2l0SHViIHRva2VuIGF1dGhlbnRpY2F0aW9uJzsKfQp9IGVsc2VpZiAoCmluX2FycmF5KCRvcmlnaW4sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkKJiYgaW5fYXJyYXkoJGF1dGhbJ3Bhc3N3b3JkJ10sIFsnb2F1dGgyJywgJ3ByaXZhdGUtdG9rZW4nLCAnZ2l0bGFiLWNpLXRva2VuJ10sIHRydWUpCikgewppZiAoJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdvYXV0aDInKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICcuJGF1dGhbJ3VzZXJuYW1lJ107CiRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlID0gJ1VzaW5nIEdpdExhYiBPQXV0aCB0b2tlbiBhdXRoZW50aWNhdGlvbic7Cn0gZWxzZSB7CiRoZWFkZXJzW10gPSAnUFJJVkFURS1UT0tFTjogJy4kYXV0aFsndXNlcm5hbWUnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgR2l0TGFiIHByaXZhdGUgdG9rZW4gYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZWlmICgKJ2JpdGJ1Y2tldC5vcmcnID09PSAkb3JpZ2luCiYmICR1cmwgIT09IEJpdGJ1Y2tldDo6T0FVVEgyX0FDQ0VTU19UT0tFTl9VUkwKJiYgJ3gtdG9rZW4tYXV0aCcgPT09ICRhdXRoWyd1c2VybmFtZSddCikgewppZiAoISR0aGlzLT5pc1B1YmxpY0JpdEJ1Y2tldERvd25sb2FkKCR1cmwpKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICcgLiAkYXV0aFsncGFzc3dvcmQnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgQml0YnVja2V0IE9BdXRoIHRva2VuIGF1dGhlbnRpY2F0aW9uJzsKfQp9IGVsc2UgewokYXV0aFN0ciA9IGJhc2U2NF9lbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10gLiAnOicgLiAkYXV0aFsncGFzc3dvcmQnXSk7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmFzaWMgJy4kYXV0aFN0cjsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiB3aXRoIHVzZXJuYW1lICInIC4gJGF1dGhbJ3VzZXJuYW1lJ10gLiAnIic7Cn0KCmlmICgkYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSAmJiAoIWlzc2V0KCR0aGlzLT5kaXNwbGF5ZWRPcmlnaW5BdXRoZW50aWNhdGlvbnNbJG9yaWdpbl0pIHx8ICR0aGlzLT5kaXNwbGF5ZWRPcmlnaW5BdXRoZW50aWNhdGlvbnNbJG9yaWdpbl0gIT09ICRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5kaXNwbGF5ZWRPcmlnaW5BdXRoZW50aWNhdGlvbnNbJG9yaWdpbl0gPSAkYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZTsKfQp9IGVsc2VpZiAoaW5fYXJyYXkoJG9yaWdpbiwgWydhcGkuYml0YnVja2V0Lm9yZycsICdhcGkuZ2l0aHViLmNvbSddLCB0cnVlKSkgewpyZXR1cm4gJHRoaXMtPmFkZEF1dGhlbnRpY2F0aW9uSGVhZGVyKCRoZWFkZXJzLCBzdHJfcmVwbGFjZSgnYXBpLicsICcnLCAkb3JpZ2luKSwgJHVybCk7Cn0KCnJldHVybiAkaGVhZGVyczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1B1YmxpY0JpdEJ1Y2tldERvd25sb2FkKHN0cmluZyAkdXJsVG9CaXRCdWNrZXRGaWxlKTogYm9vbAp7CiRkb21haW4gPSBwYXJzZV91cmwoJHVybFRvQml0QnVja2V0RmlsZSwgUEhQX1VSTF9IT1NUKTsKaWYgKHN0cnBvcygkZG9tYWluLCAnYml0YnVja2V0Lm9yZycpID09PSBmYWxzZSkgewoKCnJldHVybiB0cnVlOwp9CgokcGF0aCA9IHBhcnNlX3VybCgkdXJsVG9CaXRCdWNrZXRGaWxlLCBQSFBfVVJMX1BBVEgpOwoKCgokcGF0aFBhcnRzID0gZXhwbG9kZSgnLycsICRwYXRoKTsKCnJldHVybiBjb3VudCgkcGF0aFBhcnRzKSA+PSA0ICYmICRwYXRoUGFydHNbM10gPT09ICdkb3dubG9hZHMnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgpjbGFzcyBCaXRidWNrZXQKewoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRwcm9jZXNzOwoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICR0b2tlbiA9IG51bGw7Cgpwcml2YXRlICR0aW1lOwoKcHVibGljIGNvbnN0IE9BVVRIMl9BQ0NFU1NfVE9LRU5fVVJMID0gJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy9zaXRlL29hdXRoMi9hY2Nlc3NfdG9rZW4nOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsLCA/SHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyID0gbnVsbCwgP2ludCAkdGltZSA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlciA/OiBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkdGhpcy0+aW8sICRjb25maWcpOwokdGhpcy0+dGltZSA9ICR0aW1lOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW4oKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGgoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKaWYgKCRvcmlnaW5VcmwgIT09ICdiaXRidWNrZXQub3JnJykgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBjb25maWcgYml0YnVja2V0LmFjY2Vzc3Rva2VuJywgJG91dHB1dCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAneC10b2tlbi1hdXRoJywgdHJpbSgkb3V0cHV0KSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVlc3RBY2Nlc3NUb2tlbigpOiBib29sCnsKdHJ5IHsKJHJlc3BvbnNlID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoc2VsZjo6T0FVVEgyX0FDQ0VTU19UT0tFTl9VUkwsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCidodHRwJyA9PiBbCidtZXRob2QnID0+ICdQT1NUJywKJ2NvbnRlbnQnID0+ICdncmFudF90eXBlPWNsaWVudF9jcmVkZW50aWFscycsCl0sCl0pOwoKJHRva2VuID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7CmlmICghaXNzZXQoJHRva2VuWydleHBpcmVzX2luJ10pIHx8ICFpc3NldCgkdG9rZW5bJ2FjY2Vzc190b2tlbiddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhIHRva2VuIGNvbmZpZ3VyZWQgd2l0aCBleHBpcmVzX2luIGFuZCBhY2Nlc3NfdG9rZW4gcHJlc2VudCwgZ290ICcuanNvbl9lbmNvZGUoJHRva2VuKSk7Cn0KCiR0aGlzLT50b2tlbiA9ICR0b2tlbjsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSA0MDApIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBPQXV0aCBjb25zdW1lciBwcm92aWRlZC48L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1RoaXMgY2FuIGhhdmUgdGhyZWUgcmVhc29uczonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcxLiBZb3UgYXJlIGF1dGhlbnRpY2F0aW5nIHdpdGggYSBiaXRidWNrZXQgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcyLiBZb3UgYXJlIHVzaW5nIGFuIE9BdXRoIGNvbnN1bWVyLCBidXQgZGlkblwndCBjb25maWd1cmUgYSAoZHVtbXkpIGNhbGxiYWNrIHVybCcpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzMuIFlvdSBhcmUgdXNpbmcgYW4gT0F1dGggY29uc3VtZXIsIGJ1dCBkaWRuXCd0IGNvbmZpZ3VyZSBpdCBhcyBwcml2YXRlIGNvbnN1bWVyJyk7CgpyZXR1cm4gZmFsc2U7Cn0KaWYgKGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDMsIDQwMV0pKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkludmFsaWQgT0F1dGggY29uc3VtZXIgcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGJpdGJ1Y2tldC1vYXV0aC5iaXRidWNrZXQub3JnIDxjb25zdW1lci1rZXk+IDxjb25zdW1lci1zZWNyZXQ+IicpOwoKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyAkZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoc3RyaW5nICRvcmlnaW5VcmwsID9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsKTogYm9vbAp7CmlmICgkbWVzc2FnZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwp9CgokbG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCk7CiR1cmwgPSAnaHR0cHM6Ly9zdXBwb3J0LmF0bGFzc2lhbi5jb20vYml0YnVja2V0LWNsb3VkL2RvY3MvdXNlLW9hdXRoLW9uLWJpdGJ1Y2tldC1jbG91ZC8nOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgb24gJXMnLCAkdXJsKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCd0byBjcmVhdGUgYSBjb25zdW1lci4gSXQgd2lsbCBiZSBzdG9yZWQgaW4gIiVzIiBmb3IgZnV0dXJlIHVzZSBieSBDb21wb3Nlci4nLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRW5zdXJlIHlvdSBlbnRlciBhICJDYWxsYmFjayBVUkwiIChodHRwOi8vZXhhbXBsZS5jb20gaXMgZmluZSkgb3IgaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGFuIEFjY2VzcyBUb2tlbiAodGhpcyBjYWxsYmFjayB1cmwgd2lsbCBub3QgYmUgdXNlZCBieSBjb21wb3NlciknKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokY29uc3VtZXJLZXkgPSB0cmltKChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignQ29uc3VtZXIgS2V5IChoaWRkZW4pOiAnKSk7CgppZiAoISRjb25zdW1lcktleSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGNvbnN1bWVyIGtleSBnaXZlbiwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggYml0YnVja2V0LW9hdXRoLmJpdGJ1Y2tldC5vcmcgPGNvbnN1bWVyLWtleT4gPGNvbnN1bWVyLXNlY3JldD4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCiRjb25zdW1lclNlY3JldCA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdDb25zdW1lciBTZWNyZXQgKGhpZGRlbik6ICcpKTsKCmlmICghJGNvbnN1bWVyU2VjcmV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gY29uc3VtZXIgc2VjcmV0IGdpdmVuLCBhYm9ydGluZy48L3dhcm5pbmc+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIGFkZCBpdCBtYW51YWxseSBsYXRlciBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tYXV0aCBiaXRidWNrZXQtb2F1dGguYml0YnVja2V0Lm9yZyA8Y29uc3VtZXIta2V5PiA8Y29uc3VtZXItc2VjcmV0PiInKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgppZiAoISR0aGlzLT5yZXF1ZXN0QWNjZXNzVG9rZW4oKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+c3RvcmVJbkF1dGhDb25maWcoJGF1dGhDb25maWdTb3VyY2UsICRvcmlnaW5VcmwsICRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsKCgokdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2h0dHAtYmFzaWMuJyAuICRvcmlnaW5VcmwpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Db25zdW1lciBzdG9yZWQgc3VjY2Vzc2Z1bGx5LjwvaW5mbz4nKTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVxdWVzdFRva2VuKHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGNvbnN1bWVyS2V5LCBzdHJpbmcgJGNvbnN1bWVyU2VjcmV0KTogc3RyaW5nCnsKaWYgKCR0aGlzLT50b2tlbiAhPT0gbnVsbCB8fCAkdGhpcy0+Z2V0VG9rZW5Gcm9tQ29uZmlnKCRvcmlnaW5VcmwpKSB7CnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsKaWYgKCEkdGhpcy0+cmVxdWVzdEFjY2Vzc1Rva2VuKCkpIHsKcmV0dXJuICcnOwp9CgokdGhpcy0+c3RvcmVJbkF1dGhDb25maWcoJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCkgPz8gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLCAkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgppZiAoIWlzc2V0KCR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRva2VuIGFib3ZlJyk7Cn0KCnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN0b3JlSW5BdXRoQ29uZmlnKENvbmZpZ1xDb25maWdTb3VyY2VJbnRlcmZhY2UgJGF1dGhDb25maWdTb3VyY2UsIHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGNvbnN1bWVyS2V5LCBzdHJpbmcgJGNvbnN1bWVyU2VjcmV0KTogdm9pZAp7CiR0aGlzLT5jb25maWctPmdldENvbmZpZ1NvdXJjZSgpLT5yZW1vdmVDb25maWdTZXR0aW5nKCdiaXRidWNrZXQtb2F1dGguJy4kb3JpZ2luVXJsKTsKCmlmIChudWxsID09PSAkdGhpcy0+dG9rZW4gfHwgIWlzc2V0KCR0aGlzLT50b2tlblsnZXhwaXJlc19pbiddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhIHRva2VuIGNvbmZpZ3VyZWQgd2l0aCBleHBpcmVzX2luIHByZXNlbnQsIGdvdCAnLmpzb25fZW5jb2RlKCR0aGlzLT50b2tlbikpOwp9CgokdGltZSA9IG51bGwgPT09ICR0aGlzLT50aW1lID8gdGltZSgpIDogJHRoaXMtPnRpbWU7CiRjb25zdW1lciA9IFsKImNvbnN1bWVyLWtleSIgPT4gJGNvbnN1bWVyS2V5LAoiY29uc3VtZXItc2VjcmV0IiA9PiAkY29uc3VtZXJTZWNyZXQsCiJhY2Nlc3MtdG9rZW4iID0+ICR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10sCiJhY2Nlc3MtdG9rZW4tZXhwaXJhdGlvbiIgPT4gJHRpbWUgKyAkdGhpcy0+dG9rZW5bJ2V4cGlyZXNfaW4nXSwKXTsKCiR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+YWRkQ29uZmlnU2V0dGluZygnYml0YnVja2V0LW9hdXRoLicuJG9yaWdpblVybCwgJGNvbnN1bWVyKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRUb2tlbkZyb21Db25maWcoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKJGF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2JpdGJ1Y2tldC1vYXV0aCcpOwoKaWYgKAohaXNzZXQoJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbiddLCAkYXV0aENvbmZpZ1skb3JpZ2luVXJsXVsnYWNjZXNzLXRva2VuLWV4cGlyYXRpb24nXSkKfHwgdGltZSgpID4gJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbi1leHBpcmF0aW9uJ10KKSB7CnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPnRva2VuID0gWwonYWNjZXNzX3Rva2VuJyA9PiAkYXV0aENvbmZpZ1skb3JpZ2luVXJsXVsnYWNjZXNzLXRva2VuJ10sCl07CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgQ29tcG9zZXJNaXJyb3IKewoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzVXJsKHN0cmluZyAkbWlycm9yVXJsLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJHZlcnNpb24sID9zdHJpbmcgJHJlZmVyZW5jZSwgP3N0cmluZyAkdHlwZSwgP3N0cmluZyAkcHJldHR5VmVyc2lvbiA9IG51bGwpOiBzdHJpbmcKewppZiAoJHJlZmVyZW5jZSkgewokcmVmZXJlbmNlID0gUHJlZzo6aXNNYXRjaCgne14oW2EtZjAtOV0qfCVyZWZlcmVuY2UlKSR9JywgJHJlZmVyZW5jZSkgPyAkcmVmZXJlbmNlIDogbWQ1KCRyZWZlcmVuY2UpOwp9CiR2ZXJzaW9uID0gc3RycG9zKCR2ZXJzaW9uLCAnLycpID09PSBmYWxzZSA/ICR2ZXJzaW9uIDogbWQ1KCR2ZXJzaW9uKTsKCiRmcm9tID0gWyclcGFja2FnZSUnLCAnJXZlcnNpb24lJywgJyVyZWZlcmVuY2UlJywgJyV0eXBlJSddOwokdG8gPSBbJHBhY2thZ2VOYW1lLCAkdmVyc2lvbiwgJHJlZmVyZW5jZSwgJHR5cGVdOwppZiAobnVsbCAhPT0gJHByZXR0eVZlcnNpb24pIHsKJGZyb21bXSA9ICclcHJldHR5VmVyc2lvbiUnOwokdG9bXSA9ICRwcmV0dHlWZXJzaW9uOwp9CgokdXJsID0gc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJG1pcnJvclVybCk7CmFzc2VydCgkdXJsICE9PSAnJyk7CgpyZXR1cm4gJHVybDsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzc0dpdFVybChzdHJpbmcgJG1pcnJvclVybCwgc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICR1cmwsID9zdHJpbmcgJHR5cGUpOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaCgnI14oPzooPzpodHRwcz98Z2l0KTovL2dpdGh1YlwuY29tL3xnaXRAZ2l0aHViXC5jb206KShbXi9dKykvKC4rPykoPzpcLmdpdCk/JCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiR1cmwgPSAnZ2gtJy4kbWF0Y2hbMV0uJy8nLiRtYXRjaFsyXTsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJyNeaHR0cHM6Ly9iaXRidWNrZXRcLm9yZy8oW14vXSspLyguKz8pKD86XC5naXQpPy8/JCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiR1cmwgPSAnYmItJy4kbWF0Y2hbMV0uJy8nLiRtYXRjaFsyXTsKfSBlbHNlIHsKJHVybCA9IFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOV8uLV19aScsICctJywgdHJpbSgkdXJsLCAnLycpKTsKfQoKcmV0dXJuIHN0cl9yZXBsYWNlKApbJyVwYWNrYWdlJScsICclbm9ybWFsaXplZFVybCUnLCAnJXR5cGUlJ10sClskcGFja2FnZU5hbWUsICR1cmwsICR0eXBlXSwKJG1pcnJvclVybAopOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzSGdVcmwoc3RyaW5nICRtaXJyb3JVcmwsIHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkdXJsLCBzdHJpbmcgJHR5cGUpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6cHJvY2Vzc0dpdFVybCgkbWlycm9yVXJsLCAkcGFja2FnZU5hbWUsICR1cmwsICR0eXBlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcVmFsaWRhdGluZ0FycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcSW52YWxpZFBhY2thZ2VFeGNlcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU3BkeFxTcGR4TGljZW5zZXM7CnVzZSBTZWxkXEpzb25MaW50XER1cGxpY2F0ZUtleUV4Y2VwdGlvbjsKdXNlIFNlbGRcSnNvbkxpbnRcSnNvblBhcnNlcjsKCgoKCgoKCmNsYXNzIENvbmZpZ1ZhbGlkYXRvcgp7CnB1YmxpYyBjb25zdCBDSEVDS19WRVJTSU9OID0gMTsKCgpwcml2YXRlICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoc3RyaW5nICRmaWxlLCBpbnQgJGFycmF5TG9hZGVyVmFsaWRhdGlvbkZsYWdzID0gVmFsaWRhdGluZ0FycmF5TG9hZGVyOjpDSEVDS19BTEwsIGludCAkZmxhZ3MgPSBzZWxmOjpDSEVDS19WRVJTSU9OKTogYXJyYXkKewokZXJyb3JzID0gW107CiRwdWJsaXNoRXJyb3JzID0gW107CiR3YXJuaW5ncyA9IFtdOwoKCiRsYXhWYWxpZCA9IGZhbHNlOwokbWFuaWZlc3QgPSBudWxsOwp0cnkgewokanNvbiA9IG5ldyBKc29uRmlsZSgkZmlsZSwgbnVsbCwgJHRoaXMtPmlvKTsKJG1hbmlmZXN0ID0gJGpzb24tPnJlYWQoKTsKCiRqc29uLT52YWxpZGF0ZVNjaGVtYShKc29uRmlsZTo6TEFYX1NDSEVNQSk7CiRsYXhWYWxpZCA9IHRydWU7CiRqc29uLT52YWxpZGF0ZVNjaGVtYSgpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewpmb3JlYWNoICgkZS0+Z2V0RXJyb3JzKCkgYXMgJG1lc3NhZ2UpIHsKaWYgKCRsYXhWYWxpZCkgewokcHVibGlzaEVycm9yc1tdID0gJG1lc3NhZ2U7Cn0gZWxzZSB7CiRlcnJvcnNbXSA9ICRtZXNzYWdlOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokZXJyb3JzW10gPSAkZS0+Z2V0TWVzc2FnZSgpOwoKcmV0dXJuIFskZXJyb3JzLCAkcHVibGlzaEVycm9ycywgJHdhcm5pbmdzXTsKfQoKaWYgKGlzX2FycmF5KCRtYW5pZmVzdCkpIHsKJGpzb25QYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOwp0cnkgewokanNvblBhcnNlci0+cGFyc2UoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCBKc29uUGFyc2VyOjpERVRFQ1RfS0VZX0NPTkZMSUNUUyk7Cn0gY2F0Y2ggKER1cGxpY2F0ZUtleUV4Y2VwdGlvbiAkZSkgewokZGV0YWlscyA9ICRlLT5nZXREZXRhaWxzKCk7CiR3YXJuaW5nc1tdID0gJ0tleSAnLiRkZXRhaWxzWydrZXknXS4nIGlzIGEgZHVwbGljYXRlIGluICcuJGZpbGUuJyBhdCBsaW5lICcuJGRldGFpbHNbJ2xpbmUnXTsKfQp9CgoKaWYgKGVtcHR5KCRtYW5pZmVzdFsnbGljZW5zZSddKSkgewokd2FybmluZ3NbXSA9ICdObyBsaWNlbnNlIHNwZWNpZmllZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gZG8gc28uIEZvciBjbG9zZWQtc291cmNlIHNvZnR3YXJlIHlvdSBtYXkgdXNlICJwcm9wcmlldGFyeSIgYXMgbGljZW5zZS4nOwp9IGVsc2UgewokbGljZW5zZXMgPSAoYXJyYXkpICRtYW5pZmVzdFsnbGljZW5zZSddOwoKCmZvcmVhY2ggKCRsaWNlbnNlcyBhcyAka2V5ID0+ICRsaWNlbnNlKSB7CmlmICgncHJvcHJpZXRhcnknID09PSAkbGljZW5zZSkgewp1bnNldCgkbGljZW5zZXNbJGtleV0pOwp9Cn0KCiRsaWNlbnNlVmFsaWRhdG9yID0gbmV3IFNwZHhMaWNlbnNlcygpOwpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2UpIHsKJHNwZHhMaWNlbnNlID0gJGxpY2Vuc2VWYWxpZGF0b3ItPmdldExpY2Vuc2VCeUlkZW50aWZpZXIoJGxpY2Vuc2UpOwppZiAoJHNwZHhMaWNlbnNlICYmICRzcGR4TGljZW5zZVszXSkgewppZiAoUHJlZzo6aXNNYXRjaCgne15bQUxdP0dQTC1bMTIzXShcLlswMV0pP1wrJH1pJywgJGxpY2Vuc2UpKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgIiVzIiBpcyBhIGRlcHJlY2F0ZWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHVzZSAiJy5zdHJfcmVwbGFjZSgnKycsICcnLCAkbGljZW5zZSkuJy1vci1sYXRlciIgaW5zdGVhZCcsCiRsaWNlbnNlCik7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCd7XltBTF0/R1BMLVsxMjNdKFwuWzAxXSk/JH1pJywgJGxpY2Vuc2UpKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgIiVzIiBpcyBhIGRlcHJlY2F0ZWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHVzZSAiJy4kbGljZW5zZS4nLW9ubHkiIG9yICInLiRsaWNlbnNlLictb3ItbGF0ZXIiIGluc3RlYWQnLAokbGljZW5zZQopOwp9IGVsc2Ugewokd2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICIlcyIgaXMgYSBkZXByZWNhdGVkIFNQRFggbGljZW5zZSBpZGVudGlmaWVyLCBzZWUgaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8nLAokbGljZW5zZQopOwp9Cn0KfQp9CgppZiAoKCRmbGFncyAmIHNlbGY6OkNIRUNLX1ZFUlNJT04pICYmIGlzc2V0KCRtYW5pZmVzdFsndmVyc2lvbiddKSkgewokd2FybmluZ3NbXSA9ICdUaGUgdmVyc2lvbiBmaWVsZCBpcyBwcmVzZW50LCBpdCBpcyByZWNvbW1lbmRlZCB0byBsZWF2ZSBpdCBvdXQgaWYgdGhlIHBhY2thZ2UgaXMgcHVibGlzaGVkIG9uIFBhY2thZ2lzdC4nOwp9CgppZiAoIWVtcHR5KCRtYW5pZmVzdFsnbmFtZSddKSAmJiBQcmVnOjppc01hdGNoKCd7W0EtWl19JywgJG1hbmlmZXN0WyduYW1lJ10pKSB7CiRzdWdnZXN0TmFtZSA9IFByZWc6OnJlcGxhY2UoJ3soPzooW2Etel0pKFtBLVpdKXwoW0EtWl0pKFtBLVpdW2Etel0pKX0nLCAnXFwxXFwzLVxcMlxcNCcsICRtYW5pZmVzdFsnbmFtZSddKTsKJHN1Z2dlc3ROYW1lID0gc3RydG9sb3dlcigkc3VnZ2VzdE5hbWUpOwoKJHB1Ymxpc2hFcnJvcnNbXSA9IHNwcmludGYoCidOYW1lICIlcyIgZG9lcyBub3QgbWF0Y2ggdGhlIGJlc3QgcHJhY3RpY2UgKGUuZy4gbG93ZXItY2FzZWQvd2l0aC1kYXNoZXMpLiBXZSBzdWdnZXN0IHVzaW5nICIlcyIgaW5zdGVhZC4gQXMgc3VjaCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBzdWJtaXQgaXQgdG8gUGFja2FnaXN0LicsCiRtYW5pZmVzdFsnbmFtZSddLAokc3VnZ2VzdE5hbWUKKTsKfQoKaWYgKCFlbXB0eSgkbWFuaWZlc3RbJ3R5cGUnXSkgJiYgJG1hbmlmZXN0Wyd0eXBlJ10gPT09ICdjb21wb3Nlci1pbnN0YWxsZXInKSB7CiR3YXJuaW5nc1tdID0gIlRoZSBwYWNrYWdlIHR5cGUgJ2NvbXBvc2VyLWluc3RhbGxlcicgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIGRpc3RyaWJ1dGUgeW91ciBjdXN0b20gaW5zdGFsbGVycyBhcyBwbHVnaW5zIGZyb20gbm93IG9uLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3BsdWdpbnMubWQgZm9yIHBsdWdpbiBkb2N1bWVudGF0aW9uLiI7Cn0KCgppZiAoaXNzZXQoJG1hbmlmZXN0WydyZXF1aXJlJ10sICRtYW5pZmVzdFsncmVxdWlyZS1kZXYnXSkpIHsKJHJlcXVpcmVPdmVycmlkZXMgPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCRtYW5pZmVzdFsncmVxdWlyZSddLCAkbWFuaWZlc3RbJ3JlcXVpcmUtZGV2J10pOwoKaWYgKCFlbXB0eSgkcmVxdWlyZU92ZXJyaWRlcykpIHsKJHBsdXJhbCA9IChjb3VudCgkcmVxdWlyZU92ZXJyaWRlcykgPiAxKSA/ICdhcmUnIDogJ2lzJzsKJHdhcm5pbmdzW10gPSBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJHJlcXVpcmVPdmVycmlkZXMpKS4gIiB7JHBsdXJhbH0gcmVxdWlyZWQgYm90aCBpbiByZXF1aXJlIGFuZCByZXF1aXJlLWRldiwgdGhpcyBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIjsKfQp9CgoKZm9yZWFjaCAoWydwcm92aWRlJywgJ3JlcGxhY2UnXSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRtYW5pZmVzdFskbGlua1R5cGVdKSkgewpmb3JlYWNoIChbJ3JlcXVpcmUnLCAncmVxdWlyZS1kZXYnXSBhcyAkcmVxdWlyZVR5cGUpIHsKaWYgKGlzc2V0KCRtYW5pZmVzdFskcmVxdWlyZVR5cGVdKSkgewpmb3JlYWNoICgkbWFuaWZlc3RbJGxpbmtUeXBlXSBhcyAkcHJvdmlkZSA9PiAkY29uc3RyYWludCkgewppZiAoaXNzZXQoJG1hbmlmZXN0WyRyZXF1aXJlVHlwZV1bJHByb3ZpZGVdKSkgewokd2FybmluZ3NbXSA9ICdUaGUgcGFja2FnZSAnIC4gJHByb3ZpZGUgLiAnIGluICcuJHJlcXVpcmVUeXBlLicgaXMgYWxzbyBsaXN0ZWQgaW4gJy4kbGlua1R5cGUuJyB3aGljaCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50LiBSZW1vdmUgaXQgZnJvbSAnLiRsaW5rVHlwZS4nIGlmIHlvdSB3aXNoIHRvIGluc3RhbGwgaXQuJzsKfQp9Cn0KfQp9Cn0KCgokcmVxdWlyZSA9ICRtYW5pZmVzdFsncmVxdWlyZSddID8/IFtdOwokcmVxdWlyZURldiA9ICRtYW5pZmVzdFsncmVxdWlyZS1kZXYnXSA/PyBbXTsKJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHJlcXVpcmUsICRyZXF1aXJlRGV2KTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CmlmIChQcmVnOjppc01hdGNoKCcvIy8nLCAkdmVyc2lvbikpIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonVGhlIHBhY2thZ2UgIiVzIiBpcyBwb2ludGluZyB0byBhIGNvbW1pdC1yZWYsIHRoaXMgaXMgYmFkIHByYWN0aWNlIGFuZCBjYW4gY2F1c2UgdW5mb3Jlc2VlbiBpc3N1ZXMuJywKJHBhY2thZ2UKKTsKfQp9CgoKJHNjcmlwdHNEZXNjcmlwdGlvbnMgPSAkbWFuaWZlc3RbJ3NjcmlwdHMtZGVzY3JpcHRpb25zJ10gPz8gW107CiRzY3JpcHRzID0gJG1hbmlmZXN0WydzY3JpcHRzJ10gPz8gW107CmZvcmVhY2ggKCRzY3JpcHRzRGVzY3JpcHRpb25zIGFzICRzY3JpcHROYW1lID0+ICRzY3JpcHREZXNjcmlwdGlvbikgewppZiAoIWFycmF5X2tleV9leGlzdHMoJHNjcmlwdE5hbWUsICRzY3JpcHRzKSkgewokd2FybmluZ3NbXSA9IHNwcmludGYoCidEZXNjcmlwdGlvbiBmb3Igbm9uLWV4aXN0ZW50IHNjcmlwdCAiJXMiIGZvdW5kIGluICJzY3JpcHRzLWRlc2NyaXB0aW9ucyInLAokc2NyaXB0TmFtZQopOwp9Cn0KCgppZiAoaXNzZXQoJG1hbmlmZXN0WydhdXRvbG9hZCddWydwc3ItMCddWycnXSkpIHsKJHdhcm5pbmdzW10gPSAiRGVmaW5pbmcgYXV0b2xvYWQucHNyLTAgd2l0aCBhbiBlbXB0eSBuYW1lc3BhY2UgcHJlZml4IGlzIGEgYmFkIGlkZWEgZm9yIHBlcmZvcm1hbmNlIjsKfQppZiAoaXNzZXQoJG1hbmlmZXN0WydhdXRvbG9hZCddWydwc3ItNCddWycnXSkpIHsKJHdhcm5pbmdzW10gPSAiRGVmaW5pbmcgYXV0b2xvYWQucHNyLTQgd2l0aCBhbiBlbXB0eSBuYW1lc3BhY2UgcHJlZml4IGlzIGEgYmFkIGlkZWEgZm9yIHBlcmZvcm1hbmNlIjsKfQoKJGxvYWRlciA9IG5ldyBWYWxpZGF0aW5nQXJyYXlMb2FkZXIobmV3IEFycmF5TG9hZGVyKCksIHRydWUsIG51bGwsICRhcnJheUxvYWRlclZhbGlkYXRpb25GbGFncyk7CnRyeSB7CmlmICghaXNzZXQoJG1hbmlmZXN0Wyd2ZXJzaW9uJ10pKSB7CiRtYW5pZmVzdFsndmVyc2lvbiddID0gJzEuMC4wJzsKfQppZiAoIWlzc2V0KCRtYW5pZmVzdFsnbmFtZSddKSkgewokbWFuaWZlc3RbJ25hbWUnXSA9ICdkdW1teS9kdW1teSc7Cn0KJGxvYWRlci0+bG9hZCgkbWFuaWZlc3QpOwp9IGNhdGNoIChJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbiAkZSkgewokZXJyb3JzID0gYXJyYXlfbWVyZ2UoJGVycm9ycywgJGUtPmdldEVycm9ycygpKTsKfQoKJHdhcm5pbmdzID0gYXJyYXlfbWVyZ2UoJHdhcm5pbmdzLCAkbG9hZGVyLT5nZXRXYXJuaW5ncygpKTsKCnJldHVybiBbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc107Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgoKY2xhc3MgRXJyb3JIYW5kbGVyCnsKCnByaXZhdGUgc3RhdGljICRpbzsKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGUoaW50ICRsZXZlbCwgc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJGZpbGUsIGludCAkbGluZSk6IGJvb2wKewokaXNEZXByZWNhdGlvbk5vdGljZSA9ICRsZXZlbCA9PT0gRV9ERVBSRUNBVEVEIHx8ICRsZXZlbCA9PT0gRV9VU0VSX0RFUFJFQ0FURUQ7CgoKaWYgKCEkaXNEZXByZWNhdGlvbk5vdGljZSAmJiAhKGVycm9yX3JlcG9ydGluZygpICYgJGxldmVsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGZpbHRlcl92YXIoaW5pX2dldCgneGRlYnVnLnNjcmVhbScpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJG1lc3NhZ2UgLj0gIlxuXG5XYXJuaW5nOiBZb3UgaGF2ZSB4ZGVidWcuc2NyZWFtIGVuYWJsZWQsIHRoZSB3YXJuaW5nIGFib3ZlIG1heSBiZSIuCiJcbmEgbGVnaXRpbWF0ZWx5IHN1cHByZXNzZWQgZXJyb3IgdGhhdCB5b3Ugd2VyZSBub3Qgc3VwcG9zZWQgdG8gc2VlLiI7Cn0KCmlmICghJGlzRGVwcmVjYXRpb25Ob3RpY2UpIHsKdGhyb3cgbmV3IFxFcnJvckV4Y2VwdGlvbigkbWVzc2FnZSwgMCwgJGxldmVsLCAkZmlsZSwgJGxpbmUpOwp9CgppZiAoc2VsZjo6JGlvKSB7CnNlbGY6OiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RGVwcmVjYXRpb24gTm90aWNlOiAnLiRtZXNzYWdlLicgaW4gJy4kZmlsZS4nOicuJGxpbmUuJzwvd2FybmluZz4nKTsKaWYgKHNlbGY6OiRpby0+aXNWZXJib3NlKCkpIHsKc2VsZjo6JGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5TdGFjayB0cmFjZTo8L3dhcm5pbmc+Jyk7CnNlbGY6OiRpby0+d3JpdGVFcnJvcihhcnJheV9maWx0ZXIoYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGEpOiA/c3RyaW5nIHsKaWYgKGlzc2V0KCRhWydsaW5lJ10sICRhWydmaWxlJ10pKSB7CnJldHVybiAnPHdhcm5pbmc+ICcuJGFbJ2ZpbGUnXS4nOicuJGFbJ2xpbmUnXS4nPC93YXJuaW5nPic7Cn0KCnJldHVybiBudWxsOwp9LCBhcnJheV9zbGljZShkZWJ1Z19iYWNrdHJhY2UoKSwgMikpKSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXIoP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpOiB2b2lkCnsKc2V0X2Vycm9yX2hhbmRsZXIoW19fQ0xBU1NfXywgJ2hhbmRsZSddKTsKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIHwgRV9TVFJJQ1QpOwpzZWxmOjokaW8gPSAkaW87Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjsKdXNlIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJT0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CgoKCgoKY2xhc3MgRmlsZXN5c3RlbQp7Cgpwcml2YXRlICRwcm9jZXNzRXhlY3V0b3I7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1Byb2Nlc3NFeGVjdXRvciAkZXhlY3V0b3IgPSBudWxsKQp7CiR0aGlzLT5wcm9jZXNzRXhlY3V0b3IgPSAkZXhlY3V0b3I7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoc3RyaW5nICRmaWxlKQp7CmlmIChpc19kaXIoJGZpbGUpKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5KCRmaWxlKTsKfQoKaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgewpyZXR1cm4gJHRoaXMtPnVubGluaygkZmlsZSk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEaXJFbXB0eShzdHJpbmcgJGRpcikKewokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKQotPmlnbm9yZVZDUyhmYWxzZSkKLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSkKLT5kZXB0aCgwKQotPmluKCRkaXIpOwoKcmV0dXJuIFxjb3VudCgkZmluZGVyKSA9PT0gMDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVtcHR5RGlyZWN0b3J5KHN0cmluZyAkZGlyLCBib29sICRlbnN1cmVEaXJlY3RvcnlFeGlzdHMgPSB0cnVlKQp7CmlmIChpc19saW5rKCRkaXIpICYmIGZpbGVfZXhpc3RzKCRkaXIpKSB7CiR0aGlzLT51bmxpbmsoJGRpcik7Cn0KCmlmICgkZW5zdXJlRGlyZWN0b3J5RXhpc3RzKSB7CiR0aGlzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJGRpcik7Cn0KCmlmIChpc19kaXIoJGRpcikpIHsKJGZpbmRlciA9IEZpbmRlcjo6Y3JlYXRlKCkKLT5pZ25vcmVWQ1MoZmFsc2UpCi0+aWdub3JlRG90RmlsZXMoZmFsc2UpCi0+ZGVwdGgoMCkKLT5pbigkZGlyKTsKCmZvcmVhY2ggKCRmaW5kZXIgYXMgJHBhdGgpIHsKJHRoaXMtPnJlbW92ZSgoc3RyaW5nKSAkcGF0aCk7Cn0KfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRGlyZWN0b3J5KHN0cmluZyAkZGlyZWN0b3J5KQp7CiRlZGdlQ2FzZVJlc3VsdCA9ICR0aGlzLT5yZW1vdmVFZGdlQ2FzZXMoJGRpcmVjdG9yeSk7CmlmICgkZWRnZUNhc2VSZXN1bHQgIT09IG51bGwpIHsKcmV0dXJuICRlZGdlQ2FzZVJlc3VsdDsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokY21kID0gc3ByaW50Zigncm1kaXIgL1MgL1EgJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShyZWFscGF0aCgkZGlyZWN0b3J5KSkpOwp9IGVsc2UgewokY21kID0gc3ByaW50Zigncm0gLXJmICVzJywgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGRpcmVjdG9yeSkpOwp9CgokcmVzdWx0ID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZSgkY21kLCAkb3V0cHV0KSA9PT0gMDsKCgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKCRyZXN1bHQgJiYgIWlzX2RpcigkZGlyZWN0b3J5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuICR0aGlzLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcmVjdG9yeSk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRGlyZWN0b3J5QXN5bmMoc3RyaW5nICRkaXJlY3RvcnkpCnsKJGVkZ2VDYXNlUmVzdWx0ID0gJHRoaXMtPnJlbW92ZUVkZ2VDYXNlcygkZGlyZWN0b3J5KTsKaWYgKCRlZGdlQ2FzZVJlc3VsdCAhPT0gbnVsbCkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkZWRnZUNhc2VSZXN1bHQpOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRjbWQgPSBzcHJpbnRmKCdybWRpciAvUyAvUSAlcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKHJlYWxwYXRoKCRkaXJlY3RvcnkpKSk7Cn0gZWxzZSB7CiRjbWQgPSBzcHJpbnRmKCdybSAtcmYgJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkZGlyZWN0b3J5KSk7Cn0KCiRwcm9taXNlID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZUFzeW5jKCRjbWQpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgkcHJvY2VzcykgdXNlICgkZGlyZWN0b3J5KSB7CgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKCRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSh0cnVlKTsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRkaXJlY3RvcnkpKTsKfSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVtb3ZlRWRnZUNhc2VzKHN0cmluZyAkZGlyZWN0b3J5LCBib29sICRmYWxsYmFja1RvUGhwID0gdHJ1ZSk6ID9ib29sCnsKaWYgKCR0aGlzLT5pc1N5bWxpbmtlZERpcmVjdG9yeSgkZGlyZWN0b3J5KSkgewpyZXR1cm4gJHRoaXMtPnVubGlua1N5bWxpbmtlZERpcmVjdG9yeSgkZGlyZWN0b3J5KTsKfQoKaWYgKCR0aGlzLT5pc0p1bmN0aW9uKCRkaXJlY3RvcnkpKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlSnVuY3Rpb24oJGRpcmVjdG9yeSk7Cn0KCmlmIChpc19saW5rKCRkaXJlY3RvcnkpKSB7CnJldHVybiB1bmxpbmsoJGRpcmVjdG9yeSk7Cn0KCmlmICghaXNfZGlyKCRkaXJlY3RvcnkpIHx8ICFmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD86W2Etel06KT9bL1xcXFxdKyR9aScsICRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQWJvcnRpbmcgYW4gYXR0ZW1wdGVkIGRlbGV0aW9uIG9mICcuJGRpcmVjdG9yeS4nLCB0aGlzIHdhcyBwcm9iYWJseSBub3QgaW50ZW5kZWQsIGlmIGl0IGlzIGEgcmVhbCB1c2UgY2FzZSBwbGVhc2UgcmVwb3J0IGl0LicpOwp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpICYmICRmYWxsYmFja1RvUGhwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRkaXJlY3RvcnkpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZURpcmVjdG9yeVBocChzdHJpbmcgJGRpcmVjdG9yeSkKewokZWRnZUNhc2VSZXN1bHQgPSAkdGhpcy0+cmVtb3ZlRWRnZUNhc2VzKCRkaXJlY3RvcnksIGZhbHNlKTsKaWYgKCRlZGdlQ2FzZVJlc3VsdCAhPT0gbnVsbCkgewpyZXR1cm4gJGVkZ2VDYXNlUmVzdWx0Owp9Cgp0cnkgewokaXQgPSBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSwgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUyk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKCgpjbGVhcnN0YXRjYWNoZSgpOwp1c2xlZXAoMTAwMDAwKTsKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkpIHsKcmV0dXJuIHRydWU7Cn0KJGl0ID0gbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXJlY3RvcnksIFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwp9CiRyaSA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRpdCwgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QpOwoKZm9yZWFjaCAoJHJpIGFzICRmaWxlKSB7CmlmICgkZmlsZS0+aXNEaXIoKSkgewokdGhpcy0+cm1kaXIoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9IGVsc2UgewokdGhpcy0+dW5saW5rKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQp9CgoKdW5zZXQoJHJpLCAkaXQsICRmaWxlKTsKCnJldHVybiAkdGhpcy0+cm1kaXIoJGRpcmVjdG9yeSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoc3RyaW5nICRkaXJlY3RvcnkpCnsKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkpIHsKaWYgKGZpbGVfZXhpc3RzKCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJGRpcmVjdG9yeS4nIGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5LicKKTsKfQoKaWYgKGlzX2xpbmsoJGRpcmVjdG9yeSkgJiYgIUAkdGhpcy0+dW5saW5rSW1wbGVtZW50YXRpb24oJGRpcmVjdG9yeSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGVsZXRlIHN5bWJvbGljIGxpbmsgJy4kZGlyZWN0b3J5Lic6ICcuKGVycm9yX2dldF9sYXN0KClbJ21lc3NhZ2UnXSA/PyAnJykpOwp9CgppZiAoIUBta2RpcigkZGlyZWN0b3J5LCAwNzc3LCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGRpcmVjdG9yeS4nIGRvZXMgbm90IGV4aXN0IGFuZCBjb3VsZCBub3QgYmUgY3JlYXRlZDogJy4oZXJyb3JfZ2V0X2xhc3QoKVsnbWVzc2FnZSddID8/ICcnKSk7Cn0KfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5saW5rKHN0cmluZyAkcGF0aCkKewokdW5saW5rZWQgPSBAJHRoaXMtPnVubGlua0ltcGxlbWVudGF0aW9uKCRwYXRoKTsKaWYgKCEkdW5saW5rZWQpIHsKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKdXNsZWVwKDM1MDAwMCk7CiR1bmxpbmtlZCA9IEAkdGhpcy0+dW5saW5rSW1wbGVtZW50YXRpb24oJHBhdGgpOwp9CgppZiAoISR1bmxpbmtlZCkgewokZXJyb3IgPSBlcnJvcl9nZXRfbGFzdCgpOwokbWVzc2FnZSA9ICdDb3VsZCBub3QgZGVsZXRlICcuJHBhdGguJzogJyAuICgkZXJyb3JbJ21lc3NhZ2UnXSA/PyAnJyk7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJG1lc3NhZ2UgLj0gIlxuVGhpcyBjYW4gYmUgZHVlIHRvIGFuIGFudGl2aXJ1cyBvciB0aGUgV2luZG93cyBTZWFyY2ggSW5kZXhlciBsb2NraW5nIHRoZSBmaWxlIHdoaWxlIHRoZXkgYXJlIGFuYWx5emVkIjsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlKTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJtZGlyKHN0cmluZyAkcGF0aCkKewokZGVsZXRlZCA9IEBybWRpcigkcGF0aCk7CmlmICghJGRlbGV0ZWQpIHsKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKdXNsZWVwKDM1MDAwMCk7CiRkZWxldGVkID0gQHJtZGlyKCRwYXRoKTsKfQoKaWYgKCEkZGVsZXRlZCkgewokZXJyb3IgPSBlcnJvcl9nZXRfbGFzdCgpOwokbWVzc2FnZSA9ICdDb3VsZCBub3QgZGVsZXRlICcuJHBhdGguJzogJyAuICgkZXJyb3JbJ21lc3NhZ2UnXSA/PyAnJyk7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJG1lc3NhZ2UgLj0gIlxuVGhpcyBjYW4gYmUgZHVlIHRvIGFuIGFudGl2aXJ1cyBvciB0aGUgV2luZG93cyBTZWFyY2ggSW5kZXhlciBsb2NraW5nIHRoZSBmaWxlIHdoaWxlIHRoZXkgYXJlIGFuYWx5emVkIjsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlKTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weVRoZW5SZW1vdmUoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KQp7CiR0aGlzLT5jb3B5KCRzb3VyY2UsICR0YXJnZXQpOwppZiAoIWlzX2Rpcigkc291cmNlKSkgewokdGhpcy0+dW5saW5rKCRzb3VyY2UpOwoKcmV0dXJuOwp9CgokdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRzb3VyY2UpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5KHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHRhcmdldCkKewppZiAoIWlzX2Rpcigkc291cmNlKSkgewpyZXR1cm4gY29weSgkc291cmNlLCAkdGFyZ2V0KTsKfQoKJGl0ID0gbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzb3VyY2UsIFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwokcmkgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigkaXQsIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwokdGhpcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0YXJnZXQpOwoKJHJlc3VsdCA9IHRydWU7CmZvcmVhY2ggKCRyaSBhcyAkZmlsZSkgewokdGFyZ2V0UGF0aCA9ICR0YXJnZXQgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHJpLT5nZXRTdWJQYXRobmFtZSgpOwppZiAoJGZpbGUtPmlzRGlyKCkpIHsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0UGF0aCk7Cn0gZWxzZSB7CiRyZXN1bHQgPSAkcmVzdWx0ICYmIGNvcHkoJGZpbGUtPmdldFBhdGhuYW1lKCksICR0YXJnZXRQYXRoKTsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbmFtZShzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICR0YXJnZXQpCnsKaWYgKHRydWUgPT09IEByZW5hbWUoJHNvdXJjZSwgJHRhcmdldCkpIHsKcmV0dXJuOwp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CiR0aGlzLT5jb3B5VGhlblJlbW92ZSgkc291cmNlLCAkdGFyZ2V0KTsKCnJldHVybjsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewoKJGNvbW1hbmQgPSBzcHJpbnRmKCd4Y29weSAlcyAlcyAvRSAvSSAvUSAvWScsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRzb3VyY2UpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdGFyZ2V0KSk7CiRyZXN1bHQgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0KTsKCgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKDAgPT09ICRyZXN1bHQpIHsKJHRoaXMtPnJlbW92ZSgkc291cmNlKTsKCnJldHVybjsKfQp9IGVsc2UgewoKCiRjb21tYW5kID0gc3ByaW50ZignbXYgJXMgJXMnLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkc291cmNlKSwgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHRhcmdldCkpOwokcmVzdWx0ID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCk7CgoKY2xlYXJzdGF0Y2FjaGUoKTsKCmlmICgwID09PSAkcmVzdWx0KSB7CnJldHVybjsKfQp9CgokdGhpcy0+Y29weVRoZW5SZW1vdmUoJHNvdXJjZSwgJHRhcmdldCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFNob3J0ZXN0UGF0aChzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8sIGJvb2wgJGRpcmVjdG9yaWVzID0gZmFsc2UpCnsKaWYgKCEkdGhpcy0+aXNBYnNvbHV0ZVBhdGgoJGZyb20pIHx8ICEkdGhpcy0+aXNBYnNvbHV0ZVBhdGgoJHRvKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCckZnJvbSAoJXMpIGFuZCAkdG8gKCVzKSBtdXN0IGJlIGFic29sdXRlIHBhdGhzLicsICRmcm9tLCAkdG8pKTsKfQoKJGZyb20gPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkZnJvbSk7CiR0byA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCR0byk7CgppZiAoJGRpcmVjdG9yaWVzKSB7CiRmcm9tID0gcnRyaW0oJGZyb20sICcvJykgLiAnL2R1bW15X2ZpbGUnOwp9CgppZiAoXGRpcm5hbWUoJGZyb20pID09PSBcZGlybmFtZSgkdG8pKSB7CnJldHVybiAnLi8nLmJhc2VuYW1lKCR0byk7Cn0KCiRjb21tb25QYXRoID0gJHRvOwp3aGlsZSAoc3RycG9zKCRmcm9tLicvJywgJGNvbW1vblBhdGguJy8nKSAhPT0gMCAmJiAnLycgIT09ICRjb21tb25QYXRoICYmICFQcmVnOjppc01hdGNoKCd7XltBLVpdOi8/JH1pJywgJGNvbW1vblBhdGgpKSB7CiRjb21tb25QYXRoID0gc3RydHIoXGRpcm5hbWUoJGNvbW1vblBhdGgpLCAnXFwnLCAnLycpOwp9CgoKaWYgKDAgIT09IHN0cnBvcygkZnJvbSwgJGNvbW1vblBhdGgpKSB7CnJldHVybiAkdG87Cn0KCiRjb21tb25QYXRoID0gcnRyaW0oJGNvbW1vblBhdGgsICcvJykgLiAnLyc7CiRzb3VyY2VQYXRoRGVwdGggPSBzdWJzdHJfY291bnQoKHN0cmluZykgc3Vic3RyKCRmcm9tLCBcc3RybGVuKCRjb21tb25QYXRoKSksICcvJyk7CiRjb21tb25QYXRoQ29kZSA9IHN0cl9yZXBlYXQoJy4uLycsICRzb3VyY2VQYXRoRGVwdGgpOwoKCmlmICgnLycgPT09ICRjb21tb25QYXRoICYmICRzb3VyY2VQYXRoRGVwdGggPiAxKSB7CnJldHVybiAkdG87Cn0KCiRyZXN1bHQgPSAkY29tbW9uUGF0aENvZGUgLiBzdWJzdHIoJHRvLCBcc3RybGVuKCRjb21tb25QYXRoKSk7CmlmIChcc3RybGVuKCRyZXN1bHQpID09PSAwKSB7CnJldHVybiAnLi8nOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU2hvcnRlc3RQYXRoQ29kZShzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8sIGJvb2wgJGRpcmVjdG9yaWVzID0gZmFsc2UsIGJvb2wgJHN0YXRpY0NvZGUgPSBmYWxzZSkKewppZiAoISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkZnJvbSkgfHwgISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkdG8pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJyRmcm9tICglcykgYW5kICR0byAoJXMpIG11c3QgYmUgYWJzb2x1dGUgcGF0aHMuJywgJGZyb20sICR0bykpOwp9CgokZnJvbSA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRmcm9tKTsKJHRvID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHRvKTsKCmlmICgkZnJvbSA9PT0gJHRvKSB7CnJldHVybiAkZGlyZWN0b3JpZXMgPyAnX19ESVJfXycgOiAnX19GSUxFX18nOwp9CgokY29tbW9uUGF0aCA9ICR0bzsKd2hpbGUgKHN0cnBvcygkZnJvbS4nLycsICRjb21tb25QYXRoLicvJykgIT09IDAgJiYgJy8nICE9PSAkY29tbW9uUGF0aCAmJiAhUHJlZzo6aXNNYXRjaCgne15bQS1aXTovPyR9aScsICRjb21tb25QYXRoKSAmJiAnLicgIT09ICRjb21tb25QYXRoKSB7CiRjb21tb25QYXRoID0gc3RydHIoXGRpcm5hbWUoJGNvbW1vblBhdGgpLCAnXFwnLCAnLycpOwp9CgoKaWYgKDAgIT09IHN0cnBvcygkZnJvbSwgJGNvbW1vblBhdGgpIHx8ICcuJyA9PT0gJGNvbW1vblBhdGgpIHsKcmV0dXJuIHZhcl9leHBvcnQoJHRvLCB0cnVlKTsKfQoKJGNvbW1vblBhdGggPSBydHJpbSgkY29tbW9uUGF0aCwgJy8nKSAuICcvJzsKaWYgKHN0cl9zdGFydHNfd2l0aCgkdG8sICRmcm9tLicvJykpIHsKcmV0dXJuICdfX0RJUl9fIC4gJy52YXJfZXhwb3J0KChzdHJpbmcpIHN1YnN0cigkdG8sIFxzdHJsZW4oJGZyb20pKSwgdHJ1ZSk7Cn0KJHNvdXJjZVBhdGhEZXB0aCA9IHN1YnN0cl9jb3VudCgoc3RyaW5nKSBzdWJzdHIoJGZyb20sIFxzdHJsZW4oJGNvbW1vblBhdGgpKSwgJy8nKSArIChpbnQpICRkaXJlY3RvcmllczsKCgppZiAoJy8nID09PSAkY29tbW9uUGF0aCAmJiAkc291cmNlUGF0aERlcHRoID4gMSkgewpyZXR1cm4gdmFyX2V4cG9ydCgkdG8sIHRydWUpOwp9CgppZiAoJHN0YXRpY0NvZGUpIHsKJGNvbW1vblBhdGhDb2RlID0gIl9fRElSX18gLiAnIi5zdHJfcmVwZWF0KCcvLi4nLCAkc291cmNlUGF0aERlcHRoKS4iJyI7Cn0gZWxzZSB7CiRjb21tb25QYXRoQ29kZSA9IHN0cl9yZXBlYXQoJ2Rpcm5hbWUoJywgJHNvdXJjZVBhdGhEZXB0aCkuJ19fRElSX18nLnN0cl9yZXBlYXQoJyknLCAkc291cmNlUGF0aERlcHRoKTsKfQokcmVsVGFyZ2V0ID0gKHN0cmluZykgc3Vic3RyKCR0bywgXHN0cmxlbigkY29tbW9uUGF0aCkpOwoKcmV0dXJuICRjb21tb25QYXRoQ29kZSAuIChcc3RybGVuKCRyZWxUYXJnZXQpID4gMCA/ICcuJyAuIHZhcl9leHBvcnQoJy8nIC4gJHJlbFRhcmdldCwgdHJ1ZSkgOiAnJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQWJzb2x1dGVQYXRoKHN0cmluZyAkcGF0aCkKewpyZXR1cm4gc3RycG9zKCRwYXRoLCAnLycpID09PSAwIHx8IHN1YnN0cigkcGF0aCwgMSwgMSkgPT09ICc6JyB8fCBzdHJwb3MoJHBhdGgsICdcXFxcJykgPT09IDA7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNpemUoc3RyaW5nICRwYXRoKQp7CmlmICghZmlsZV9leGlzdHMoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiJHBhdGggZG9lcyBub3QgZXhpc3QuIik7Cn0KaWYgKGlzX2RpcigkcGF0aCkpIHsKcmV0dXJuICR0aGlzLT5kaXJlY3RvcnlTaXplKCRwYXRoKTsKfQoKcmV0dXJuIChpbnQpIGZpbGVzaXplKCRwYXRoKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHN0cmluZyAkcGF0aCkKewokcGFydHMgPSBbXTsKJHBhdGggPSBzdHJ0cigkcGF0aCwgJ1xcJywgJy8nKTsKJHByZWZpeCA9ICcnOwokYWJzb2x1dGUgPSAnJzsKCgppZiAoc3RycG9zKCRwYXRoLCAnLy8nKSA9PT0gMCAmJiBcc3RybGVuKCRwYXRoKSA+IDIpIHsKJGFic29sdXRlID0gJy8vJzsKJHBhdGggPSBzdWJzdHIoJHBhdGgsIDIpOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKCBbMC05YS16XXsyLH0rOiAoPzogLy8gKD86IFthLXpdOiApPyApPyB8IFthLXpdOiApfWl4JywgJHBhdGgsICRtYXRjaCkpIHsKJHByZWZpeCA9ICRtYXRjaFsxXTsKJHBhdGggPSBzdWJzdHIoJHBhdGgsIFxzdHJsZW4oJHByZWZpeCkpOwp9CgppZiAoc3RycG9zKCRwYXRoLCAnLycpID09PSAwKSB7CiRhYnNvbHV0ZSA9ICcvJzsKJHBhdGggPSBzdWJzdHIoJHBhdGgsIDEpOwp9CgokdXAgPSBmYWxzZTsKZm9yZWFjaCAoZXhwbG9kZSgnLycsICRwYXRoKSBhcyAkY2h1bmspIHsKaWYgKCcuLicgPT09ICRjaHVuayAmJiAoXHN0cmxlbigkYWJzb2x1dGUpID4gMCB8fCAkdXApKSB7CmFycmF5X3BvcCgkcGFydHMpOwokdXAgPSAhKFxjb3VudCgkcGFydHMpID09PSAwIHx8ICcuLicgPT09IGVuZCgkcGFydHMpKTsKfSBlbHNlaWYgKCcuJyAhPT0gJGNodW5rICYmICcnICE9PSAkY2h1bmspIHsKJHBhcnRzW10gPSAkY2h1bms7CiR1cCA9ICcuLicgIT09ICRjaHVuazsKfQp9CgoKJHByZWZpeCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygneyhefDovLylbYS16XTokfWknLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRtKSB7CmFzc2VydChpc19zdHJpbmcoJG1bMF0pKTsKcmV0dXJuIHN0cnRvdXBwZXIoJG1bMF0pOwp9LCAkcHJlZml4KTsKCnJldHVybiAkcHJlZml4LiRhYnNvbHV0ZS5pbXBsb2RlKCcvJywgJHBhcnRzKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdHJpbVRyYWlsaW5nU2xhc2goc3RyaW5nICRwYXRoKQp7CmlmICghUHJlZzo6aXNNYXRjaCgne15bL1xcXFxdKyR9JywgJHBhdGgpKSB7CiRwYXRoID0gcnRyaW0oJHBhdGgsICcvXFwnKTsKfQoKcmV0dXJuICRwYXRoOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNMb2NhbFBhdGgoc3RyaW5nICRwYXRoKQp7CnJldHVybiBQcmVnOjppc01hdGNoKCd7XihmaWxlOi8vKD8hLy8pfC8oPyEvKXwvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVBhdGgoc3RyaW5nICRwYXRoKQp7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHBhdGggPSBQcmVnOjpyZXBsYWNlKCd7Xig/OmZpbGU6Ly8vKFthLXpdKTo/Lyl9aScsICdmaWxlOi8vJDE6LycsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teZmlsZTovL31pJywgJycsICRwYXRoKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRwYXRoKQp7CmlmIChpc19yZWFkYWJsZSgkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19maWxlKCRwYXRoKSkgewpyZXR1cm4gZmFsc2UgIT09IFNpbGVuY2VyOjpjYWxsKCdmaWxlX2dldF9jb250ZW50cycsICRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgMSk7Cn0KCmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiBmYWxzZSAhPT0gU2lsZW5jZXI6OmNhbGwoJ29wZW5kaXInLCAkcGF0aCk7Cn0KCgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXJlY3RvcnlTaXplKHN0cmluZyAkZGlyZWN0b3J5KQp7CiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5LCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cgokc2l6ZSA9IDA7CmZvcmVhY2ggKCRyaSBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmlzRmlsZSgpKSB7CiRzaXplICs9ICRmaWxlLT5nZXRTaXplKCk7Cn0KfQoKcmV0dXJuICRzaXplOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzRXhlY3V0b3I7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtJbXBsZW1lbnRhdGlvbihzdHJpbmcgJHBhdGgpOiBib29sCnsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBpc19kaXIoJHBhdGgpICYmIGlzX2xpbmsoJHBhdGgpKSB7CnJldHVybiBybWRpcigkcGF0aCk7Cn0KCnJldHVybiB1bmxpbmsoJHBhdGgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbGF0aXZlU3ltbGluayhzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRsaW5rKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokY3dkID0gUGxhdGZvcm06OmdldEN3ZCgpOwoKJHJlbGF0aXZlUGF0aCA9ICR0aGlzLT5maW5kU2hvcnRlc3RQYXRoKCRsaW5rLCAkdGFyZ2V0KTsKY2hkaXIoXGRpcm5hbWUoJGxpbmspKTsKJHJlc3VsdCA9IEBzeW1saW5rKCRyZWxhdGl2ZVBhdGgsICRsaW5rKTsKCmNoZGlyKCRjd2QpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3ltbGlua2VkRGlyZWN0b3J5KHN0cmluZyAkZGlyZWN0b3J5KQp7CmlmICghaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuIGlzX2xpbmsoJHJlc29sdmVkKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtTeW1saW5rZWREaXJlY3Rvcnkoc3RyaW5nICRkaXJlY3RvcnkpOiBib29sCnsKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuICR0aGlzLT51bmxpbmsoJHJlc29sdmVkKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZVN5bWxpbmtlZERpcmVjdG9yeVN5bWxpbmsoc3RyaW5nICRwYXRobmFtZSk6IHN0cmluZwp7CmlmICghaXNfZGlyKCRwYXRobmFtZSkpIHsKcmV0dXJuICRwYXRobmFtZTsKfQoKJHJlc29sdmVkID0gcnRyaW0oJHBhdGhuYW1lLCAnLycpOwoKaWYgKDAgPT09IFxzdHJsZW4oJHJlc29sdmVkKSkgewpyZXR1cm4gJHBhdGhuYW1lOwp9CgpyZXR1cm4gJHJlc29sdmVkOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBqdW5jdGlvbihzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Z1bmN0aW9uICVzIGlzIG5vdCBhdmFpbGFibGUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm0nLCBfX0NMQVNTX18pKTsKfQppZiAoIWlzX2RpcigkdGFyZ2V0KSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IGp1bmN0aW9uIHRvICIlcyIgYXMgaXQgaXMgbm90IGEgZGlyZWN0b3J5LicsICR0YXJnZXQpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKCmlmICghaXNfZGlyKCRqdW5jdGlvbikgfHwgJHRoaXMtPmlzSnVuY3Rpb24oJGp1bmN0aW9uKSkgewpAcm1kaXIoJGp1bmN0aW9uKTsKfQoKJGNtZCA9IHNwcmludGYoCidta2xpbmsgL0ogJXMgJXMnLApQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShzdHJfcmVwbGFjZSgnLycsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRqdW5jdGlvbikpLApQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShyZWFscGF0aCgkdGFyZ2V0KSkKKTsKaWYgKCR0aGlzLT5nZXRQcm9jZXNzKCktPmV4ZWN1dGUoJGNtZCwgJG91dHB1dCkgIT09IDApIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjcmVhdGUganVuY3Rpb24gdG8gIiVzIiBhdCAiJXMiLicsICR0YXJnZXQsICRqdW5jdGlvbiksIDAsIG51bGwsICR0YXJnZXQpOwp9CmNsZWFyc3RhdGNhY2hlKHRydWUsICRqdW5jdGlvbik7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSnVuY3Rpb24oc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgpjbGVhcnN0YXRjYWNoZSh0cnVlLCAkanVuY3Rpb24pOwoKaWYgKCFpc19kaXIoJGp1bmN0aW9uKSB8fCBpc19saW5rKCRqdW5jdGlvbikpIHsKcmV0dXJuIGZhbHNlOwp9Cgokc3RhdCA9IGxzdGF0KCRqdW5jdGlvbik7CgoKcmV0dXJuIGlzX2FycmF5KCRzdGF0KSA/IDB4NDAwMCAhPT0gKCRzdGF0Wydtb2RlJ10gJiAweEYwMDApIDogZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUp1bmN0aW9uKHN0cmluZyAkanVuY3Rpb24pCnsKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CiRqdW5jdGlvbiA9IHJ0cmltKHN0cl9yZXBsYWNlKCcvJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJGp1bmN0aW9uKSwgRElSRUNUT1JZX1NFUEFSQVRPUik7CmlmICghJHRoaXMtPmlzSnVuY3Rpb24oJGp1bmN0aW9uKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignJXMgaXMgbm90IGEganVuY3Rpb24gYW5kIHRodXMgY2Fubm90IGJlIHJlbW92ZWQgYXMgb25lJywgJGp1bmN0aW9uKSk7Cn0KCnJldHVybiAkdGhpcy0+cm1kaXIoJGp1bmN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoc3RyaW5nICRwYXRoLCBzdHJpbmcgJGNvbnRlbnQpCnsKJGN1cnJlbnRDb250ZW50ID0gU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfZ2V0X2NvbnRlbnRzJywgJHBhdGgpOwppZiAoZmFsc2UgPT09ICRjdXJyZW50Q29udGVudCB8fCAkY3VycmVudENvbnRlbnQgIT09ICRjb250ZW50KSB7CnJldHVybiBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJGNvbnRlbnQpOwp9CgpyZXR1cm4gMDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNhZmVDb3B5KHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHRhcmdldCk6IHZvaWQKewppZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXQpIHx8ICFmaWxlX2V4aXN0cygkc291cmNlKSB8fCAhJHRoaXMtPmZpbGVzQXJlRXF1YWwoJHNvdXJjZSwgJHRhcmdldCkpIHsKJHNvdXJjZUhhbmRsZSA9IGZvcGVuKCRzb3VyY2UsICdyJyk7CmFzc2VydCgkc291cmNlSGFuZGxlICE9PSBmYWxzZSwgJ0NvdWxkIG5vdCBvcGVuICInLiRzb3VyY2UuJyIgZm9yIHJlYWRpbmcuJyk7CiR0YXJnZXRIYW5kbGUgPSBmb3BlbigkdGFyZ2V0LCAndysnKTsKYXNzZXJ0KCR0YXJnZXRIYW5kbGUgIT09IGZhbHNlLCAnQ291bGQgbm90IG9wZW4gIicuJHRhcmdldC4nIiBmb3Igd3JpdGluZy4nKTsKCnN0cmVhbV9jb3B5X3RvX3N0cmVhbSgkc291cmNlSGFuZGxlLCAkdGFyZ2V0SGFuZGxlKTsKZmNsb3NlKCRzb3VyY2VIYW5kbGUpOwpmY2xvc2UoJHRhcmdldEhhbmRsZSk7Cgp0b3VjaCgkdGFyZ2V0LCAoaW50KSBmaWxlbXRpbWUoJHNvdXJjZSksIChpbnQpIGZpbGVhdGltZSgkc291cmNlKSk7Cn0KfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsZXNBcmVFcXVhbChzdHJpbmcgJGEsIHN0cmluZyAkYik6IGJvb2wKewoKaWYgKGZpbGVzaXplKCRhKSAhPT0gZmlsZXNpemUoJGIpKSB7CnJldHVybiBmYWxzZTsKfQoKCiRhSGFuZGxlID0gZm9wZW4oJGEsICdyYicpOwphc3NlcnQoJGFIYW5kbGUgIT09IGZhbHNlLCAnQ291bGQgbm90IG9wZW4gIicuJGEuJyIgZm9yIHJlYWRpbmcuJyk7CiRiSGFuZGxlID0gZm9wZW4oJGIsICdyYicpOwphc3NlcnQoJGJIYW5kbGUgIT09IGZhbHNlLCAnQ291bGQgbm90IG9wZW4gIicuJGIuJyIgZm9yIHJlYWRpbmcuJyk7CgokcmVzdWx0ID0gdHJ1ZTsKd2hpbGUgKCFmZW9mKCRhSGFuZGxlKSkgewppZiAoZnJlYWQoJGFIYW5kbGUsIDgxOTIpICE9PSBmcmVhZCgkYkhhbmRsZSwgODE5MikpIHsKJHJlc3VsdCA9IGZhbHNlOwpicmVhazsKfQp9CgpmY2xvc2UoJGFIYW5kbGUpOwpmY2xvc2UoJGJIYW5kbGUpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEdpdAp7Cgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvbiA9IGZhbHNlOwoKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIEZpbGVzeXN0ZW0gJGZzKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bkNvbW1hbmQoY2FsbGFibGUgJGNvbW1hbmRDYWxsYWJsZSwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCwgYm9vbCAkaW5pdGlhbENsb25lID0gZmFsc2UsICYkY29tbWFuZE91dHB1dCA9IG51bGwpOiB2b2lkCnsKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCmlmICgkaW5pdGlhbENsb25lKSB7CiRvcmlnQ3dkID0gJGN3ZDsKJGN3ZCA9IG51bGw7Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7XnNzaDovL1teQF0rQFteOl0rOlteMC05XSt9JywgJHVybCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBzb3VyY2UgVVJMICcgLiAkdXJsIC4gJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nIC4gIlxuIiAuICdVc2Ugc3NoOi8vZ2l0QGV4YW1wbGUuY29tOjIyL3BhdGggb3IganVzdCBnaXRAZXhhbXBsZS5jb206cGF0aCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gcHJvdmlkZSBhIHBhc3N3b3JkIG9yIGN1c3RvbSBwb3J0LicpOwp9CgppZiAoISRpbml0aWFsQ2xvbmUpIHsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgcmVtb3RlIC12JywgJG91dHB1dCwgJGN3ZCk7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OmNvbXBvc2VyfG9yaWdpbilccytodHRwcz86Ly8oLispOiguKylAKFteL10rKX1pbScsICRvdXRwdXQsICRtYXRjaCkgJiYgISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzNdKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFszXSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsxXSksIHJhd3VybGRlY29kZSgkbWF0Y2hbMl0pKTsKfQp9CgokcHJvdG9jb2xzID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItcHJvdG9jb2xzJyk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpodHRwcz98Z2l0KTovLycgLiBzZWxmOjpnZXRHaXRIdWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnLyguKil9JywgJHVybCwgJG1hdGNoKSkgewokbWVzc2FnZXMgPSBbXTsKZm9yZWFjaCAoJHByb3RvY29scyBhcyAkcHJvdG9jb2wpIHsKaWYgKCdzc2gnID09PSAkcHJvdG9jb2wpIHsKJHByb3RvVXJsID0gImdpdEAiIC4gJG1hdGNoWzFdIC4gIjoiIC4gJG1hdGNoWzJdOwp9IGVsc2UgewokcHJvdG9VcmwgPSAkcHJvdG9jb2wgLiAiOi8vIiAuICRtYXRjaFsxXSAuICIvIiAuICRtYXRjaFsyXTsKfQoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kQ2FsbGFibGUoJHByb3RvVXJsKSwgJGNvbW1hbmRPdXRwdXQsICRjd2QpKSB7CnJldHVybjsKfQokbWVzc2FnZXNbXSA9ICctICcgLiAkcHJvdG9VcmwgLiAiXG4iIC4gUHJlZzo6cmVwbGFjZSgnI14jbScsICcgICcsICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKCmlmICgkaW5pdGlhbENsb25lICYmIGlzc2V0KCRvcmlnQ3dkKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRvcmlnQ3dkKTsKfQp9CgoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkgJiYgISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT50aHJvd0V4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcgLiAkdXJsIC4gJyB2aWEgJyAuIGltcGxvZGUoJywgJywgJHByb3RvY29scykgLiAnIHByb3RvY29scywgYWJvcnRpbmcuJyAuICJcblxuIiAuIGltcGxvZGUoIlxuIiwgJG1lc3NhZ2VzKSwgJHVybCk7Cn0KfQoKCiRieXBhc3NTc2hGb3JHaXRIdWIgPSBQcmVnOjppc01hdGNoKCd7XmdpdEAnIC4gc2VsZjo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJzooLis/KVwuZ2l0JH1pJywgJHVybCkgJiYgIWluX2FycmF5KCdzc2gnLCAkcHJvdG9jb2xzLCB0cnVlKTsKCiRjb21tYW5kID0gJGNvbW1hbmRDYWxsYWJsZSgkdXJsKTsKCiRhdXRoID0gbnVsbDsKJGNyZWRlbnRpYWxzID0gW107CmlmICgkYnlwYXNzU3NoRm9yR2l0SHViIHx8IDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkY29tbWFuZE91dHB1dCwgJGN3ZCkpIHsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15naXRAJyAuIHNlbGY6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICc6KC4rPylcLmdpdCR9aScsICR1cmwsICRtYXRjaCkKfHwgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15odHRwcz86Ly8nIC4gc2VsZjo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJy8oLio/KSg/OlwuZ2l0KT8kfWknLCAkdXJsLCAkbWF0Y2gpCikgewppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzFdKSkgewokZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiRtZXNzYWdlID0gJ0Nsb25pbmcgZmFpbGVkIHVzaW5nIGFuIHNzaCBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uLCBlbnRlciB5b3VyIEdpdEh1YiBjcmVkZW50aWFscyB0byBhY2Nlc3MgcHJpdmF0ZSByZXBvcyc7CgppZiAoISRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aCgkbWF0Y2hbMV0pICYmICR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJG1hdGNoWzFdLCAkbWVzc2FnZSk7Cn0KfQoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzFdKSkgewokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzFdKTsKJGF1dGhVcmwgPSAnaHR0cHM6Ly8nIC4gcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkbWF0Y2hbMV0gLiAnLycgLiAkbWF0Y2hbMl0gLiAnLmdpdCc7CiRjb21tYW5kID0gJGNvbW1hbmRDYWxsYWJsZSgkYXV0aFVybCk7CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGNvbW1hbmRPdXRwdXQsICRjd2QpKSB7CnJldHVybjsKfQoKJGNyZWRlbnRpYWxzID0gW3Jhd3VybGVuY29kZSgkYXV0aFsndXNlcm5hbWUnXSksIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSldOwokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfQp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15odHRwczovLyhiaXRidWNrZXRcLm9yZykvKC4qPykoPzpcLmdpdCk/JH1pJywgJHVybCwgJG1hdGNoKSkgeyAKJGJpdGJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkpIHsKJG1lc3NhZ2UgPSAnRW50ZXIgeW91ciBCaXRidWNrZXQgY3JlZGVudGlhbHMgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwoKaWYgKCEkYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGgoJG1hdGNoWzFdKSAmJiAkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRtYXRjaFsxXSwgJG1lc3NhZ2UpOwokYWNjZXNzVG9rZW4gPSAkYml0YnVja2V0VXRpbC0+Z2V0VG9rZW4oKTsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMV0sICd4LXRva2VuLWF1dGgnLCAkYWNjZXNzVG9rZW4pOwp9Cn0gZWxzZSB7IAokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzFdKTsKCgppZiAoJGF1dGhbJ3VzZXJuYW1lJ10gIT09ICd4LXRva2VuLWF1dGgnKSB7CiRhY2Nlc3NUb2tlbiA9ICRiaXRidWNrZXRVdGlsLT5yZXF1ZXN0VG9rZW4oJG1hdGNoWzFdLCAkYXV0aFsndXNlcm5hbWUnXSwgJGF1dGhbJ3Bhc3N3b3JkJ10pOwppZiAoIWVtcHR5KCRhY2Nlc3NUb2tlbikpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMV0sICd4LXRva2VuLWF1dGgnLCAkYWNjZXNzVG9rZW4pOwp9Cn0KfQoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzFdKSkgewokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzFdKTsKJGF1dGhVcmwgPSAnaHR0cHM6Ly8nIC4gcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkbWF0Y2hbMV0gLiAnLycgLiAkbWF0Y2hbMl0gLiAnLmdpdCc7CgokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJGF1dGhVcmwpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRjb21tYW5kT3V0cHV0LCAkY3dkKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0gZWxzZSB7IAokc3NoVXJsID0gJ2dpdEBiaXRidWNrZXQub3JnOicgLiAkbWF0Y2hbMl0gLiAnLmdpdCc7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIE5vIGJpdGJ1Y2tldCBhdXRoZW50aWNhdGlvbiBjb25maWd1cmVkLiBGYWxsaW5nIGJhY2sgdG8gc3NoLicpOwokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJHNzaFVybCk7CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGNvbW1hbmRPdXRwdXQsICRjd2QpKSB7CnJldHVybjsKfQoKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KfSBlbHNlaWYgKApQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihnaXQpQCcgLiBzZWxmOjpnZXRHaXRMYWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnOiguKz9cLmdpdCkkfWknLCAkdXJsLCAkbWF0Y2gpCnx8IFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKGh0dHBzPyk6Ly8nIC4gc2VsZjo6Z2V0R2l0TGFiRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJy8oLiopfWknLCAkdXJsLCAkbWF0Y2gpCikgewppZiAoJG1hdGNoWzFdID09PSAnZ2l0JykgewokbWF0Y2hbMV0gPSAnaHR0cHMnOwp9CgppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoWzJdKSkgewokZ2l0TGFiVXRpbCA9IG5ldyBHaXRMYWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiRtZXNzYWdlID0gJ0Nsb25pbmcgZmFpbGVkLCBlbnRlciB5b3VyIEdpdExhYiBjcmVkZW50aWFscyB0byBhY2Nlc3MgcHJpdmF0ZSByZXBvcyc7CgppZiAoISRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aCgkbWF0Y2hbMl0pICYmICR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJG1hdGNoWzFdLCAkbWF0Y2hbMl0sICRtZXNzYWdlKTsKfQp9CgppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pOwppZiAoJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdwcml2YXRlLXRva2VuJyB8fCAkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ29hdXRoMicgfHwgJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdnaXRsYWItY2ktdG9rZW4nKSB7CiRhdXRoVXJsID0gJG1hdGNoWzFdIC4gJzovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSAuICdAJyAuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXTsgCn0gZWxzZSB7CiRhdXRoVXJsID0gJG1hdGNoWzFdIC4gJzovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXTsKfQoKJGNvbW1hbmQgPSAkY29tbWFuZENhbGxhYmxlKCRhdXRoVXJsKTsKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkY29tbWFuZE91dHB1dCwgJGN3ZCkpIHsKcmV0dXJuOwp9CgokY3JlZGVudGlhbHMgPSBbcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSwgcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKV07CiRlcnJvck1zZyA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9Cn0gZWxzZWlmICgkdGhpcy0+aXNBdXRoZW50aWNhdGlvbkZhaWx1cmUoJHVybCwgJG1hdGNoKSkgeyAKaWYgKHN0cnBvcygkbWF0Y2hbMl0sICdAJykpIHsKWyRhdXRoUGFydHMsICRtYXRjaFsyXV0gPSBleHBsb2RlKCdAJywgJG1hdGNoWzJdLCAyKTsKfQoKJHN0b3JlQXV0aCA9IGZhbHNlOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pOwp9IGVsc2VpZiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGRlZmF1bHRVc2VybmFtZSA9IG51bGw7CmlmIChpc3NldCgkYXV0aFBhcnRzKSAmJiAkYXV0aFBhcnRzKSB7CmlmIChmYWxzZSAhPT0gc3RycG9zKCRhdXRoUGFydHMsICc6JykpIHsKWyRkZWZhdWx0VXNlcm5hbWUsIF0gPSBleHBsb2RlKCc6JywgJGF1dGhQYXJ0cywgMik7Cn0gZWxzZSB7CiRkZWZhdWx0VXNlcm5hbWUgPSAkYXV0aFBhcnRzOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkICg8aW5mbz4nIC4gJG1hdGNoWzJdIC4gJzwvaW5mbz4pOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicgLiB0cmltKCRlcnJvck1zZykgLiAnPC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKJGF1dGggPSBbCid1c2VybmFtZScgPT4gJHRoaXMtPmlvLT5hc2soJyAgICAgIFVzZXJuYW1lOiAnLCAkZGVmYXVsdFVzZXJuYW1lKSwKJ3Bhc3N3b3JkJyA9PiAkdGhpcy0+aW8tPmFza0FuZEhpZGVBbnN3ZXIoJyAgICAgIFBhc3N3b3JkOiAnKSwKXTsKJHN0b3JlQXV0aCA9ICR0aGlzLT5jb25maWctPmdldCgnc3RvcmUtYXV0aHMnKTsKfQoKaWYgKG51bGwgIT09ICRhdXRoKSB7CiRhdXRoVXJsID0gJG1hdGNoWzFdIC4gcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkbWF0Y2hbMl0gLiAkbWF0Y2hbM107CgokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJGF1dGhVcmwpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRjb21tYW5kT3V0cHV0LCAkY3dkKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSwgJGF1dGhbJ3VzZXJuYW1lJ10sICRhdXRoWydwYXNzd29yZCddKTsKJGF1dGhIZWxwZXIgPSBuZXcgQXV0aEhlbHBlcigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcpOwokYXV0aEhlbHBlci0+c3RvcmVBdXRoKCRtYXRjaFsyXSwgJHN0b3JlQXV0aCk7CgpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KfQoKaWYgKCRpbml0aWFsQ2xvbmUgJiYgaXNzZXQoJG9yaWdDd2QpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJG9yaWdDd2QpOwp9CgppZiAoY291bnQoJGNyZWRlbnRpYWxzKSA+IDApIHsKJGNvbW1hbmQgPSAkdGhpcy0+bWFza0NyZWRlbnRpYWxzKCRjb21tYW5kLCAkY3JlZGVudGlhbHMpOwokZXJyb3JNc2cgPSAkdGhpcy0+bWFza0NyZWRlbnRpYWxzKCRlcnJvck1zZywgJGNyZWRlbnRpYWxzKTsKfQokdGhpcy0+dGhyb3dFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiAkY29tbWFuZCAuICJcblxuIiAuICRlcnJvck1zZywgJHVybCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHN5bmNNaXJyb3Ioc3RyaW5nICR1cmwsIHN0cmluZyAkZGlyKTogYm9vbAp7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSAhPT0gJ3ByaW1lJykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkFib3J0aW5nIGdpdCBtaXJyb3Igc3luYyBvZiAnLiR1cmwuJyBhcyBuZXR3b3JrIGlzIGRpc2FibGVkPC93YXJuaW5nPicpOwoKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKGlzX2RpcigkZGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXInLCAkb3V0cHV0LCAkZGlyKSAmJiB0cmltKCRvdXRwdXQpID09PSAnLicpIHsKdHJ5IHsKJGNvbW1hbmRDYWxsYWJsZSA9IHN0YXRpYyBmdW5jdGlvbiAoJHVybCk6IHN0cmluZyB7CiRzYW5pdGl6ZWRVcmwgPSBQcmVnOjpyZXBsYWNlKCd7Oi8vKFteQF0rPyk6KC4rPylAfScsICc6Ly8nLCAkdXJsKTsKCnJldHVybiBzcHJpbnRmKCdnaXQgcmVtb3RlIHNldC11cmwgb3JpZ2luIC0tICVzICYmIGdpdCByZW1vdGUgdXBkYXRlIC0tcHJ1bmUgb3JpZ2luICYmIGdpdCByZW1vdGUgc2V0LXVybCBvcmlnaW4gLS0gJXMgJiYgZ2l0IGdjIC0tYXV0bycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR1cmwpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkc2FuaXRpemVkVXJsKSk7Cn07CiR0aGlzLT5ydW5Db21tYW5kKCRjb21tYW5kQ2FsbGFibGUsICR1cmwsICRkaXIpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPlN5bmMgbWlycm9yIGZhaWxlZDogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJGRpcik7CgokY29tbWFuZENhbGxhYmxlID0gc3RhdGljIGZ1bmN0aW9uICgkdXJsKSB1c2UgKCRkaXIpOiBzdHJpbmcgewpyZXR1cm4gc3ByaW50ZignZ2l0IGNsb25lIC0tbWlycm9yIC0tICVzICVzJywgUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHVybCksIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRkaXIpKTsKfTsKCiR0aGlzLT5ydW5Db21tYW5kKCRjb21tYW5kQ2FsbGFibGUsICR1cmwsICRkaXIsIHRydWUpOwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmZXRjaFJlZk9yU3luY01pcnJvcihzdHJpbmcgJHVybCwgc3RyaW5nICRkaXIsIHN0cmluZyAkcmVmLCBzdHJpbmcgJHByZXR0eVZlcnNpb24gPSBudWxsKTogYm9vbAp7CmlmICgkdGhpcy0+Y2hlY2tSZWZJc0luTWlycm9yKCRkaXIsICRyZWYpKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9JywgJHJlZikgJiYgJHByZXR0eVZlcnNpb24gIT09IG51bGwpIHsKJGJyYW5jaCA9IFByZWc6OnJlcGxhY2UoJ3soPzpeZGV2LXwoPzpcLngpPy1kZXYkKX1pJywgJycsICRwcmV0dHlWZXJzaW9uKTsKJGJyYW5jaGVzID0gbnVsbDsKJHRhZ3MgPSBudWxsOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBicmFuY2gnLCAkb3V0cHV0LCAkZGlyKSkgewokYnJhbmNoZXMgPSAkb3V0cHV0Owp9CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IHRhZycsICRvdXRwdXQsICRkaXIpKSB7CiR0YWdzID0gJG91dHB1dDsKfQoKCgoKCmlmIChudWxsICE9PSAkYnJhbmNoZXMgJiYgIVByZWc6OmlzTWF0Y2goJ3teW1xzKl0qdj8nLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICRicmFuY2hlcykKJiYgbnVsbCAhPT0gJHRhZ3MgJiYgIVByZWc6OmlzTWF0Y2goJ3teW1xzKl0qJy5wcmVnX3F1b3RlKCRicmFuY2gpLickfW0nLCAkdGFncykKKSB7CiR0aGlzLT5zeW5jTWlycm9yKCR1cmwsICRkaXIpOwp9Cn0KCnJldHVybiB0cnVlOwp9CgppZiAoJHRoaXMtPnN5bmNNaXJyb3IoJHVybCwgJGRpcikpIHsKcmV0dXJuICR0aGlzLT5jaGVja1JlZklzSW5NaXJyb3IoJGRpciwgJHJlZik7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXROb1Nob3dTaWduYXR1cmVGbGFnKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IHN0cmluZwp7CiRnaXRWZXJzaW9uID0gc2VsZjo6Z2V0VmVyc2lvbigkcHJvY2Vzcyk7CmlmICgkZ2l0VmVyc2lvbiAmJiB2ZXJzaW9uX2NvbXBhcmUoJGdpdFZlcnNpb24sICcyLjEwLjAtcmMwJywgJz49JykpIHsKcmV0dXJuICcgLS1uby1zaG93LXNpZ25hdHVyZSc7Cn0KCnJldHVybiAnJzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1JlZklzSW5NaXJyb3Ioc3RyaW5nICRkaXIsIHN0cmluZyAkcmVmKTogYm9vbAp7CmlmIChpc19kaXIoJGRpcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCByZXYtcGFyc2UgLS1naXQtZGlyJywgJG91dHB1dCwgJGRpcikgJiYgdHJpbSgkb3V0cHV0KSA9PT0gJy4nKSB7CiRlc2NhcGVkUmVmID0gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHJlZi4nXntjb21taXR9Jyk7CiRleGl0Q29kZSA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKHNwcmludGYoJ2dpdCByZXYtcGFyc2UgLS1xdWlldCAtLXZlcmlmeSAlcycsICRlc2NhcGVkUmVmKSwgJGlnbm9yZWRPdXRwdXQsICRkaXIpOwppZiAoJGV4aXRDb2RlID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc0F1dGhlbnRpY2F0aW9uRmFpbHVyZShzdHJpbmcgJHVybCwgYXJyYXkgJiRtYXRjaCk6IGJvb2wKewppZiAoIVByZWc6OmlzTWF0Y2goJ3teKGh0dHBzPzovLykoW14vXSspKC4qKSR9aScsICR1cmwsICRtYXRjaCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokYXV0aEZhaWx1cmVzID0gWwonZmF0YWw6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCcsCidyZW1vdGUgZXJyb3I6IEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuJywKJ2Vycm9yOiA0MDEgVW5hdXRob3JpemVkJywKJ2ZhdGFsOiB1bmFibGUgdG8gYWNjZXNzJywKJ2ZhdGFsOiBjb3VsZCBub3QgcmVhZCBVc2VybmFtZScsCl07CgokZXJyb3JPdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKZm9yZWFjaCAoJGF1dGhGYWlsdXJlcyBhcyAkYXV0aEZhaWx1cmUpIHsKaWYgKHN0cnBvcygkZXJyb3JPdXRwdXQsICRhdXRoRmFpbHVyZSkgIT09IGZhbHNlKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE1pcnJvckRlZmF1bHRCcmFuY2goc3RyaW5nICR1cmwsIHN0cmluZyAkZGlyLCBib29sICRpc0xvY2FsUGF0aFJlcG9zaXRvcnkpOiA/c3RyaW5nCnsKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewpyZXR1cm4gbnVsbDsKfQoKdHJ5IHsKaWYgKCRpc0xvY2FsUGF0aFJlcG9zaXRvcnkpIHsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCByZW1vdGUgc2hvdyBvcmlnaW4nLCAkb3V0cHV0LCAkZGlyKTsKfSBlbHNlIHsKJGNvbW1hbmRDYWxsYWJsZSA9IHN0YXRpYyBmdW5jdGlvbiAoJHVybCk6IHN0cmluZyB7CiRzYW5pdGl6ZWRVcmwgPSBQcmVnOjpyZXBsYWNlKCd7Oi8vKFteQF0rPyk6KC4rPylAfScsICc6Ly8nLCAkdXJsKTsKCnJldHVybiBzcHJpbnRmKCdnaXQgcmVtb3RlIHNldC11cmwgb3JpZ2luIC0tICVzICYmIGdpdCByZW1vdGUgc2hvdyBvcmlnaW4gJiYgZ2l0IHJlbW90ZSBzZXQtdXJsIG9yaWdpbiAtLSAlcycsIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR1cmwpLCBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkc2FuaXRpemVkVXJsKSk7Cn07CgokdGhpcy0+cnVuQ29tbWFuZCgkY29tbWFuZENhbGxhYmxlLCAkdXJsLCAkZGlyLCBmYWxzZSwgJG91dHB1dCk7Cn0KCiRsaW5lcyA9ICR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpOwpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKaWYgKFByZWc6Om1hdGNoKCd7XlxzKkhFQUQgYnJhbmNoOlxzKC4rKVxzKiR9bScsICRsaW5lLCAkbWF0Y2hlcykgPiAwKSB7CnJldHVybiAkbWF0Y2hlc1sxXTsKfQp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIGZldGNoIHJvb3QgaWRlbnRpZmllciBmcm9tIHJlbW90ZTogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgpyZXR1cm4gbnVsbDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGVhbkVudigpOiB2b2lkCnsKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRfQVNLUEFTUycpICE9PSAnZWNobycpIHsKUGxhdGZvcm06OnB1dEVudignR0lUX0FTS1BBU1MnLCAnZWNobycpOwp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVF9ESVInKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0dJVF9ESVInKTsKfQppZiAoUGxhdGZvcm06OmdldEVudignR0lUX1dPUktfVFJFRScpKSB7ClBsYXRmb3JtOjpjbGVhckVudignR0lUX1dPUktfVFJFRScpOwp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0xBTkdVQUdFJykgIT09ICdDJykgewpQbGF0Zm9ybTo6cHV0RW52KCdMQU5HVUFHRScsICdDJyk7Cn0KCgpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0RZTERfTElCUkFSWV9QQVRIJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R2l0SHViRG9tYWluc1JlZ2V4KENvbmZpZyAkY29uZmlnKTogc3RyaW5nCnsKcmV0dXJuICcoJyAuIGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSAuICcpJzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRHaXRMYWJEb21haW5zUmVnZXgoQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJygnIC4gaW1wbG9kZSgnfCcsIGFycmF5X21hcCgncHJlZ19xdW90ZScsICRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSkpIC4gJyknOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24oJG1lc3NhZ2UsIHN0cmluZyAkdXJsKTogdm9pZAp7CgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgLS12ZXJzaW9uJywgJGlnbm9yZWRPdXRwdXQpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKCdGYWlsZWQgdG8gY2xvbmUgJyAuICR1cmwgLiAnLCBnaXQgd2FzIG5vdCBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWQgYW5kIGluIHlvdXIgUEFUSCBlbnYuJyAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKSk7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKCRtZXNzYWdlKSk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6ID9zdHJpbmcKewppZiAoZmFsc2UgPT09IHNlbGY6OiR2ZXJzaW9uKSB7CnNlbGY6OiR2ZXJzaW9uID0gbnVsbDsKaWYgKDAgPT09ICRwcm9jZXNzLT5leGVjdXRlKCdnaXQgLS12ZXJzaW9uJywgJG91dHB1dCkgJiYgUHJlZzo6aXNNYXRjaCgnL15naXQgdmVyc2lvbiAoXGQrKD86XC5cZCspKykvbScsICRvdXRwdXQsICRtYXRjaGVzKSkgewpzZWxmOjokdmVyc2lvbiA9ICRtYXRjaGVzWzFdOwp9Cn0KCnJldHVybiBzZWxmOjokdmVyc2lvbjsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtYXNrQ3JlZGVudGlhbHMoc3RyaW5nICRlcnJvciwgYXJyYXkgJGNyZWRlbnRpYWxzKTogc3RyaW5nCnsKJG1hc2tlZENyZWRlbnRpYWxzID0gW107Cgpmb3JlYWNoICgkY3JlZGVudGlhbHMgYXMgJGNyZWRlbnRpYWwpIHsKaWYgKGluX2FycmF5KCRjcmVkZW50aWFsLCBbJ3ByaXZhdGUtdG9rZW4nLCAneC10b2tlbi1hdXRoJywgJ29hdXRoMicsICdnaXRsYWItY2ktdG9rZW4nLCAneC1vYXV0aC1iYXNpYyddKSkgewokbWFza2VkQ3JlZGVudGlhbHNbXSA9ICRjcmVkZW50aWFsOwp9IGVsc2VpZiAoc3RybGVuKCRjcmVkZW50aWFsKSA+IDYpIHsKJG1hc2tlZENyZWRlbnRpYWxzW10gPSBzdWJzdHIoJGNyZWRlbnRpYWwsIDAsIDMpIC4gJy4uLicgLiBzdWJzdHIoJGNyZWRlbnRpYWwsIC0zKTsKfSBlbHNlaWYgKHN0cmxlbigkY3JlZGVudGlhbCkgPiAzKSB7CiRtYXNrZWRDcmVkZW50aWFsc1tdID0gc3Vic3RyKCRjcmVkZW50aWFsLCAwLCAzKSAuICcuLi4nOwp9IGVsc2UgewokbWFza2VkQ3JlZGVudGlhbHNbXSA9ICdYWFgnOwp9Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgkY3JlZGVudGlhbHMsICRtYXNrZWRDcmVkZW50aWFscywgJGVycm9yKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgR2l0SHViCnsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlciA/OiBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkdGhpcy0+aW8sICRjb25maWcpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGgoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKaWYgKCFpbl9hcnJheSgkb3JpZ2luVXJsLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IGNvbmZpZyBnaXRodWIuYWNjZXNzdG9rZW4nLCAkb3V0cHV0KSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsIHRyaW0oJG91dHB1dCksICd4LW9hdXRoLWJhc2ljJyk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KHN0cmluZyAkb3JpZ2luVXJsLCA/c3RyaW5nICRtZXNzYWdlID0gbnVsbCk6IGJvb2wKewppZiAoJG1lc3NhZ2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKfQoKJG5vdGUgPSAnQ29tcG9zZXInOwppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItZXhwb3NlLWhvc3RuYW1lJykgPT09IHRydWUgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2hvc3RuYW1lJywgJG91dHB1dCkpIHsKJG5vdGUgLj0gJyBvbiAnIC4gdHJpbSgkb3V0cHV0KTsKfQokbm90ZSAuPSAnICcgLiBkYXRlKCdZLW0tZCBIaScpOwoKJHVybCA9ICdodHRwczovLycuJG9yaWdpblVybC4nL3NldHRpbmdzL3Rva2Vucy9uZXc/c2NvcGVzPSZkZXNjcmlwdGlvbj0nIC4gc3RyX3JlcGxhY2UoJyUyMCcsICcrJywgcmF3dXJsZW5jb2RlKCRub3RlKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdXaGVuIHdvcmtpbmcgd2l0aCBfcHVibGljXyBHaXRIdWIgcmVwb3NpdG9yaWVzIG9ubHksIGhlYWQgdG8gJXMgdG8gcmV0cmlldmUgYSB0b2tlbi4nLCAkdXJsKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVGhpcyB0b2tlbiB3aWxsIGhhdmUgcmVhZC1vbmx5IHBlcm1pc3Npb24gZm9yIHB1YmxpYyBpbmZvcm1hdGlvbiBvbmx5LicpOwoKJGxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOwokdXJsID0gJ2h0dHBzOi8vJy4kb3JpZ2luVXJsLicvc2V0dGluZ3MvdG9rZW5zL25ldz9zY29wZXM9cmVwbyZkZXNjcmlwdGlvbj0nIC4gc3RyX3JlcGxhY2UoJyUyMCcsICcrJywgcmF3dXJsZW5jb2RlKCRub3RlKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdXaGVuIHlvdSBuZWVkIHRvIGFjY2VzcyBfcHJpdmF0ZV8gR2l0SHViIHJlcG9zaXRvcmllcyBhcyB3ZWxsLCBnbyB0byAlcycsICR1cmwpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdOb3RlIHRoYXQgc3VjaCB0b2tlbnMgaGF2ZSBicm9hZCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIG9uIHlvdXIgYmVoYWxmLCBldmVuIGlmIG5vdCBuZWVkZWQgYnkgQ29tcG9zZXIuJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdUb2tlbnMgd2lsbCBiZSBzdG9yZWQgaW4gcGxhaW4gdGV4dCBpbiAiJXMiIGZvciBmdXR1cmUgdXNlIGJ5IENvbXBvc2VyLicsICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZy0+Z2V0TmFtZSgpIC4gJyBPUiAnIDogJycpIC4gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5nZXROYW1lKCkpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgY2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL2F1dGhlbnRpY2F0aW9uLWZvci1wcml2YXRlLXBhY2thZ2VzLm1kI2dpdGh1Yi1vYXV0aCcpOwoKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSBmYWxzZTsKaWYgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwpIHsKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbignQSBsb2NhbCBhdXRoIGNvbmZpZyBzb3VyY2Ugd2FzIGZvdW5kLCBkbyB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdG9rZW4gdGhlcmU/JywgdHJ1ZSk7Cn0KCiR0b2tlbiA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdUb2tlbiAoaGlkZGVuKTogJykpOwoKaWYgKCR0b2tlbiA9PT0gJycpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5ObyB0b2tlbiBnaXZlbiwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20gPHRva2VuPiInKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkdG9rZW4sICd4LW9hdXRoLWJhc2ljJyk7Cgp0cnkgewokYXBpVXJsID0gKCdnaXRodWIuY29tJyA9PT0gJG9yaWdpblVybCkgPyAnYXBpLmdpdGh1Yi5jb20vJyA6ICRvcmlnaW5VcmwgLiAnL2FwaS92My8nOwoKJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJ2h0dHBzOi8vJy4gJGFwaVVybCwgWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKXSk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDAxXSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCB0b2tlbiBwcm92aWRlZC48L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20gPHRva2VuPiInKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgJGU7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+Y29uZmlnLT5nZXRDb25maWdTb3VyY2UoKS0+cmVtb3ZlQ29uZmlnU2V0dGluZygnZ2l0aHViLW9hdXRoLicuJG9yaWdpblVybCk7CiRhdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCdnaXRodWItb2F1dGguJy4kb3JpZ2luVXJsLCAkdG9rZW4pOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Ub2tlbiBzdG9yZWQgc3VjY2Vzc2Z1bGx5LjwvaW5mbz4nKTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJhdGVMaW1pdChhcnJheSAkaGVhZGVycyk6IGFycmF5CnsKJHJhdGVMaW1pdCA9IFsKJ2xpbWl0JyA9PiAnPycsCidyZXNldCcgPT4gJz8nLApdOwoKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewokaGVhZGVyID0gdHJpbSgkaGVhZGVyKTsKaWYgKGZhbHNlID09PSBzdHJpcG9zKCRoZWFkZXIsICd4LXJhdGVsaW1pdC0nKSkgewpjb250aW51ZTsKfQpbJHR5cGUsICR2YWx1ZV0gPSBleHBsb2RlKCc6JywgJGhlYWRlciwgMik7CnN3aXRjaCAoc3RydG9sb3dlcigkdHlwZSkpIHsKY2FzZSAneC1yYXRlbGltaXQtbGltaXQnOgokcmF0ZUxpbWl0WydsaW1pdCddID0gKGludCkgdHJpbSgkdmFsdWUpOwpicmVhazsKY2FzZSAneC1yYXRlbGltaXQtcmVzZXQnOgokcmF0ZUxpbWl0WydyZXNldCddID0gZGF0ZSgnWS1tLWQgSDppOnMnLCAoaW50KSB0cmltKCR2YWx1ZSkpOwpicmVhazsKfQp9CgpyZXR1cm4gJHJhdGVMaW1pdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3NvVXJsKGFycmF5ICRoZWFkZXJzKTogP3N0cmluZwp7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKJGhlYWRlciA9IHRyaW0oJGhlYWRlcik7CmlmIChmYWxzZSA9PT0gc3RyaXBvcygkaGVhZGVyLCAneC1naXRodWItc3NvOiByZXF1aXJlZCcpKSB7CmNvbnRpbnVlOwp9CmlmIChQcmVnOjppc01hdGNoKCd7XGJ1cmw9KD9QPHVybD5bXlxzO10rKX0nLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbJ3VybCddOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1JhdGVMaW1pdGVkKGFycmF5ICRoZWFkZXJzKTogYm9vbAp7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teeC1yYXRlbGltaXQtcmVtYWluaW5nOiAqMCR9aScsIHRyaW0oJGhlYWRlcikpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXF1aXJlc1NzbyhhcnJheSAkaGVhZGVycyk6IGJvb2wKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XngtZ2l0aHViLXNzbzogcmVxdWlyZWR9aScsIHRyaW0oJGhlYWRlcikpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgR2l0TGFiCnsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlciA/OiBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkdGhpcy0+aW8sICRjb25maWcpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoKHN0cmluZyAkb3JpZ2luVXJsKTogYm9vbAp7CgokYmNPcmlnaW5VcmwgPSBQcmVnOjpyZXBsYWNlKCd7OlxkK30nLCAnJywgJG9yaWdpblVybCk7CgppZiAoIWluX2FycmF5KCRvcmlnaW5VcmwsICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkgJiYgIWluX2FycmF5KCRiY09yaWdpblVybCwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ2dpdCBjb25maWcgZ2l0bGFiLmFjY2Vzc3Rva2VuJywgJG91dHB1dCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCB0cmltKCRvdXRwdXQpLCAnb2F1dGgyJyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgnZ2l0IGNvbmZpZyBnaXRsYWIuZGVwbG95dG9rZW4udXNlcicsICR0b2tlblVzZXIpICYmIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCdnaXQgY29uZmlnIGdpdGxhYi5kZXBsb3l0b2tlbi50b2tlbicsICR0b2tlblBhc3N3b3JkKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsIHRyaW0oJHRva2VuVXNlciksIHRyaW0oJHRva2VuUGFzc3dvcmQpKTsKCnJldHVybiB0cnVlOwp9CgoKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi10b2tlbicpOwoKaWYgKGlzc2V0KCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdKSkgewokdG9rZW4gPSAkYXV0aFRva2Vuc1skb3JpZ2luVXJsXTsKfQoKaWYgKGlzc2V0KCRhdXRoVG9rZW5zWyRiY09yaWdpblVybF0pKSB7CiR0b2tlbiA9ICRhdXRoVG9rZW5zWyRiY09yaWdpblVybF07Cn0KCmlmIChpc3NldCgkdG9rZW4pKSB7CiR1c2VybmFtZSA9IGlzX2FycmF5KCR0b2tlbikgPyAkdG9rZW5bInVzZXJuYW1lIl0gOiAkdG9rZW47CiRwYXNzd29yZCA9IGlzX2FycmF5KCR0b2tlbikgPyAkdG9rZW5bInRva2VuIl0gOiAncHJpdmF0ZS10b2tlbic7CgoKCmlmIChpbl9hcnJheSgkdXNlcm5hbWUsIFsncHJpdmF0ZS10b2tlbicsICdnaXRsYWItY2ktdG9rZW4nLCAnb2F1dGgyJ10sIHRydWUpKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHBhc3N3b3JkLCAkdXNlcm5hbWUpOwp9IGVsc2UgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICR1c2VybmFtZSwgJHBhc3N3b3JkKTsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseShzdHJpbmcgJHNjaGVtZSwgc3RyaW5nICRvcmlnaW5VcmwsID9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsKTogYm9vbAp7CmlmICgkbWVzc2FnZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwp9CgokbG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdBIHRva2VuIHdpbGwgYmUgY3JlYXRlZCBhbmQgc3RvcmVkIGluICIlcyIsIHlvdXIgcGFzc3dvcmQgd2lsbCBuZXZlciBiZSBzdG9yZWQnLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG8gcmV2b2tlIGFjY2VzcyB0byB0aGlzIHRva2VuIHlvdSBjYW4gdmlzaXQgJy4kc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3Byb2ZpbGUvYXBwbGljYXRpb25zJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNldHVwIGFuIHBlcnNvbmFsIGFjY2VzcyB0b2tlbiBvbiAgJy4kc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3Byb2ZpbGUvcGVyc29uYWxfYWNjZXNzX3Rva2VucyBhbmQgc3RvcmUgaXQgdW5kZXIgImdpdGxhYi10b2tlbiIgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9hdXRoZW50aWNhdGlvbi1mb3ItcHJpdmF0ZS1wYWNrYWdlcy5tZCNnaXRsYWItdG9rZW4gZm9yIG1vcmUgZGV0YWlscy4nKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokYXR0ZW1wdENvdW50ZXIgPSAwOwoKd2hpbGUgKCRhdHRlbXB0Q291bnRlcisrIDwgNSkgewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+Y3JlYXRlVG9rZW4oJHNjaGVtZSwgJG9yaWdpblVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewoKCmlmIChpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAzLCA0MDFdKSkgewppZiAoNDAxID09PSAkZS0+Z2V0Q29kZSgpKSB7CiRyZXNwb25zZSA9IGpzb25fZGVjb2RlKCRlLT5nZXRSZXNwb25zZSgpLCB0cnVlKTsKaWYgKGlzc2V0KCRyZXNwb25zZVsnZXJyb3InXSkgJiYgJHJlc3BvbnNlWydlcnJvciddID09PSAnaW52YWxpZF9ncmFudCcpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdCYWQgY3JlZGVudGlhbHMuIElmIHlvdSBoYXZlIHR3byBmYWN0b3IgYXV0aGVudGljYXRpb24gZW5hYmxlZCB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIHBlcnNvbmFsIGFjY2VzcyB0b2tlbicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0JhZCBjcmVkZW50aWFscy4nKTsKfQp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ01heGltdW0gbnVtYmVyIG9mIGxvZ2luIGF0dGVtcHRzIGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgYSBwZXJzb25hbCBhY2Nlc3MgdG9rZW4gZW5hYmxpbmcgdGhlICJyZWFkX2FwaSIgc2NvcGUgYXQgJy4kc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy9wcm9maWxlL3BlcnNvbmFsX2FjY2Vzc190b2tlbnMnKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdBZGQgaXQgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0bGFiLXRva2VuLicuJG9yaWdpblVybC4nIDx0b2tlbj4iJyk7Cgpjb250aW51ZTsKfQoKdGhyb3cgJGU7Cn0KCiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHJlc3BvbnNlWydhY2Nlc3NfdG9rZW4nXSwgJ29hdXRoMicpOwoKJGF1dGhDb25maWdTb3VyY2UgPSAkc3RvcmVJbkxvY2FsQXV0aENvbmZpZyAmJiAkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZyA6ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKCmlmIChpc3NldCgkcmVzcG9uc2VbJ2V4cGlyZXNfaW4nXSkpIHsKJGF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoCidnaXRsYWItb2F1dGguJy4kb3JpZ2luVXJsLApbCidleHBpcmVzLWF0JyA9PiBpbnR2YWwoJHJlc3BvbnNlWydjcmVhdGVkX2F0J10pICsgaW50dmFsKCRyZXNwb25zZVsnZXhwaXJlc19pbiddKSwKJ3JlZnJlc2gtdG9rZW4nID0+ICRyZXNwb25zZVsncmVmcmVzaF90b2tlbiddLAondG9rZW4nID0+ICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10sCl0KKTsKfSBlbHNlIHsKJGF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJ2dpdGxhYi1vYXV0aC4nLiRvcmlnaW5VcmwsICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10pOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIEdpdExhYiBjcmVkZW50aWFscyA1IHRpbWVzIGluIGEgcm93LCBhYm9ydGluZy4nKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhSZWZyZXNoKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+cmVmcmVzaFRva2VuKCRzY2hlbWUsICRvcmlnaW5VcmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJDb3VsZG4ndCByZWZyZXNoIGFjY2VzcyB0b2tlbjogIi4kZS0+Z2V0TWVzc2FnZSgpKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLCAnb2F1dGgyJyk7CgoKJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5hZGRDb25maWdTZXR0aW5nKAonZ2l0bGFiLW9hdXRoLicuJG9yaWdpblVybCwKWwonZXhwaXJlcy1hdCcgPT4gaW50dmFsKCRyZXNwb25zZVsnY3JlYXRlZF9hdCddKSArIGludHZhbCgkcmVzcG9uc2VbJ2V4cGlyZXNfaW4nXSksCidyZWZyZXNoLXRva2VuJyA9PiAkcmVzcG9uc2VbJ3JlZnJlc2hfdG9rZW4nXSwKJ3Rva2VuJyA9PiAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLApdCik7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVRva2VuKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGFycmF5CnsKJHVzZXJuYW1lID0gJHRoaXMtPmlvLT5hc2soJ1VzZXJuYW1lOiAnKTsKJHBhc3N3b3JkID0gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdQYXNzd29yZDogJyk7CgokaGVhZGVycyA9IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXTsKCiRhcGlVcmwgPSAkb3JpZ2luVXJsOwokZGF0YSA9IGh0dHBfYnVpbGRfcXVlcnkoWwondXNlcm5hbWUnID0+ICR1c2VybmFtZSwKJ3Bhc3N3b3JkJyA9PiAkcGFzc3dvcmQsCidncmFudF90eXBlJyA9PiAncGFzc3dvcmQnLApdLCAnJywgJyYnKTsKJG9wdGlvbnMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+ICRoZWFkZXJzLAonY29udGVudCcgPT4gJGRhdGEsCl0sCl07CgokdG9rZW4gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkc2NoZW1lLic6Ly8nLiRhcGlVcmwuJy9vYXV0aC90b2tlbicsICRvcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUb2tlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCcpOwoKcmV0dXJuICR0b2tlbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNPQXV0aEV4cGlyZWQoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwppZiAoaXNzZXQoJGF1dGhUb2tlbnNbJG9yaWdpblVybF1bJ2V4cGlyZXMtYXQnXSkpIHsKaWYgKCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydleHBpcmVzLWF0J10gPCB0aW1lKCkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVmcmVzaFRva2VuKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGFycmF5CnsKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwppZiAoIWlzc2V0KCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydyZWZyZXNoLXRva2VuJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTm8gR2l0TGFiIHJlZnJlc2ggdG9rZW4gcHJlc2VudCBmb3IgJy4kb3JpZ2luVXJsLicuJyk7Cn0KCiRyZWZyZXNoVG9rZW4gPSAkYXV0aFRva2Vuc1skb3JpZ2luVXJsXVsncmVmcmVzaC10b2tlbiddOwokaGVhZGVycyA9IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXTsKCiRkYXRhID0gaHR0cF9idWlsZF9xdWVyeShbCidyZWZyZXNoX3Rva2VuJyA9PiAkcmVmcmVzaFRva2VuLAonZ3JhbnRfdHlwZScgPT4gJ3JlZnJlc2hfdG9rZW4nLApdLCAnJywgJyYnKTsKJG9wdGlvbnMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+ICRoZWFkZXJzLAonY29udGVudCcgPT4gJGRhdGEsCl0sCl07CgokdG9rZW4gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy9vYXV0aC90b2tlbicsICRvcHRpb25zKS0+ZGVjb2RlSnNvbigpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0dpdExhYiB0b2tlbiBzdWNjZXNzZnVsbHkgcmVmcmVzaGVkJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG8gcmV2b2tlIGFjY2VzcyB0byB0aGlzIHRva2VuIHlvdSBjYW4gdmlzaXQgJy4kc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3Byb2ZpbGUvYXBwbGljYXRpb25zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CgpyZXR1cm4gJHRva2VuOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBIZwp7Cgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvbiA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkaW87CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcykKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZChjYWxsYWJsZSAkY29tbWFuZENhbGxhYmxlLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkKTogdm9pZAp7CiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCgokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJHVybCk7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCAkY3dkKSkgewpyZXR1cm47Cn0KCgppZiAoUHJlZzo6aXNNYXRjaCgne14oaHR0cHM/KTovLygoLispKD86XDooLispKT9AKT8oW14vXSspKC8uKik/fW1pJywgJHVybCwgJG1hdGNoKSAmJiAkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKChzdHJpbmcpICRtYXRjaFs1XSkpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKChzdHJpbmcpICRtYXRjaFs1XSk7CiRhdXRoZW50aWNhdGVkVXJsID0gJG1hdGNoWzFdIC4gJzovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRtYXRjaFs1XSAuICRtYXRjaFs2XTsKCiRjb21tYW5kID0gJGNvbW1hbmRDYWxsYWJsZSgkYXV0aGVudGljYXRlZFVybCk7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCAkY3dkKSkgewpyZXR1cm47Cn0KCiRlcnJvciA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9IGVsc2UgewokZXJyb3IgPSAnVGhlIGdpdmVuIFVSTCAoJyAuICR1cmwgLiAnKSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgZm9ybWF0IChodHRwKHMpOi8vKHVzZXJuYW1lOnBhc3N3b3JkQClleGFtcGxlLmNvbS9wYXRoLXRvLXJlcG9zaXRvcnkpJzsKfQoKJHRoaXMtPnRocm93RXhjZXB0aW9uKCdGYWlsZWQgdG8gY2xvbmUgJyAuICR1cmwgLiAnLCAnIC4gIlxuXG4iIC4gJGVycm9yLCAkdXJsKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKCRtZXNzYWdlLCBzdHJpbmcgJHVybCk6IHZvaWQKewppZiAobnVsbCA9PT0gc2VsZjo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2VzcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJ0ZhaWxlZCB0byBjbG9uZSAnIC4gJHVybCAuICcsIGhnIHdhcyBub3QgZm91bmQsIGNoZWNrIHRoYXQgaXQgaXMgaW5zdGFsbGVkIGFuZCBpbiB5b3VyIFBBVEggZW52LicgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSkpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oVXJsOjpzYW5pdGl6ZSgkbWVzc2FnZSkpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvbihQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MpOiA/c3RyaW5nCnsKaWYgKGZhbHNlID09PSBzZWxmOjokdmVyc2lvbikgewpzZWxmOjokdmVyc2lvbiA9IG51bGw7CmlmICgwID09PSAkcHJvY2Vzcy0+ZXhlY3V0ZSgnaGcgLS12ZXJzaW9uJywgJG91dHB1dCkgJiYgUHJlZzo6aXNNYXRjaCgnL14uKz8gKFxkKyg/OlwuXGQrKSspKD86XCsuKj8pP1wpP1xyP1xuLycsICRvdXRwdXQsICRtYXRjaGVzKSkgewpzZWxmOjokdmVyc2lvbiA9ICRtYXRjaGVzWzFdOwp9Cn0KCnJldHVybiBzZWxmOjokdmVyc2lvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFN0cmVhbUNvbnRleHRGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxBdXRoSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlOwoKCgoKCgoKCmNsYXNzIEN1cmxEb3dubG9hZGVyCnsKCnByaXZhdGUgJG11bHRpSGFuZGxlOwoKcHJpdmF0ZSAkc2hhcmVIYW5kbGU7Cgpwcml2YXRlICRqb2JzID0gW107Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGF1dGhIZWxwZXI7Cgpwcml2YXRlICRzZWxlY3RUaW1lb3V0ID0gNS4wOwoKcHJpdmF0ZSAkbWF4UmVkaXJlY3RzID0gMjA7Cgpwcml2YXRlICRtYXhSZXRyaWVzID0gMzsKCnByaXZhdGUgJHByb3h5TWFuYWdlcjsKCnByaXZhdGUgJHN1cHBvcnRzU2VjdXJlUHJveHk7Cgpwcm90ZWN0ZWQgJG11bHRpRXJyb3JzID0gWwpDVVJMTV9CQURfSEFORExFID0+IFsnQ1VSTE1fQkFEX0hBTkRMRScsICdUaGUgcGFzc2VkLWluIGhhbmRsZSBpcyBub3QgYSB2YWxpZCBDVVJMTSBoYW5kbGUuJ10sCkNVUkxNX0JBRF9FQVNZX0hBTkRMRSA9PiBbJ0NVUkxNX0JBRF9FQVNZX0hBTkRMRScsICJBbiBlYXN5IGhhbmRsZSB3YXMgbm90IGdvb2QvdmFsaWQuIEl0IGNvdWxkIG1lYW4gdGhhdCBpdCBpc24ndCBhbiBlYXN5IGhhbmRsZSBhdCBhbGwsIG9yIHBvc3NpYmx5IHRoYXQgdGhlIGhhbmRsZSBhbHJlYWR5IGlzIGluIHVzZWQgYnkgdGhpcyBvciBhbm90aGVyIG11bHRpIGhhbmRsZS4iXSwKQ1VSTE1fT1VUX09GX01FTU9SWSA9PiBbJ0NVUkxNX09VVF9PRl9NRU1PUlknLCAnWW91IGFyZSBkb29tZWQuJ10sCkNVUkxNX0lOVEVSTkFMX0VSUk9SID0+IFsnQ1VSTE1fSU5URVJOQUxfRVJST1InLCAnVGhpcyBjYW4gb25seSBiZSByZXR1cm5lZCBpZiBsaWJjdXJsIGJ1Z3MuIFBsZWFzZSByZXBvcnQgaXQgdG8gdXMhJ10sCl07CgoKcHJpdmF0ZSBzdGF0aWMgJG9wdGlvbnMgPSBbCidodHRwJyA9PiBbCidtZXRob2QnID0+IENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwKJ2NvbnRlbnQnID0+IENVUkxPUFRfUE9TVEZJRUxEUywKJ2hlYWRlcicgPT4gQ1VSTE9QVF9IVFRQSEVBREVSLAondGltZW91dCcgPT4gQ1VSTE9QVF9USU1FT1VULApdLAonc3NsJyA9PiBbCidjYWZpbGUnID0+IENVUkxPUFRfQ0FJTkZPLAonY2FwYXRoJyA9PiBDVVJMT1BUX0NBUEFUSCwKJ3ZlcmlmeV9wZWVyJyA9PiBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLAondmVyaWZ5X3BlZXJfbmFtZScgPT4gQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwKJ2xvY2FsX2NlcnQnID0+IENVUkxPUFRfU1NMQ0VSVCwKJ2xvY2FsX3BrJyA9PiBDVVJMT1BUX1NTTEtFWSwKJ3Bhc3NwaHJhc2UnID0+IENVUkxPUFRfU1NMS0VZUEFTU1dELApdLApdOwoKCnByaXZhdGUgc3RhdGljICR0aW1lSW5mbyA9IFsKJ3RvdGFsX3RpbWUnID0+IHRydWUsCiduYW1lbG9va3VwX3RpbWUnID0+IHRydWUsCidjb25uZWN0X3RpbWUnID0+IHRydWUsCidwcmV0cmFuc2Zlcl90aW1lJyA9PiB0cnVlLAonc3RhcnR0cmFuc2Zlcl90aW1lJyA9PiB0cnVlLAoncmVkaXJlY3RfdGltZScgPT4gdHJ1ZSwKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKCiR0aGlzLT5tdWx0aUhhbmRsZSA9ICRtaCA9IGN1cmxfbXVsdGlfaW5pdCgpOwppZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX211bHRpX3NldG9wdCcpKSB7CmN1cmxfbXVsdGlfc2V0b3B0KCRtaCwgQ1VSTE1PUFRfUElQRUxJTklORywgUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDAgPyAgMiA6ICAzKTsKaWYgKGRlZmluZWQoJ0NVUkxNT1BUX01BWF9IT1NUX0NPTk5FQ1RJT05TJykgJiYgIWRlZmluZWQoJ0hIVk1fVkVSU0lPTicpKSB7CmN1cmxfbXVsdGlfc2V0b3B0KCRtaCwgQ1VSTE1PUFRfTUFYX0hPU1RfQ09OTkVDVElPTlMsIDgpOwp9Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc2hhcmVfaW5pdCcpKSB7CiR0aGlzLT5zaGFyZUhhbmRsZSA9ICRzaCA9IGN1cmxfc2hhcmVfaW5pdCgpOwpjdXJsX3NoYXJlX3NldG9wdCgkc2gsIENVUkxTSE9QVF9TSEFSRSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKY3VybF9zaGFyZV9zZXRvcHQoJHNoLCBDVVJMU0hPUFRfU0hBUkUsIENVUkxfTE9DS19EQVRBX0ROUyk7CmN1cmxfc2hhcmVfc2V0b3B0KCRzaCwgQ1VSTFNIT1BUX1NIQVJFLCBDVVJMX0xPQ0tfREFUQV9TU0xfU0VTU0lPTik7Cn0KCiR0aGlzLT5hdXRoSGVscGVyID0gbmV3IEF1dGhIZWxwZXIoJGlvLCAkY29uZmlnKTsKJHRoaXMtPnByb3h5TWFuYWdlciA9IFByb3h5TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKCiR2ZXJzaW9uID0gY3VybF92ZXJzaW9uKCk7CiRmZWF0dXJlcyA9ICR2ZXJzaW9uWydmZWF0dXJlcyddOwokdGhpcy0+c3VwcG9ydHNTZWN1cmVQcm94eSA9IGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9IVFRQU19QUk9YWScpICYmICgkZmVhdHVyZXMgJiBDVVJMX1ZFUlNJT05fSFRUUFNfUFJPWFkpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QsIHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMsID9zdHJpbmcgJGNvcHlUbyA9IG51bGwpOiBpbnQKewokYXR0cmlidXRlcyA9IFtdOwppZiAoaXNzZXQoJG9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddKSkgewokYXR0cmlidXRlc1sncmV0cnlBdXRoRmFpbHVyZSddID0gJG9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddOwp1bnNldCgkb3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pOwp9CgpyZXR1cm4gJHRoaXMtPmluaXREb3dubG9hZCgkcmVzb2x2ZSwgJHJlamVjdCwgJG9yaWdpbiwgJHVybCwgJG9wdGlvbnMsICRjb3B5VG8sICRhdHRyaWJ1dGVzKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXREb3dubG9hZChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCwgc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucywgP3N0cmluZyAkY29weVRvID0gbnVsbCwgYXJyYXkgJGF0dHJpYnV0ZXMgPSBbXSk6IGludAp7CiRhdHRyaWJ1dGVzID0gYXJyYXlfbWVyZ2UoWwoncmV0cnlBdXRoRmFpbHVyZScgPT4gdHJ1ZSwKJ3JlZGlyZWN0cycgPT4gMCwKJ3JldHJpZXMnID0+IDAsCidzdG9yZUF1dGgnID0+IGZhbHNlLApdLCAkYXR0cmlidXRlcyk7Cgokb3JpZ2luYWxPcHRpb25zID0gJG9wdGlvbnM7CgoKaWYgKCFQcmVnOjppc01hdGNoKCd7Xmh0dHA6Ly8ocmVwb1wuKT9wYWNrYWdpc3RcLm9yZy9wL30nLCAkdXJsKSB8fCAoZmFsc2UgPT09IHN0cnBvcygkdXJsLCAnJCcpICYmIGZhbHNlID09PSBzdHJwb3MoJHVybCwgJyUyNCcpKSkgewokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR1cmwsICR0aGlzLT5pbywgJG9wdGlvbnMpOwp9CgokY3VybEhhbmRsZSA9IGN1cmxfaW5pdCgpOwokaGVhZGVySGFuZGxlID0gZm9wZW4oJ3BocDovL3RlbXAvbWF4bWVtb3J5OjMyNzY4JywgJ3crYicpOwppZiAoZmFsc2UgPT09ICRoZWFkZXJIYW5kbGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gb3BlbiBhIHRlbXAgc3RyZWFtIHRvIHN0b3JlIGN1cmwgaGVhZGVycycpOwp9CgppZiAoJGNvcHlUbyAhPT0gbnVsbCkgewokYm9keVRhcmdldCA9ICRjb3B5VG8uJ34nOwp9IGVsc2UgewokYm9keVRhcmdldCA9ICdwaHA6Ly90ZW1wL21heG1lbW9yeTo1MjQyODgnOwp9CgokZXJyb3JNZXNzYWdlID0gJyc7CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCRjb2RlLCAkbXNnKSB1c2UgKCYkZXJyb3JNZXNzYWdlKTogdm9pZCB7CmlmICgkZXJyb3JNZXNzYWdlKSB7CiRlcnJvck1lc3NhZ2UgLj0gIlxuIjsKfQokZXJyb3JNZXNzYWdlIC49IFByZWc6OnJlcGxhY2UoJ3teZm9wZW5cKC4qP1wpOiB9JywgJycsICRtc2cpOwp9KTsKJGJvZHlIYW5kbGUgPSBmb3BlbigkYm9keVRhcmdldCwgJ3crYicpOwpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKaWYgKGZhbHNlID09PSAkYm9keUhhbmRsZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHVybC4nIiBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuIHRvICcuKCRjb3B5VG8gPz8gJ2EgdGVtcG9yYXJ5IGZpbGUnKS4nOiAnLiRlcnJvck1lc3NhZ2UpOwp9CgpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsICR1cmwpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgZmFsc2UpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgMTApOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCBtYXgoKGludCkgaW5pX2dldCgiZGVmYXVsdF9zb2NrZXRfdGltZW91dCIpLCAzMDApKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfV1JJVEVIRUFERVIsICRoZWFkZXJIYW5kbGUpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9GSUxFLCAkYm9keUhhbmRsZSk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0VOQ09ESU5HLCAiIik7IApjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9QUk9UT0NPTFMsIENVUkxQUk9UT19IVFRQIHwgQ1VSTFBST1RPX0hUVFBTKTsKCmlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc2hhcmVfaW5pdCcpKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1NIQVJFLCAkdGhpcy0+c2hhcmVIYW5kbGUpOwp9CgppZiAoIWlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IFtdOwp9Cgokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IGFycmF5X2RpZmYoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sIFsnQ29ubmVjdGlvbjogY2xvc2UnXSk7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSc7CgokdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpOwokZmVhdHVyZXMgPSAkdmVyc2lvblsnZmVhdHVyZXMnXTsKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAnaHR0cHM6Ly8nKSAmJiBcZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX0hUVFAyJykgJiYgXGRlZmluZWQoJ0NVUkxfSFRUUF9WRVJTSU9OXzJfMCcpICYmIChDVVJMX1ZFUlNJT05fSFRUUDIgJiAkZmVhdHVyZXMpKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0hUVFBfVkVSU0lPTiwgQ1VSTF9IVFRQX1ZFUlNJT05fMl8wKTsKfQoKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAkdGhpcy0+YXV0aEhlbHBlci0+YWRkQXV0aGVudGljYXRpb25IZWFkZXIoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sICRvcmlnaW4sICR1cmwpOwokb3B0aW9ucyA9IFN0cmVhbUNvbnRleHRGYWN0b3J5Ojppbml0T3B0aW9ucygkdXJsLCAkb3B0aW9ucywgdHJ1ZSk7Cgpmb3JlYWNoIChzZWxmOjokb3B0aW9ucyBhcyAkdHlwZSA9PiAkY3VybE9wdGlvbnMpIHsKZm9yZWFjaCAoJGN1cmxPcHRpb25zIGFzICRuYW1lID0+ICRjdXJsT3B0aW9uKSB7CmlmIChpc3NldCgkb3B0aW9uc1skdHlwZV1bJG5hbWVdKSkgewppZiAoJHR5cGUgPT09ICdzc2wnICYmICRuYW1lID09PSAndmVyaWZ5X3BlZXJfbmFtZScpIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsICRjdXJsT3B0aW9uLCAkb3B0aW9uc1skdHlwZV1bJG5hbWVdID09PSB0cnVlID8gMiA6ICRvcHRpb25zWyR0eXBlXVskbmFtZV0pOwp9IGVsc2UgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgJGN1cmxPcHRpb24sICRvcHRpb25zWyR0eXBlXVskbmFtZV0pOwp9Cn0KfQp9CgoKCiRwcm94eSA9ICR0aGlzLT5wcm94eU1hbmFnZXItPmdldFByb3h5Rm9yUmVxdWVzdCgkdXJsKTsKaWYgKCRwcm94eS0+Z2V0VXJsKCkgIT09ICcnKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1BST1hZLCAkcHJveHktPmdldFVybCgpKTsKfQoKCgppZiAoJHByb3h5LT5pc1NlY3VyZSgpKSB7CmlmICghJHRoaXMtPnN1cHBvcnRzU2VjdXJlUHJveHkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ29ubmVjdGluZyB0byBhIHNlY3VyZSBwcm94eSB1c2luZyBjdXJsIGlzIG5vdCBzdXBwb3J0ZWQgb24gUEhQIHZlcnNpb25zIGJlbG93IDcuMy4wLicpOwp9CmlmICghZW1wdHkoJG9wdGlvbnNbJ3NzbCddWydjYWZpbGUnXSkpIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfUFJPWFlfQ0FJTkZPLCAkb3B0aW9uc1snc3NsJ11bJ2NhZmlsZSddKTsKfQppZiAoIWVtcHR5KCRvcHRpb25zWydzc2wnXVsnY2FwYXRoJ10pKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1BST1hZX0NBUEFUSCwgJG9wdGlvbnNbJ3NzbCddWydjYXBhdGgnXSk7Cn0KfQoKJHByb2dyZXNzID0gYXJyYXlfZGlmZl9rZXkoY3VybF9nZXRpbmZvKCRjdXJsSGFuZGxlKSwgc2VsZjo6JHRpbWVJbmZvKTsKCiR0aGlzLT5qb2JzWyhpbnQpICRjdXJsSGFuZGxlXSA9IFsKJ3VybCcgPT4gJHVybCwKJ29yaWdpbicgPT4gJG9yaWdpbiwKJ2F0dHJpYnV0ZXMnID0+ICRhdHRyaWJ1dGVzLAonb3B0aW9ucycgPT4gJG9yaWdpbmFsT3B0aW9ucywKJ3Byb2dyZXNzJyA9PiAkcHJvZ3Jlc3MsCidjdXJsSGFuZGxlJyA9PiAkY3VybEhhbmRsZSwKJ2ZpbGVuYW1lJyA9PiAkY29weVRvLAonaGVhZGVySGFuZGxlJyA9PiAkaGVhZGVySGFuZGxlLAonYm9keUhhbmRsZScgPT4gJGJvZHlIYW5kbGUsCidyZXNvbHZlJyA9PiAkcmVzb2x2ZSwKJ3JlamVjdCcgPT4gJHJlamVjdCwKXTsKCiR1c2luZ1Byb3h5ID0gJHByb3h5LT5nZXRGb3JtYXR0ZWRVcmwoJyB1c2luZyBwcm94eSAoJXMpJyk7CiRpZk1vZGlmaWVkID0gZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnLCcsICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSwgJ2lmLW1vZGlmaWVkLXNpbmNlOicpID8gJyBpZiBtb2RpZmllZCcgOiAnJzsKaWYgKCRhdHRyaWJ1dGVzWydyZWRpcmVjdHMnXSA9PT0gMCAmJiAkYXR0cmlidXRlc1sncmV0cmllcyddID09PSAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRG93bmxvYWRpbmcgJyAuIFVybDo6c2FuaXRpemUoJHVybCkgLiAkdXNpbmdQcm94eSAuICRpZk1vZGlmaWVkLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgokdGhpcy0+Y2hlY2tDdXJsUmVzdWx0KGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRjdXJsSGFuZGxlKSk7CgoKcmV0dXJuIChpbnQpICRjdXJsSGFuZGxlOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWJvcnRSZXF1ZXN0KGludCAkaWQpOiB2b2lkCnsKaWYgKGlzc2V0KCR0aGlzLT5qb2JzWyRpZF0sICR0aGlzLT5qb2JzWyRpZF1bJ2N1cmxIYW5kbGUnXSkpIHsKJGpvYiA9ICR0aGlzLT5qb2JzWyRpZF07CmN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRqb2JbJ2N1cmxIYW5kbGUnXSk7CmN1cmxfY2xvc2UoJGpvYlsnY3VybEhhbmRsZSddKTsKaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydib2R5SGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwp9CmlmIChudWxsICE9PSAkam9iWydmaWxlbmFtZSddKSB7CkB1bmxpbmsoJGpvYlsnZmlsZW5hbWUnXS4nficpOwp9CnVuc2V0KCR0aGlzLT5qb2JzWyRpZF0pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aWNrKCk6IHZvaWQKewpzdGF0aWMgJHRpbWVvdXRXYXJuaW5nID0gZmFsc2U7CgppZiAoY291bnQoJHRoaXMtPmpvYnMpID09PSAwKSB7CnJldHVybjsKfQoKJGFjdGl2ZSA9IHRydWU7CiR0aGlzLT5jaGVja0N1cmxSZXN1bHQoY3VybF9tdWx0aV9leGVjKCR0aGlzLT5tdWx0aUhhbmRsZSwgJGFjdGl2ZSkpOwppZiAoLTEgPT09IGN1cmxfbXVsdGlfc2VsZWN0KCR0aGlzLT5tdWx0aUhhbmRsZSwgJHRoaXMtPnNlbGVjdFRpbWVvdXQpKSB7Cgp1c2xlZXAoMTUwKTsKfQoKd2hpbGUgKCRwcm9ncmVzcyA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKCR0aGlzLT5tdWx0aUhhbmRsZSkpIHsKJGN1cmxIYW5kbGUgPSAkcHJvZ3Jlc3NbJ2hhbmRsZSddOwokcmVzdWx0ID0gJHByb2dyZXNzWydyZXN1bHQnXTsKJGkgPSAoaW50KSAkY3VybEhhbmRsZTsKaWYgKCFpc3NldCgkdGhpcy0+am9ic1skaV0pKSB7CmNvbnRpbnVlOwp9CgokcHJvZ3Jlc3MgPSBjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpOwppZiAoZmFsc2UgPT09ICRwcm9ncmVzcykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCBnZXR0aW5nIGluZm8gZnJvbSBjdXJsIGhhbmRsZSAnLiRpLicgKCcuJHRoaXMtPmpvYnNbJGldWyd1cmwnXS4nKScpOwp9CiRqb2IgPSAkdGhpcy0+am9ic1skaV07CnVuc2V0KCR0aGlzLT5qb2JzWyRpXSk7CiRlcnJvciA9IGN1cmxfZXJyb3IoJGN1cmxIYW5kbGUpOwokZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsSGFuZGxlKTsKY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCR0aGlzLT5tdWx0aUhhbmRsZSwgJGN1cmxIYW5kbGUpOwpjdXJsX2Nsb3NlKCRjdXJsSGFuZGxlKTsKCiRoZWFkZXJzID0gbnVsbDsKJHN0YXR1c0NvZGUgPSBudWxsOwokcmVzcG9uc2UgPSBudWxsOwp0cnkgewoKaWYgKENVUkxFX09LICE9PSAkZXJybm8gfHwgJGVycm9yIHx8ICRyZXN1bHQgIT09IENVUkxFX09LKSB7CiRlcnJubyA9ICRlcnJubyA/OiAkcmVzdWx0OwppZiAoISRlcnJvciAmJiBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc3RyZXJyb3InKSkgewokZXJyb3IgPSBjdXJsX3N0cmVycm9yKCRlcnJubyk7Cn0KJHByb2dyZXNzWydlcnJvcl9jb2RlJ10gPSAkZXJybm87CgppZiAoCighaXNzZXQoJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddKSB8fCAkam9iWydvcHRpb25zJ11bJ2h0dHAnXVsnbWV0aG9kJ10gPT09ICdHRVQnKQomJiAoCmluX2FycmF5KCRlcnJubywgWzcgLCAxNiAsIDkyICwgNiBdLCB0cnVlKQp8fCAoaW5fYXJyYXkoJGVycm5vLCBbNTYgLCAzNSBdLCB0cnVlKSAmJiBzdHJfY29udGFpbnMoKHN0cmluZykgJGVycm9yLCAnQ29ubmVjdGlvbiByZXNldCBieSBwZWVyJykpCikgJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gPCAkdGhpcy0+bWF4UmV0cmllcwopIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZXRyeWluZyAoJy4oJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxKS4nKSAnIC4gVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSkgLiAnIGR1ZSB0byBjdXJsIGVycm9yICcuICRlcnJubywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJlc3RhcnRKb2JXaXRoRGVsYXkoJGpvYiwgJGpvYlsndXJsJ10sIFsncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXSk7CmNvbnRpbnVlOwp9CgoKaWYgKCRlcnJubyA9PT0gNTUgKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gY3VybCBlcnJvciAnLiAkZXJybm8sIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV0pOwpjb250aW51ZTsKfQoKaWYgKCRlcnJubyA9PT0gMjggICYmIFBIUF9WRVJTSU9OX0lEID49IDcwMzAwICYmICRwcm9ncmVzc1snbmFtZWxvb2t1cF90aW1lJ10gPT09IDAuMCAmJiAhJHRpbWVvdXRXYXJuaW5nKSB7CiR0aW1lb3V0V2FybmluZyA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBjb25uZWN0aW9uIHRpbWVvdXQgd2FzIGVuY291bnRlcmVkLiBJZiB5b3UgaW50ZW5kIHRvIHJ1biBDb21wb3NlciB3aXRob3V0IGNvbm5lY3RpbmcgdG8gdGhlIGludGVybmV0LCBydW4gdGhlIGNvbW1hbmQgYWdhaW4gcHJlZml4ZWQgd2l0aCBDT01QT1NFUl9ESVNBQkxFX05FVFdPUks9MSB0byBtYWtlIENvbXBvc2VyIHJ1biBpbiBvZmZsaW5lIG1vZGUuPC93YXJuaW5nPicpOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdjdXJsIGVycm9yICcuJGVycm5vLicgd2hpbGUgZG93bmxvYWRpbmcgJy5Vcmw6OnNhbml0aXplKCRwcm9ncmVzc1sndXJsJ10pLic6ICcuJGVycm9yKTsKfQokc3RhdHVzQ29kZSA9ICRwcm9ncmVzc1snaHR0cF9jb2RlJ107CnJld2luZCgkam9iWydoZWFkZXJIYW5kbGUnXSk7CiRoZWFkZXJzID0gZXhwbG9kZSgiXHJcbiIsIHJ0cmltKHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnaGVhZGVySGFuZGxlJ10pKSk7CmZjbG9zZSgkam9iWydoZWFkZXJIYW5kbGUnXSk7CgppZiAoJHN0YXR1c0NvZGUgPT09IDApIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignUmVjZWl2ZWQgdW5leHBlY3RlZCBodHRwIHN0YXR1cyBjb2RlIDAgd2l0aG91dCBlcnJvciBmb3IgJy5Vcmw6OnNhbml0aXplKCRwcm9ncmVzc1sndXJsJ10pLic6IGhlYWRlcnMgJy52YXJfZXhwb3J0KCRoZWFkZXJzLCB0cnVlKS4nIGN1cmwgaW5mbyAnLnZhcl9leHBvcnQoJHByb2dyZXNzLCB0cnVlKSk7Cn0KCgppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewokY29udGVudHMgPSAkam9iWydmaWxlbmFtZSddLid+JzsKaWYgKCRzdGF0dXNDb2RlID49IDMwMCkgewpyZXdpbmQoJGpvYlsnYm9keUhhbmRsZSddKTsKJGNvbnRlbnRzID0gc3RyZWFtX2dldF9jb250ZW50cygkam9iWydib2R5SGFuZGxlJ10pOwp9CiRyZXNwb25zZSA9IG5ldyBDdXJsUmVzcG9uc2UoWyd1cmwnID0+ICRqb2JbJ3VybCddXSwgJHN0YXR1c0NvZGUsICRoZWFkZXJzLCAkY29udGVudHMsICRwcm9ncmVzcyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWycuJHN0YXR1c0NvZGUuJ10gJy5Vcmw6OnNhbml0aXplKCRqb2JbJ3VybCddKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfSBlbHNlIHsKJG1heEZpbGVTaXplID0gJGpvYlsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gPz8gbnVsbDsKcmV3aW5kKCRqb2JbJ2JvZHlIYW5kbGUnXSk7CmlmICgkbWF4RmlsZVNpemUgIT09IG51bGwpIHsKJGNvbnRlbnRzID0gc3RyZWFtX2dldF9jb250ZW50cygkam9iWydib2R5SGFuZGxlJ10sICRtYXhGaWxlU2l6ZSk7CgoKaWYgKCRjb250ZW50cyAhPT0gZmFsc2UgJiYgUGxhdGZvcm06OnN0cmxlbigkY29udGVudHMpID49ICRtYXhGaWxlU2l6ZSkgewp0aHJvdyBuZXcgTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbignTWF4aW11bSBhbGxvd2VkIGRvd25sb2FkIHNpemUgcmVhY2hlZC4gRG93bmxvYWRlZCAnIC4gUGxhdGZvcm06OnN0cmxlbigkY29udGVudHMpIC4gJyBvZiBhbGxvd2VkICcgLiAkbWF4RmlsZVNpemUgLiAnIGJ5dGVzJyk7Cn0KfSBlbHNlIHsKJGNvbnRlbnRzID0gc3RyZWFtX2dldF9jb250ZW50cygkam9iWydib2R5SGFuZGxlJ10pOwp9CgokcmVzcG9uc2UgPSBuZXcgQ3VybFJlc3BvbnNlKFsndXJsJyA9PiAkam9iWyd1cmwnXV0sICRzdGF0dXNDb2RlLCAkaGVhZGVycywgJGNvbnRlbnRzLCAkcHJvZ3Jlc3MpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1snLiRzdGF0dXNDb2RlLiddICcuVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KZmNsb3NlKCRqb2JbJ2JvZHlIYW5kbGUnXSk7CgppZiAoJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPj0gNDAwICYmICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICRqb2JbJ29yaWdpbiddLCBqc29uX2RlY29kZSgkcmVzcG9uc2UtPmdldEJvZHkoKSwgdHJ1ZSkpOwp9CgokcmVzdWx0ID0gJHRoaXMtPmlzQXV0aGVudGljYXRlZFJldHJ5TmVlZGVkKCRqb2IsICRyZXNwb25zZSk7CmlmICgkcmVzdWx0WydyZXRyeSddKSB7CiR0aGlzLT5yZXN0YXJ0Sm9iKCRqb2IsICRqb2JbJ3VybCddLCBbJ3N0b3JlQXV0aCcgPT4gJHJlc3VsdFsnc3RvcmVBdXRoJ10sICdyZXRyaWVzJyA9PiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJpZXMnXSArIDFdKTsKY29udGludWU7Cn0KCgppZiAoJHN0YXR1c0NvZGUgPj0gMzAwICYmICRzdGF0dXNDb2RlIDw9IDM5OSAmJiAkc3RhdHVzQ29kZSAhPT0gMzA0ICYmICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmVkaXJlY3RzJ10gPCAkdGhpcy0+bWF4UmVkaXJlY3RzKSB7CiRsb2NhdGlvbiA9ICR0aGlzLT5oYW5kbGVSZWRpcmVjdCgkam9iLCAkcmVzcG9uc2UpOwppZiAoJGxvY2F0aW9uKSB7CiR0aGlzLT5yZXN0YXJ0Sm9iKCRqb2IsICRsb2NhdGlvbiwgWydyZWRpcmVjdHMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmVkaXJlY3RzJ10gKyAxXSk7CmNvbnRpbnVlOwp9Cn0KCgppZiAoJHN0YXR1c0NvZGUgPj0gNDAwICYmICRzdGF0dXNDb2RlIDw9IDU5OSkgewppZiAoCighaXNzZXQoJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddKSB8fCAkam9iWydvcHRpb25zJ11bJ2h0dHAnXVsnbWV0aG9kJ10gPT09ICdHRVQnKQomJiBpbl9hcnJheSgkc3RhdHVzQ29kZSwgWzQyMywgNDI1LCA1MDAsIDUwMiwgNTAzLCA1MDQsIDUwNywgNTEwXSwgdHJ1ZSkKJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gPCAkdGhpcy0+bWF4UmV0cmllcwopIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZXRyeWluZyAoJy4oJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxKS4nKSAnIC4gVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSkgLiAnIGR1ZSB0byBzdGF0dXMgY29kZSAnLiAkc3RhdHVzQ29kZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJlc3RhcnRKb2JXaXRoRGVsYXkoJGpvYiwgJGpvYlsndXJsJ10sIFsncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXSk7CmNvbnRpbnVlOwp9Cgp0aHJvdyAkdGhpcy0+ZmFpbFJlc3BvbnNlKCRqb2IsICRyZXNwb25zZSwgJHJlc3BvbnNlLT5nZXRTdGF0dXNNZXNzYWdlKCkpOwp9CgppZiAoJGpvYlsnYXR0cmlidXRlcyddWydzdG9yZUF1dGgnXSAhPT0gZmFsc2UpIHsKJHRoaXMtPmF1dGhIZWxwZXItPnN0b3JlQXV0aCgkam9iWydvcmlnaW4nXSwgJGpvYlsnYXR0cmlidXRlcyddWydzdG9yZUF1dGgnXSk7Cn0KCgppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewpyZW5hbWUoJGpvYlsnZmlsZW5hbWUnXS4nficsICRqb2JbJ2ZpbGVuYW1lJ10pOwokam9iWydyZXNvbHZlJ10oJHJlc3BvbnNlKTsKfSBlbHNlIHsKJGpvYlsncmVzb2x2ZSddKCRyZXNwb25zZSk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKaWYgKG51bGwgIT09ICRoZWFkZXJzKSB7CiRlLT5zZXRIZWFkZXJzKCRoZWFkZXJzKTsKJGUtPnNldFN0YXR1c0NvZGUoJHN0YXR1c0NvZGUpOwp9CmlmIChudWxsICE9PSAkcmVzcG9uc2UpIHsKJGUtPnNldFJlc3BvbnNlKCRyZXNwb25zZS0+Z2V0Qm9keSgpKTsKfQokZS0+c2V0UmVzcG9uc2VJbmZvKCRwcm9ncmVzcyk7Cn0KCiR0aGlzLT5yZWplY3RKb2IoJGpvYiwgJGUpOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRpID0+ICRjdXJsSGFuZGxlKSB7CiRjdXJsSGFuZGxlID0gJHRoaXMtPmpvYnNbJGldWydjdXJsSGFuZGxlJ107CiRwcm9ncmVzcyA9IGFycmF5X2RpZmZfa2V5KGN1cmxfZ2V0aW5mbygkY3VybEhhbmRsZSksIHNlbGY6OiR0aW1lSW5mbyk7CgppZiAoJHRoaXMtPmpvYnNbJGldWydwcm9ncmVzcyddICE9PSAkcHJvZ3Jlc3MpIHsKJHRoaXMtPmpvYnNbJGldWydwcm9ncmVzcyddID0gJHByb2dyZXNzOwoKaWYgKGlzc2V0KCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10pKSB7CgppZiAoJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ21heF9maWxlX3NpemUnXSA8ICRwcm9ncmVzc1snZG93bmxvYWRfY29udGVudF9sZW5ndGgnXSkgewokdGhpcy0+cmVqZWN0Sm9iKCR0aGlzLT5qb2JzWyRpXSwgbmV3IE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24oJ01heGltdW0gYWxsb3dlZCBkb3dubG9hZCBzaXplIHJlYWNoZWQuIENvbnRlbnQtbGVuZ3RoIGhlYWRlciBpbmRpY2F0ZXMgJyAuICRwcm9ncmVzc1snZG93bmxvYWRfY29udGVudF9sZW5ndGgnXSAuICcgYnl0ZXMuIEFsbG93ZWQgJyAuICR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gLiAnIGJ5dGVzJykpOwp9CgoKaWYgKCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gPCAkcHJvZ3Jlc3NbJ3NpemVfZG93bmxvYWQnXSkgewokdGhpcy0+cmVqZWN0Sm9iKCR0aGlzLT5qb2JzWyRpXSwgbmV3IE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24oJ01heGltdW0gYWxsb3dlZCBkb3dubG9hZCBzaXplIHJlYWNoZWQuIERvd25sb2FkZWQgJyAuICRwcm9ncmVzc1snc2l6ZV9kb3dubG9hZCddIC4gJyBvZiBhbGxvd2VkICcgLiAkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddIC4gJyBieXRlcycpKTsKfQp9CgoKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QoYXJyYXkgJGpvYiwgUmVzcG9uc2UgJHJlc3BvbnNlKTogc3RyaW5nCnsKaWYgKCRsb2NhdGlvbkhlYWRlciA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsb2NhdGlvbicpKSB7CmlmIChwYXJzZV91cmwoJGxvY2F0aW9uSGVhZGVyLCBQSFBfVVJMX1NDSEVNRSkpIHsKCiR0YXJnZXRVcmwgPSAkbG9jYXRpb25IZWFkZXI7Cn0gZWxzZWlmIChwYXJzZV91cmwoJGxvY2F0aW9uSGVhZGVyLCBQSFBfVVJMX0hPU1QpKSB7CgokdGFyZ2V0VXJsID0gcGFyc2VfdXJsKCRqb2JbJ3VybCddLCBQSFBfVVJMX1NDSEVNRSkuJzonLiRsb2NhdGlvbkhlYWRlcjsKfSBlbHNlaWYgKCcvJyA9PT0gJGxvY2F0aW9uSGVhZGVyWzBdKSB7CgokdXJsSG9zdCA9IHBhcnNlX3VybCgkam9iWyd1cmwnXSwgUEhQX1VSTF9IT1NUKTsKCgokdGFyZ2V0VXJsID0gUHJlZzo6cmVwbGFjZSgne14oLisoPzovL3xAKScucHJlZ19xdW90ZSgkdXJsSG9zdCkuJyg/OjpcZCspPykoPzpbL1w/XS4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkam9iWyd1cmwnXSk7Cn0gZWxzZSB7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rLylbXi8/XSooPzpcPy4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkam9iWyd1cmwnXSk7Cn0KfQoKaWYgKCFlbXB0eSgkdGFyZ2V0VXJsKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRm9sbG93aW5nIHJlZGlyZWN0ICgldSkgJXMnLCAkam9iWydhdHRyaWJ1dGVzJ11bJ3JlZGlyZWN0cyddICsgMSwgVXJsOjpzYW5pdGl6ZSgkdGFyZ2V0VXJsKSksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gJHRhcmdldFVybDsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiRqb2JbJ3VybCddLiciIGZpbGUgY291bGQgbm90IGJlIGRvd25sb2FkZWQsIGdvdCByZWRpcmVjdCB3aXRob3V0IExvY2F0aW9uICgnLiRyZXNwb25zZS0+Z2V0U3RhdHVzTWVzc2FnZSgpLicpJyk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzQXV0aGVudGljYXRlZFJldHJ5TmVlZGVkKGFycmF5ICRqb2IsIFJlc3BvbnNlICRyZXNwb25zZSk6IGFycmF5CnsKaWYgKGluX2FycmF5KCRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpLCBbNDAxLCA0MDNdKSAmJiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJ5QXV0aEZhaWx1cmUnXSkgewokcmVzdWx0ID0gJHRoaXMtPmF1dGhIZWxwZXItPnByb21wdEF1dGhJZk5lZWRlZCgkam9iWyd1cmwnXSwgJGpvYlsnb3JpZ2luJ10sICRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpLCAkcmVzcG9uc2UtPmdldFN0YXR1c01lc3NhZ2UoKSwgJHJlc3BvbnNlLT5nZXRIZWFkZXJzKCksICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddKTsKCmlmICgkcmVzdWx0WydyZXRyeSddKSB7CnJldHVybiAkcmVzdWx0Owp9Cn0KCiRsb2NhdGlvbkhlYWRlciA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsb2NhdGlvbicpOwokbmVlZHNBdXRoUmV0cnkgPSBmYWxzZTsKCgppZiAoCiRqb2JbJ29yaWdpbiddID09PSAnYml0YnVja2V0Lm9yZycKJiYgISR0aGlzLT5hdXRoSGVscGVyLT5pc1B1YmxpY0JpdEJ1Y2tldERvd25sb2FkKCRqb2JbJ3VybCddKQomJiBzdWJzdHIoJGpvYlsndXJsJ10sIC00KSA9PT0gJy56aXAnCiYmICghJGxvY2F0aW9uSGVhZGVyIHx8IHN1YnN0cigkbG9jYXRpb25IZWFkZXIsIC00KSAhPT0gJy56aXAnKQomJiBQcmVnOjppc01hdGNoKCd7XnRleHQvaHRtbFxifWknLCAkcmVzcG9uc2UtPmdldEhlYWRlcignY29udGVudC10eXBlJykpCikgewokbmVlZHNBdXRoUmV0cnkgPSAnQml0YnVja2V0IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uIGFuZCBpdCB3YXMgbm90IHByb3ZpZGVkJzsKfQoKCmlmICgKJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNAomJiBpbl9hcnJheSgkam9iWydvcmlnaW4nXSwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKQomJiBmYWxzZSAhPT0gc3RycG9zKCRqb2JbJ3VybCddLCAnYXJjaGl2ZS56aXAnKQopIHsKJG5lZWRzQXV0aFJldHJ5ID0gJ0dpdExhYiByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiBhbmQgaXQgd2FzIG5vdCBwcm92aWRlZCc7Cn0KCmlmICgkbmVlZHNBdXRoUmV0cnkpIHsKaWYgKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cnlBdXRoRmFpbHVyZSddKSB7CiRyZXN1bHQgPSAkdGhpcy0+YXV0aEhlbHBlci0+cHJvbXB0QXV0aElmTmVlZGVkKCRqb2JbJ3VybCddLCAkam9iWydvcmlnaW4nXSwgNDAxLCBudWxsLCBbXSwgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10pOwppZiAoJHJlc3VsdFsncmV0cnknXSkgewpyZXR1cm4gJHJlc3VsdDsKfQp9Cgp0aHJvdyAkdGhpcy0+ZmFpbFJlc3BvbnNlKCRqb2IsICRyZXNwb25zZSwgJG5lZWRzQXV0aFJldHJ5KTsKfQoKcmV0dXJuIFsncmV0cnknID0+IGZhbHNlLCAnc3RvcmVBdXRoJyA9PiBmYWxzZV07Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzdGFydEpvYihhcnJheSAkam9iLCBzdHJpbmcgJHVybCwgYXJyYXkgJGF0dHJpYnV0ZXMgPSBbXSk6IHZvaWQKewppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewpAdW5saW5rKCRqb2JbJ2ZpbGVuYW1lJ10uJ34nKTsKfQoKJGF0dHJpYnV0ZXMgPSBhcnJheV9tZXJnZSgkam9iWydhdHRyaWJ1dGVzJ10sICRhdHRyaWJ1dGVzKTsKJG9yaWdpbiA9IFVybDo6Z2V0T3JpZ2luKCR0aGlzLT5jb25maWcsICR1cmwpOwoKJHRoaXMtPmluaXREb3dubG9hZCgkam9iWydyZXNvbHZlJ10sICRqb2JbJ3JlamVjdCddLCAkb3JpZ2luLCAkdXJsLCAkam9iWydvcHRpb25zJ10sICRqb2JbJ2ZpbGVuYW1lJ10sICRhdHRyaWJ1dGVzKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXN0YXJ0Sm9iV2l0aERlbGF5KGFycmF5ICRqb2IsIHN0cmluZyAkdXJsLCBhcnJheSAkYXR0cmlidXRlcyk6IHZvaWQKewppZiAoJGF0dHJpYnV0ZXNbJ3JldHJpZXMnXSA+PSAzKSB7CnVzbGVlcCg1MDAwMDApOyAKfSBlbHNlaWYgKCRhdHRyaWJ1dGVzWydyZXRyaWVzJ10gPj0gMikgewp1c2xlZXAoMTAwMDAwKTsgCn0gCgokdGhpcy0+cmVzdGFydEpvYigkam9iLCAkdXJsLCAkYXR0cmlidXRlcyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmFpbFJlc3BvbnNlKGFycmF5ICRqb2IsIFJlc3BvbnNlICRyZXNwb25zZSwgc3RyaW5nICRlcnJvck1lc3NhZ2UpOiBUcmFuc3BvcnRFeGNlcHRpb24KewppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewpAdW5saW5rKCRqb2JbJ2ZpbGVuYW1lJ10uJ34nKTsKfQoKJGRldGFpbHMgPSAnJzsKaWYgKGluX2FycmF5KHN0cnRvbG93ZXIoKHN0cmluZykgJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScpKSwgWydhcHBsaWNhdGlvbi9qc29uJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXSwgdHJ1ZSkpIHsKJGRldGFpbHMgPSAnOicuUEhQX0VPTC5zdWJzdHIoJHJlc3BvbnNlLT5nZXRCb2R5KCksIDAsIDIwMCkuKHN0cmxlbigkcmVzcG9uc2UtPmdldEJvZHkoKSkgPiAyMDAgPyAnLi4uJyA6ICcnKTsKfQoKcmV0dXJuIG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kam9iWyd1cmwnXS4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkICgnLiRlcnJvck1lc3NhZ2UuJyknIC4gJGRldGFpbHMsICRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZWplY3RKb2IoYXJyYXkgJGpvYiwgXEV4Y2VwdGlvbiAkZSk6IHZvaWQKewppZiAoaXNfcmVzb3VyY2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydoZWFkZXJIYW5kbGUnXSk7Cn0KaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2JvZHlIYW5kbGUnXSkpIHsKZmNsb3NlKCRqb2JbJ2JvZHlIYW5kbGUnXSk7Cn0KaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KJGpvYlsncmVqZWN0J10oJGUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ3VybFJlc3VsdChpbnQgJGNvZGUpOiB2b2lkCnsKaWYgKCRjb2RlICE9PSBDVVJMTV9PSyAmJiAkY29kZSAhPT0gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKaXNzZXQoJHRoaXMtPm11bHRpRXJyb3JzWyRjb2RlXSkKPyAiY1VSTCBlcnJvcjogeyRjb2RlfSAoeyR0aGlzLT5tdWx0aUVycm9yc1skY29kZV1bMF19KTogY1VSTCBtZXNzYWdlOiB7JHRoaXMtPm11bHRpRXJyb3JzWyRjb2RlXVsxXX0iCjogJ1VuZXhwZWN0ZWQgY1VSTCBlcnJvcjogJyAuICRjb2RlCik7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7CgoKCgpjbGFzcyBDdXJsUmVzcG9uc2UgZXh0ZW5kcyBSZXNwb25zZQp7CgoKCgoKcHJpdmF0ZSAkY3VybEluZm87CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcXVlc3QsID9pbnQgJGNvZGUsIGFycmF5ICRoZWFkZXJzLCA/c3RyaW5nICRib2R5LCBhcnJheSAkY3VybEluZm8pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVxdWVzdCwgJGNvZGUsICRoZWFkZXJzLCAkYm9keSk7CiR0aGlzLT5jdXJsSW5mbyA9ICRjdXJsSW5mbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEN1cmxJbmZvKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jdXJsSW5mbzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7CgoKCgoKCgpjbGFzcyBQcm94eUhlbHBlcgp7CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFByb3h5RGF0YSgpOiBhcnJheQp7CiRodHRwUHJveHkgPSBudWxsOwokaHR0cHNQcm94eSA9IG51bGw7CgoKaWYgKFBIUF9TQVBJID09PSAnY2xpJyB8fCBQSFBfU0FQSSA9PT0gJ3BocGRiZycpIHsKaWYgKCRlbnYgPSBzZWxmOjpnZXRQcm94eUVudihbJ2h0dHBfcHJveHknLCAnSFRUUF9QUk9YWSddLCAkbmFtZSkpIHsKJGh0dHBQcm94eSA9IHNlbGY6OmNoZWNrUHJveHkoJGVudiwgJG5hbWUpOwp9Cn0KCgppZiAoJGVudiA9IHNlbGY6OmdldFByb3h5RW52KFsnQ0dJX0hUVFBfUFJPWFknXSwgJG5hbWUpKSB7CiRodHRwUHJveHkgPSBzZWxmOjpjaGVja1Byb3h5KCRlbnYsICRuYW1lKTsKfQoKCmlmICgkZW52ID0gc2VsZjo6Z2V0UHJveHlFbnYoWydodHRwc19wcm94eScsICdIVFRQU19QUk9YWSddLCAkbmFtZSkpIHsKJGh0dHBzUHJveHkgPSBzZWxmOjpjaGVja1Byb3h5KCRlbnYsICRuYW1lKTsKfSBlbHNlIHsKJGh0dHBzUHJveHkgPSAkaHR0cFByb3h5Owp9CgoKJG5vUHJveHkgPSBzZWxmOjpnZXRQcm94eUVudihbJ25vX3Byb3h5JywgJ05PX1BST1hZJ10sICRuYW1lKTsKCnJldHVybiBbJGh0dHBQcm94eSwgJGh0dHBzUHJveHksICRub1Byb3h5XTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRleHRPcHRpb25zKHN0cmluZyAkcHJveHlVcmwpOiBhcnJheQp7CiRwcm94eSA9IHBhcnNlX3VybCgkcHJveHlVcmwpOwoKCiRwcm94eVVybCA9IHNlbGY6OmZvcm1hdFBhcnNlZFVybCgkcHJveHksIGZhbHNlKTsKJHByb3h5VXJsID0gc3RyX3JlcGxhY2UoWydodHRwOi8vJywgJ2h0dHBzOi8vJ10sIFsndGNwOi8vJywgJ3NzbDovLyddLCAkcHJveHlVcmwpOwoKJG9wdGlvbnNbJ2h0dHAnXVsncHJveHknXSA9ICRwcm94eVVybDsKCgppZiAoaXNzZXQoJHByb3h5Wyd1c2VyJ10pKSB7CiRhdXRoID0gcmF3dXJsZGVjb2RlKCRwcm94eVsndXNlciddKTsKCmlmIChpc3NldCgkcHJveHlbJ3Bhc3MnXSkpIHsKJGF1dGggLj0gJzonIC4gcmF3dXJsZGVjb2RlKCRwcm94eVsncGFzcyddKTsKfQokYXV0aCA9IGJhc2U2NF9lbmNvZGUoJGF1dGgpOwoKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgeyRhdXRofSI7Cn0KCnJldHVybiAkb3B0aW9uczsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFJlcXVlc3RGdWxsVXJpKHN0cmluZyAkcmVxdWVzdFVybCwgYXJyYXkgJiRvcHRpb25zKTogdm9pZAp7CmlmICgnaHR0cCcgPT09IHBhcnNlX3VybCgkcmVxdWVzdFVybCwgUEhQX1VSTF9TQ0hFTUUpKSB7CiRvcHRpb25zWydodHRwJ11bJ3JlcXVlc3RfZnVsbHVyaSddID0gdHJ1ZTsKfSBlbHNlIHsKdW5zZXQoJG9wdGlvbnNbJ2h0dHAnXVsncmVxdWVzdF9mdWxsdXJpJ10pOwp9Cn0KCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJveHlFbnYoYXJyYXkgJG5hbWVzLCA/c3RyaW5nICYkbmFtZSk6ID9zdHJpbmcKewpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKaWYgKCFlbXB0eSgkX1NFUlZFUlskbmFtZV0pKSB7CnJldHVybiAkX1NFUlZFUlskbmFtZV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNoZWNrUHJveHkoc3RyaW5nICRwcm94eVVybCwgc3RyaW5nICRlbnZOYW1lKTogc3RyaW5nCnsKJGVycm9yID0gc3ByaW50ZignbWFsZm9ybWVkICVzIHVybCcsICRlbnZOYW1lKTsKJHByb3h5ID0gcGFyc2VfdXJsKCRwcm94eVVybCk7CgoKaWYgKCFpc3NldCgkcHJveHlbJ2hvc3QnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRlcnJvcik7Cn0KCiRwcm94eVVybCA9IHNlbGY6OmZvcm1hdFBhcnNlZFVybCgkcHJveHksIHRydWUpOwoKCmlmICghcGFyc2VfdXJsKCRwcm94eVVybCwgUEhQX1VSTF9QT1JUKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKcmV0dXJuICRwcm94eVVybDsKfQoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdFBhcnNlZFVybChhcnJheSAkcHJveHksIGJvb2wgJGluY2x1ZGVBdXRoKTogc3RyaW5nCnsKJHByb3h5VXJsID0gaXNzZXQoJHByb3h5WydzY2hlbWUnXSkgPyBzdHJ0b2xvd2VyKCRwcm94eVsnc2NoZW1lJ10pIC4gJzovLycgOiAnJzsKCmlmICgkaW5jbHVkZUF1dGggJiYgaXNzZXQoJHByb3h5Wyd1c2VyJ10pKSB7CiRwcm94eVVybCAuPSAkcHJveHlbJ3VzZXInXTsKCmlmIChpc3NldCgkcHJveHlbJ3Bhc3MnXSkpIHsKJHByb3h5VXJsIC49ICc6JyAuICRwcm94eVsncGFzcyddOwp9CiRwcm94eVVybCAuPSAnQCc7Cn0KCiRwcm94eVVybCAuPSAkcHJveHlbJ2hvc3QnXTsKCmlmIChpc3NldCgkcHJveHlbJ3BvcnQnXSkpIHsKJHByb3h5VXJsIC49ICc6JyAuICRwcm94eVsncG9ydCddOwp9IGVsc2VpZiAoc3RycG9zKCRwcm94eVVybCwgJ2h0dHA6Ly8nKSA9PT0gMCkgewokcHJveHlVcmwgLj0gJzo4MCc7Cn0gZWxzZWlmIChzdHJwb3MoJHByb3h5VXJsLCAnaHR0cHM6Ly8nKSA9PT0gMCkgewokcHJveHlVcmwgLj0gJzo0NDMnOwp9CgpyZXR1cm4gJHByb3h5VXJsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWxcSHR0cDsKCnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFV0aWxcTm9Qcm94eVBhdHRlcm47CnVzZSBDb21wb3NlclxVdGlsXFVybDsKCgoKCgpjbGFzcyBQcm94eU1hbmFnZXIKewoKcHJpdmF0ZSAkZXJyb3IgPSBudWxsOwoKcHJpdmF0ZSAkZnVsbFByb3h5OwoKcHJpdmF0ZSAkc2FmZVByb3h5OwoKcHJpdmF0ZSAkc3RyZWFtczsKCnByaXZhdGUgJGhhc1Byb3h5OwoKcHJpdmF0ZSAkaW5mbyA9IG51bGw7Cgpwcml2YXRlICRub1Byb3h5SGFuZGxlciA9IG51bGw7CgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5mdWxsUHJveHkgPSAkdGhpcy0+c2FmZVByb3h5ID0gWwonaHR0cCcgPT4gbnVsbCwKJ2h0dHBzJyA9PiBudWxsLApdOwoKJHRoaXMtPnN0cmVhbXNbJ2h0dHAnXSA9ICR0aGlzLT5zdHJlYW1zWydodHRwcyddID0gWwonb3B0aW9ucycgPT4gbnVsbCwKXTsKCiR0aGlzLT5oYXNQcm94eSA9IGZhbHNlOwokdGhpcy0+aW5pdFByb3h5RGF0YSgpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbmNlKCk6IFByb3h5TWFuYWdlcgp7CmlmICghc2VsZjo6JGluc3RhbmNlKSB7CnNlbGY6OiRpbnN0YW5jZSA9IG5ldyBzZWxmKCk7Cn0KCnJldHVybiBzZWxmOjokaW5zdGFuY2U7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CnNlbGY6OiRpbnN0YW5jZSA9IG51bGw7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3h5Rm9yUmVxdWVzdChzdHJpbmcgJHJlcXVlc3RVcmwpOiBSZXF1ZXN0UHJveHkKewppZiAoJHRoaXMtPmVycm9yKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1VuYWJsZSB0byB1c2UgYSBwcm94eTogJy4kdGhpcy0+ZXJyb3IpOwp9Cgokc2NoZW1lID0gcGFyc2VfdXJsKCRyZXF1ZXN0VXJsLCBQSFBfVVJMX1NDSEVNRSkgPzogJ2h0dHAnOwokcHJveHlVcmwgPSAnJzsKJG9wdGlvbnMgPSBbXTsKJGZvcm1hdHRlZFByb3h5VXJsID0gJyc7CgppZiAoJHRoaXMtPmhhc1Byb3h5ICYmIGluX2FycmF5KCRzY2hlbWUsIFsnaHR0cCcsICdodHRwcyddLCB0cnVlKSAmJiAkdGhpcy0+ZnVsbFByb3h5WyRzY2hlbWVdKSB7CmlmICgkdGhpcy0+bm9Qcm94eSgkcmVxdWVzdFVybCkpIHsKJGZvcm1hdHRlZFByb3h5VXJsID0gJ2V4Y2x1ZGVkIGJ5IG5vX3Byb3h5JzsKfSBlbHNlIHsKJHByb3h5VXJsID0gJHRoaXMtPmZ1bGxQcm94eVskc2NoZW1lXTsKJG9wdGlvbnMgPSAkdGhpcy0+c3RyZWFtc1skc2NoZW1lXVsnb3B0aW9ucyddOwpQcm94eUhlbHBlcjo6c2V0UmVxdWVzdEZ1bGxVcmkoJHJlcXVlc3RVcmwsICRvcHRpb25zKTsKJGZvcm1hdHRlZFByb3h5VXJsID0gJHRoaXMtPnNhZmVQcm94eVskc2NoZW1lXTsKfQp9CgpyZXR1cm4gbmV3IFJlcXVlc3RQcm94eSgkcHJveHlVcmwsICRvcHRpb25zLCAkZm9ybWF0dGVkUHJveHlVcmwpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Byb3h5aW5nKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhc1Byb3h5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRQcm94eSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5oYXNQcm94eSA/ICR0aGlzLT5pbmZvIDogJHRoaXMtPmVycm9yOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXRQcm94eURhdGEoKTogdm9pZAp7CnRyeSB7ClskaHR0cFByb3h5LCAkaHR0cHNQcm94eSwgJG5vUHJveHldID0gUHJveHlIZWxwZXI6OmdldFByb3h5RGF0YSgpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewokdGhpcy0+ZXJyb3IgPSAkZS0+Z2V0TWVzc2FnZSgpOwoKcmV0dXJuOwp9CgokaW5mbyA9IFtdOwoKaWYgKCRodHRwUHJveHkpIHsKJGluZm9bXSA9ICR0aGlzLT5zZXREYXRhKCRodHRwUHJveHksICdodHRwJyk7Cn0KaWYgKCRodHRwc1Byb3h5KSB7CiRpbmZvW10gPSAkdGhpcy0+c2V0RGF0YSgkaHR0cHNQcm94eSwgJ2h0dHBzJyk7Cn0KaWYgKCR0aGlzLT5oYXNQcm94eSkgewokdGhpcy0+aW5mbyA9IGltcGxvZGUoJywgJywgJGluZm8pOwppZiAoJG5vUHJveHkpIHsKJHRoaXMtPm5vUHJveHlIYW5kbGVyID0gbmV3IE5vUHJveHlQYXR0ZXJuKCRub1Byb3h5KTsKfQp9Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXREYXRhKCR1cmwsICRzY2hlbWUpOiBzdHJpbmcKewokc2FmZVByb3h5ID0gVXJsOjpzYW5pdGl6ZSgkdXJsKTsKJHRoaXMtPmZ1bGxQcm94eVskc2NoZW1lXSA9ICR1cmw7CiR0aGlzLT5zYWZlUHJveHlbJHNjaGVtZV0gPSAkc2FmZVByb3h5OwokdGhpcy0+c3RyZWFtc1skc2NoZW1lXVsnb3B0aW9ucyddID0gUHJveHlIZWxwZXI6OmdldENvbnRleHRPcHRpb25zKCR1cmwpOwokdGhpcy0+aGFzUHJveHkgPSB0cnVlOwoKcmV0dXJuIHNwcmludGYoJyVzPSVzJywgJHNjaGVtZSwgJHNhZmVQcm94eSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbm9Qcm94eShzdHJpbmcgJHJlcXVlc3RVcmwpOiBib29sCnsKcmV0dXJuICR0aGlzLT5ub1Byb3h5SGFuZGxlciAmJiAkdGhpcy0+bm9Qcm94eUhhbmRsZXItPnRlc3QoJHJlcXVlc3RVcmwpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWxcSHR0cDsKCnVzZSBDb21wb3NlclxVdGlsXFVybDsKCgoKCgpjbGFzcyBSZXF1ZXN0UHJveHkKewoKcHJpdmF0ZSAkY29udGV4dE9wdGlvbnM7Cgpwcml2YXRlICRpc1NlY3VyZTsKCnByaXZhdGUgJGZvcm1hdHRlZFVybDsKCnByaXZhdGUgJHVybDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHVybCwgYXJyYXkgJGNvbnRleHRPcHRpb25zLCBzdHJpbmcgJGZvcm1hdHRlZFVybCkKewokdGhpcy0+dXJsID0gJHVybDsKJHRoaXMtPmNvbnRleHRPcHRpb25zID0gJGNvbnRleHRPcHRpb25zOwokdGhpcy0+Zm9ybWF0dGVkVXJsID0gJGZvcm1hdHRlZFVybDsKJHRoaXMtPmlzU2VjdXJlID0gMCA9PT0gc3RycG9zKCR1cmwsICdodHRwczovLycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y29udGV4dE9wdGlvbnM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRVcmwoP3N0cmluZyAkZm9ybWF0ID0gJycpOiBzdHJpbmcKewokcmVzdWx0ID0gJyc7CmlmICgkdGhpcy0+Zm9ybWF0dGVkVXJsKSB7CiRmb3JtYXQgPSAkZm9ybWF0ID86ICclcyc7CiRyZXN1bHQgPSBzcHJpbnRmKCRmb3JtYXQsICR0aGlzLT5mb3JtYXR0ZWRVcmwpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1NlY3VyZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5pc1NlY3VyZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CgoKCgpjbGFzcyBSZXNwb25zZQp7Cgpwcml2YXRlICRyZXF1ZXN0OwoKcHJpdmF0ZSAkY29kZTsKCnByaXZhdGUgJGhlYWRlcnM7Cgpwcml2YXRlICRib2R5OwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVxdWVzdCwgP2ludCAkY29kZSwgYXJyYXkgJGhlYWRlcnMsID9zdHJpbmcgJGJvZHkpCnsKaWYgKCFpc3NldCgkcmVxdWVzdFsndXJsJ10pKSB7IAp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCd1cmwga2V5IG1pc3NpbmcgZnJvbSByZXF1ZXN0IGFycmF5Jyk7Cn0KJHRoaXMtPnJlcXVlc3QgPSAkcmVxdWVzdDsKJHRoaXMtPmNvZGUgPSAoaW50KSAkY29kZTsKJHRoaXMtPmhlYWRlcnMgPSAkaGVhZGVyczsKJHRoaXMtPmJvZHkgPSAkYm9keTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoKTogaW50CnsKcmV0dXJuICR0aGlzLT5jb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzTWVzc2FnZSgpOiA/c3RyaW5nCnsKJHZhbHVlID0gbnVsbDsKZm9yZWFjaCAoJHRoaXMtPmhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne15IVFRQL1xTKyBcZCt9aScsICRoZWFkZXIpKSB7CgoKJHZhbHVlID0gJGhlYWRlcjsKfQp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+aGVhZGVyczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcihzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKcmV0dXJuIHNlbGY6OmZpbmRIZWFkZXJWYWx1ZSgkdGhpcy0+aGVhZGVycywgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5ib2R5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVjb2RlSnNvbigpCnsKcmV0dXJuIEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmJvZHksICR0aGlzLT5yZXF1ZXN0Wyd1cmwnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb2xsZWN0KCk6IHZvaWQKewoKJHRoaXMtPnJlcXVlc3QgPSAkdGhpcy0+Y29kZSA9ICR0aGlzLT5oZWFkZXJzID0gJHRoaXMtPmJvZHkgPSBudWxsOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5kSGVhZGVyVmFsdWUoYXJyYXkgJGhlYWRlcnMsIHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XicucHJlZ19xdW90ZSgkbmFtZSkuJzpccyooLis/KVxzKiR9aScsICRoZWFkZXIsICRtYXRjaCkpIHsKJHZhbHVlID0gJG1hdGNoWzFdOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXEN1cmxEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxFeGNlcHRpb25cSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBIdHRwRG93bmxvYWRlcgp7CnByaXZhdGUgY29uc3QgU1RBVFVTX1FVRVVFRCA9IDE7CnByaXZhdGUgY29uc3QgU1RBVFVTX1NUQVJURUQgPSAyOwpwcml2YXRlIGNvbnN0IFNUQVRVU19DT01QTEVURUQgPSAzOwpwcml2YXRlIGNvbnN0IFNUQVRVU19GQUlMRUQgPSA0Owpwcml2YXRlIGNvbnN0IFNUQVRVU19BQk9SVEVEID0gNTsKCgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGpvYnMgPSBbXTsKCnByaXZhdGUgJG9wdGlvbnMgPSBbXTsKCnByaXZhdGUgJHJ1bm5pbmdKb2JzID0gMDsKCnByaXZhdGUgJG1heEpvYnMgPSAxMjsKCnByaXZhdGUgJGN1cmw7Cgpwcml2YXRlICRyZnM7Cgpwcml2YXRlICRpZEdlbiA9IDA7Cgpwcml2YXRlICRkaXNhYmxlZDsKCnByaXZhdGUgJGFsbG93QXN5bmMgPSBmYWxzZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIGFycmF5ICRvcHRpb25zID0gW10sIGJvb2wgJGRpc2FibGVUbHMgPSBmYWxzZSkKewokdGhpcy0+aW8gPSAkaW87CgokdGhpcy0+ZGlzYWJsZWQgPSAoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJyk7CgoKCmlmICgkZGlzYWJsZVRscyA9PT0gZmFsc2UpIHsKJHRoaXMtPm9wdGlvbnMgPSBTdHJlYW1Db250ZXh0RmFjdG9yeTo6Z2V0VGxzRGVmYXVsdHMoJG9wdGlvbnMsICRpbyk7Cn0KCgokdGhpcy0+b3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKaWYgKHNlbGY6OmlzQ3VybEVuYWJsZWQoKSkgewokdGhpcy0+Y3VybCA9IG5ldyBDdXJsRG93bmxvYWRlcigkaW8sICRjb25maWcsICRvcHRpb25zLCAkZGlzYWJsZVRscyk7Cn0KCiR0aGlzLT5yZnMgPSBuZXcgUmVtb3RlRmlsZXN5c3RlbSgkaW8sICRjb25maWcsICRvcHRpb25zLCAkZGlzYWJsZVRscyk7CgppZiAoaXNfbnVtZXJpYygkbWF4Sm9icyA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX01BWF9QQVJBTExFTF9IVFRQJykpKSB7CiR0aGlzLT5tYXhKb2JzID0gbWF4KDEsIG1pbig1MCwgKGludCkgJG1heEpvYnMpKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbJGpvYiwgJHByb21pc2VdID0gJHRoaXMtPmFkZEpvYihbJ3VybCcgPT4gJHVybCwgJ29wdGlvbnMnID0+ICRvcHRpb25zLCAnY29weVRvJyA9PiBudWxsXSwgdHJ1ZSk7CiRwcm9taXNlLT50aGVuKG51bGwsIGZ1bmN0aW9uIChcVGhyb3dhYmxlICRlKSB7Cgp9KTsKJHRoaXMtPndhaXQoJGpvYlsnaWQnXSk7CgokcmVzcG9uc2UgPSAkdGhpcy0+Z2V0UmVzcG9uc2UoJGpvYlsnaWQnXSk7CgpyZXR1cm4gJHJlc3BvbnNlOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZChzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJycgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyR1cmwgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KWywgJHByb21pc2VdID0gJHRoaXMtPmFkZEpvYihbJ3VybCcgPT4gJHVybCwgJ29wdGlvbnMnID0+ICRvcHRpb25zLCAnY29weVRvJyA9PiBudWxsXSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJHVybCwgc3RyaW5nICR0bywgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJycgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyR1cmwgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KWyRqb2JdID0gJHRoaXMtPmFkZEpvYihbJ3VybCcgPT4gJHVybCwgJ29wdGlvbnMnID0+ICRvcHRpb25zLCAnY29weVRvJyA9PiAkdG9dLCB0cnVlKTsKJHRoaXMtPndhaXQoJGpvYlsnaWQnXSk7CgpyZXR1cm4gJHRoaXMtPmdldFJlc3BvbnNlKCRqb2JbJ2lkJ10pOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDb3B5KHN0cmluZyAkdXJsLCBzdHJpbmcgJHRvLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbLCAkcHJvbWlzZV0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+ICR0b10pOwoKcmV0dXJuICRwcm9taXNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25zKCkKewpyZXR1cm4gJHRoaXMtPm9wdGlvbnM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKGFycmF5ICRvcHRpb25zKQp7CiR0aGlzLT5vcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZEpvYihhcnJheSAkcmVxdWVzdCwgYm9vbCAkc3luYyA9IGZhbHNlKTogYXJyYXkKewokcmVxdWVzdFsnb3B0aW9ucyddID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICRyZXF1ZXN0WydvcHRpb25zJ10pOwoKCiRqb2IgPSBbCidpZCcgPT4gJHRoaXMtPmlkR2VuKyssCidzdGF0dXMnID0+IHNlbGY6OlNUQVRVU19RVUVVRUQsCidyZXF1ZXN0JyA9PiAkcmVxdWVzdCwKJ3N5bmMnID0+ICRzeW5jLAonb3JpZ2luJyA9PiBVcmw6OmdldE9yaWdpbigkdGhpcy0+Y29uZmlnLCAkcmVxdWVzdFsndXJsJ10pLApdOwoKaWYgKCEkc3luYyAmJiAhJHRoaXMtPmFsbG93QXN5bmMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignWW91IG11c3QgdXNlIHRoZSBIdHRwRG93bmxvYWRlciBpbnN0YW5jZSB3aGljaCBpcyBwYXJ0IG9mIGEgQ29tcG9zZXJcTG9vcCBpbnN0YW5jZSB0byBiZSBhYmxlIHRvIHJ1biBhc3luYyBodHRwIHJlcXVlc3RzJyk7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15odHRwcz86Ly8oW146L10rKTooW15AL10rKUAoW14vXSspfWknLCAkcmVxdWVzdFsndXJsJ10sICRtYXRjaCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkam9iWydvcmlnaW4nXSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsxXSksIHJhd3VybGRlY29kZSgkbWF0Y2hbMl0pKTsKfQoKJHJmcyA9ICR0aGlzLT5yZnM7CgppZiAoJHRoaXMtPmNhblVzZUN1cmwoJGpvYikpIHsKJHJlc29sdmVyID0gc3RhdGljIGZ1bmN0aW9uICgkcmVzb2x2ZSwgJHJlamVjdCkgdXNlICgmJGpvYik6IHZvaWQgewokam9iWydzdGF0dXMnXSA9IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfUVVFVUVEOwokam9iWydyZXNvbHZlJ10gPSAkcmVzb2x2ZTsKJGpvYlsncmVqZWN0J10gPSAkcmVqZWN0Owp9Owp9IGVsc2UgewokcmVzb2x2ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCYkam9iLCAkcmZzKTogdm9pZCB7CgokdXJsID0gJGpvYlsncmVxdWVzdCddWyd1cmwnXTsKJG9wdGlvbnMgPSAkam9iWydyZXF1ZXN0J11bJ29wdGlvbnMnXTsKCiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19TVEFSVEVEOwoKaWYgKCRqb2JbJ3JlcXVlc3QnXVsnY29weVRvJ10pIHsKJHJmcy0+Y29weSgkam9iWydvcmlnaW4nXSwgJHVybCwgJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSwgZmFsc2UgLCAkb3B0aW9ucyk7CgokaGVhZGVycyA9ICRyZnMtPmdldExhc3RIZWFkZXJzKCk7CiRyZXNwb25zZSA9IG5ldyBIdHRwXFJlc3BvbnNlKCRqb2JbJ3JlcXVlc3QnXSwgJHJmcy0+ZmluZFN0YXR1c0NvZGUoJGhlYWRlcnMpLCAkaGVhZGVycywgJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXS4nficpOwoKJHJlc29sdmUoJHJlc3BvbnNlKTsKfSBlbHNlIHsKJGJvZHkgPSAkcmZzLT5nZXRDb250ZW50cygkam9iWydvcmlnaW4nXSwgJHVybCwgZmFsc2UgLCAkb3B0aW9ucyk7CiRoZWFkZXJzID0gJHJmcy0+Z2V0TGFzdEhlYWRlcnMoKTsKJHJlc3BvbnNlID0gbmV3IEh0dHBcUmVzcG9uc2UoJGpvYlsncmVxdWVzdCddLCAkcmZzLT5maW5kU3RhdHVzQ29kZSgkaGVhZGVycyksICRoZWFkZXJzLCAkYm9keSk7CgokcmVzb2x2ZSgkcmVzcG9uc2UpOwp9Cn07Cn0KCiRjdXJsID0gJHRoaXMtPmN1cmw7CgokY2FuY2VsZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJGpvYiwgJGN1cmwpOiB2b2lkIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX1FVRVVFRCkgewokam9iWydzdGF0dXMnXSA9IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfQUJPUlRFRDsKfQppZiAoJGpvYlsnc3RhdHVzJ10gIT09IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfU1RBUlRFRCkgewpyZXR1cm47Cn0KJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX0FCT1JURUQ7CmlmIChpc3NldCgkam9iWydjdXJsX2lkJ10pKSB7CiRjdXJsLT5hYm9ydFJlcXVlc3QoJGpvYlsnY3VybF9pZCddKTsKfQp0aHJvdyBuZXcgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uKCdEb3dubG9hZCBvZiAnIC4gVXJsOjpzYW5pdGl6ZSgkam9iWydyZXF1ZXN0J11bJ3VybCddKSAuICcgY2FuY2VsZWQnKTsKfTsKCiRwcm9taXNlID0gbmV3IFByb21pc2UoJHJlc29sdmVyLCAkY2FuY2VsZXIpOwokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgkcmVzcG9uc2UpIHVzZSAoJiRqb2IpIHsKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX0NPTVBMRVRFRDsKJGpvYlsncmVzcG9uc2UnXSA9ICRyZXNwb25zZTsKCiR0aGlzLT5tYXJrSm9iRG9uZSgpOwoKcmV0dXJuICRyZXNwb25zZTsKfSwgZnVuY3Rpb24gKCRlKSB1c2UgKCYkam9iKTogdm9pZCB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19GQUlMRUQ7CiRqb2JbJ2V4Y2VwdGlvbiddID0gJGU7CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnRocm93ICRlOwp9KTsKJHRoaXMtPmpvYnNbJGpvYlsnaWQnXV0gPSAmJGpvYjsKCmlmICgkdGhpcy0+cnVubmluZ0pvYnMgPCAkdGhpcy0+bWF4Sm9icykgewokdGhpcy0+c3RhcnRKb2IoJGpvYlsnaWQnXSk7Cn0KCnJldHVybiBbJGpvYiwgJHByb21pc2VdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHN0YXJ0Sm9iKGludCAkaWQpOiB2b2lkCnsKJGpvYiA9ICYkdGhpcy0+am9ic1skaWRdOwppZiAoJGpvYlsnc3RhdHVzJ10gIT09IHNlbGY6OlNUQVRVU19RVUVVRUQpIHsKcmV0dXJuOwp9CgoKJGpvYlsnc3RhdHVzJ10gPSBzZWxmOjpTVEFUVVNfU1RBUlRFRDsKJHRoaXMtPnJ1bm5pbmdKb2JzKys7Cgphc3NlcnQoaXNzZXQoJGpvYlsncmVzb2x2ZSddKSk7CmFzc2VydChpc3NldCgkam9iWydyZWplY3QnXSkpOwoKJHJlc29sdmUgPSAkam9iWydyZXNvbHZlJ107CiRyZWplY3QgPSAkam9iWydyZWplY3QnXTsKJHVybCA9ICRqb2JbJ3JlcXVlc3QnXVsndXJsJ107CiRvcHRpb25zID0gJGpvYlsncmVxdWVzdCddWydvcHRpb25zJ107CiRvcmlnaW4gPSAkam9iWydvcmlnaW4nXTsKCmlmICgkdGhpcy0+ZGlzYWJsZWQpIHsKaWYgKGlzc2V0KCRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddWydodHRwJ11bJ2hlYWRlciddKSAmJiBmYWxzZSAhPT0gc3RyaXBvcyhpbXBsb2RlKCcnLCAkam9iWydyZXF1ZXN0J11bJ29wdGlvbnMnXVsnaHR0cCddWydoZWFkZXInXSksICdpZi1tb2RpZmllZC1zaW5jZScpKSB7CiRyZXNvbHZlKG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJHVybF0sIDMwNCwgW10sICcnKSk7Cn0gZWxzZSB7CiRlID0gbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignTmV0d29yayBkaXNhYmxlZCwgcmVxdWVzdCBjYW5jZWxlZDogJy5Vcmw6OnNhbml0aXplKCR1cmwpLCA0OTkpOwokZS0+c2V0U3RhdHVzQ29kZSg0OTkpOwokcmVqZWN0KCRlKTsKfQoKcmV0dXJuOwp9Cgp0cnkgewppZiAoJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSkgewokam9iWydjdXJsX2lkJ10gPSAkdGhpcy0+Y3VybC0+ZG93bmxvYWQoJHJlc29sdmUsICRyZWplY3QsICRvcmlnaW4sICR1cmwsICRvcHRpb25zLCAkam9iWydyZXF1ZXN0J11bJ2NvcHlUbyddKTsKfSBlbHNlIHsKJGpvYlsnY3VybF9pZCddID0gJHRoaXMtPmN1cmwtPmRvd25sb2FkKCRyZXNvbHZlLCAkcmVqZWN0LCAkb3JpZ2luLCAkdXJsLCAkb3B0aW9ucyk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZXhjZXB0aW9uKSB7CiRyZWplY3QoJGV4Y2VwdGlvbik7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrSm9iRG9uZSgpOiB2b2lkCnsKJHRoaXMtPnJ1bm5pbmdKb2JzLS07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdCg/aW50ICRpbmRleCA9IG51bGwpCnsKZG8gewokam9iQ291bnQgPSAkdGhpcy0+Y291bnRBY3RpdmVKb2JzKCRpbmRleCk7Cn0gd2hpbGUgKCRqb2JDb3VudCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbmFibGVBc3luYygpOiB2b2lkCnsKJHRoaXMtPmFsbG93QXN5bmMgPSB0cnVlOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnRBY3RpdmVKb2JzKD9pbnQgJGluZGV4ID0gbnVsbCk6IGludAp7CmlmICgkdGhpcy0+cnVubmluZ0pvYnMgPCAkdGhpcy0+bWF4Sm9icykgewpmb3JlYWNoICgkdGhpcy0+am9icyBhcyAkam9iKSB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX1FVRVVFRCAmJiAkdGhpcy0+cnVubmluZ0pvYnMgPCAkdGhpcy0+bWF4Sm9icykgewokdGhpcy0+c3RhcnRKb2IoJGpvYlsnaWQnXSk7Cn0KfQp9CgppZiAoJHRoaXMtPmN1cmwpIHsKJHRoaXMtPmN1cmwtPnRpY2soKTsKfQoKaWYgKG51bGwgIT09ICRpbmRleCkgewpyZXR1cm4gJHRoaXMtPmpvYnNbJGluZGV4XVsnc3RhdHVzJ10gPCBzZWxmOjpTVEFUVVNfQ09NUExFVEVEID8gMSA6IDA7Cn0KCiRhY3RpdmUgPSAwOwpmb3JlYWNoICgkdGhpcy0+am9icyBhcyAkam9iKSB7CmlmICgkam9iWydzdGF0dXMnXSA8IHNlbGY6OlNUQVRVU19DT01QTEVURUQpIHsKJGFjdGl2ZSsrOwp9IGVsc2VpZiAoISRqb2JbJ3N5bmMnXSkgewp1bnNldCgkdGhpcy0+am9ic1skam9iWydpZCddXSk7Cn0KfQoKcmV0dXJuICRhY3RpdmU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVzcG9uc2UoaW50ICRpbmRleCk6IFJlc3BvbnNlCnsKaWYgKCFpc3NldCgkdGhpcy0+am9ic1skaW5kZXhdKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdJbnZhbGlkIHJlcXVlc3QgaWQnKTsKfQoKaWYgKCR0aGlzLT5qb2JzWyRpbmRleF1bJ3N0YXR1cyddID09PSBzZWxmOjpTVEFUVVNfRkFJTEVEKSB7CmFzc2VydChpc3NldCgkdGhpcy0+am9ic1skaW5kZXhdWydleGNlcHRpb24nXSkpOwp0aHJvdyAkdGhpcy0+am9ic1skaW5kZXhdWydleGNlcHRpb24nXTsKfQoKaWYgKCFpc3NldCgkdGhpcy0+am9ic1skaW5kZXhdWydyZXNwb25zZSddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdSZXNwb25zZSBub3QgYXZhaWxhYmxlIHlldCwgY2FsbCB3YWl0KCkgZmlyc3QnKTsKfQoKJHJlc3AgPSAkdGhpcy0+am9ic1skaW5kZXhdWydyZXNwb25zZSddOwoKdW5zZXQoJHRoaXMtPmpvYnNbJGluZGV4XSk7CgpyZXR1cm4gJHJlc3A7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvdXRwdXRXYXJuaW5ncyhJT0ludGVyZmFjZSAkaW8sIHN0cmluZyAkdXJsLCAkZGF0YSk6IHZvaWQKewokY2xlYW5NZXNzYWdlID0gc3RhdGljIGZ1bmN0aW9uICgkbXNnKSB1c2UgKCRpbykgewppZiAoISRpby0+aXNEZWNvcmF0ZWQoKSkgewokbXNnID0gUHJlZzo6cmVwbGFjZSgneycuY2hyKDI3KS4nXFxbWztcZF0qbX11JywgJycsICRtc2cpOwp9CgpyZXR1cm4gJG1zZzsKfTsKCgpmb3JlYWNoIChbJ3dhcm5pbmcnLCAnaW5mbyddIGFzICR0eXBlKSB7CmlmIChlbXB0eSgkZGF0YVskdHlwZV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoIWVtcHR5KCRkYXRhWyR0eXBlIC4gJy12ZXJzaW9ucyddKSkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGRhdGFbJHR5cGUgLiAnLXZlcnNpb25zJ10pOwokY29tcG9zZXIgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplKENvbXBvc2VyOjpnZXRWZXJzaW9uKCkpKTsKaWYgKCEkY29uc3RyYWludC0+bWF0Y2hlcygkY29tcG9zZXIpKSB7CmNvbnRpbnVlOwp9Cn0KCiRpby0+d3JpdGVFcnJvcignPCcuJHR5cGUuJz4nLnVjZmlyc3QoJHR5cGUpLicgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJzogJy4kY2xlYW5NZXNzYWdlKCRkYXRhWyR0eXBlXSkuJzwvJy4kdHlwZS4nPicpOwp9CgoKZm9yZWFjaCAoWyd3YXJuaW5ncycsICdpbmZvcyddIGFzICRrZXkpIHsKaWYgKGVtcHR5KCRkYXRhWyRrZXldKSkgewpjb250aW51ZTsKfQoKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwpmb3JlYWNoICgkZGF0YVska2V5XSBhcyAkc3BlYykgewokdHlwZSA9IHN1YnN0cigka2V5LCAwLCAtMSk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHNwZWNbJ3ZlcnNpb25zJ10pOwokY29tcG9zZXIgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplKENvbXBvc2VyOjpnZXRWZXJzaW9uKCkpKTsKaWYgKCEkY29uc3RyYWludC0+bWF0Y2hlcygkY29tcG9zZXIpKSB7CmNvbnRpbnVlOwp9CgokaW8tPndyaXRlRXJyb3IoJzwnLiR0eXBlLic+Jy51Y2ZpcnN0KCR0eXBlKS4nIGZyb20gJy5Vcmw6OnNhbml0aXplKCR1cmwpLic6ICcuJGNsZWFuTWVzc2FnZSgkc3BlY1snbWVzc2FnZSddKS4nPC8nLiR0eXBlLic+Jyk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXhjZXB0aW9uSGludHMoXFRocm93YWJsZSAkZSk6ID9hcnJheQp7CmlmICghJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKcmV0dXJuIG51bGw7Cn0KCmlmICgKZmFsc2UgIT09IHN0cnBvcygkZS0+Z2V0TWVzc2FnZSgpLCAnUmVzb2x2aW5nIHRpbWVkIG91dCcpCnx8IGZhbHNlICE9PSBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ0NvdWxkIG5vdCByZXNvbHZlIGhvc3QnKQopIHsKU2lsZW5jZXI6OnN1cHByZXNzKCk7CiR0ZXN0Q29ubmVjdGl2aXR5ID0gZmlsZV9nZXRfY29udGVudHMoJ2h0dHBzOi8vOC44LjguOCcsIGZhbHNlLCBzdHJlYW1fY29udGV4dF9jcmVhdGUoWwonc3NsJyA9PiBbJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZV0sCidodHRwJyA9PiBbJ2ZvbGxvd19sb2NhdGlvbicgPT4gZmFsc2UsICdpZ25vcmVfZXJyb3JzJyA9PiB0cnVlXSwKXSkpOwpTaWxlbmNlcjo6cmVzdG9yZSgpOwppZiAoZmFsc2UgIT09ICR0ZXN0Q29ubmVjdGl2aXR5KSB7CnJldHVybiBbCic8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gcHJvYmFibHkgaW5kaWNhdGVzIHlvdSBoYXZlIG1pc2NvbmZpZ3VyZWQgRE5TIHJlc29sdmVyKHMpPC9lcnJvcj4nLApdOwp9CgpyZXR1cm4gWwonPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHByb2JhYmx5IGluZGljYXRlcyB5b3UgYXJlIG9mZmxpbmUgb3IgaGF2ZSBtaXNjb25maWd1cmVkIEROUyByZXNvbHZlcihzKTwvZXJyb3I+JywKXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FuVXNlQ3VybChhcnJheSAkam9iKTogYm9vbAp7CmlmICghJHRoaXMtPmN1cmwpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vfWknLCAkam9iWydyZXF1ZXN0J11bJ3VybCddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghZW1wdHkoJGpvYlsncmVxdWVzdCddWydvcHRpb25zJ11bJ3NzbCddWydhbGxvd19zZWxmX3NpZ25lZCddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQ3VybEVuYWJsZWQoKTogYm9vbAp7CnJldHVybiBcZXh0ZW5zaW9uX2xvYWRlZCgnY3VybCcpICYmIFxmdW5jdGlvbl9leGlzdHMoJ2N1cmxfbXVsdGlfZXhlYycpICYmIFxmdW5jdGlvbl9leGlzdHMoJ2N1cmxfbXVsdGlfaW5pdCcpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlclxYZGVidWdIYW5kbGVyOwoKCgoKCgoKCmNsYXNzIEluaUhlbHBlcgp7CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGwoKTogYXJyYXkKewpyZXR1cm4gWGRlYnVnSGFuZGxlcjo6Z2V0QWxsSW5pRmlsZXMoKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNZXNzYWdlKCk6IHN0cmluZwp7CiRwYXRocyA9IHNlbGY6OmdldEFsbCgpOwoKaWYgKGVtcHR5KCRwYXRoc1swXSkpIHsKYXJyYXlfc2hpZnQoJHBhdGhzKTsKfQoKJGluaSA9IGFycmF5X3NoaWZ0KCRwYXRocyk7CgppZiAoZW1wdHkoJGluaSkpIHsKcmV0dXJuICdBIHBocC5pbmkgZmlsZSBkb2VzIG5vdCBleGlzdC4gWW91IHdpbGwgaGF2ZSB0byBjcmVhdGUgb25lLic7Cn0KCmlmICghZW1wdHkoJHBhdGhzKSkgewpyZXR1cm4gJ1lvdXIgY29tbWFuZC1saW5lIFBIUCBpcyB1c2luZyBtdWx0aXBsZSBpbmkgZmlsZXMuIFJ1biBgcGhwIC0taW5pYCB0byBzaG93IHRoZW0uJzsKfQoKcmV0dXJuICdUaGUgcGhwLmluaSB1c2VkIGJ5IHlvdXIgY29tbWFuZC1saW5lIFBIUCBpczogJy4kaW5pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgUmVhY3RcUHJvbWlzZVxDYW5jZWxsYWJsZVByb21pc2VJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCmNsYXNzIExvb3AKewoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRwcm9jZXNzRXhlY3V0b3I7Cgpwcml2YXRlICRjdXJyZW50UHJvbWlzZXMgPSBbXTsKCnByaXZhdGUgJHdhaXRJbmRleCA9IDA7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzRXhlY3V0b3IgPSBudWxsKQp7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5lbmFibGVBc3luYygpOwoKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9ICRwcm9jZXNzRXhlY3V0b3I7CmlmICgkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKSB7CiR0aGlzLT5wcm9jZXNzRXhlY3V0b3ItPmVuYWJsZUFzeW5jKCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGdldEh0dHBEb3dubG9hZGVyKCk6IEh0dHBEb3dubG9hZGVyCnsKcmV0dXJuICR0aGlzLT5odHRwRG93bmxvYWRlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3NFeGVjdXRvcigpOiA/UHJvY2Vzc0V4ZWN1dG9yCnsKcmV0dXJuICR0aGlzLT5wcm9jZXNzRXhlY3V0b3I7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdChhcnJheSAkcHJvbWlzZXMsID9Qcm9ncmVzc0JhciAkcHJvZ3Jlc3MgPSBudWxsKTogdm9pZAp7CiR1bmNhdWdodCA9IG51bGw7CgpcUmVhY3RcUHJvbWlzZVxhbGwoJHByb21pc2VzKS0+dGhlbigKc3RhdGljIGZ1bmN0aW9uICgpOiB2b2lkIHsKfSwKc3RhdGljIGZ1bmN0aW9uIChcVGhyb3dhYmxlICRlKSB1c2UgKCYkdW5jYXVnaHQpOiB2b2lkIHsKJHVuY2F1Z2h0ID0gJGU7Cn0KKTsKCgoKJHdhaXRJbmRleCA9ICR0aGlzLT53YWl0SW5kZXgrKzsKJHRoaXMtPmN1cnJlbnRQcm9taXNlc1skd2FpdEluZGV4XSA9ICRwcm9taXNlczsKCmlmICgkcHJvZ3Jlc3MpIHsKJHRvdGFsSm9icyA9IDA7CiR0b3RhbEpvYnMgKz0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5jb3VudEFjdGl2ZUpvYnMoKTsKaWYgKCR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRvdGFsSm9icyArPSAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yLT5jb3VudEFjdGl2ZUpvYnMoKTsKfQokcHJvZ3Jlc3MtPnN0YXJ0KCR0b3RhbEpvYnMpOwp9CgokbGFzdFVwZGF0ZSA9IDA7CndoaWxlICh0cnVlKSB7CiRhY3RpdmVKb2JzID0gMDsKCiRhY3RpdmVKb2JzICs9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Y291bnRBY3RpdmVKb2JzKCk7CmlmICgkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKSB7CiRhY3RpdmVKb2JzICs9ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3ItPmNvdW50QWN0aXZlSm9icygpOwp9CgppZiAoJHByb2dyZXNzICYmIG1pY3JvdGltZSh0cnVlKSAtICRsYXN0VXBkYXRlID4gMC4xKSB7CiRsYXN0VXBkYXRlID0gbWljcm90aW1lKHRydWUpOwokcHJvZ3Jlc3MtPnNldFByb2dyZXNzKCRwcm9ncmVzcy0+Z2V0TWF4U3RlcHMoKSAtICRhY3RpdmVKb2JzKTsKfQoKaWYgKCEkYWN0aXZlSm9icykgewpicmVhazsKfQp9CgoKaWYgKCRwcm9ncmVzcykgewokcHJvZ3Jlc3MtPmZpbmlzaCgpOwp9Cgp1bnNldCgkdGhpcy0+Y3VycmVudFByb21pc2VzWyR3YWl0SW5kZXhdKTsKaWYgKG51bGwgIT09ICR1bmNhdWdodCkgewp0aHJvdyAkdW5jYXVnaHQ7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGFib3J0Sm9icygpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPmN1cnJlbnRQcm9taXNlcyBhcyAkcHJvbWlzZUdyb3VwKSB7CmZvcmVhY2ggKCRwcm9taXNlR3JvdXAgYXMgJHByb21pc2UpIHsKClxSZWFjdFxQcm9taXNlXHJlc29sdmUoJHByb21pc2UpLT5jYW5jZWwoKTsKfQp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCkB0cmlnZ2VyX2Vycm9yKCdDb21wb3NlclxVdGlsXE1ldGFkYXRhTWluaWZpZXIgaXMgZGVwcmVjYXRlZCwgdXNlIENvbXBvc2VyXE1ldGFkYXRhTWluaWZpZXJcTWV0YWRhdGFNaW5pZmllciBmcm9tIGNvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKCgoKY2xhc3MgTWV0YWRhdGFNaW5pZmllciBleHRlbmRzIFxDb21wb3NlclxNZXRhZGF0YU1pbmlmaWVyXE1ldGFkYXRhTWluaWZpZXIKewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIHN0ZENsYXNzOwoKCgoKY2xhc3MgTm9Qcm94eVBhdHRlcm4KewoKCgpwcm90ZWN0ZWQgJGhvc3ROYW1lcyA9IFtdOwoKCgoKcHJvdGVjdGVkICRydWxlcyA9IFtdOwoKCgoKcHJvdGVjdGVkICRub3Byb3h5OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGF0dGVybikKewokdGhpcy0+aG9zdE5hbWVzID0gUHJlZzo6c3BsaXQoJ3tbXHMsXSt9JywgJHBhdHRlcm4sIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsKJHRoaXMtPm5vcHJveHkgPSBlbXB0eSgkdGhpcy0+aG9zdE5hbWVzKSB8fCAnKicgPT09ICR0aGlzLT5ob3N0TmFtZXNbMF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0KHN0cmluZyAkdXJsKTogYm9vbAp7CmlmICgkdGhpcy0+bm9wcm94eSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCEkdXJsRGF0YSA9ICR0aGlzLT5nZXRVcmxEYXRhKCR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKZm9yZWFjaCAoJHRoaXMtPmhvc3ROYW1lcyBhcyAkaW5kZXggPT4gJGhvc3ROYW1lKSB7CmlmICgkdGhpcy0+bWF0Y2goJGluZGV4LCAkaG9zdE5hbWUsICR1cmxEYXRhKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFVybERhdGEoc3RyaW5nICR1cmwpCnsKaWYgKCEkaG9zdCA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX0hPU1QpKSB7CnJldHVybiBmYWxzZTsKfQoKJHBvcnQgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9QT1JUKTsKCmlmIChlbXB0eSgkcG9ydCkpIHsKc3dpdGNoIChwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9TQ0hFTUUpKSB7CmNhc2UgJ2h0dHAnOgokcG9ydCA9IDgwOwpicmVhazsKY2FzZSAnaHR0cHMnOgokcG9ydCA9IDQ0MzsKYnJlYWs7Cn0KfQoKJGhvc3ROYW1lID0gJGhvc3QgLiAoJHBvcnQgPyAnOicgLiAkcG9ydCA6ICcnKTsKWyRob3N0LCAkcG9ydCwgJGVycl0gPSAkdGhpcy0+c3BsaXRIb3N0UG9ydCgkaG9zdE5hbWUpOwoKaWYgKCRlcnIgfHwgISR0aGlzLT5pcENoZWNrRGF0YSgkaG9zdCwgJGlwZGF0YSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPm1ha2VEYXRhKCRob3N0LCAkcG9ydCwgJGlwZGF0YSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaChpbnQgJGluZGV4LCBzdHJpbmcgJGhvc3ROYW1lLCBzdGRDbGFzcyAkdXJsKTogYm9vbAp7CmlmICghJHJ1bGUgPSAkdGhpcy0+Z2V0UnVsZSgkaW5kZXgsICRob3N0TmFtZSkpIHsKCnJldHVybiBmYWxzZTsKfQoKaWYgKCRydWxlLT5pcGRhdGEpIHsKCmlmICghJHVybC0+aXBkYXRhKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRydWxlLT5pcGRhdGEtPm5ldG1hc2spIHsKcmV0dXJuICR0aGlzLT5tYXRjaFJhbmdlKCRydWxlLT5pcGRhdGEsICR1cmwtPmlwZGF0YSk7Cn0KCiRtYXRjaCA9ICRydWxlLT5pcGRhdGEtPmlwID09PSAkdXJsLT5pcGRhdGEtPmlwOwp9IGVsc2UgewoKJGhheXN0YWNrID0gc3Vic3RyKCR1cmwtPm5hbWUsIC1zdHJsZW4oJHJ1bGUtPm5hbWUpKTsKJG1hdGNoID0gc3RyaXBvcygkaGF5c3RhY2ssICRydWxlLT5uYW1lKSA9PT0gMDsKfQoKaWYgKCRtYXRjaCAmJiAkcnVsZS0+cG9ydCkgewokbWF0Y2ggPSAkcnVsZS0+cG9ydCA9PT0gJHVybC0+cG9ydDsKfQoKcmV0dXJuICRtYXRjaDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoUmFuZ2Uoc3RkQ2xhc3MgJG5ldHdvcmssIHN0ZENsYXNzICR0YXJnZXQpOiBib29sCnsKJG5ldCA9IHVucGFjaygnQyonLCAkbmV0d29yay0+aXApOwokbWFzayA9IHVucGFjaygnQyonLCAkbmV0d29yay0+bmV0bWFzayk7CiRpcCA9IHVucGFjaygnQyonLCAkdGFyZ2V0LT5pcCk7CmlmIChmYWxzZSA9PT0gJG5ldCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSBuZXR3b3JrIElQICcuJG5ldHdvcmstPmlwKTsKfQppZiAoZmFsc2UgPT09ICRtYXNrKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIG5ldG1hc2sgJy4kbmV0d29yay0+bmV0bWFzayk7Cn0KaWYgKGZhbHNlID09PSAkaXApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgdGFyZ2V0IElQICcuJHRhcmdldC0+aXApOwp9Cgpmb3IgKCRpID0gMTsgJGkgPCAxNzsgKyskaSkgewppZiAoKCRuZXRbJGldICYgJG1hc2tbJGldKSAhPT0gKCRpcFskaV0gJiAkbWFza1skaV0pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJ1bGUoaW50ICRpbmRleCwgc3RyaW5nICRob3N0TmFtZSk6ID9zdGRDbGFzcwp7CmlmIChhcnJheV9rZXlfZXhpc3RzKCRpbmRleCwgJHRoaXMtPnJ1bGVzKSkgewpyZXR1cm4gJHRoaXMtPnJ1bGVzWyRpbmRleF07Cn0KCiR0aGlzLT5ydWxlc1skaW5kZXhdID0gbnVsbDsKWyRob3N0LCAkcG9ydCwgJGVycl0gPSAkdGhpcy0+c3BsaXRIb3N0UG9ydCgkaG9zdE5hbWUpOwoKaWYgKCRlcnIgfHwgISR0aGlzLT5pcENoZWNrRGF0YSgkaG9zdCwgJGlwZGF0YSwgdHJ1ZSkpIHsKcmV0dXJuIG51bGw7Cn0KCiR0aGlzLT5ydWxlc1skaW5kZXhdID0gJHRoaXMtPm1ha2VEYXRhKCRob3N0LCAkcG9ydCwgJGlwZGF0YSk7CgpyZXR1cm4gJHRoaXMtPnJ1bGVzWyRpbmRleF07Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpcENoZWNrRGF0YShzdHJpbmcgJGhvc3QsID9zdGRDbGFzcyAmJGlwZGF0YSwgYm9vbCAkYWxsb3dQcmVmaXggPSBmYWxzZSk6IGJvb2wKewokaXBkYXRhID0gbnVsbDsKJG5ldG1hc2sgPSBudWxsOwokcHJlZml4ID0gbnVsbDsKJG1vZGlmaWVkID0gZmFsc2U7CgoKaWYgKHN0cnBvcygkaG9zdCwgJy8nKSAhPT0gZmFsc2UpIHsKWyRob3N0LCAkcHJlZml4XSA9IGV4cGxvZGUoJy8nLCAkaG9zdCk7CgppZiAoISRhbGxvd1ByZWZpeCB8fCAhJHRoaXMtPnZhbGlkYXRlSW50KCRwcmVmaXgsIDAsIDEyOCkpIHsKcmV0dXJuIGZhbHNlOwp9CiRwcmVmaXggPSAoaW50KSAkcHJlZml4OwokbW9kaWZpZWQgPSB0cnVlOwp9CgoKaWYgKCFmaWx0ZXJfdmFyKCRob3N0LCBGSUxURVJfVkFMSURBVEVfSVApKSB7CnJldHVybiAhJG1vZGlmaWVkOwp9CgpbJGlwLCAkc2l6ZV0gPSAkdGhpcy0+aXBHZXRBZGRyKCRob3N0KTsKCmlmICgkcHJlZml4ICE9PSBudWxsKSB7CgppZiAoJHByZWZpeCA+ICRzaXplICogOCkgewpyZXR1cm4gZmFsc2U7Cn0KClskaXAsICRuZXRtYXNrXSA9ICR0aGlzLT5pcEdldE5ldHdvcmsoJGlwLCAkc2l6ZSwgJHByZWZpeCk7Cn0KCiRpcGRhdGEgPSAkdGhpcy0+bWFrZUlwRGF0YSgkaXAsICRzaXplLCAkbmV0bWFzayk7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlwR2V0QWRkcihzdHJpbmcgJGhvc3QpOiBhcnJheQp7CiRpcCA9IGluZXRfcHRvbigkaG9zdCk7CiRzaXplID0gc3RybGVuKCRpcCk7CiRtYXBwZWQgPSAkdGhpcy0+aXBNYXBUbzYoJGlwLCAkc2l6ZSk7CgpyZXR1cm4gWyRtYXBwZWQsICRzaXplXTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpcEdldE1hc2soaW50ICRwcmVmaXgsIGludCAkc2l6ZSk6IHN0cmluZwp7CiRtYXNrID0gJyc7CgppZiAoJG9uZXMgPSBmbG9vcigkcHJlZml4IC8gOCkpIHsKJG1hc2sgPSBzdHJfcmVwZWF0KGNocigyNTUpLCAoaW50KSAkb25lcyk7Cn0KCmlmICgkcmVtYWluZGVyID0gJHByZWZpeCAlIDgpIHsKJG1hc2sgLj0gY2hyKDB4ZmYgXiAoMHhmZiA+PiAkcmVtYWluZGVyKSk7Cn0KCiRtYXNrID0gc3RyX3BhZCgkbWFzaywgJHNpemUsIGNocigwKSk7CgpyZXR1cm4gJHRoaXMtPmlwTWFwVG82KCRtYXNrLCAkc2l6ZSk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBHZXROZXR3b3JrKHN0cmluZyAkcmFuZ2VJcCwgaW50ICRzaXplLCBpbnQgJHByZWZpeCk6IGFycmF5CnsKJG5ldG1hc2sgPSAkdGhpcy0+aXBHZXRNYXNrKCRwcmVmaXgsICRzaXplKTsKCgokbWFzayA9IHVucGFjaygnQyonLCAkbmV0bWFzayk7CiRpcCA9IHVucGFjaygnQyonLCAkcmFuZ2VJcCk7CiRuZXQgPSAnJzsKaWYgKGZhbHNlID09PSAkbWFzaykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSBuZXRtYXNrICcuJG5ldG1hc2spOwp9CmlmIChmYWxzZSA9PT0gJGlwKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIHJhbmdlIElQICcuJHJhbmdlSXApOwp9Cgpmb3IgKCRpID0gMTsgJGkgPCAxNzsgKyskaSkgewokbmV0IC49IGNocigkaXBbJGldICYgJG1hc2tbJGldKTsKfQoKcmV0dXJuIFskbmV0LCAkbmV0bWFza107Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpcE1hcFRvNihzdHJpbmcgJGJpbmFyeSwgaW50ICRzaXplKTogc3RyaW5nCnsKaWYgKCRzaXplID09PSA0KSB7CiRwcmVmaXggPSBzdHJfcmVwZWF0KGNocigwKSwgMTApIC4gc3RyX3JlcGVhdChjaHIoMjU1KSwgMik7CiRiaW5hcnkgPSAkcHJlZml4IC4gJGJpbmFyeTsKfQoKcmV0dXJuICRiaW5hcnk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFrZURhdGEoc3RyaW5nICRob3N0LCBpbnQgJHBvcnQsID9zdGRDbGFzcyAkaXBkYXRhKTogc3RkQ2xhc3MKewpyZXR1cm4gKG9iamVjdCkgWwonaG9zdCcgPT4gJGhvc3QsCiduYW1lJyA9PiAnLicgLiBsdHJpbSgkaG9zdCwgJy4nKSwKJ3BvcnQnID0+ICRwb3J0LAonaXBkYXRhJyA9PiAkaXBkYXRhLApdOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtYWtlSXBEYXRhKHN0cmluZyAkaXAsIGludCAkc2l6ZSwgP3N0cmluZyAkbmV0bWFzayk6IHN0ZENsYXNzCnsKcmV0dXJuIChvYmplY3QpIFsKJ2lwJyA9PiAkaXAsCidzaXplJyA9PiAkc2l6ZSwKJ25ldG1hc2snID0+ICRuZXRtYXNrLApdOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc3BsaXRIb3N0UG9ydChzdHJpbmcgJGhvc3ROYW1lKTogYXJyYXkKewoKJGVycm9yID0gWycnLCAnJywgdHJ1ZV07CiRwb3J0ID0gMDsKJGlwNiA9ICcnOwoKCmlmICgkaG9zdE5hbWVbMF0gPT09ICdbJykgewokaW5kZXggPSBzdHJwb3MoJGhvc3ROYW1lLCAnXScpOwoKCmlmIChmYWxzZSA9PT0gJGluZGV4IHx8ICRpbmRleCA8IDMpIHsKcmV0dXJuICRlcnJvcjsKfQoKJGlwNiA9IHN1YnN0cigkaG9zdE5hbWUsIDEsICRpbmRleCAtIDEpOwokaG9zdE5hbWUgPSBzdWJzdHIoJGhvc3ROYW1lLCAkaW5kZXggKyAxKTsKCmlmIChzdHJwYnJrKCRob3N0TmFtZSwgJ1tdJykgIT09IGZhbHNlIHx8IHN1YnN0cl9jb3VudCgkaG9zdE5hbWUsICc6JykgPiAxKSB7CnJldHVybiAkZXJyb3I7Cn0KfQoKaWYgKHN1YnN0cl9jb3VudCgkaG9zdE5hbWUsICc6JykgPT09IDEpIHsKJGluZGV4ID0gc3RycG9zKCRob3N0TmFtZSwgJzonKTsKJHBvcnQgPSBzdWJzdHIoJGhvc3ROYW1lLCAkaW5kZXggKyAxKTsKJGhvc3ROYW1lID0gc3Vic3RyKCRob3N0TmFtZSwgMCwgJGluZGV4KTsKCmlmICghJHRoaXMtPnZhbGlkYXRlSW50KCRwb3J0LCAxLCA2NTUzNSkpIHsKcmV0dXJuICRlcnJvcjsKfQoKJHBvcnQgPSAoaW50KSAkcG9ydDsKfQoKJGhvc3QgPSAkaXA2IC4gJGhvc3ROYW1lOwoKcmV0dXJuIFskaG9zdCwgJHBvcnQsIGZhbHNlXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUludChzdHJpbmcgJGludCwgaW50ICRtaW4sIGludCAkbWF4KTogYm9vbAp7CiRvcHRpb25zID0gWwonb3B0aW9ucycgPT4gWwonbWluX3JhbmdlJyA9PiAkbWluLAonbWF4X3JhbmdlJyA9PiAkbWF4LApdLApdOwoKcmV0dXJuIGZhbHNlICE9PSBmaWx0ZXJfdmFyKCRpbnQsIEZJTFRFUl9WQUxJREFURV9JTlQsICRvcHRpb25zKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKY2xhc3MgUGFja2FnZUluZm8KewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZpZXdTb3VyY2VVcmwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9zdHJpbmcKewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgaXNzZXQoJHBhY2thZ2UtPmdldFN1cHBvcnQoKVsnc291cmNlJ10pICYmICcnICE9PSAkcGFja2FnZS0+Z2V0U3VwcG9ydCgpWydzb3VyY2UnXSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldFN1cHBvcnQoKVsnc291cmNlJ107Cn0KCnJldHVybiAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9zdHJpbmcKewokdXJsID0gc2VsZjo6Z2V0Vmlld1NvdXJjZVVybCgkcGFja2FnZSkgPz8gKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCkgOiBudWxsKTsKCmlmICgkdXJsID09PSAnJykgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR1cmw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwoKY2xhc3MgUGFja2FnZVNvcnRlcgp7CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TW9zdEN1cnJlbnRWZXJzaW9uKGFycmF5ICRwYWNrYWdlcyk6ID9QYWNrYWdlSW50ZXJmYWNlCnsKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKcmV0dXJuIG51bGw7Cn0KCiRoaWdoZXN0ID0gcmVzZXQoJHBhY2thZ2VzKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRjYW5kaWRhdGUpIHsKaWYgKCRjYW5kaWRhdGUtPmlzRGVmYXVsdEJyYW5jaCgpKSB7CnJldHVybiAkY2FuZGlkYXRlOwp9CgppZiAodmVyc2lvbl9jb21wYXJlKCRoaWdoZXN0LT5nZXRWZXJzaW9uKCksICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgJzwnKSkgewokaGlnaGVzdCA9ICRjYW5kaWRhdGU7Cn0KfQoKcmV0dXJuICRoaWdoZXN0Owp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzb3J0UGFja2FnZXNBbHBoYWJldGljYWxseShhcnJheSAkcGFja2FnZXMpOiBhcnJheQp7CnVzb3J0KCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRhLCBQYWNrYWdlSW50ZXJmYWNlICRiKSB7CnJldHVybiAkYS0+Z2V0TmFtZSgpIDw9PiAkYi0+Z2V0TmFtZSgpOwp9KTsKCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc29ydFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcywgYXJyYXkgJHdlaWdodHMgPSBbXSk6IGFycmF5CnsKJHVzYWdlTGlzdCA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaW5rcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokbGlua3MgPSBhcnJheV9tZXJnZSgkbGlua3MsICRwYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKfQpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJHRhcmdldCA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKJHVzYWdlTGlzdFskdGFyZ2V0XVtdID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfQp9CiRjb21wdXRpbmcgPSBbXTsKJGNvbXB1dGVkID0gW107CiRjb21wdXRlSW1wb3J0YW5jZSA9IHN0YXRpYyBmdW5jdGlvbiAoJG5hbWUpIHVzZSAoJiRjb21wdXRlSW1wb3J0YW5jZSwgJiRjb21wdXRpbmcsICYkY29tcHV0ZWQsICR1c2FnZUxpc3QsICR3ZWlnaHRzKSB7CgppZiAoaXNzZXQoJGNvbXB1dGVkWyRuYW1lXSkpIHsKcmV0dXJuICRjb21wdXRlZFskbmFtZV07Cn0KCgppZiAoaXNzZXQoJGNvbXB1dGluZ1skbmFtZV0pKSB7CnJldHVybiAwOwp9CgokY29tcHV0aW5nWyRuYW1lXSA9IHRydWU7CiR3ZWlnaHQgPSAkd2VpZ2h0c1skbmFtZV0gPz8gMDsKCmlmIChpc3NldCgkdXNhZ2VMaXN0WyRuYW1lXSkpIHsKZm9yZWFjaCAoJHVzYWdlTGlzdFskbmFtZV0gYXMgJHVzZXIpIHsKJHdlaWdodCAtPSAxIC0gJGNvbXB1dGVJbXBvcnRhbmNlKCR1c2VyKTsKfQp9Cgp1bnNldCgkY29tcHV0aW5nWyRuYW1lXSk7CiRjb21wdXRlZFskbmFtZV0gPSAkd2VpZ2h0OwoKcmV0dXJuICR3ZWlnaHQ7Cn07Cgokd2VpZ2h0ZWRQYWNrYWdlcyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiR3ZWlnaHQgPSAkY29tcHV0ZUltcG9ydGFuY2UoJG5hbWUpOwokd2VpZ2h0ZWRQYWNrYWdlc1tdID0gWyduYW1lJyA9PiAkbmFtZSwgJ3dlaWdodCcgPT4gJHdlaWdodCwgJ2luZGV4JyA9PiAkaW5kZXhdOwp9Cgp1c29ydCgkd2VpZ2h0ZWRQYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkYSwgYXJyYXkgJGIpOiBpbnQgewppZiAoJGFbJ3dlaWdodCddICE9PSAkYlsnd2VpZ2h0J10pIHsKcmV0dXJuICRhWyd3ZWlnaHQnXSAtICRiWyd3ZWlnaHQnXTsKfQoKcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7Cn0pOwoKJHNvcnRlZFBhY2thZ2VzID0gW107Cgpmb3JlYWNoICgkd2VpZ2h0ZWRQYWNrYWdlcyBhcyAkcGtnKSB7CiRzb3J0ZWRQYWNrYWdlc1tdID0gJHBhY2thZ2VzWyRwa2dbJ2luZGV4J11dOwp9CgpyZXR1cm4gJHNvcnRlZFBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmNsYXNzIFBlcmZvcmNlCnsKCnByb3RlY3RlZCAkcGF0aDsKCnByb3RlY3RlZCAkcDREZXBvdDsKCnByb3RlY3RlZCAkcDRDbGllbnQ7Cgpwcm90ZWN0ZWQgJHA0VXNlcjsKCnByb3RlY3RlZCAkcDRQYXNzd29yZDsKCnByb3RlY3RlZCAkcDRQb3J0OwoKcHJvdGVjdGVkICRwNFN0cmVhbTsKCnByb3RlY3RlZCAkcDRDbGllbnRTcGVjOwoKcHJvdGVjdGVkICRwNERlcG90VHlwZTsKCnByb3RlY3RlZCAkcDRCcmFuY2g7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJHVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZTsKCnByb3RlY3RlZCAkd2luZG93c0ZsYWc7Cgpwcm90ZWN0ZWQgJGNvbW1hbmRSZXN1bHQ7CgoKcHJvdGVjdGVkICRpbzsKCgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJlcG9Db25maWcsIHN0cmluZyAkcG9ydCwgc3RyaW5nICRwYXRoLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIGJvb2wgJGlzV2luZG93cywgSU9JbnRlcmZhY2UgJGlvKQp7CiR0aGlzLT53aW5kb3dzRmxhZyA9ICRpc1dpbmRvd3M7CiR0aGlzLT5wNFBvcnQgPSAkcG9ydDsKJHRoaXMtPmluaXRpYWxpemVQYXRoKCRwYXRoKTsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKJHRoaXMtPmluaXRpYWxpemUoJHJlcG9Db25maWcpOwokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCRyZXBvQ29uZmlnLCBzdHJpbmcgJHBvcnQsIHN0cmluZyAkcGF0aCwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCBJT0ludGVyZmFjZSAkaW8pOiBzZWxmCnsKcmV0dXJuIG5ldyBQZXJmb3JjZSgkcmVwb0NvbmZpZywgJHBvcnQsICRwYXRoLCAkcHJvY2VzcywgUGxhdGZvcm06OmlzV2luZG93cygpLCAkaW8pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrU2VydmVyRXhpc3RzKHN0cmluZyAkdXJsLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3NFeGVjdXRvcik6IGJvb2wKewpyZXR1cm4gMCA9PT0gJHByb2Nlc3NFeGVjdXRvci0+ZXhlY3V0ZSgncDQgLXAgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR1cmwpIC4gJyBpbmZvIC1zJywgJGlnbm9yZWRPdXRwdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgkcmVwb0NvbmZpZyk6IHZvaWQKewokdGhpcy0+dW5pcXVlUGVyZm9yY2VDbGllbnROYW1lID0gJHRoaXMtPmdlbmVyYXRlVW5pcXVlUGVyZm9yY2VDbGllbnROYW1lKCk7CmlmICghJHJlcG9Db25maWcpIHsKcmV0dXJuOwp9CmlmIChpc3NldCgkcmVwb0NvbmZpZ1sndW5pcXVlX3BlcmZvcmNlX2NsaWVudF9uYW1lJ10pKSB7CiR0aGlzLT51bmlxdWVQZXJmb3JjZUNsaWVudE5hbWUgPSAkcmVwb0NvbmZpZ1sndW5pcXVlX3BlcmZvcmNlX2NsaWVudF9uYW1lJ107Cn0KCmlmIChpc3NldCgkcmVwb0NvbmZpZ1snZGVwb3QnXSkpIHsKJHRoaXMtPnA0RGVwb3QgPSAkcmVwb0NvbmZpZ1snZGVwb3QnXTsKfQppZiAoaXNzZXQoJHJlcG9Db25maWdbJ2JyYW5jaCddKSkgewokdGhpcy0+cDRCcmFuY2ggPSAkcmVwb0NvbmZpZ1snYnJhbmNoJ107Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydwNHVzZXInXSkpIHsKJHRoaXMtPnA0VXNlciA9ICRyZXBvQ29uZmlnWydwNHVzZXInXTsKfSBlbHNlIHsKJHRoaXMtPnA0VXNlciA9ICR0aGlzLT5nZXRQNHZhcmlhYmxlKCdQNFVTRVInKTsKfQppZiAoaXNzZXQoJHJlcG9Db25maWdbJ3A0cGFzc3dvcmQnXSkpIHsKJHRoaXMtPnA0UGFzc3dvcmQgPSAkcmVwb0NvbmZpZ1sncDRwYXNzd29yZCddOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplRGVwb3RBbmRCcmFuY2goP3N0cmluZyAkZGVwb3QsID9zdHJpbmcgJGJyYW5jaCk6IHZvaWQKewppZiAoaXNzZXQoJGRlcG90KSkgewokdGhpcy0+cDREZXBvdCA9ICRkZXBvdDsKfQppZiAoaXNzZXQoJGJyYW5jaCkpIHsKJHRoaXMtPnA0QnJhbmNoID0gJGJyYW5jaDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2VuZXJhdGVVbmlxdWVQZXJmb3JjZUNsaWVudE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuIGdldGhvc3RuYW1lKCkgLiAiXyIgLiB0aW1lKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwQ2xpZW50U3BlYygpOiB2b2lkCnsKJGNsaWVudCA9ICR0aGlzLT5nZXRDbGllbnQoKTsKJHRhc2sgPSAnY2xpZW50IC1kICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkY2xpZW50KTsKJHVzZVA0Q2xpZW50ID0gZmFsc2U7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCR0YXNrLCAkdXNlUDRDbGllbnQpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokY2xpZW50U3BlYyA9ICR0aGlzLT5nZXRQNENsaWVudFNwZWMoKTsKJGZpbGVTeXN0ZW0gPSAkdGhpcy0+Z2V0RmlsZXN5c3RlbSgpOwokZmlsZVN5c3RlbS0+cmVtb3ZlKCRjbGllbnRTcGVjKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTogaW50CnsKJHRoaXMtPmNvbW1hbmRSZXN1bHQgPSAnJzsKCnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJHRoaXMtPmNvbW1hbmRSZXN1bHQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xpZW50KCk6IHN0cmluZwp7CmlmICghaXNzZXQoJHRoaXMtPnA0Q2xpZW50KSkgewokY2xlYW5TdHJlYW1OYW1lID0gc3RyX3JlcGxhY2UoWycvLycsICcvJywgJ0AnXSwgWycnLCAnXycsICcnXSwgJHRoaXMtPmdldFN0cmVhbSgpKTsKJHRoaXMtPnA0Q2xpZW50ID0gJ2NvbXBvc2VyX3BlcmZvcmNlXycgLiAkdGhpcy0+dW5pcXVlUGVyZm9yY2VDbGllbnROYW1lIC4gJ18nIC4gJGNsZWFuU3RyZWFtTmFtZTsKfQoKcmV0dXJuICR0aGlzLT5wNENsaWVudDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBhdGgoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wYXRoOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZVBhdGgoc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5wYXRoID0gJHBhdGg7CiRmcyA9ICR0aGlzLT5nZXRGaWxlc3lzdGVtKCk7CiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRwYXRoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBvcnQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wNFBvcnQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHJlYW0oc3RyaW5nICRzdHJlYW0pOiB2b2lkCnsKJHRoaXMtPnA0U3RyZWFtID0gJHN0cmVhbTsKJGluZGV4ID0gc3RycnBvcygkc3RyZWFtLCAnLycpOwoKaWYgKCRpbmRleCA+IDIpIHsKJHRoaXMtPnA0RGVwb3RUeXBlID0gJ3N0cmVhbSc7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RyZWFtKCk6IGJvb2wKewpyZXR1cm4gaXNfc3RyaW5nKCR0aGlzLT5wNERlcG90VHlwZSkgJiYgKHN0cmNtcCgkdGhpcy0+cDREZXBvdFR5cGUsICdzdHJlYW0nKSA9PT0gMCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+cDRTdHJlYW0pKSB7CmlmICgkdGhpcy0+aXNTdHJlYW0oKSkgewokdGhpcy0+cDRTdHJlYW0gPSAnLy8nIC4gJHRoaXMtPnA0RGVwb3QgLiAnLycgLiAkdGhpcy0+cDRCcmFuY2g7Cn0gZWxzZSB7CiR0aGlzLT5wNFN0cmVhbSA9ICcvLycgLiAkdGhpcy0+cDREZXBvdDsKfQp9CgpyZXR1cm4gJHRoaXMtPnA0U3RyZWFtOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtV2l0aG91dExhYmVsKHN0cmluZyAkc3RyZWFtKTogc3RyaW5nCnsKJGluZGV4ID0gc3RycG9zKCRzdHJlYW0sICdAJyk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybiAkc3RyZWFtOwp9CgpyZXR1cm4gc3Vic3RyKCRzdHJlYW0sIDAsICRpbmRleCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQNENsaWVudFNwZWMoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wYXRoIC4gJy8nIC4gJHRoaXMtPmdldENsaWVudCgpIC4gJy5wNC5zcGVjJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVzZXIoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+cDRVc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VXNlcig/c3RyaW5nICR1c2VyKTogdm9pZAp7CiR0aGlzLT5wNFVzZXIgPSAkdXNlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHF1ZXJ5UDRVc2VyKCk6IHZvaWQKewokdGhpcy0+Z2V0VXNlcigpOwppZiAoc3RybGVuKChzdHJpbmcpICR0aGlzLT5wNFVzZXIpID4gMCkgewpyZXR1cm47Cn0KJHRoaXMtPnA0VXNlciA9ICR0aGlzLT5nZXRQNHZhcmlhYmxlKCdQNFVTRVInKTsKaWYgKHN0cmxlbigoc3RyaW5nKSAkdGhpcy0+cDRVc2VyKSA+IDApIHsKcmV0dXJuOwp9CiR0aGlzLT5wNFVzZXIgPSAkdGhpcy0+aW8tPmFzaygnRW50ZXIgUDQgVXNlcjonKTsKaWYgKCR0aGlzLT53aW5kb3dzRmxhZykgewokY29tbWFuZCA9ICdwNCBzZXQgUDRVU0VSPScgLiAkdGhpcy0+cDRVc2VyOwp9IGVsc2UgewokY29tbWFuZCA9ICdleHBvcnQgUDRVU0VSPScgLiAkdGhpcy0+cDRVc2VyOwp9CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQNHZhcmlhYmxlKHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewppZiAoJHRoaXMtPndpbmRvd3NGbGFnKSB7CiRjb21tYW5kID0gJ3A0IHNldCc7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSB0cmltKCR0aGlzLT5jb21tYW5kUmVzdWx0KTsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CiRmaWVsZHMgPSBleHBsb2RlKCc9JywgJGxpbmUpOwppZiAoc3RyY21wKCRuYW1lLCAkZmllbGRzWzBdKSA9PT0gMCkgewokaW5kZXggPSBzdHJwb3MoJGZpZWxkc1sxXSwgJyAnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKJHZhbHVlID0gJGZpZWxkc1sxXTsKfSBlbHNlIHsKJHZhbHVlID0gc3Vic3RyKCRmaWVsZHNbMV0sIDAsICRpbmRleCk7Cn0KJHZhbHVlID0gdHJpbSgkdmFsdWUpOwoKcmV0dXJuICR2YWx1ZTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSAnZWNobyAkJyAuICRuYW1lOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gdHJpbSgkdGhpcy0+Y29tbWFuZFJlc3VsdCk7CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIHF1ZXJ5UDRQYXNzd29yZCgpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCR0aGlzLT5wNFBhc3N3b3JkKSkgewpyZXR1cm4gJHRoaXMtPnA0UGFzc3dvcmQ7Cn0KJHBhc3N3b3JkID0gJHRoaXMtPmdldFA0dmFyaWFibGUoJ1A0UEFTU1dEJyk7CmlmIChzdHJsZW4oKHN0cmluZykgJHBhc3N3b3JkKSA8PSAwKSB7CiRwYXNzd29yZCA9ICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignRW50ZXIgcGFzc3dvcmQgZm9yIFBlcmZvcmNlIHVzZXIgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiAnOiAnKTsKfQokdGhpcy0+cDRQYXNzd29yZCA9ICRwYXNzd29yZDsKCnJldHVybiAkcGFzc3dvcmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZVA0Q29tbWFuZChzdHJpbmcgJGNvbW1hbmQsIGJvb2wgJHVzZUNsaWVudCA9IHRydWUpOiBzdHJpbmcKewokcDRDb21tYW5kID0gJ3A0ICc7CiRwNENvbW1hbmQgLj0gJy11ICcgLiAkdGhpcy0+Z2V0VXNlcigpIC4gJyAnOwppZiAoJHVzZUNsaWVudCkgewokcDRDb21tYW5kIC49ICctYyAnIC4gJHRoaXMtPmdldENsaWVudCgpIC4gJyAnOwp9CiRwNENvbW1hbmQgLj0gJy1wICcgLiAkdGhpcy0+Z2V0UG9ydCgpIC4gJyAnIC4gJGNvbW1hbmQ7CgpyZXR1cm4gJHA0Q29tbWFuZDsKfQoKcHVibGljIGZ1bmN0aW9uIGlzTG9nZ2VkSW4oKTogYm9vbAp7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdsb2dpbiAtcycsIGZhbHNlKTsKJGV4aXRDb2RlID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKaWYgKCRleGl0Q29kZSkgewokZXJyb3JPdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKJGluZGV4ID0gc3RycG9zKCRlcnJvck91dHB1dCwgJHRoaXMtPmdldFVzZXIoKSk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CiRpbmRleCA9IHN0cnBvcygkZXJyb3JPdXRwdXQsICdwNCcpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewpyZXR1cm4gZmFsc2U7Cn0KdGhyb3cgbmV3IFxFeGNlcHRpb24oJ3A0IGNvbW1hbmQgbm90IGZvdW5kIGluIHBhdGg6ICcgLiAkZXJyb3JPdXRwdXQpOwp9CnRocm93IG5ldyBcRXhjZXB0aW9uKCdJbnZhbGlkIHVzZXIgbmFtZTogJyAuICR0aGlzLT5nZXRVc2VyKCkpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIGNvbm5lY3RDbGllbnQoKTogdm9pZAp7CiRwNENyZWF0ZUNsaWVudENvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoCidjbGllbnQgLWkgPCAnIC4gc3RyX3JlcGxhY2UoIiAiLCAiXFwgIiwgJHRoaXMtPmdldFA0Q2xpZW50U3BlYygpKQopOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJHA0Q3JlYXRlQ2xpZW50Q29tbWFuZCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzeW5jQ29kZUJhc2UoP3N0cmluZyAkc291cmNlUmVmZXJlbmNlKTogdm9pZAp7CiRwcmV2RGlyID0gUGxhdGZvcm06OmdldEN3ZCgpOwpjaGRpcigkdGhpcy0+cGF0aCk7CiRwNFN5bmNDb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdzeW5jIC1mICcpOwppZiAobnVsbCAhPT0gJHNvdXJjZVJlZmVyZW5jZSkgewokcDRTeW5jQ29tbWFuZCAuPSAnQCcgLiAkc291cmNlUmVmZXJlbmNlOwp9CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkcDRTeW5jQ29tbWFuZCk7CmNoZGlyKCRwcmV2RGlyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlQ2xpZW50U3BlY1RvRmlsZSgkc3BlYyk6IHZvaWQKewpmd3JpdGUoJHNwZWMsICdDbGllbnQ6ICcgLiAkdGhpcy0+Z2V0Q2xpZW50KCkgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ1VwZGF0ZTogJyAuIGRhdGUoJ1kvbS9kIEg6aTpzJykgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ0FjY2VzczogJyAuIGRhdGUoJ1kvbS9kIEg6aTpzJykgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnT3duZXI6ICAnIC4gJHRoaXMtPmdldFVzZXIoKSAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnRGVzY3JpcHRpb246JyAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICcgIENyZWF0ZWQgYnkgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiAnIGZyb20gY29tcG9zZXIuJyAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnUm9vdDogJyAuICR0aGlzLT5nZXRQYXRoKCkgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ09wdGlvbnM6ICBub2FsbHdyaXRlIG5vY2xvYmJlciBub2NvbXByZXNzIHVubG9ja2VkIG1vZHRpbWUgcm1kaXInIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdTdWJtaXRPcHRpb25zOiAgcmV2ZXJ0dW5jaGFuZ2VkJyAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnTGluZUVuZDogIGxvY2FsJyAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKaWYgKCR0aGlzLT5pc1N0cmVhbSgpKSB7CmZ3cml0ZSgkc3BlYywgJ1N0cmVhbTonIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJyAgJyAuICR0aGlzLT5nZXRTdHJlYW1XaXRob3V0TGFiZWwoJHRoaXMtPnA0U3RyZWFtKSAuIFBIUF9FT0wpOwp9IGVsc2Ugewpmd3JpdGUoCiRzcGVjLAonVmlldzogICcgLiAkdGhpcy0+Z2V0U3RyZWFtKCkgLiAnLy4uLiAgLy8nIC4gJHRoaXMtPmdldENsaWVudCgpIC4gJy8uLi4gJyAuIFBIUF9FT0wKKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVQNENsaWVudFNwZWMoKTogdm9pZAp7CiRjbGllbnRTcGVjID0gJHRoaXMtPmdldFA0Q2xpZW50U3BlYygpOwokc3BlYyA9IGZvcGVuKCRjbGllbnRTcGVjLCAndycpOwp0cnkgewokdGhpcy0+d3JpdGVDbGllbnRTcGVjVG9GaWxlKCRzcGVjKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpmY2xvc2UoJHNwZWMpOwp0aHJvdyAkZTsKfQpmY2xvc2UoJHNwZWMpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlYWQoJHBpcGUsICRuYW1lKTogdm9pZAp7CmlmIChmZW9mKCRwaXBlKSkgewpyZXR1cm47Cn0KJGxpbmUgPSBmZ2V0cygkcGlwZSk7CndoaWxlICgkbGluZSAhPT0gZmFsc2UpIHsKJGxpbmUgPSBmZ2V0cygkcGlwZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHdpbmRvd3NMb2dpbig/c3RyaW5nICRwYXNzd29yZCk6IGludAp7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCcgbG9naW4gLWEnKTsKCiRwcm9jZXNzID0gUHJvY2Vzczo6ZnJvbVNoZWxsQ29tbWFuZGxpbmUoJGNvbW1hbmQsIG51bGwsIG51bGwsICRwYXNzd29yZCk7CgpyZXR1cm4gJHByb2Nlc3MtPnJ1bigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcDRMb2dpbigpOiB2b2lkCnsKJHRoaXMtPnF1ZXJ5UDRVc2VyKCk7CmlmICghJHRoaXMtPmlzTG9nZ2VkSW4oKSkgewokcGFzc3dvcmQgPSAkdGhpcy0+cXVlcnlQNFBhc3N3b3JkKCk7CmlmICgkdGhpcy0+d2luZG93c0ZsYWcpIHsKJHRoaXMtPndpbmRvd3NMb2dpbigkcGFzc3dvcmQpOwp9IGVsc2UgewokY29tbWFuZCA9ICdlY2hvICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkcGFzc3dvcmQpIC4gJyB8ICcgLiAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJyBsb2dpbiAtYScsIGZhbHNlKTsKJGV4aXRDb2RlID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKaWYgKCRleGl0Q29kZSkgewp0aHJvdyBuZXcgXEV4Y2VwdGlvbigiRXJyb3IgbG9nZ2luZyBpbjoiIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokY29tcG9zZXJGaWxlQ29udGVudCA9ICR0aGlzLT5nZXRGaWxlQ29udGVudCgnY29tcG9zZXIuanNvbicsICRpZGVudGlmaWVyKTsKCmlmICghJGNvbXBvc2VyRmlsZUNvbnRlbnQpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBqc29uX2RlY29kZSgkY29tcG9zZXJGaWxlQ29udGVudCwgdHJ1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewokcGF0aCA9ICR0aGlzLT5nZXRGaWxlUGF0aCgkZmlsZSwgJGlkZW50aWZpZXIpOwoKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJyBwcmludCAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBhdGgpKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwoKaWYgKCF0cmltKCRyZXN1bHQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVQYXRoKHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CiRpbmRleCA9IHN0cnBvcygkaWRlbnRpZmllciwgJ0AnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKcmV0dXJuICRpZGVudGlmaWVyLiAnLycgLiAkZmlsZTsKfQoKJHBhdGggPSBzdWJzdHIoJGlkZW50aWZpZXIsIDAsICRpbmRleCkgLiAnLycgLiAkZmlsZSAuIHN1YnN0cigkaWRlbnRpZmllciwgJGluZGV4KTsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJyBmaWxlcyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBhdGgpLCBmYWxzZSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJGluZGV4MiA9IHN0cnBvcygkcmVzdWx0LCAnbm8gc3VjaCBmaWxlKHMpLicpOwppZiAoJGluZGV4MiA9PT0gZmFsc2UpIHsKJGluZGV4MyA9IHN0cnBvcygkcmVzdWx0LCAnY2hhbmdlJyk7CmlmICgkaW5kZXgzICE9PSBmYWxzZSkgewokcGhyYXNlID0gdHJpbShzdWJzdHIoJHJlc3VsdCwgJGluZGV4MykpOwokZmllbGRzID0gZXhwbG9kZSgnICcsICRwaHJhc2UpOwoKcmV0dXJuIHN1YnN0cigkaWRlbnRpZmllciwgMCwgJGluZGV4KSAuICcvJyAuICRmaWxlIC4gJ0AnIC4gJGZpZWxkc1sxXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKJHBvc3NpYmxlQnJhbmNoZXMgPSBbXTsKaWYgKCEkdGhpcy0+aXNTdHJlYW0oKSkgewokcG9zc2libGVCcmFuY2hlc1skdGhpcy0+cDRCcmFuY2hdID0gJHRoaXMtPmdldFN0cmVhbSgpOwp9IGVsc2UgewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnc3RyZWFtcyAnLlByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCcvLycgLiAkdGhpcy0+cDREZXBvdCAuICcvLi4uJykpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CiRyZXNBcnJheSA9IGV4cGxvZGUoUEhQX0VPTCwgJHJlc3VsdCk7CmZvcmVhY2ggKCRyZXNBcnJheSBhcyAkbGluZSkgewokcmVzQml0cyA9IGV4cGxvZGUoJyAnLCAkbGluZSk7CmlmIChjb3VudCgkcmVzQml0cykgPiA0KSB7CiRicmFuY2ggPSBQcmVnOjpyZXBsYWNlKCcvW15BLVphLXowLTkgXS8nLCAnJywgJHJlc0JpdHNbNF0pOwokcG9zc2libGVCcmFuY2hlc1skYnJhbmNoXSA9ICRyZXNCaXRzWzFdOwp9Cn0KfQokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnY2hhbmdlcyAnLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdGhpcy0+Z2V0U3RyZWFtKCkgLiAnLy4uLicpLCBmYWxzZSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKJGxhc3RDb21taXQgPSAkcmVzQXJyYXlbMF07CiRsYXN0Q29tbWl0QXJyID0gZXhwbG9kZSgnICcsICRsYXN0Q29tbWl0KTsKJGxhc3RDb21taXROdW0gPSAkbGFzdENvbW1pdEFyclsxXTsKCnJldHVybiBbJ21hc3RlcicgPT4gJHBvc3NpYmxlQnJhbmNoZXNbJHRoaXMtPnA0QnJhbmNoXSAuICdAJy4gJGxhc3RDb21taXROdW1dOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdsYWJlbHMnKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwokcmVzQXJyYXkgPSBleHBsb2RlKFBIUF9FT0wsICRyZXN1bHQpOwokdGFncyA9IFtdOwpmb3JlYWNoICgkcmVzQXJyYXkgYXMgJGxpbmUpIHsKaWYgKHN0cnBvcygkbGluZSwgJ0xhYmVsJykgIT09IGZhbHNlKSB7CiRmaWVsZHMgPSBleHBsb2RlKCcgJywgJGxpbmUpOwokdGFnc1skZmllbGRzWzFdXSA9ICR0aGlzLT5nZXRTdHJlYW0oKSAuICdAJyAuICRmaWVsZHNbMV07Cn0KfQoKcmV0dXJuICR0YWdzOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2tTdHJlYW0oKTogYm9vbAp7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdkZXBvdHMnLCBmYWxzZSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CmlmIChzdHJwb3MoJGxpbmUsICdEZXBvdCcpICE9PSBmYWxzZSkgewokZmllbGRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKaWYgKHN0cmNtcCgkdGhpcy0+cDREZXBvdCwgJGZpZWxkc1sxXSkgPT09IDApIHsKJHRoaXMtPnA0RGVwb3RUeXBlID0gJGZpZWxkc1szXTsKCnJldHVybiAkdGhpcy0+aXNTdHJlYW0oKTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENoYW5nZUxpc3Qoc3RyaW5nICRyZWZlcmVuY2UpOiBtaXhlZAp7CiRpbmRleCA9IHN0cnBvcygkcmVmZXJlbmNlLCAnQCcpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewpyZXR1cm4gbnVsbDsKfQokbGFiZWwgPSBzdWJzdHIoJHJlZmVyZW5jZSwgJGluZGV4KTsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJyBjaGFuZ2VzIC1tMSAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGxhYmVsKSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRjaGFuZ2VzID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CmlmIChzdHJwb3MoJGNoYW5nZXMsICdDaGFuZ2UnKSAhPT0gMCkgewpyZXR1cm4gbnVsbDsKfQokZmllbGRzID0gZXhwbG9kZSgnICcsICRjaGFuZ2VzKTsKCnJldHVybiAkZmllbGRzWzFdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UpOiBtaXhlZAp7CiRmcm9tQ2hhbmdlTGlzdCA9ICR0aGlzLT5nZXRDaGFuZ2VMaXN0KCRmcm9tUmVmZXJlbmNlKTsKaWYgKCRmcm9tQ2hhbmdlTGlzdCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQokdG9DaGFuZ2VMaXN0ID0gJHRoaXMtPmdldENoYW5nZUxpc3QoJHRvUmVmZXJlbmNlKTsKaWYgKCR0b0NoYW5nZUxpc3QgPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KJGluZGV4ID0gc3RycG9zKCRmcm9tUmVmZXJlbmNlLCAnQCcpOwokbWFpbiA9IHN1YnN0cigkZnJvbVJlZmVyZW5jZSwgMCwgJGluZGV4KSAuICcvLi4uJzsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ2ZpbGVsb2cgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRtYWluIC4gJ0AnIC4gJGZyb21DaGFuZ2VMaXN0LiAnLCcgLiAkdG9DaGFuZ2VMaXN0KSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CgpyZXR1cm4gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlc3lzdGVtKCk6IEZpbGVzeXN0ZW0KewppZiAobnVsbCA9PT0gJHRoaXMtPmZpbGVzeXN0ZW0pIHsKJHRoaXMtPmZpbGVzeXN0ZW0gPSBuZXcgRmlsZXN5c3RlbSgkdGhpcy0+cHJvY2Vzcyk7Cn0KCnJldHVybiAkdGhpcy0+ZmlsZXN5c3RlbTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEZpbGVzeXN0ZW0oRmlsZXN5c3RlbSAkZnMpOiB2b2lkCnsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZnM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCmNsYXNzIFBsYXRmb3JtCnsKCnByaXZhdGUgc3RhdGljICRpc1ZpcnR1YWxCb3hHdWVzdCA9IG51bGw7Cgpwcml2YXRlIHN0YXRpYyAkaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXggPSBudWxsOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEN3ZChib29sICRhbGxvd0VtcHR5ID0gZmFsc2UpOiBzdHJpbmcKewokY3dkID0gZ2V0Y3dkKCk7CgoKaWYgKGZhbHNlID09PSAkY3dkKSB7CiRjd2QgPSByZWFscGF0aCgnJyk7Cn0KCgppZiAoZmFsc2UgPT09ICRjd2QpIHsKaWYgKCRhbGxvd0VtcHR5KSB7CnJldHVybiAnJzsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Jyk7Cn0KCnJldHVybiAkY3dkOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RW52KHN0cmluZyAkbmFtZSkKewppZiAoYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJF9TRVJWRVIpKSB7CnJldHVybiAoc3RyaW5nKSAkX1NFUlZFUlskbmFtZV07Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJG5hbWUsICRfRU5WKSkgewpyZXR1cm4gKHN0cmluZykgJF9FTlZbJG5hbWVdOwp9CgpyZXR1cm4gZ2V0ZW52KCRuYW1lKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwdXRFbnYoc3RyaW5nICRuYW1lLCBzdHJpbmcgJHZhbHVlKTogdm9pZAp7CiR2YWx1ZSA9IChzdHJpbmcpICR2YWx1ZTsKcHV0ZW52KCRuYW1lIC4gJz0nIC4gJHZhbHVlKTsKJF9TRVJWRVJbJG5hbWVdID0gJF9FTlZbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFyRW52KHN0cmluZyAkbmFtZSk6IHZvaWQKewpwdXRlbnYoJG5hbWUpOwp1bnNldCgkX1NFUlZFUlskbmFtZV0sICRfRU5WWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXhwYW5kUGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaCgnI15+W1xcL10jJywgJHBhdGgpKSB7CnJldHVybiBzZWxmOjpnZXRVc2VyRGlyZWN0b3J5KCkgLiBzdWJzdHIoJHBhdGgsIDEpOwp9CgpyZXR1cm4gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCcjXihcJHwoP1A8cGVyY2VudD4lKSkoP1A8dmFyPlx3KyspKD8ocGVyY2VudCklKSg/UDxwYXRoPi4qKSMnLCBzdGF0aWMgZnVuY3Rpb24gKCRtYXRjaGVzKTogc3RyaW5nIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1sndmFyJ10pKTsKCgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmICRtYXRjaGVzWyd2YXInXSA9PT0gJ0hPTUUnKSB7CnJldHVybiAoUGxhdGZvcm06OmdldEVudignSE9NRScpID86IFBsYXRmb3JtOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykpIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfQoKcmV0dXJuIFBsYXRmb3JtOjpnZXRFbnYoJG1hdGNoZXNbJ3ZhciddKSAuICRtYXRjaGVzWydwYXRoJ107Cn0sICRwYXRoKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VXNlckRpcmVjdG9yeSgpOiBzdHJpbmcKewppZiAoZmFsc2UgIT09ICgkaG9tZSA9IHNlbGY6OmdldEVudignSE9NRScpKSkgewpyZXR1cm4gJGhvbWU7Cn0KCmlmIChzZWxmOjppc1dpbmRvd3MoKSAmJiBmYWxzZSAhPT0gKCRob21lID0gc2VsZjo6Z2V0RW52KCdVU0VSUFJPRklMRScpKSkgewpyZXR1cm4gJGhvbWU7Cn0KCmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXR1aWQnKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpKSB7CiRpbmZvID0gcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0dWlkKCkpOwoKcmV0dXJuICRpbmZvWydkaXInXTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHVzZXIgZGlyZWN0b3J5Jyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgpIHsKc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gZmFsc2U7CgoKaWYgKHNlbGY6OmlzV2luZG93cygpKSB7CnJldHVybiBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXggPSBmYWxzZTsKfQoKaWYgKAohaW5pX2dldCgnb3Blbl9iYXNlZGlyJykKJiYgaXNfcmVhZGFibGUoJy9wcm9jL3ZlcnNpb24nKQomJiBmYWxzZSAhPT0gc3RyaXBvcygoc3RyaW5nKVNpbGVuY2VyOjpjYWxsKCdmaWxlX2dldF9jb250ZW50cycsICcvcHJvYy92ZXJzaW9uJyksICdtaWNyb3NvZnQnKQomJiAhZmlsZV9leGlzdHMoJy8uZG9ja2VyZW52JykgCikgewpyZXR1cm4gc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gdHJ1ZTsKfQp9CgpyZXR1cm4gc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzV2luZG93cygpOiBib29sCnsKcmV0dXJuIFxkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RybGVuKHN0cmluZyAkc3RyKTogaW50CnsKc3RhdGljICR1c2VNYlN0cmluZyA9IG51bGw7CmlmIChudWxsID09PSAkdXNlTWJTdHJpbmcpIHsKJHVzZU1iU3RyaW5nID0gXGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpOwp9CgppZiAoJHVzZU1iU3RyaW5nKSB7CnJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKfQoKcmV0dXJuIFxzdHJsZW4oJHN0cik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNUdHkoJGZkID0gbnVsbCk6IGJvb2wKewppZiAoJGZkID09PSBudWxsKSB7CiRmZCA9IGRlZmluZWQoJ1NURE9VVCcpID8gU1RET1VUIDogZm9wZW4oJ3BocDovL3N0ZG91dCcsICd3Jyk7CmlmICgkZmQgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKCmlmIChpbl9hcnJheShzdHJ0b3VwcGVyKHNlbGY6OmdldEVudignTVNZU1RFTScpID86ICcnKSwgWydNSU5HVzMyJywgJ01JTkdXNjQnXSwgdHJ1ZSkpIHsKcmV0dXJuIHRydWU7Cn0KCgoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnc3RyZWFtX2lzYXR0eScpKSB7CnJldHVybiBzdHJlYW1faXNhdHR5KCRmZCk7Cn0KCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9pc2F0dHknKSAmJiBwb3NpeF9pc2F0dHkoJGZkKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJHN0YXQgPSBAZnN0YXQoJGZkKTsKCnJldHVybiAkc3RhdCA/IDAwMjAwMDAgPT09ICgkc3RhdFsnbW9kZSddICYgMDE3MDAwMCkgOiBmYWxzZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKTogYm9vbAp7CnJldHVybiAnX2NvbXBsZXRlJyA9PT0gKCRfU0VSVkVSWydhcmd2J11bMV0gPz8gbnVsbCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd29ya2Fyb3VuZEZpbGVzeXN0ZW1Jc3N1ZXMoKTogdm9pZAp7CmlmIChzZWxmOjppc1ZpcnR1YWxCb3hHdWVzdCgpKSB7CnVzbGVlcCgyMDAwMDApOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNWaXJ0dWFsQm94R3Vlc3QoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QpIHsKc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0ID0gZmFsc2U7CmlmIChzZWxmOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0Owp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpKSB7CiRwcm9jZXNzVXNlciA9IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk7CmlmICgkcHJvY2Vzc1VzZXIgJiYgJHByb2Nlc3NVc2VyWyduYW1lJ10gPT09ICd2YWdyYW50JykgewpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0ID0gdHJ1ZTsKfQp9CgppZiAoc2VsZjo6Z2V0RW52KCdDT01QT1NFUl9SVU5USU1FX0VOVicpID09PSAndmlydHVhbGJveCcpIHsKcmV0dXJuIHNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdCA9IHRydWU7Cn0KCmlmIChkZWZpbmVkKCdQSFBfT1NfRkFNSUxZJykgJiYgUEhQX09TX0ZBTUlMWSA9PT0gJ0xpbnV4JykgewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKdHJ5IHsKaWYgKDAgPT09ICRwcm9jZXNzLT5leGVjdXRlKCdsc21vZCB8IGdyZXAgdmJveGd1ZXN0JywgJGlnbm9yZWRPdXRwdXQpKSB7CnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QgPSB0cnVlOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCn0KfQp9CgpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERldk51bGwoKTogc3RyaW5nCnsKaWYgKHNlbGY6OmlzV2luZG93cygpKSB7CnJldHVybiAnTlVMJzsKfQoKcmV0dXJuICcvZGV2L251bGwnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTZWxkXFNpZ25hbFxTaWduYWxIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgpjbGFzcyBQcm9jZXNzRXhlY3V0b3IKewpwcml2YXRlIGNvbnN0IFNUQVRVU19RVUVVRUQgPSAxOwpwcml2YXRlIGNvbnN0IFNUQVRVU19TVEFSVEVEID0gMjsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQ09NUExFVEVEID0gMzsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfRkFJTEVEID0gNDsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQUJPUlRFRCA9IDU7CgoKcHJvdGVjdGVkIHN0YXRpYyAkdGltZW91dCA9IDMwMDsKCgpwcm90ZWN0ZWQgJGNhcHR1cmVPdXRwdXQgPSBmYWxzZTsKCnByb3RlY3RlZCAkZXJyb3JPdXRwdXQgPSAnJzsKCnByb3RlY3RlZCAkaW87CgoKCgpwcml2YXRlICRqb2JzID0gW107Cgpwcml2YXRlICRydW5uaW5nSm9icyA9IDA7Cgpwcml2YXRlICRtYXhKb2JzID0gMTA7Cgpwcml2YXRlICRpZEdlbiA9IDA7Cgpwcml2YXRlICRhbGxvd0FzeW5jID0gZmFsc2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgkY29tbWFuZCwgJiRvdXRwdXQgPSBudWxsLCA/c3RyaW5nICRjd2QgPSBudWxsKTogaW50CnsKaWYgKGZ1bmNfbnVtX2FyZ3MoKSA+IDEpIHsKcmV0dXJuICR0aGlzLT5kb0V4ZWN1dGUoJGNvbW1hbmQsICRjd2QsIGZhbHNlLCAkb3V0cHV0KTsKfQoKcmV0dXJuICR0aGlzLT5kb0V4ZWN1dGUoJGNvbW1hbmQsICRjd2QsIGZhbHNlKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlVHR5KCRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsKTogaW50CnsKaWYgKFBsYXRmb3JtOjppc1R0eSgpKSB7CnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCB0cnVlKTsKfQoKcmV0dXJuICR0aGlzLT5kb0V4ZWN1dGUoJGNvbW1hbmQsICRjd2QsIGZhbHNlKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9FeGVjdXRlKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsIGJvb2wgJHR0eSwgJiRvdXRwdXQgPSBudWxsKTogaW50CnsKJHRoaXMtPm91dHB1dENvbW1hbmRSdW4oJGNvbW1hbmQsICRjd2QsIGZhbHNlKTsKCiR0aGlzLT5jYXB0dXJlT3V0cHV0ID0gZnVuY19udW1fYXJncygpID4gMzsKJHRoaXMtPmVycm9yT3V0cHV0ID0gJyc7CgppZiAoaXNfc3RyaW5nKCRjb21tYW5kKSkgewokcHJvY2VzcyA9IFByb2Nlc3M6OmZyb21TaGVsbENvbW1hbmRsaW5lKCRjb21tYW5kLCAkY3dkLCBudWxsLCBudWxsLCBzdGF0aWM6OmdldFRpbWVvdXQoKSk7Cn0gZWxzZSB7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJGNvbW1hbmQsICRjd2QsIG51bGwsIG51bGwsIHN0YXRpYzo6Z2V0VGltZW91dCgpKTsKfQoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJHR0eSkgewp0cnkgewokcHJvY2Vzcy0+c2V0VHR5KHRydWUpOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9Cn0KCiRjYWxsYmFjayA9IGlzX2NhbGxhYmxlKCRvdXRwdXQpID8gJG91dHB1dCA6IGZ1bmN0aW9uIChzdHJpbmcgJHR5cGUsIHN0cmluZyAkYnVmZmVyKTogdm9pZCB7CiR0aGlzLT5vdXRwdXRIYW5kbGVyKCR0eXBlLCAkYnVmZmVyKTsKfTsKCiRzaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKFtTaWduYWxIYW5kbGVyOjpTSUdJTlQsIFNpZ25hbEhhbmRsZXI6OlNJR1RFUk0sIFNpZ25hbEhhbmRsZXI6OlNJR0hVUF0sIGZ1bmN0aW9uIChzdHJpbmcgJHNpZ25hbCkgewppZiAoJHRoaXMtPmlvICE9PSBudWxsKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVjZWl2ZWQgJy4kc2lnbmFsLicsIGFib3J0aW5nIHdoZW4gY2hpbGQgcHJvY2VzcyBpcyBkb25lJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQp9KTsKCnRyeSB7CiRwcm9jZXNzLT5ydW4oJGNhbGxiYWNrKTsKCmlmICgkdGhpcy0+Y2FwdHVyZU91dHB1dCAmJiAhaXNfY2FsbGFibGUoJG91dHB1dCkpIHsKJG91dHB1dCA9ICRwcm9jZXNzLT5nZXRPdXRwdXQoKTsKfQoKJHRoaXMtPmVycm9yT3V0cHV0ID0gJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0gY2F0Y2ggKFByb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbiAkZSkgewppZiAoJHNpZ25hbEhhbmRsZXItPmlzVHJpZ2dlcmVkKCkpIHsKCiRzaWduYWxIYW5kbGVyLT5leGl0V2l0aExhc3RTaWduYWwoKTsKfQp9IGZpbmFsbHkgewokc2lnbmFsSGFuZGxlci0+dW5yZWdpc3RlcigpOwp9CgpyZXR1cm4gJHByb2Nlc3MtPmdldEV4aXRDb2RlKCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jKCRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHRoaXMtPmFsbG93QXN5bmMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignWW91IG11c3QgdXNlIHRoZSBQcm9jZXNzRXhlY3V0b3IgaW5zdGFuY2Ugd2hpY2ggaXMgcGFydCBvZiBhIENvbXBvc2VyXExvb3AgaW5zdGFuY2UgdG8gYmUgYWJsZSB0byBydW4gYXN5bmMgcHJvY2Vzc2VzJyk7Cn0KCiRqb2IgPSBbCidpZCcgPT4gJHRoaXMtPmlkR2VuKyssCidzdGF0dXMnID0+IHNlbGY6OlNUQVRVU19RVUVVRUQsCidjb21tYW5kJyA9PiAkY29tbWFuZCwKJ2N3ZCcgPT4gJGN3ZCwKXTsKCiRyZXNvbHZlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpIHVzZSAoJiRqb2IpOiB2b2lkIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19RVUVVRUQ7CiRqb2JbJ3Jlc29sdmUnXSA9ICRyZXNvbHZlOwokam9iWydyZWplY3QnXSA9ICRyZWplY3Q7Cn07CgokY2FuY2VsZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJGpvYik6IHZvaWQgewppZiAoJGpvYlsnc3RhdHVzJ10gPT09IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX1FVRVVFRCkgewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0FCT1JURUQ7Cn0KaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19TVEFSVEVEKSB7CnJldHVybjsKfQokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0FCT1JURUQ7CnRyeSB7CmlmIChkZWZpbmVkKCdTSUdJTlQnKSkgewokam9iWydwcm9jZXNzJ10tPnNpZ25hbChTSUdJTlQpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCn0KJGpvYlsncHJvY2VzcyddLT5zdG9wKDEpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBYm9ydGVkIHByb2Nlc3MnKTsKfTsKCiRwcm9taXNlID0gbmV3IFByb21pc2UoJHJlc29sdmVyLCAkY2FuY2VsZXIpOwokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJiRqb2IpIHsKaWYgKCRqb2JbJ3Byb2Nlc3MnXS0+aXNTdWNjZXNzZnVsKCkpIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19DT01QTEVURUQ7Cn0gZWxzZSB7CiRqb2JbJ3N0YXR1cyddID0gUHJvY2Vzc0V4ZWN1dG9yOjpTVEFUVVNfRkFJTEVEOwp9CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnJldHVybiAkam9iWydwcm9jZXNzJ107Cn0sIGZ1bmN0aW9uICgkZSkgdXNlICgmJGpvYik6IHZvaWQgewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0ZBSUxFRDsKCiR0aGlzLT5tYXJrSm9iRG9uZSgpOwoKdGhyb3cgJGU7Cn0pOwokdGhpcy0+am9ic1skam9iWydpZCddXSA9ICYkam9iOwoKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQoKcmV0dXJuICRwcm9taXNlOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gb3V0cHV0SGFuZGxlcihzdHJpbmcgJHR5cGUsIHN0cmluZyAkYnVmZmVyKTogdm9pZAp7CmlmICgkdGhpcy0+Y2FwdHVyZU91dHB1dCkgewpyZXR1cm47Cn0KCmlmIChudWxsID09PSAkdGhpcy0+aW8pIHsKZWNobyAkYnVmZmVyOwoKcmV0dXJuOwp9CgppZiAoUHJvY2Vzczo6RVJSID09PSAkdHlwZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3JSYXcoJGJ1ZmZlciwgZmFsc2UpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlUmF3KCRidWZmZXIsIGZhbHNlKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHN0YXJ0Sm9iKGludCAkaWQpOiB2b2lkCnsKJGpvYiA9ICYkdGhpcy0+am9ic1skaWRdOwppZiAoJGpvYlsnc3RhdHVzJ10gIT09IHNlbGY6OlNUQVRVU19RVUVVRUQpIHsKcmV0dXJuOwp9CgoKJGpvYlsnc3RhdHVzJ10gPSBzZWxmOjpTVEFUVVNfU1RBUlRFRDsKJHRoaXMtPnJ1bm5pbmdKb2JzKys7CgokY29tbWFuZCA9ICRqb2JbJ2NvbW1hbmQnXTsKJGN3ZCA9ICRqb2JbJ2N3ZCddOwoKJHRoaXMtPm91dHB1dENvbW1hbmRSdW4oJGNvbW1hbmQsICRjd2QsIHRydWUpOwoKdHJ5IHsKaWYgKGlzX3N0cmluZygkY29tbWFuZCkpIHsKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgJGN3ZCwgbnVsbCwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9IGVsc2UgewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzKCRjb21tYW5kLCAkY3dkLCBudWxsLCBudWxsLCBzdGF0aWM6OmdldFRpbWVvdXQoKSk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokam9iWydyZWplY3QnXSgkZSk7CgpyZXR1cm47Cn0KCiRqb2JbJ3Byb2Nlc3MnXSA9ICRwcm9jZXNzOwoKdHJ5IHsKJHByb2Nlc3MtPnN0YXJ0KCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGpvYlsncmVqZWN0J10oJGUpOwoKcmV0dXJuOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRNYXhKb2JzKGludCAkbWF4Sm9icyk6IHZvaWQKewokdGhpcy0+bWF4Sm9icyA9ICRtYXhKb2JzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRNYXhKb2JzKCk6IHZvaWQKewokdGhpcy0+bWF4Sm9icyA9IDEwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdCgkaW5kZXggPSBudWxsKTogdm9pZAp7CndoaWxlICh0cnVlKSB7CmlmICgwID09PSAkdGhpcy0+Y291bnRBY3RpdmVKb2JzKCRpbmRleCkpIHsKcmV0dXJuOwp9Cgp1c2xlZXAoMTAwMCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZUFzeW5jKCk6IHZvaWQKewokdGhpcy0+YWxsb3dBc3luYyA9IHRydWU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudEFjdGl2ZUpvYnMoJGluZGV4ID0gbnVsbCk6IGludAp7Cgpmb3JlYWNoICgkdGhpcy0+am9icyBhcyAkam9iKSB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX1NUQVJURUQpIHsKaWYgKCEkam9iWydwcm9jZXNzJ10tPmlzUnVubmluZygpKSB7CmNhbGxfdXNlcl9mdW5jKCRqb2JbJ3Jlc29sdmUnXSwgJGpvYlsncHJvY2VzcyddKTsKfQoKJGpvYlsncHJvY2VzcyddLT5jaGVja1RpbWVvdXQoKTsKfQoKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX1FVRVVFRCkgewokdGhpcy0+c3RhcnRKb2IoJGpvYlsnaWQnXSk7Cn0KfQp9CgppZiAobnVsbCAhPT0gJGluZGV4KSB7CnJldHVybiAkdGhpcy0+am9ic1skaW5kZXhdWydzdGF0dXMnXSA8IHNlbGY6OlNUQVRVU19DT01QTEVURUQgPyAxIDogMDsKfQoKJGFjdGl2ZSA9IDA7CmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRqb2IpIHsKaWYgKCRqb2JbJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCkgewokYWN0aXZlKys7Cn0gZWxzZSB7CnVuc2V0KCR0aGlzLT5qb2JzWyRqb2JbJ2lkJ11dKTsKfQp9CgpyZXR1cm4gJGFjdGl2ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrSm9iRG9uZSgpOiB2b2lkCnsKJHRoaXMtPnJ1bm5pbmdKb2JzLS07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzcGxpdExpbmVzKD9zdHJpbmcgJG91dHB1dCk6IGFycmF5CnsKJG91dHB1dCA9IHRyaW0oKHN0cmluZykgJG91dHB1dCk7CgpyZXR1cm4gJG91dHB1dCA9PT0gJycgPyBbXSA6IFByZWc6OnNwbGl0KCd7XHI/XG59JywgJG91dHB1dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmVycm9yT3V0cHV0Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRpbWVvdXQoKTogaW50CnsKcmV0dXJuIHN0YXRpYzo6JHRpbWVvdXQ7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VGltZW91dChpbnQgJHRpbWVvdXQpOiB2b2lkCnsKc3RhdGljOjokdGltZW91dCA9ICR0aW1lb3V0Owp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGUoJGFyZ3VtZW50KTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmVzY2FwZUFyZ3VtZW50KCRhcmd1bWVudCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0Q29tbWFuZFJ1bigkY29tbWFuZCwgP3N0cmluZyAkY3dkLCBib29sICRhc3luYyk6IHZvaWQKewppZiAobnVsbCA9PT0gJHRoaXMtPmlvIHx8ICEkdGhpcy0+aW8tPmlzRGVidWcoKSkgewpyZXR1cm47Cn0KCiRjb21tYW5kU3RyaW5nID0gaXNfc3RyaW5nKCRjb21tYW5kKSA/ICRjb21tYW5kIDogaW1wbG9kZSgnICcsIGFycmF5X21hcChzZWxmOjpjbGFzcy4nOjplc2NhcGUnLCAkY29tbWFuZCkpOwokc2FmZUNvbW1hbmQgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3s6Ly8oP1A8dXNlcj5bXjovXHNdKyk6KD9QPHBhc3N3b3JkPlteQFxzL10rKUB9aScsIHN0YXRpYyBmdW5jdGlvbiAoJG0pOiBzdHJpbmcgewphc3NlcnQoaXNfc3RyaW5nKCRtWyd1c2VyJ10pKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgne14oW2EtZjAtOV17MTIsfXxnaFthLXpdX1thLXpBLVowLTlfXSspJH0nLCAkbVsndXNlciddKSkgewpyZXR1cm4gJzovLyoqKjoqKipAJzsKfQppZiAoUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXsxMix9JH0nLCAkbVsndXNlciddKSkgewpyZXR1cm4gJzovLyoqKjoqKipAJzsKfQoKcmV0dXJuICc6Ly8nLiRtWyd1c2VyJ10uJzoqKipAJzsKfSwgJGNvbW1hbmRTdHJpbmcpOwokc2FmZUNvbW1hbmQgPSBQcmVnOjpyZXBsYWNlKCJ7LS1wYXNzd29yZCAoLipbXlxcXFxdXCcpIH0iLCAnLS1wYXNzd29yZCBcJyoqKlwnICcsICRzYWZlQ29tbWFuZCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRXhlY3V0aW5nJy4oJGFzeW5jID8gJyBhc3luYycgOiAnJykuJyBjb21tYW5kICgnLigkY3dkID86ICdDV0QnKS4nKTogJy4kc2FmZUNvbW1hbmQpOwp9CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlQXJndW1lbnQoJGFyZ3VtZW50KTogc3RyaW5nCnsKaWYgKCcnID09PSAoJGFyZ3VtZW50ID0gKHN0cmluZykgJGFyZ3VtZW50KSkgewpyZXR1cm4gZXNjYXBlc2hlbGxhcmcoJGFyZ3VtZW50KTsKfQoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuICInIi5zdHJfcmVwbGFjZSgiJyIsICInXFwnJyIsICRhcmd1bWVudCkuIiciOwp9CgoKJGFyZ3VtZW50ID0gc3RydHIoJGFyZ3VtZW50LCAiXG4iLCAnICcpOwoKCiRxdW90ZSA9IHN0cnBicmsoJGFyZ3VtZW50LCAiIFx0LCIpICE9PSBmYWxzZTsKJGFyZ3VtZW50ID0gUHJlZzo6cmVwbGFjZSgnLyhcXFxcKikiLycsICckMSQxXFwiJywgJGFyZ3VtZW50LCAtMSwgJGRxdW90ZXMpOwokbWV0YSA9ICRkcXVvdGVzID4gMCB8fCBQcmVnOjppc01hdGNoKCcvJVteJV0rJXwhW14hXSshLycsICRhcmd1bWVudCk7CgppZiAoISRtZXRhICYmICEkcXVvdGUpIHsKJHF1b3RlID0gc3RycGJyaygkYXJndW1lbnQsICdeJnw8PigpJykgIT09IGZhbHNlOwp9CgppZiAoJHF1b3RlKSB7CiRhcmd1bWVudCA9ICciJy5QcmVnOjpyZXBsYWNlKCcvKFxcXFwqKSQvJywgJyQxJDEnLCAkYXJndW1lbnQpLiciJzsKfQoKaWYgKCRtZXRhKSB7CiRhcmd1bWVudCA9IFByZWc6OnJlcGxhY2UoJy8oWyJeJnw8PigpJV0pLycsICdeJDEnLCAkYXJndW1lbnQpOwokYXJndW1lbnQgPSBQcmVnOjpyZXBsYWNlKCcvKCEpLycsICdeXiQxJywgJGFyZ3VtZW50KTsKfQoKcmV0dXJuICRhcmd1bWVudDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwoKCgoKCgoKY2xhc3MgUmVtb3RlRmlsZXN5c3RlbQp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJHNjaGVtZTsKCnByaXZhdGUgJGJ5dGVzTWF4OwoKcHJpdmF0ZSAkb3JpZ2luVXJsOwoKcHJpdmF0ZSAkZmlsZVVybDsKCnByaXZhdGUgJGZpbGVOYW1lOwoKcHJpdmF0ZSAkcmV0cnkgPSBmYWxzZTsKCnByaXZhdGUgJHByb2dyZXNzOwoKcHJpdmF0ZSAkbGFzdFByb2dyZXNzOwoKcHJpdmF0ZSAkb3B0aW9ucyA9IFtdOwoKcHJpdmF0ZSAkZGlzYWJsZVRscyA9IGZhbHNlOwoKcHJpdmF0ZSAkbGFzdEhlYWRlcnM7Cgpwcml2YXRlICRzdG9yZUF1dGggPSBmYWxzZTsKCnByaXZhdGUgJGF1dGhIZWxwZXI7Cgpwcml2YXRlICRkZWdyYWRlZE1vZGUgPSBmYWxzZTsKCnByaXZhdGUgJHJlZGlyZWN0czsKCnByaXZhdGUgJG1heFJlZGlyZWN0cyA9IDIwOwoKcHJpdmF0ZSAkcHJveHlNYW5hZ2VyOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJG9wdGlvbnMgPSBbXSwgYm9vbCAkZGlzYWJsZVRscyA9IGZhbHNlLCA/QXV0aEhlbHBlciAkYXV0aEhlbHBlciA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwoKCgppZiAoJGRpc2FibGVUbHMgPT09IGZhbHNlKSB7CiR0aGlzLT5vcHRpb25zID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldFRsc0RlZmF1bHRzKCRvcHRpb25zLCAkaW8pOwp9IGVsc2UgewokdGhpcy0+ZGlzYWJsZVRscyA9IHRydWU7Cn0KCgokdGhpcy0+b3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+YXV0aEhlbHBlciA9ICRhdXRoSGVscGVyID8/IG5ldyBBdXRoSGVscGVyKCRpbywgJGNvbmZpZyk7CiR0aGlzLT5wcm94eU1hbmFnZXIgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHkoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgc3RyaW5nICRmaWxlTmFtZSwgYm9vbCAkcHJvZ3Jlc3MgPSB0cnVlLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CnJldHVybiAkdGhpcy0+Z2V0KCRvcmlnaW5VcmwsICRmaWxlVXJsLCAkb3B0aW9ucywgJGZpbGVOYW1lLCAkcHJvZ3Jlc3MpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGZpbGVVcmwsIGJvb2wgJHByb2dyZXNzID0gdHJ1ZSwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewpyZXR1cm4gJHRoaXMtPmdldCgkb3JpZ2luVXJsLCAkZmlsZVVybCwgJG9wdGlvbnMsIG51bGwsICRwcm9ncmVzcyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Rsc0Rpc2FibGVkKCkKewpyZXR1cm4gJHRoaXMtPmRpc2FibGVUbHMgPT09IHRydWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExhc3RIZWFkZXJzKCkKewpyZXR1cm4gJHRoaXMtPmxhc3RIZWFkZXJzOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5kU3RhdHVzQ29kZShhcnJheSAkaGVhZGVycykKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XkhUVFAvXFMrIChcZCspfWknLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CgoKJHZhbHVlID0gKGludCkgJG1hdGNoWzFdOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFN0YXR1c01lc3NhZ2UoYXJyYXkgJGhlYWRlcnMpCnsKJHZhbHVlID0gbnVsbDsKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne15IVFRQL1xTKyBcZCt9aScsICRoZWFkZXIpKSB7CgoKJHZhbHVlID0gJGhlYWRlcjsKfQp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXQoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgYXJyYXkgJGFkZGl0aW9uYWxPcHRpb25zID0gW10sID9zdHJpbmcgJGZpbGVOYW1lID0gbnVsbCwgYm9vbCAkcHJvZ3Jlc3MgPSB0cnVlKQp7CiR0aGlzLT5zY2hlbWUgPSBwYXJzZV91cmwoc3RydHIoJGZpbGVVcmwsICdcXCcsICcvJyksIFBIUF9VUkxfU0NIRU1FKTsKJHRoaXMtPmJ5dGVzTWF4ID0gMDsKJHRoaXMtPm9yaWdpblVybCA9ICRvcmlnaW5Vcmw7CiR0aGlzLT5maWxlVXJsID0gJGZpbGVVcmw7CiR0aGlzLT5maWxlTmFtZSA9ICRmaWxlTmFtZTsKJHRoaXMtPnByb2dyZXNzID0gJHByb2dyZXNzOwokdGhpcy0+bGFzdFByb2dyZXNzID0gbnVsbDsKJHJldHJ5QXV0aEZhaWx1cmUgPSB0cnVlOwokdGhpcy0+bGFzdEhlYWRlcnMgPSBbXTsKJHRoaXMtPnJlZGlyZWN0cyA9IDE7IAoKJHRlbXBBZGRpdGlvbmFsT3B0aW9ucyA9ICRhZGRpdGlvbmFsT3B0aW9uczsKaWYgKGlzc2V0KCR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddKSkgewokcmV0cnlBdXRoRmFpbHVyZSA9IChib29sKSAkdGVtcEFkZGl0aW9uYWxPcHRpb25zWydyZXRyeS1hdXRoLWZhaWx1cmUnXTsKCnVuc2V0KCR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddKTsKfQoKJGlzUmVkaXJlY3QgPSBmYWxzZTsKaWYgKGlzc2V0KCR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JlZGlyZWN0cyddKSkgewokdGhpcy0+cmVkaXJlY3RzID0gJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ107CiRpc1JlZGlyZWN0ID0gdHJ1ZTsKCnVuc2V0KCR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JlZGlyZWN0cyddKTsKfQoKJG9wdGlvbnMgPSAkdGhpcy0+Z2V0T3B0aW9uc0ZvclVybCgkb3JpZ2luVXJsLCAkdGVtcEFkZGl0aW9uYWxPcHRpb25zKTsKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9ucyk7Cgokb3JpZ0ZpbGVVcmwgPSAkZmlsZVVybDsKCmlmIChpc3NldCgkb3B0aW9uc1snZ2l0bGFiLXRva2VuJ10pKSB7CiRmaWxlVXJsIC49IChmYWxzZSA9PT0gc3RycG9zKCRmaWxlVXJsLCAnPycpID8gJz8nIDogJyYnKSAuICdhY2Nlc3NfdG9rZW49Jy4kb3B0aW9uc1snZ2l0bGFiLXRva2VuJ107CnVuc2V0KCRvcHRpb25zWydnaXRsYWItdG9rZW4nXSk7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddKSkgewokb3B0aW9uc1snaHR0cCddWydpZ25vcmVfZXJyb3JzJ10gPSB0cnVlOwp9CgppZiAoJHRoaXMtPmRlZ3JhZGVkTW9kZSAmJiBzdHJwb3MoJGZpbGVVcmwsICdodHRwOi8vcmVwby5wYWNrYWdpc3Qub3JnLycpID09PSAwKSB7CgokZmlsZVVybCA9ICdodHRwOi8vJyAuIGdldGhvc3RieW5hbWUoJ3JlcG8ucGFja2FnaXN0Lm9yZycpIC4gc3Vic3RyKCRmaWxlVXJsLCAyMCk7CiRkZWdyYWRlZFBhY2thZ2lzdCA9IHRydWU7Cn0KCiRtYXhGaWxlU2l6ZSA9IG51bGw7CmlmIChpc3NldCgkb3B0aW9uc1snbWF4X2ZpbGVfc2l6ZSddKSkgewokbWF4RmlsZVNpemUgPSAkb3B0aW9uc1snbWF4X2ZpbGVfc2l6ZSddOwp1bnNldCgkb3B0aW9uc1snbWF4X2ZpbGVfc2l6ZSddKTsKfQoKJGN0eCA9IFN0cmVhbUNvbnRleHRGYWN0b3J5OjpnZXRDb250ZXh0KCRmaWxlVXJsLCAkb3B0aW9ucywgWydub3RpZmljYXRpb24nID0+IFskdGhpcywgJ2NhbGxiYWNrR2V0J11dKTsKCiRwcm94eSA9ICR0aGlzLT5wcm94eU1hbmFnZXItPmdldFByb3h5Rm9yUmVxdWVzdCgkZmlsZVVybCk7CiR1c2luZ1Byb3h5ID0gJHByb3h5LT5nZXRGb3JtYXR0ZWRVcmwoJyB1c2luZyBwcm94eSAoJXMpJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigoc3RycG9zKCRvcmlnRmlsZVVybCwgJ2h0dHAnKSA9PT0gMCA/ICdEb3dubG9hZGluZyAnIDogJ1JlYWRpbmcgJykgLiBVcmw6OnNhbml0aXplKCRvcmlnRmlsZVVybCkgLiAkdXNpbmdQcm94eSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKdW5zZXQoJG9yaWdGaWxlVXJsLCAkcHJveHksICR1c2luZ1Byb3h5KTsKCgppZiAoKCFQcmVnOjppc01hdGNoKCd7Xmh0dHA6Ly8ocmVwb1wuKT9wYWNrYWdpc3RcLm9yZy9wL30nLCAkZmlsZVVybCkgfHwgKGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICckJykgJiYgZmFsc2UgPT09IHN0cnBvcygkZmlsZVVybCwgJyUyNCcpKSkgJiYgZW1wdHkoJGRlZ3JhZGVkUGFja2FnaXN0KSkgewokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCRmaWxlVXJsLCAkdGhpcy0+aW8pOwp9CgppZiAoJHRoaXMtPnByb2dyZXNzICYmICEkaXNSZWRpcmVjdCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8Y29tbWVudD5jb25uZWN0aW5nLi4uPC9jb21tZW50PikiLCBmYWxzZSk7Cn0KCiRlcnJvck1lc3NhZ2UgPSAnJzsKJGVycm9yQ29kZSA9IDA7CiRyZXN1bHQgPSBmYWxzZTsKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkY29kZSwgJG1zZykgdXNlICgmJGVycm9yTWVzc2FnZSk6IGJvb2wgewppZiAoJGVycm9yTWVzc2FnZSkgewokZXJyb3JNZXNzYWdlIC49ICJcbiI7Cn0KJGVycm9yTWVzc2FnZSAuPSBQcmVnOjpyZXBsYWNlKCd7XmZpbGVfZ2V0X2NvbnRlbnRzXCguKj9cKTogfScsICcnLCAkbXNnKTsKCnJldHVybiB0cnVlOwp9KTsKJGh0dHBfcmVzcG9uc2VfaGVhZGVyID0gW107CnRyeSB7CiRyZXN1bHQgPSAkdGhpcy0+Z2V0UmVtb3RlQ29udGVudHMoJG9yaWdpblVybCwgJGZpbGVVcmwsICRjdHgsICRodHRwX3Jlc3BvbnNlX2hlYWRlciwgJG1heEZpbGVTaXplKTsKCmlmICghZW1wdHkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyWzBdKSkgewokc3RhdHVzQ29kZSA9IHNlbGY6OmZpbmRTdGF0dXNDb2RlKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CmlmICgkc3RhdHVzQ29kZSA+PSA0MDAgJiYgUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LXR5cGUnKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICRvcmlnaW5VcmwsIGpzb25fZGVjb2RlKCRyZXN1bHQsIHRydWUpKTsKfQoKaWYgKGluX2FycmF5KCRzdGF0dXNDb2RlLCBbNDAxLCA0MDNdKSAmJiAkcmV0cnlBdXRoRmFpbHVyZSkgewokdGhpcy0+cHJvbXB0QXV0aEFuZFJldHJ5KCRzdGF0dXNDb2RlLCAkdGhpcy0+ZmluZFN0YXR1c01lc3NhZ2UoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKfQp9CgokY29udGVudExlbmd0aCA9ICFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pID8gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LWxlbmd0aCcpIDogbnVsbDsKaWYgKCRjb250ZW50TGVuZ3RoICYmIFBsYXRmb3JtOjpzdHJsZW4oJHJlc3VsdCkgPCAkY29udGVudExlbmd0aCkgewoKJGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb250ZW50LUxlbmd0aCBtaXNtYXRjaCwgcmVjZWl2ZWQgJy5QbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpLicgYnl0ZXMgb3V0IG9mIHRoZSBleHBlY3RlZCAnLiRjb250ZW50TGVuZ3RoKTsKJGUtPnNldEhlYWRlcnMoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGUtPnNldFN0YXR1c0NvZGUoc2VsZjo6ZmluZFN0YXR1c0NvZGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSk7CnRyeSB7CiRlLT5zZXRSZXNwb25zZSgkdGhpcy0+ZGVjb2RlUmVzdWx0KCRyZXN1bHQsICRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRkaXNjYXJkZWQpIHsKJGUtPnNldFJlc3BvbnNlKCR0aGlzLT5ub3JtYWxpemVSZXN1bHQoJHJlc3VsdCkpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0NvbnRlbnQtTGVuZ3RoIG1pc21hdGNoLCByZWNlaXZlZCAnLlBsYXRmb3JtOjpzdHJsZW4oJHJlc3VsdCkuJyBvdXQgb2YgJy4kY29udGVudExlbmd0aC4nIGJ5dGVzOiAoJyAuIGJhc2U2NF9lbmNvZGUoJHJlc3VsdCkuJyknLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKdGhyb3cgJGU7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSkpIHsKJGUtPnNldEhlYWRlcnMoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGUtPnNldFN0YXR1c0NvZGUoc2VsZjo6ZmluZFN0YXR1c0NvZGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSk7Cn0KaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRyZXN1bHQgIT09IGZhbHNlKSB7CiRlLT5zZXRSZXNwb25zZSgkdGhpcy0+ZGVjb2RlUmVzdWx0KCRyZXN1bHQsICRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwp9CiRyZXN1bHQgPSBmYWxzZTsKfQppZiAoJGVycm9yTWVzc2FnZSAmJiAhZmlsdGVyX3ZhcihpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiRlcnJvck1lc3NhZ2UgPSAnYWxsb3dfdXJsX2ZvcGVuIG11c3QgYmUgZW5hYmxlZCBpbiBwaHAuaW5pICgnLiRlcnJvck1lc3NhZ2UuJyknOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwppZiAoaXNzZXQoJGUpICYmICEkdGhpcy0+cmV0cnkpIHsKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlICYmIGZhbHNlICE9PSBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ09wZXJhdGlvbiB0aW1lZCBvdXQnKSkgewokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJzxlcnJvcj4nLiRlLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+JywKJzxlcnJvcj5SZXRyeWluZyB3aXRoIGRlZ3JhZGVkIG1vZGUsIGNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy90cm91Ymxlc2hvb3RpbmcubWQjZGVncmFkZWQtbW9kZSBmb3IgbW9yZSBpbmZvPC9lcnJvcj4nLApdKTsKCnJldHVybiAkdGhpcy0+Z2V0KCR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5maWxlVXJsLCAkYWRkaXRpb25hbE9wdGlvbnMsICR0aGlzLT5maWxlTmFtZSwgJHRoaXMtPnByb2dyZXNzKTsKfQoKdGhyb3cgJGU7Cn0KCiRzdGF0dXNDb2RlID0gbnVsbDsKJGNvbnRlbnRUeXBlID0gbnVsbDsKJGxvY2F0aW9uSGVhZGVyID0gbnVsbDsKaWYgKCFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pKSB7CiRzdGF0dXNDb2RlID0gc2VsZjo6ZmluZFN0YXR1c0NvZGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGNvbnRlbnRUeXBlID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LXR5cGUnKTsKJGxvY2F0aW9uSGVhZGVyID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdsb2NhdGlvbicpOwp9CgoKaWYgKCRvcmlnaW5VcmwgPT09ICdiaXRidWNrZXQub3JnJwomJiAhJHRoaXMtPmF1dGhIZWxwZXItPmlzUHVibGljQml0QnVja2V0RG93bmxvYWQoJGZpbGVVcmwpCiYmIHN1YnN0cigkZmlsZVVybCwgLTQpID09PSAnLnppcCcKJiYgKCEkbG9jYXRpb25IZWFkZXIgfHwgc3Vic3RyKHBhcnNlX3VybCgkbG9jYXRpb25IZWFkZXIsIFBIUF9VUkxfUEFUSCksIC00KSAhPT0gJy56aXAnKQomJiAkY29udGVudFR5cGUgJiYgUHJlZzo6aXNNYXRjaCgne150ZXh0L2h0bWxcYn1pJywgJGNvbnRlbnRUeXBlKQopIHsKJHJlc3VsdCA9IGZhbHNlOwppZiAoJHJldHJ5QXV0aEZhaWx1cmUpIHsKJHRoaXMtPnByb21wdEF1dGhBbmRSZXRyeSg0MDEpOwp9Cn0KCgppZiAoJHN0YXR1c0NvZGUgPT09IDQwNAomJiBpbl9hcnJheSgkb3JpZ2luVXJsLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpCiYmIGZhbHNlICE9PSBzdHJwb3MoJGZpbGVVcmwsICdhcmNoaXZlLnppcCcpCikgewokcmVzdWx0ID0gZmFsc2U7CmlmICgkcmV0cnlBdXRoRmFpbHVyZSkgewokdGhpcy0+cHJvbXB0QXV0aEFuZFJldHJ5KDQwMSk7Cn0KfQoKCiRoYXNGb2xsb3dlZFJlZGlyZWN0ID0gZmFsc2U7CmlmICgkc3RhdHVzQ29kZSA+PSAzMDAgJiYgJHN0YXR1c0NvZGUgPD0gMzk5ICYmICRzdGF0dXNDb2RlICE9PSAzMDQgJiYgJHRoaXMtPnJlZGlyZWN0cyA8ICR0aGlzLT5tYXhSZWRpcmVjdHMpIHsKJGhhc0ZvbGxvd2VkUmVkaXJlY3QgPSB0cnVlOwokcmVzdWx0ID0gJHRoaXMtPmhhbmRsZVJlZGlyZWN0KCRodHRwX3Jlc3BvbnNlX2hlYWRlciwgJGFkZGl0aW9uYWxPcHRpb25zLCAkcmVzdWx0KTsKfQoKCmlmICgkc3RhdHVzQ29kZSAmJiAkc3RhdHVzQ29kZSA+PSA0MDAgJiYgJHN0YXR1c0NvZGUgPD0gNTk5KSB7CmlmICghJHRoaXMtPnJldHJ5KSB7CmlmICgkdGhpcy0+cHJvZ3Jlc3MgJiYgISRpc1JlZGlyZWN0KSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8ZXJyb3I+ZmFpbGVkPC9lcnJvcj4pIiwgZmFsc2UpOwp9CgokZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kdGhpcy0+ZmlsZVVybC4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkICgnLiRodHRwX3Jlc3BvbnNlX2hlYWRlclswXS4nKScsICRzdGF0dXNDb2RlKTsKJGUtPnNldEhlYWRlcnMoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGUtPnNldFJlc3BvbnNlKCR0aGlzLT5kZWNvZGVSZXN1bHQoJHJlc3VsdCwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSk7CiRlLT5zZXRTdGF0dXNDb2RlKCRzdGF0dXNDb2RlKTsKdGhyb3cgJGU7Cn0KJHJlc3VsdCA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPnByb2dyZXNzICYmICEkdGhpcy0+cmV0cnkgJiYgISRpc1JlZGlyZWN0KSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICgiLigkcmVzdWx0ID09PSBmYWxzZSA/ICc8ZXJyb3I+ZmFpbGVkPC9lcnJvcj4nIDogJzxjb21tZW50PjEwMCU8L2NvbW1lbnQ+JykuIikiLCBmYWxzZSk7Cn0KCgppZiAoJHJlc3VsdCAmJiBleHRlbnNpb25fbG9hZGVkKCd6bGliJykgJiYgc3RycG9zKCRmaWxlVXJsLCAnaHR0cCcpID09PSAwICYmICEkaGFzRm9sbG93ZWRSZWRpcmVjdCkgewp0cnkgewokcmVzdWx0ID0gJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CnRocm93ICRlOwp9CgokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJycsCic8ZXJyb3I+RmFpbGVkIHRvIGRlY29kZSByZXNwb25zZTogJy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicsCic8ZXJyb3I+UmV0cnlpbmcgd2l0aCBkZWdyYWRlZCBtb2RlLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2RlZ3JhZGVkLW1vZGUgZm9yIG1vcmUgaW5mbzwvZXJyb3I+JywKXSk7CgpyZXR1cm4gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KfQoKCmlmIChmYWxzZSAhPT0gJHJlc3VsdCAmJiBudWxsICE9PSAkZmlsZU5hbWUgJiYgISRpc1JlZGlyZWN0KSB7CmlmICgnJyA9PT0gJHJlc3VsdCkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCciJy4kdGhpcy0+ZmlsZVVybC4nIiBhcHBlYXJzIGJyb2tlbiwgYW5kIHJldHVybmVkIGFuIGVtcHR5IDIwMCByZXNwb25zZScpOwp9CgokZXJyb3JNZXNzYWdlID0gJyc7CnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJGNvZGUsICRtc2cpIHVzZSAoJiRlcnJvck1lc3NhZ2UpOiBib29sIHsKaWYgKCRlcnJvck1lc3NhZ2UpIHsKJGVycm9yTWVzc2FnZSAuPSAiXG4iOwp9CiRlcnJvck1lc3NhZ2UgLj0gUHJlZzo6cmVwbGFjZSgne15maWxlX3B1dF9jb250ZW50c1woLio/XCk6IH0nLCAnJywgJG1zZyk7CgpyZXR1cm4gdHJ1ZTsKfSk7CiRyZXN1bHQgPSAoYm9vbCkgZmlsZV9wdXRfY29udGVudHMoJGZpbGVOYW1lLCAkcmVzdWx0KTsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7CmlmIChmYWxzZSA9PT0gJHJlc3VsdCkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHRoaXMtPmZpbGVVcmwuJyIgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byAnLiRmaWxlTmFtZS4nOiAnLiRlcnJvck1lc3NhZ2UpOwp9Cn0KCmlmICgkdGhpcy0+cmV0cnkpIHsKJHRoaXMtPnJldHJ5ID0gZmFsc2U7CgokcmVzdWx0ID0gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7CgppZiAoJHRoaXMtPnN0b3JlQXV0aCkgewokdGhpcy0+YXV0aEhlbHBlci0+c3RvcmVBdXRoKCR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5zdG9yZUF1dGgpOwokdGhpcy0+c3RvcmVBdXRoID0gZmFsc2U7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgppZiAoZmFsc2UgPT09ICRyZXN1bHQpIHsKJGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHRoaXMtPmZpbGVVcmwuJyIgZmlsZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZDogJy4kZXJyb3JNZXNzYWdlLCAkZXJyb3JDb2RlKTsKaWYgKCFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pKSB7CiRlLT5zZXRIZWFkZXJzKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7Cn0KCmlmICghJHRoaXMtPmRlZ3JhZGVkTW9kZSAmJiBmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdPcGVyYXRpb24gdGltZWQgb3V0JykpIHsKJHRoaXMtPmRlZ3JhZGVkTW9kZSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCic8ZXJyb3I+Jy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicsCic8ZXJyb3I+UmV0cnlpbmcgd2l0aCBkZWdyYWRlZCBtb2RlLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2RlZ3JhZGVkLW1vZGUgZm9yIG1vcmUgaW5mbzwvZXJyb3I+JywKXSk7CgpyZXR1cm4gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KCnRocm93ICRlOwp9CgppZiAoIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSkpIHsKJHRoaXMtPmxhc3RIZWFkZXJzID0gJGh0dHBfcmVzcG9uc2VfaGVhZGVyOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UmVtb3RlQ29udGVudHMoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgJGNvbnRleHQsID9hcnJheSAmJHJlc3BvbnNlSGVhZGVycyA9IG51bGwsID9pbnQgJG1heEZpbGVTaXplID0gbnVsbCkKewokcmVzdWx0ID0gZmFsc2U7Cgp0cnkgewokZSA9IG51bGw7CmlmICgkbWF4RmlsZVNpemUgIT09IG51bGwpIHsKJHJlc3VsdCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlVXJsLCBmYWxzZSwgJGNvbnRleHQsIDAsICRtYXhGaWxlU2l6ZSk7Cn0gZWxzZSB7CgokcmVzdWx0ID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVVcmwsIGZhbHNlLCAkY29udGV4dCk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewp9CgppZiAoJHJlc3VsdCAhPT0gZmFsc2UgJiYgJG1heEZpbGVTaXplICE9PSBudWxsICYmIFBsYXRmb3JtOjpzdHJsZW4oJHJlc3VsdCkgPj0gJG1heEZpbGVTaXplKSB7CnRocm93IG5ldyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKCdNYXhpbXVtIGFsbG93ZWQgZG93bmxvYWQgc2l6ZSByZWFjaGVkLiBEb3dubG9hZGVkICcgLiBQbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpIC4gJyBvZiBhbGxvd2VkICcgLiAkbWF4RmlsZVNpemUgLiAnIGJ5dGVzJyk7Cn0KCgokcmVzcG9uc2VIZWFkZXJzID0gJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdOwoKaWYgKG51bGwgIT09ICRlKSB7CnRocm93ICRlOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsbGJhY2tHZXQoaW50ICRub3RpZmljYXRpb25Db2RlLCBpbnQgJHNldmVyaXR5LCA/c3RyaW5nICRtZXNzYWdlLCBpbnQgJG1lc3NhZ2VDb2RlLCBpbnQgJGJ5dGVzVHJhbnNmZXJyZWQsIGludCAkYnl0ZXNNYXgpCnsKc3dpdGNoICgkbm90aWZpY2F0aW9uQ29kZSkgewpjYXNlIFNUUkVBTV9OT1RJRllfRkFJTFVSRToKaWYgKDQwMCA9PT0gJG1lc3NhZ2VDb2RlKSB7CgoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiVGhlICciIC4gJHRoaXMtPmZpbGVVcmwgLiAiJyBVUkwgY291bGQgbm90IGJlIGFjY2Vzc2VkOiAiIC4gJG1lc3NhZ2UsICRtZXNzYWdlQ29kZSk7Cn0KYnJlYWs7CgpjYXNlIFNUUkVBTV9OT1RJRllfRklMRV9TSVpFX0lTOgokdGhpcy0+Ynl0ZXNNYXggPSAkYnl0ZXNNYXg7CmJyZWFrOwoKY2FzZSBTVFJFQU1fTk9USUZZX1BST0dSRVNTOgppZiAoJHRoaXMtPmJ5dGVzTWF4ID4gMCAmJiAkdGhpcy0+cHJvZ3Jlc3MpIHsKJHByb2dyZXNzaW9uID0gbWluKDEwMCwgKGludCkgcm91bmQoJGJ5dGVzVHJhbnNmZXJyZWQgLyAkdGhpcy0+Ynl0ZXNNYXggKiAxMDApKTsKCmlmICgoMCA9PT0gJHByb2dyZXNzaW9uICUgNSkgJiYgMTAwICE9PSAkcHJvZ3Jlc3Npb24gJiYgJHByb2dyZXNzaW9uICE9PSAkdGhpcy0+bGFzdFByb2dyZXNzKSB7CiR0aGlzLT5sYXN0UHJvZ3Jlc3MgPSAkcHJvZ3Jlc3Npb247CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8Y29tbWVudD4kcHJvZ3Jlc3Npb24lPC9jb21tZW50PikiLCBmYWxzZSk7Cn0KfQpicmVhazsKCmRlZmF1bHQ6CmJyZWFrOwp9Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcm9tcHRBdXRoQW5kUmV0cnkoJGh0dHBTdGF0dXMsID9zdHJpbmcgJHJlYXNvbiA9IG51bGwsIGFycmF5ICRoZWFkZXJzID0gW10pCnsKJHJlc3VsdCA9ICR0aGlzLT5hdXRoSGVscGVyLT5wcm9tcHRBdXRoSWZOZWVkZWQoJHRoaXMtPmZpbGVVcmwsICR0aGlzLT5vcmlnaW5VcmwsICRodHRwU3RhdHVzLCAkcmVhc29uLCAkaGVhZGVycywgMSApOwoKJHRoaXMtPnN0b3JlQXV0aCA9ICRyZXN1bHRbJ3N0b3JlQXV0aCddOwokdGhpcy0+cmV0cnkgPSAkcmVzdWx0WydyZXRyeSddOwoKaWYgKCR0aGlzLT5yZXRyeSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdSRVRSWScpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE9wdGlvbnNGb3JVcmwoc3RyaW5nICRvcmlnaW5VcmwsIGFycmF5ICRhZGRpdGlvbmFsT3B0aW9ucykKewokdGxzT3B0aW9ucyA9IFtdOwokaGVhZGVycyA9IFtdOwoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewokaGVhZGVyc1tdID0gJ0FjY2VwdC1FbmNvZGluZzogZ3ppcCc7Cn0KCiRvcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICR0bHNPcHRpb25zLCAkYWRkaXRpb25hbE9wdGlvbnMpOwppZiAoISR0aGlzLT5kZWdyYWRlZE1vZGUpIHsKCgokb3B0aW9uc1snaHR0cCddWydwcm90b2NvbF92ZXJzaW9uJ10gPSAxLjE7CiRoZWFkZXJzW10gPSAnQ29ubmVjdGlvbjogY2xvc2UnOwp9CgokaGVhZGVycyA9ICR0aGlzLT5hdXRoSGVscGVyLT5hZGRBdXRoZW50aWNhdGlvbkhlYWRlcigkaGVhZGVycywgJG9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwpOwoKJG9wdGlvbnNbJ2h0dHAnXVsnZm9sbG93X2xvY2F0aW9uJ10gPSAwOwoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSAmJiAhaXNfYXJyYXkoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gZXhwbG9kZSgiXHJcbiIsIHRyaW0oJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sICJcclxuIikpOwp9CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICRoZWFkZXI7Cn0KCnJldHVybiAkb3B0aW9uczsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QoYXJyYXkgJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMsICRyZXN1bHQpCnsKaWYgKCRsb2NhdGlvbkhlYWRlciA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyLCAnbG9jYXRpb24nKSkgewppZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9TQ0hFTUUpKSB7CgokdGFyZ2V0VXJsID0gJGxvY2F0aW9uSGVhZGVyOwp9IGVsc2VpZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9IT1NUKSkgewoKJHRhcmdldFVybCA9ICR0aGlzLT5zY2hlbWUuJzonLiRsb2NhdGlvbkhlYWRlcjsKfSBlbHNlaWYgKCcvJyA9PT0gJGxvY2F0aW9uSGVhZGVyWzBdKSB7CgokdXJsSG9zdCA9IHBhcnNlX3VybCgkdGhpcy0+ZmlsZVVybCwgUEhQX1VSTF9IT1NUKTsKCgokdGFyZ2V0VXJsID0gUHJlZzo6cmVwbGFjZSgne14oLisoPzovL3xAKScucHJlZ19xdW90ZSgkdXJsSG9zdCkuJyg/OjpcZCspPykoPzpbL1w/XS4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkdGhpcy0+ZmlsZVVybCk7Cn0gZWxzZSB7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rLylbXi8/XSooPzpcPy4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkdGhpcy0+ZmlsZVVybCk7Cn0KfQoKaWYgKCFlbXB0eSgkdGFyZ2V0VXJsKSkgewokdGhpcy0+cmVkaXJlY3RzKys7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdGb2xsb3dpbmcgcmVkaXJlY3QgKCV1KSAlcycsICR0aGlzLT5yZWRpcmVjdHMsIFVybDo6c2FuaXRpemUoJHRhcmdldFVybCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKJGFkZGl0aW9uYWxPcHRpb25zWydyZWRpcmVjdHMnXSA9ICR0aGlzLT5yZWRpcmVjdHM7CgpyZXR1cm4gJHRoaXMtPmdldChwYXJzZV91cmwoJHRhcmdldFVybCwgUEhQX1VSTF9IT1NUKSwgJHRhcmdldFVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KCmlmICghJHRoaXMtPnJldHJ5KSB7CiRlID0gbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiR0aGlzLT5maWxlVXJsLiciIGZpbGUgY291bGQgbm90IGJlIGRvd25sb2FkZWQsIGdvdCByZWRpcmVjdCB3aXRob3V0IExvY2F0aW9uICgnLiRodHRwX3Jlc3BvbnNlX2hlYWRlclswXS4nKScpOwokZS0+c2V0SGVhZGVycygkaHR0cF9yZXNwb25zZV9oZWFkZXIpOwokZS0+c2V0UmVzcG9uc2UoJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIpKTsKCnRocm93ICRlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlY29kZVJlc3VsdCgkcmVzdWx0LCBhcnJheSAkaHR0cF9yZXNwb25zZV9oZWFkZXIpOiA/c3RyaW5nCnsKCmlmICgkcmVzdWx0ICYmIGV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewokY29udGVudEVuY29kaW5nID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LWVuY29kaW5nJyk7CiRkZWNvZGUgPSAkY29udGVudEVuY29kaW5nICYmICdnemlwJyA9PT0gc3RydG9sb3dlcigkY29udGVudEVuY29kaW5nKTsKCmlmICgkZGVjb2RlKSB7CiRyZXN1bHQgPSB6bGliX2RlY29kZSgkcmVzdWx0KTsKCmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdGYWlsZWQgdG8gZGVjb2RlIHpsaWIgc3RyZWFtJyk7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPm5vcm1hbGl6ZVJlc3VsdCgkcmVzdWx0KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVSZXN1bHQoJHJlc3VsdCk6ID9zdHJpbmcKewppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgoKCgoKCmNsYXNzIFNpbGVuY2VyCnsKCgoKcHJpdmF0ZSBzdGF0aWMgJHN0YWNrID0gW107CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHByZXNzKD9pbnQgJG1hc2sgPSBudWxsKTogaW50CnsKaWYgKCFpc3NldCgkbWFzaykpIHsKJG1hc2sgPSBFX1dBUk5JTkcgfCBFX05PVElDRSB8IEVfVVNFUl9XQVJOSU5HIHwgRV9VU0VSX05PVElDRSB8IEVfREVQUkVDQVRFRCB8IEVfVVNFUl9ERVBSRUNBVEVEIHwgRV9TVFJJQ1Q7Cn0KJG9sZCA9IGVycm9yX3JlcG9ydGluZygpOwpzZWxmOjokc3RhY2tbXSA9ICRvbGQ7CmVycm9yX3JlcG9ydGluZygkb2xkICYgfiRtYXNrKTsKCnJldHVybiAkb2xkOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc3RvcmUoKTogdm9pZAp7CmlmICghZW1wdHkoc2VsZjo6JHN0YWNrKSkgewplcnJvcl9yZXBvcnRpbmcoYXJyYXlfcG9wKHNlbGY6OiRzdGFjaykpOwp9Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxsKGNhbGxhYmxlICRjYWxsYWJsZSwgLi4uJHBhcmFtZXRlcnMpCnsKdHJ5IHsKc2VsZjo6c3VwcHJlc3MoKTsKJHJlc3VsdCA9ICRjYWxsYWJsZSguLi4kcGFyYW1ldGVycyk7CnNlbGY6OnJlc3RvcmUoKTsKCnJldHVybiAkcmVzdWx0Owp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CgpzZWxmOjpyZXN0b3JlKCk7CnRocm93ICRlOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXENhQnVuZGxlXENhQnVuZGxlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxQcm94eU1hbmFnZXI7CnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKCgoKCgoKCmZpbmFsIGNsYXNzIFN0cmVhbUNvbnRleHRGYWN0b3J5CnsKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGV4dChzdHJpbmcgJHVybCwgYXJyYXkgJGRlZmF1bHRPcHRpb25zID0gW10sIGFycmF5ICRkZWZhdWx0UGFyYW1zID0gW10pCnsKJG9wdGlvbnMgPSBbJ2h0dHAnID0+IFsKCidmb2xsb3dfbG9jYXRpb24nID0+IDEsCidtYXhfcmVkaXJlY3RzJyA9PiAyMCwKXV07Cgokb3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRvcHRpb25zLCBzZWxmOjppbml0T3B0aW9ucygkdXJsLCAkZGVmYXVsdE9wdGlvbnMpKTsKdW5zZXQoJGRlZmF1bHRPcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKJG9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkb3B0aW9ucywgJGRlZmF1bHRPcHRpb25zKTsKCmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBzZWxmOjpmaXhIdHRwSGVhZGVyRmllbGQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pOwp9CgpyZXR1cm4gc3RyZWFtX2NvbnRleHRfY3JlYXRlKCRvcHRpb25zLCAkZGVmYXVsdFBhcmFtcyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXRPcHRpb25zKHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucywgYm9vbCAkZm9yQ3VybCA9IGZhbHNlKTogYXJyYXkKewoKaWYgKCFpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBbXTsKfQppZiAoaXNfc3RyaW5nKCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IGV4cGxvZGUoIlxyXG4iLCAkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSk7Cn0KCgppZiAoISRmb3JDdXJsKSB7CiRwcm94eSA9IFByb3h5TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0UHJveHlGb3JSZXF1ZXN0KCR1cmwpOwppZiAoJHByb3h5T3B0aW9ucyA9ICRwcm94eS0+Z2V0Q29udGV4dE9wdGlvbnMoKSkgewokaXNIdHRwc1JlcXVlc3QgPSAwID09PSBzdHJwb3MoJHVybCwgJ2h0dHBzOi8vJyk7CgppZiAoJHByb3h5LT5pc1NlY3VyZSgpKSB7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24gdG8gdXNlIGEgc2VjdXJlIHByb3h5LicpOwp9CmlmICgkaXNIdHRwc1JlcXVlc3QpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignWW91IG11c3QgZW5hYmxlIHRoZSBjdXJsIGV4dGVuc2lvbiB0byBtYWtlIGh0dHBzIHJlcXVlc3RzIHRocm91Z2ggYSBzZWN1cmUgcHJveHkuJyk7Cn0KfSBlbHNlaWYgKCRpc0h0dHBzUmVxdWVzdCAmJiAhZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24gdG8gbWFrZSBodHRwcyByZXF1ZXN0cyB0aHJvdWdoIGEgcHJveHkuJyk7Cn0KCgppZiAoaXNzZXQoJHByb3h5T3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICRwcm94eU9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107CnVuc2V0KCRwcm94eU9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pOwp9CiRvcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJG9wdGlvbnMsICRwcm94eU9wdGlvbnMpOwp9Cn0KCmlmIChkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewokcGhwVmVyc2lvbiA9ICdISFZNICcgLiBISFZNX1ZFUlNJT047Cn0gZWxzZSB7CiRwaHBWZXJzaW9uID0gJ1BIUCAnIC4gUEhQX01BSk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfTUlOT1JfVkVSU0lPTiAuICcuJyAuIFBIUF9SRUxFQVNFX1ZFUlNJT047Cn0KCmlmICgkZm9yQ3VybCkgewokY3VybCA9IGN1cmxfdmVyc2lvbigpOwokaHR0cFZlcnNpb24gPSAnY1VSTCAnLiRjdXJsWyd2ZXJzaW9uJ107Cn0gZWxzZSB7CiRodHRwVmVyc2lvbiA9ICdzdHJlYW1zJzsKfQoKaWYgKCFpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkgfHwgZmFsc2UgPT09IHN0cmlwb3MoaW1wbG9kZSgnJywgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pLCAndXNlci1hZ2VudCcpKSB7CiRwbGF0Zm9ybVBocFZlcnNpb24gPSBQbGF0Zm9ybVJlcG9zaXRvcnk6OmdldFBsYXRmb3JtUGhwVmVyc2lvbigpOwokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gc3ByaW50ZigKJ1VzZXItQWdlbnQ6IENvbXBvc2VyLyVzICglczsgJXM7ICVzOyAlcyVzJXMpJywKQ29tcG9zZXI6OmdldFZlcnNpb24oKSwKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncycpIDogJ1Vua25vd24nLApmdW5jdGlvbl9leGlzdHMoJ3BocF91bmFtZScpID8gcGhwX3VuYW1lKCdyJykgOiAnVW5rbm93bicsCiRwaHBWZXJzaW9uLAokaHR0cFZlcnNpb24sCiRwbGF0Zm9ybVBocFZlcnNpb24gPyAnOyBQbGF0Zm9ybS1QSFAgJy4kcGxhdGZvcm1QaHBWZXJzaW9uIDogJycsClBsYXRmb3JtOjpnZXRFbnYoJ0NJJykgPyAnOyBDSScgOiAnJwopOwp9CgpyZXR1cm4gJG9wdGlvbnM7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUbHNEZWZhdWx0cyhhcnJheSAkb3B0aW9ucywgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCk6IGFycmF5CnsKJGNpcGhlcnMgPSBpbXBsb2RlKCc6JywgWwonRUNESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2JywKJ0VDREhFLUVDRFNBLUFFUzEyOC1HQ00tU0hBMjU2JywKJ0VDREhFLVJTQS1BRVMyNTYtR0NNLVNIQTM4NCcsCidFQ0RIRS1FQ0RTQS1BRVMyNTYtR0NNLVNIQTM4NCcsCidESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2JywKJ0RIRS1EU1MtQUVTMTI4LUdDTS1TSEEyNTYnLAona0VESCtBRVNHQ00nLAonRUNESEUtUlNBLUFFUzEyOC1TSEEyNTYnLAonRUNESEUtRUNEU0EtQUVTMTI4LVNIQTI1NicsCidFQ0RIRS1SU0EtQUVTMTI4LVNIQScsCidFQ0RIRS1FQ0RTQS1BRVMxMjgtU0hBJywKJ0VDREhFLVJTQS1BRVMyNTYtU0hBMzg0JywKJ0VDREhFLUVDRFNBLUFFUzI1Ni1TSEEzODQnLAonRUNESEUtUlNBLUFFUzI1Ni1TSEEnLAonRUNESEUtRUNEU0EtQUVTMjU2LVNIQScsCidESEUtUlNBLUFFUzEyOC1TSEEyNTYnLAonREhFLVJTQS1BRVMxMjgtU0hBJywKJ0RIRS1EU1MtQUVTMTI4LVNIQTI1NicsCidESEUtUlNBLUFFUzI1Ni1TSEEyNTYnLAonREhFLURTUy1BRVMyNTYtU0hBJywKJ0RIRS1SU0EtQUVTMjU2LVNIQScsCidBRVMxMjgtR0NNLVNIQTI1NicsCidBRVMyNTYtR0NNLVNIQTM4NCcsCidBRVMxMjgtU0hBMjU2JywKJ0FFUzI1Ni1TSEEyNTYnLAonQUVTMTI4LVNIQScsCidBRVMyNTYtU0hBJywKJ0FFUycsCidDQU1FTExJQScsCidERVMtQ0JDMy1TSEEnLAonIWFOVUxMJywKJyFlTlVMTCcsCichRVhQT1JUJywKJyFERVMnLAonIVJDNCcsCichTUQ1JywKJyFQU0snLAonIWFFQ0RIJywKJyFFREgtRFNTLURFUy1DQkMzLVNIQScsCichRURILVJTQS1ERVMtQ0JDMy1TSEEnLAonIUtSQjUtREVTLUNCQzMtU0hBJywKXSk7CgoKCgoKCgokZGVmYXVsdHMgPSBbCidzc2wnID0+IFsKJ2NpcGhlcnMnID0+ICRjaXBoZXJzLAondmVyaWZ5X3BlZXInID0+IHRydWUsCid2ZXJpZnlfZGVwdGgnID0+IDcsCidTTklfZW5hYmxlZCcgPT4gdHJ1ZSwKJ2NhcHR1cmVfcGVlcl9jZXJ0JyA9PiB0cnVlLApdLApdOwoKaWYgKGlzc2V0KCRvcHRpb25zWydzc2wnXSkpIHsKJGRlZmF1bHRzWydzc2wnXSA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRkZWZhdWx0c1snc3NsJ10sICRvcHRpb25zWydzc2wnXSk7Cn0KCgoKCgppZiAoIWlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddKSAmJiAhaXNzZXQoJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10pKSB7CiRyZXN1bHQgPSBDYUJ1bmRsZTo6Z2V0U3lzdGVtQ2FSb290QnVuZGxlUGF0aCgkbG9nZ2VyKTsKCmlmIChpc19kaXIoJHJlc3VsdCkpIHsKJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10gPSAkcmVzdWx0Owp9IGVsc2UgewokZGVmYXVsdHNbJ3NzbCddWydjYWZpbGUnXSA9ICRyZXN1bHQ7Cn0KfQoKaWYgKGlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddKSAmJiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRlZmF1bHRzWydzc2wnXVsnY2FmaWxlJ10pIHx8ICFDYUJ1bmRsZTo6dmFsaWRhdGVDYUZpbGUoJGRlZmF1bHRzWydzc2wnXVsnY2FmaWxlJ10sICRsb2dnZXIpKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgY29uZmlndXJlZCBjYWZpbGUgd2FzIG5vdCB2YWxpZCBvciBjb3VsZCBub3QgYmUgcmVhZC4nKTsKfQoKaWYgKGlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddKSAmJiAoIWlzX2RpcigkZGVmYXVsdHNbJ3NzbCddWydjYXBhdGgnXSkgfHwgIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10pKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgY29uZmlndXJlZCBjYXBhdGggd2FzIG5vdCB2YWxpZCBvciBjb3VsZCBub3QgYmUgcmVhZC4nKTsKfQoKCgoKJGRlZmF1bHRzWydzc2wnXVsnZGlzYWJsZV9jb21wcmVzc2lvbiddID0gdHJ1ZTsKCnJldHVybiAkZGVmYXVsdHM7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmaXhIdHRwSGVhZGVyRmllbGQoJGhlYWRlcik6IGFycmF5CnsKaWYgKCFpc19hcnJheSgkaGVhZGVyKSkgewokaGVhZGVyID0gZXhwbG9kZSgiXHJcbiIsICRoZWFkZXIpOwp9CnVhc29ydCgkaGVhZGVyLCBzdGF0aWMgZnVuY3Rpb24gKCRlbCk6IGludCB7CnJldHVybiBzdHJpcG9zKCRlbCwgJ2NvbnRlbnQtdHlwZScpID09PSAwID8gMSA6IC0xOwp9KTsKCnJldHVybiAkaGVhZGVyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKY2xhc3MgU3ZuCnsKcHJpdmF0ZSBjb25zdCBNQVhfUVRZX0FVVEhfVFJJRVMgPSA1OwoKCgoKcHJvdGVjdGVkICRjcmVkZW50aWFsczsKCgoKCnByb3RlY3RlZCAkaGFzQXV0aDsKCgoKCnByb3RlY3RlZCAkaW87CgoKCgpwcm90ZWN0ZWQgJHVybDsKCgoKCnByb3RlY3RlZCAkY2FjaGVDcmVkZW50aWFscyA9IHRydWU7CgoKCgpwcm90ZWN0ZWQgJHByb2Nlc3M7CgoKCgpwcm90ZWN0ZWQgJHF0eUF1dGhUcmllcyA9IDA7CgoKCgpwcm90ZWN0ZWQgJGNvbmZpZzsKCgoKCnByaXZhdGUgc3RhdGljICR2ZXJzaW9uOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdXJsLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewokdGhpcy0+dXJsID0gJHVybDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYW5FbnYoKTogdm9pZAp7CgpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0RZTERfTElCUkFSWV9QQVRIJyk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKHN0cmluZyAkY29tbWFuZCwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsLCBib29sICR2ZXJib3NlID0gZmFsc2UpOiBzdHJpbmcKewoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKcmV0dXJuICR0aGlzLT5leGVjdXRlV2l0aEF1dGhSZXRyeSgkY29tbWFuZCwgJGN3ZCwgJHVybCwgJHBhdGgsICR2ZXJib3NlKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZUxvY2FsKHN0cmluZyAkY29tbWFuZCwgc3RyaW5nICRwYXRoLCA/c3RyaW5nICRjd2QgPSBudWxsLCBib29sICR2ZXJib3NlID0gZmFsc2UpOiBzdHJpbmcKewoKcmV0dXJuICR0aGlzLT5leGVjdXRlV2l0aEF1dGhSZXRyeSgkY29tbWFuZCwgJGN3ZCwgJycsICRwYXRoLCAkdmVyYm9zZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXhlY3V0ZVdpdGhBdXRoUmV0cnkoc3RyaW5nICRzdm5Db21tYW5kLCA/c3RyaW5nICRjd2QsIHN0cmluZyAkdXJsLCA/c3RyaW5nICRwYXRoLCBib29sICR2ZXJib3NlKTogP3N0cmluZwp7CgokY29tbWFuZCA9ICR0aGlzLT5nZXRDb21tYW5kKCRzdm5Db21tYW5kLCAkdXJsLCAkcGF0aCk7Cgokb3V0cHV0ID0gbnVsbDsKJGlvID0gJHRoaXMtPmlvOwokaGFuZGxlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHR5cGUsICRidWZmZXIpIHVzZSAoJiRvdXRwdXQsICRpbywgJHZlcmJvc2UpIHsKaWYgKCR0eXBlICE9PSAnb3V0JykgewpyZXR1cm4gbnVsbDsKfQppZiAoc3RycG9zKCRidWZmZXIsICdSZWRpcmVjdGluZyB0byBVUkwgJykgPT09IDApIHsKcmV0dXJuIG51bGw7Cn0KJG91dHB1dCAuPSAkYnVmZmVyOwppZiAoJHZlcmJvc2UpIHsKJGlvLT53cml0ZUVycm9yKCRidWZmZXIsIGZhbHNlKTsKfQp9Owokc3RhdHVzID0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRoYW5kbGVyLCAkY3dkKTsKaWYgKDAgPT09ICRzdGF0dXMpIHsKcmV0dXJuICRvdXRwdXQ7Cn0KCiRlcnJvck91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwokZnVsbE91dHB1dCA9IHRyaW0oaW1wbG9kZSgiXG4iLCBbJG91dHB1dCwgJGVycm9yT3V0cHV0XSkpOwoKCmlmIChmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgdG8gc2VydmVyOicpCiYmIGZhbHNlID09PSBzdHJpcG9zKCRmdWxsT3V0cHV0LCAnYXV0aG9yaXphdGlvbiBmYWlsZWQnKQomJiBmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ3N2bjogRTE3MDAwMTonKQomJiBmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ3N2bjogRTIxNTAwNDonKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGZ1bGxPdXRwdXQpOwp9CgppZiAoISR0aGlzLT5oYXNBdXRoKCkpIHsKJHRoaXMtPmRvQXV0aERhbmNlKCk7Cn0KCgppZiAoJHRoaXMtPnF0eUF1dGhUcmllcysrIDwgc2VsZjo6TUFYX1FUWV9BVVRIX1RSSUVTKSB7CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGVXaXRoQXV0aFJldHJ5KCRzdm5Db21tYW5kLCAkY3dkLCAkdXJsLCAkcGF0aCwgJHZlcmJvc2UpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCid3cm9uZyBjcmVkZW50aWFscyBwcm92aWRlZCAoJy4kZnVsbE91dHB1dC4nKScKKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENhY2hlQ3JlZGVudGlhbHMoYm9vbCAkY2FjaGVDcmVkZW50aWFscyk6IHZvaWQKewokdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA9ICRjYWNoZUNyZWRlbnRpYWxzOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9BdXRoRGFuY2UoKTogU3ZuCnsKCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonY2FuIG5vdCBhc2sgZm9yIGF1dGhlbnRpY2F0aW9uIGluIG5vbiBpbnRlcmFjdGl2ZSBtb2RlJwopOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlRoZSBTdWJ2ZXJzaW9uIHNlcnZlciAoeyR0aGlzLT51cmx9KSByZXF1ZXN0ZWQgY3JlZGVudGlhbHM6Iik7CgokdGhpcy0+aGFzQXV0aCA9IHRydWU7CiR0aGlzLT5jcmVkZW50aWFscyA9IFsKJ3VzZXJuYW1lJyA9PiAoc3RyaW5nKSAkdGhpcy0+aW8tPmFzaygiVXNlcm5hbWU6ICIsICcnKSwKJ3Bhc3N3b3JkJyA9PiAoc3RyaW5nKSAkdGhpcy0+aW8tPmFza0FuZEhpZGVBbnN3ZXIoIlBhc3N3b3JkOiAiKSwKXTsKCiR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oIlNob3VsZCBTdWJ2ZXJzaW9uIGNhY2hlIHRoZXNlIGNyZWRlbnRpYWxzPyAoeWVzL25vKSAiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21tYW5kKHN0cmluZyAkY21kLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkcGF0aCA9IG51bGwpOiBzdHJpbmcKewokY21kID0gc3ByaW50ZigKJyVzICVzJXMgLS0gJXMnLAokY21kLAonLS1ub24taW50ZXJhY3RpdmUgJywKJHRoaXMtPmdldENyZWRlbnRpYWxTdHJpbmcoKSwKUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHVybCkKKTsKCmlmICgkcGF0aCkgewokY21kIC49ICcgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwYXRoKTsKfQoKcmV0dXJuICRjbWQ7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENyZWRlbnRpYWxTdHJpbmcoKTogc3RyaW5nCnsKaWYgKCEkdGhpcy0+aGFzQXV0aCgpKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuIHNwcmludGYoCicgJXMtLXVzZXJuYW1lICVzIC0tcGFzc3dvcmQgJXMgJywKJHRoaXMtPmdldEF1dGhDYWNoZSgpLApQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdGhpcy0+Z2V0VXNlcm5hbWUoKSksClByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0aGlzLT5nZXRQYXNzd29yZCgpKQopOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXNzd29yZCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmNyZWRlbnRpYWxzID09PSBudWxsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIk5vIHN2biBhdXRoIGRldGVjdGVkLiIpOwp9CgpyZXR1cm4gJHRoaXMtPmNyZWRlbnRpYWxzWydwYXNzd29yZCddOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRVc2VybmFtZSgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmNyZWRlbnRpYWxzID09PSBudWxsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIk5vIHN2biBhdXRoIGRldGVjdGVkLiIpOwp9CgpyZXR1cm4gJHRoaXMtPmNyZWRlbnRpYWxzWyd1c2VybmFtZSddOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzQXV0aCgpOiBib29sCnsKaWYgKG51bGwgIT09ICR0aGlzLT5oYXNBdXRoKSB7CnJldHVybiAkdGhpcy0+aGFzQXV0aDsKfQoKaWYgKGZhbHNlID09PSAkdGhpcy0+Y3JlYXRlQXV0aEZyb21Db25maWcoKSkgewokdGhpcy0+Y3JlYXRlQXV0aEZyb21VcmwoKTsKfQoKcmV0dXJuIChib29sKSAkdGhpcy0+aGFzQXV0aDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEF1dGhDYWNoZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPyAnJyA6ICctLW5vLWF1dGgtY2FjaGUgJzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVBdXRoRnJvbUNvbmZpZygpOiBib29sCnsKaWYgKCEkdGhpcy0+Y29uZmlnLT5oYXMoJ2h0dHAtYmFzaWMnKSkgewpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSBmYWxzZTsKfQoKJGF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2h0dHAtYmFzaWMnKTsKCiRob3N0ID0gcGFyc2VfdXJsKCR0aGlzLT51cmwsIFBIUF9VUkxfSE9TVCk7CmlmIChpc3NldCgkYXV0aENvbmZpZ1skaG9zdF0pKSB7CiR0aGlzLT5jcmVkZW50aWFscyA9IFsKJ3VzZXJuYW1lJyA9PiAkYXV0aENvbmZpZ1skaG9zdF1bJ3VzZXJuYW1lJ10sCidwYXNzd29yZCcgPT4gJGF1dGhDb25maWdbJGhvc3RdWydwYXNzd29yZCddLApdOwoKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gdHJ1ZTsKfQoKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlQXV0aEZyb21VcmwoKTogYm9vbAp7CiR1cmkgPSBwYXJzZV91cmwoJHRoaXMtPnVybCk7CmlmIChlbXB0eSgkdXJpWyd1c2VyJ10pKSB7CnJldHVybiAkdGhpcy0+aGFzQXV0aCA9IGZhbHNlOwp9CgokdGhpcy0+Y3JlZGVudGlhbHMgPSBbCid1c2VybmFtZScgPT4gJHVyaVsndXNlciddLAoncGFzc3dvcmQnID0+ICFlbXB0eSgkdXJpWydwYXNzJ10pID8gJHVyaVsncGFzcyddIDogJycsCl07CgpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYmluYXJ5VmVyc2lvbigpOiA/c3RyaW5nCnsKaWYgKCFzZWxmOjokdmVyc2lvbikgewppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJ3N2biAtLXZlcnNpb24nLCAkb3V0cHV0KSkgewppZiAoUHJlZzo6aXNNYXRjaCgneyhcZCsoPzpcLlxkKykrKX0nLCAkb3V0cHV0LCAkbWF0Y2gpKSB7CnNlbGY6OiR2ZXJzaW9uID0gJG1hdGNoWzFdOwp9Cn0KfQoKcmV0dXJuIHNlbGY6OiR2ZXJzaW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgpjbGFzcyBTeW5jSGVscGVyCnsKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRvd25sb2FkQW5kSW5zdGFsbFBhY2thZ2VTeW5jKExvb3AgJGxvb3AsICRkb3dubG9hZGVyLCBzdHJpbmcgJHBhdGgsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiB2b2lkCnsKYXNzZXJ0KCRkb3dubG9hZGVyIGluc3RhbmNlb2YgRG93bmxvYWRlckludGVyZmFjZSB8fCAkZG93bmxvYWRlciBpbnN0YW5jZW9mIERvd25sb2FkTWFuYWdlcik7CgokdHlwZSA9ICRwcmV2UGFja2FnZSAhPT0gbnVsbCA/ICd1cGRhdGUnIDogJ2luc3RhbGwnOwoKdHJ5IHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5kb3dubG9hZCgkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwoKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5wcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwoKaWYgKCR0eXBlID09PSAndXBkYXRlJyAmJiAkcHJldlBhY2thZ2UgIT09IG51bGwpIHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT51cGRhdGUoJHBhY2thZ2UsICRwcmV2UGFja2FnZSwgJHBhdGgpKTsKfSBlbHNlIHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5pbnN0YWxsKCRwYWNrYWdlLCAkcGF0aCkpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwp0aHJvdyAkZTsKfQoKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGF3YWl0KExvb3AgJGxvb3AsID9Qcm9taXNlSW50ZXJmYWNlICRwcm9taXNlID0gbnVsbCk6IHZvaWQKewppZiAoJHByb21pc2UgIT09IG51bGwpIHsKJGxvb3AtPndhaXQoWyRwcm9taXNlXSk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKCgoKY2xhc3MgVGFyCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wb3Nlckpzb24oc3RyaW5nICRwYXRoVG9BcmNoaXZlKTogP3N0cmluZwp7CiRwaGFyID0gbmV3IFxQaGFyRGF0YSgkcGF0aFRvQXJjaGl2ZSk7CgppZiAoISRwaGFyLT52YWxpZCgpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gc2VsZjo6ZXh0cmFjdENvbXBvc2VySnNvbkZyb21Gb2xkZXIoJHBoYXIpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0Q29tcG9zZXJKc29uRnJvbUZvbGRlcihcUGhhckRhdGEgJHBoYXIpOiBzdHJpbmcKewppZiAoaXNzZXQoJHBoYXJbJ2NvbXBvc2VyLmpzb24nXSkpIHsKcmV0dXJuICRwaGFyWydjb21wb3Nlci5qc29uJ10tPmdldENvbnRlbnQoKTsKfQoKJHRvcExldmVsUGF0aHMgPSBbXTsKZm9yZWFjaCAoJHBoYXIgYXMgJGZvbGRlckZpbGUpIHsKJG5hbWUgPSAkZm9sZGVyRmlsZS0+Z2V0QmFzZW5hbWUoKTsKCmlmICgkZm9sZGVyRmlsZS0+aXNEaXIoKSkgewokdG9wTGV2ZWxQYXRoc1skbmFtZV0gPSB0cnVlOwppZiAoXGNvdW50KCR0b3BMZXZlbFBhdGhzKSA+IDEpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBcmNoaXZlIGhhcyBtb3JlIHRoYW4gb25lIHRvcCBsZXZlbCBkaXJlY3RvcmllcywgYW5kIG5vIGNvbXBvc2VyLmpzb24gd2FzIGZvdW5kIG9uIHRoZSB0b3AgbGV2ZWwsIHNvIGl0XCdzIGFuIGludmFsaWQgYXJjaGl2ZS4gVG9wIGxldmVsIHBhdGhzIGZvdW5kIHdlcmU6ICcuaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHRvcExldmVsUGF0aHMpKSk7Cn0KfQp9CgokY29tcG9zZXJKc29uUGF0aCA9IGtleSgkdG9wTGV2ZWxQYXRocykuJy9jb21wb3Nlci5qc29uJzsKaWYgKCR0b3BMZXZlbFBhdGhzICYmIGlzc2V0KCRwaGFyWyRjb21wb3Nlckpzb25QYXRoXSkpIHsKcmV0dXJuICRwaGFyWyRjb21wb3Nlckpzb25QYXRoXS0+Z2V0Q29udGVudCgpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgZWl0aGVyIGF0IHRoZSB0b3AgbGV2ZWwgb3Igd2l0aGluIHRoZSB0b3Btb3N0IGRpcmVjdG9yeScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ2FCdW5kbGVcQ2FCdW5kbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKZmluYWwgY2xhc3MgVGxzSGVscGVyCnsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tDZXJ0aWZpY2F0ZUhvc3QoJGNlcnRpZmljYXRlLCBzdHJpbmcgJGhvc3RuYW1lLCA/c3RyaW5nICYkY24gPSBudWxsKTogYm9vbAp7CiRuYW1lcyA9IHNlbGY6OmdldENlcnRpZmljYXRlTmFtZXMoJGNlcnRpZmljYXRlKTsKCmlmIChlbXB0eSgkbmFtZXMpKSB7CnJldHVybiBmYWxzZTsKfQoKJGNvbWJpbmVkTmFtZXMgPSBhcnJheV9tZXJnZSgkbmFtZXNbJ3NhbiddLCBbJG5hbWVzWydjbiddXSk7CiRob3N0bmFtZSA9IHN0cnRvbG93ZXIoJGhvc3RuYW1lKTsKCmZvcmVhY2ggKCRjb21iaW5lZE5hbWVzIGFzICRjZXJ0TmFtZSkgewokbWF0Y2hlciA9IHNlbGY6OmNlcnROYW1lTWF0Y2hlcigkY2VydE5hbWUpOwoKaWYgKCRtYXRjaGVyICYmICRtYXRjaGVyKCRob3N0bmFtZSkpIHsKJGNuID0gJG5hbWVzWydjbiddOwoKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDZXJ0aWZpY2F0ZU5hbWVzKCRjZXJ0aWZpY2F0ZSk6ID9hcnJheQp7CmlmIChpc19hcnJheSgkY2VydGlmaWNhdGUpKSB7CiRpbmZvID0gJGNlcnRpZmljYXRlOwp9IGVsc2VpZiAoQ2FCdW5kbGU6OmlzT3BlbnNzbFBhcnNlU2FmZSgpKSB7CiRpbmZvID0gb3BlbnNzbF94NTA5X3BhcnNlKCRjZXJ0aWZpY2F0ZSwgZmFsc2UpOwp9CgppZiAoIWlzc2V0KCRpbmZvWydzdWJqZWN0J11bJ2NvbW1vbk5hbWUnXSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRjb21tb25OYW1lID0gc3RydG9sb3dlcigkaW5mb1snc3ViamVjdCddWydjb21tb25OYW1lJ10pOwokc3ViamVjdEFsdE5hbWVzID0gW107CgppZiAoaXNzZXQoJGluZm9bJ2V4dGVuc2lvbnMnXVsnc3ViamVjdEFsdE5hbWUnXSkpIHsKJHN1YmplY3RBbHROYW1lcyA9IFByZWc6OnNwbGl0KCd7XHMqLFxzKn0nLCAkaW5mb1snZXh0ZW5zaW9ucyddWydzdWJqZWN0QWx0TmFtZSddKTsKJHN1YmplY3RBbHROYW1lcyA9IGFycmF5X2ZpbHRlcihhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkbmFtZSk6ID9zdHJpbmcgewppZiAoMCA9PT0gc3RycG9zKCRuYW1lLCAnRE5TOicpKSB7CnJldHVybiBzdHJ0b2xvd2VyKGx0cmltKHN1YnN0cigkbmFtZSwgNCkpKTsKfQoKcmV0dXJuIG51bGw7Cn0sICRzdWJqZWN0QWx0TmFtZXMpKTsKJHN1YmplY3RBbHROYW1lcyA9IGFycmF5X3ZhbHVlcygkc3ViamVjdEFsdE5hbWVzKTsKfQoKcmV0dXJuIFsKJ2NuJyA9PiAkY29tbW9uTmFtZSwKJ3NhbicgPT4gJHN1YmplY3RBbHROYW1lcywKXTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDZXJ0aWZpY2F0ZUZpbmdlcnByaW50KHN0cmluZyAkY2VydGlmaWNhdGUpOiBzdHJpbmcKewokcHVia2V5ID0gb3BlbnNzbF9nZXRfcHVibGlja2V5KCRjZXJ0aWZpY2F0ZSk7CmlmICgkcHVia2V5ID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byByZXRyaWV2ZSB0aGUgcHVibGljIGtleSBmcm9tIGNlcnRpZmljYXRlJyk7Cn0KJHB1YmtleWRldGFpbHMgPSBvcGVuc3NsX3BrZXlfZ2V0X2RldGFpbHMoJHB1YmtleSk7CiRwdWJrZXlwZW0gPSAkcHVia2V5ZGV0YWlsc1sna2V5J107Cgokc3RhcnQgPSAnLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0nOwokZW5kID0gJy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLSc7CiRwZW10cmltID0gc3Vic3RyKCRwdWJrZXlwZW0sIHN0cnBvcygkcHVia2V5cGVtLCAkc3RhcnQpICsgc3RybGVuKCRzdGFydCksIChzdHJsZW4oJHB1YmtleXBlbSkgLSBzdHJwb3MoJHB1YmtleXBlbSwgJGVuZCkpICogKC0xKSk7CiRkZXIgPSBiYXNlNjRfZGVjb2RlKCRwZW10cmltKTsKCnJldHVybiBzaGExKCRkZXIpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT3BlbnNzbFBhcnNlU2FmZSgpOiBib29sCnsKcmV0dXJuIENhQnVuZGxlOjppc09wZW5zc2xQYXJzZVNhZmUoKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjZXJ0TmFtZU1hdGNoZXIoc3RyaW5nICRjZXJ0TmFtZSk6ID9jYWxsYWJsZQp7CiR3aWxkY2FyZHMgPSBzdWJzdHJfY291bnQoJGNlcnROYW1lLCAnKicpOwoKaWYgKDAgPT09ICR3aWxkY2FyZHMpIHsKCnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKCRob3N0bmFtZSkgdXNlICgkY2VydE5hbWUpOiBib29sIHsKcmV0dXJuICRob3N0bmFtZSA9PT0gJGNlcnROYW1lOwp9Owp9CgppZiAoMSA9PT0gJHdpbGRjYXJkcykgewokY29tcG9uZW50cyA9IGV4cGxvZGUoJy4nLCAkY2VydE5hbWUpOwoKaWYgKDMgPiBjb3VudCgkY29tcG9uZW50cykpIHsKCnJldHVybiBudWxsOwp9CgokZmlyc3RDb21wb25lbnQgPSAkY29tcG9uZW50c1swXTsKCgppZiAoJyonICE9PSAkZmlyc3RDb21wb25lbnRbc3RybGVuKCRmaXJzdENvbXBvbmVudCkgLSAxXSkgewpyZXR1cm4gbnVsbDsKfQoKJHdpbGRjYXJkUmVnZXggPSBwcmVnX3F1b3RlKCRjZXJ0TmFtZSk7CiR3aWxkY2FyZFJlZ2V4ID0gc3RyX3JlcGxhY2UoJ1xcKicsICdbYS16MC05LV0rJywgJHdpbGRjYXJkUmVnZXgpOwokd2lsZGNhcmRSZWdleCA9ICJ7Xnskd2lsZGNhcmRSZWdleH0kfSI7CgpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uICgkaG9zdG5hbWUpIHVzZSAoJHdpbGRjYXJkUmVnZXgpOiBib29sIHsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJHdpbGRjYXJkUmVnZXgsICRob3N0bmFtZSk7Cn07Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgVXJsCnsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlRGlzdFJlZmVyZW5jZShDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIHN0cmluZyAkcmVmKTogc3RyaW5nCnsKJGhvc3QgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKCmlmICgkaG9zdCA9PT0gJ2FwaS5naXRodWIuY29tJyB8fCAkaG9zdCA9PT0gJ2dpdGh1Yi5jb20nIHx8ICRob3N0ID09PSAnd3d3LmdpdGh1Yi5jb20nKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9naXRodWJcLmNvbS8oW14vXSspLyhbXi9dKykvKHppcHx0YXIpYmFsbC8oLispJH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzp3d3dcLik/Z2l0aHViXC5jb20vKFteL10rKS8oW14vXSspL2FyY2hpdmUvLitcLih6aXB8dGFyKSg/OlwuZ3opPyR9aScsICR1cmwsICRtYXRjaCkpIHsKCiR1cmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8nIC4gJG1hdGNoWzFdIC4gJy8nLiAkbWF0Y2hbMl0gLiAnLycgLiAkbWF0Y2hbM10gLiAnYmFsbC8nIC4gJHJlZjsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vYXBpXC5naXRodWJcLmNvbS9yZXBvcy8oW14vXSspLyhbXi9dKykvKHppcHx0YXIpYmFsbCg/Oi8uKyk/JH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9Cn0gZWxzZWlmICgkaG9zdCA9PT0gJ2JpdGJ1Y2tldC5vcmcnIHx8ICRob3N0ID09PSAnd3d3LmJpdGJ1Y2tldC5vcmcnKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9iaXRidWNrZXRcLm9yZy8oW14vXSspLyhbXi9dKykvZ2V0LyguKylcLih6aXB8dGFyXC5nenx0YXJcLmJ6MikkfWknLCAkdXJsLCAkbWF0Y2gpKSB7CgokdXJsID0gJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy8nIC4gJG1hdGNoWzFdIC4gJy8nLiAkbWF0Y2hbMl0gLiAnL2dldC8nIC4gJHJlZiAuICcuJyAuICRtYXRjaFs0XTsKfQp9IGVsc2VpZiAoJGhvc3QgPT09ICdnaXRsYWIuY29tJyB8fCAkaG9zdCA9PT0gJ3d3dy5naXRsYWIuY29tJykgewppZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzp3d3dcLik/Z2l0bGFiXC5jb20vYXBpL3ZbMzRdL3Byb2plY3RzLyhbXi9dKykvcmVwb3NpdG9yeS9hcmNoaXZlXC4oemlwfHRhclwuZ3p8dGFyXC5iejJ8dGFyKVw/c2hhPS4rJH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0L3Byb2plY3RzLycgLiAkbWF0Y2hbMV0gLiAnL3JlcG9zaXRvcnkvYXJjaGl2ZS4nIC4gJG1hdGNoWzJdIC4gJz9zaGE9JyAuICRyZWY7Cn0KfSBlbHNlaWYgKGluX2FycmF5KCRob3N0LCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7KC9yZXBvcy9bXi9dKy9bXi9dKy8oemlwfHRhciliYWxsKSg/Oi8uKyk/JH1pJywgJyQxLycuJHJlZiwgJHVybCk7Cn0gZWxzZWlmIChpbl9hcnJheSgkaG9zdCwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdXJsID0gUHJlZzo6cmVwbGFjZSgneygvYXBpL3ZbMzRdL3Byb2plY3RzL1teL10rL3JlcG9zaXRvcnkvYXJjaGl2ZVwuKD86emlwfHRhclwuZ3p8dGFyXC5iejJ8dGFyKVw/c2hhPSkuKyR9aScsICckezF9Jy4kcmVmLCAkdXJsKTsKfQoKYXNzZXJ0KCR1cmwgIT09ICcnKTsKCnJldHVybiAkdXJsOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPcmlnaW4oQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAnZmlsZTovLycpKSB7CnJldHVybiAkdXJsOwp9Cgokb3JpZ2luID0gKHN0cmluZykgcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCk7CmlmICgkcG9ydCA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1BPUlQpKSB7CiRvcmlnaW4gLj0gJzonLiRwb3J0Owp9CgppZiAoc3RycG9zKCRvcmlnaW4sICcuZ2l0aHViLmNvbScpID09PSAoc3RybGVuKCRvcmlnaW4pIC0gMTEpKSB7CnJldHVybiAnZ2l0aHViLmNvbSc7Cn0KCmlmICgkb3JpZ2luID09PSAncmVwby5wYWNrYWdpc3Qub3JnJykgewpyZXR1cm4gJ3BhY2thZ2lzdC5vcmcnOwp9CgppZiAoJG9yaWdpbiA9PT0gJycpIHsKJG9yaWdpbiA9ICR1cmw7Cn0KCgoKaWYgKApmYWxzZSA9PT0gc3RycG9zKCRvcmlnaW4sICcvJykKJiYgIWluX2FycmF5KCRvcmlnaW4sICRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkKKSB7CmZvcmVhY2ggKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSBhcyAkZ2l0bGFiRG9tYWluKSB7CmlmICgkZ2l0bGFiRG9tYWluICE9PSAnJyAmJiBzdHJfc3RhcnRzX3dpdGgoJGdpdGxhYkRvbWFpbiwgJG9yaWdpbikpIHsKcmV0dXJuICRnaXRsYWJEb21haW47Cn0KfQp9CgpyZXR1cm4gJG9yaWdpbjsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYW5pdGl6ZShzdHJpbmcgJHVybCk6IHN0cmluZwp7CgoKJHVybCA9IFByZWc6OnJlcGxhY2UoJ3soWyY/XWFjY2Vzc190b2tlbj0pW14mXSt9JywgJyQxKioqJywgJHVybCk7CgokdXJsID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7Xig/UDxwcmVmaXg+W2EtejAtOV0rOi8vKT8oP1A8dXNlcj5bXjovXHNAXSspOig/UDxwYXNzd29yZD5bXkBccy9dKylAfWknLCBzdGF0aWMgZnVuY3Rpb24gKCRtKTogc3RyaW5nIHsKYXNzZXJ0KGlzX3N0cmluZygkbVsndXNlciddKSk7CgppZiAoUHJlZzo6aXNNYXRjaCgne14oW2EtZjAtOV17MTIsfXxnaFthLXpdX1thLXpBLVowLTlfXSt8Z2l0aHViX3BhdF9bYS16QS1aMC05X10rKSR9JywgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICRtWydwcmVmaXgnXS4nKioqOioqKkAnOwp9CgpyZXR1cm4gJG1bJ3ByZWZpeCddLiRtWyd1c2VyJ10uJzoqKipAJzsKfSwgJHVybCk7CgpyZXR1cm4gJHVybDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKCgoKY2xhc3MgWmlwCnsKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wb3Nlckpzb24oc3RyaW5nICRwYXRoVG9aaXApOiA/c3RyaW5nCnsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCd6aXAnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBaaXAgVXRpbCByZXF1aXJlcyBQSFBcJ3MgemlwIGV4dGVuc2lvbicpOwp9CgokemlwID0gbmV3IFxaaXBBcmNoaXZlKCk7CmlmICgkemlwLT5vcGVuKCRwYXRoVG9aaXApICE9PSB0cnVlKSB7CnJldHVybiBudWxsOwp9CgppZiAoMCA9PT0gJHppcC0+bnVtRmlsZXMpIHsKJHppcC0+Y2xvc2UoKTsKCnJldHVybiBudWxsOwp9CgokZm91bmRGaWxlSW5kZXggPSBzZWxmOjpsb2NhdGVGaWxlKCR6aXAsICdjb21wb3Nlci5qc29uJyk7CgokY29udGVudCA9IG51bGw7CiRjb25maWd1cmF0aW9uRmlsZU5hbWUgPSAkemlwLT5nZXROYW1lSW5kZXgoJGZvdW5kRmlsZUluZGV4KTsKJHN0cmVhbSA9ICR6aXAtPmdldFN0cmVhbSgkY29uZmlndXJhdGlvbkZpbGVOYW1lKTsKCmlmIChmYWxzZSAhPT0gJHN0cmVhbSkgewokY29udGVudCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHN0cmVhbSk7Cn0KCiR6aXAtPmNsb3NlKCk7CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbG9jYXRlRmlsZShcWmlwQXJjaGl2ZSAkemlwLCBzdHJpbmcgJGZpbGVuYW1lKTogaW50CnsKCmlmIChmYWxzZSAhPT0gKCRpbmRleCA9ICR6aXAtPmxvY2F0ZU5hbWUoJGZpbGVuYW1lKSkgJiYgJHppcC0+Z2V0RnJvbUluZGV4KCRpbmRleCkgIT09IGZhbHNlKSB7CnJldHVybiAkaW5kZXg7Cn0KCiR0b3BMZXZlbFBhdGhzID0gW107CmZvciAoJGkgPSAwOyAkaSA8ICR6aXAtPm51bUZpbGVzOyAkaSsrKSB7CiRuYW1lID0gJHppcC0+Z2V0TmFtZUluZGV4KCRpKTsKJGRpcm5hbWUgPSBkaXJuYW1lKCRuYW1lKTsKCgppZiAoc3RycG9zKCRuYW1lLCAnX19NQUNPU1gnKSAhPT0gZmFsc2UpIHsKY29udGludWU7Cn0KCgppZiAoJGRpcm5hbWUgPT09ICcuJykgewokdG9wTGV2ZWxQYXRoc1skbmFtZV0gPSB0cnVlOwppZiAoXGNvdW50KCR0b3BMZXZlbFBhdGhzKSA+IDEpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBcmNoaXZlIGhhcyBtb3JlIHRoYW4gb25lIHRvcCBsZXZlbCBkaXJlY3RvcmllcywgYW5kIG5vIGNvbXBvc2VyLmpzb24gd2FzIGZvdW5kIG9uIHRoZSB0b3AgbGV2ZWwsIHNvIGl0XCdzIGFuIGludmFsaWQgYXJjaGl2ZS4gVG9wIGxldmVsIHBhdGhzIGZvdW5kIHdlcmU6ICcuaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHRvcExldmVsUGF0aHMpKSk7Cn0KY29udGludWU7Cn0KCgppZiAoZmFsc2UgPT09IHN0cnBvcygkZGlybmFtZSwgJ1xcJykgJiYgZmFsc2UgPT09IHN0cnBvcygkZGlybmFtZSwgJy8nKSkgewokdG9wTGV2ZWxQYXRoc1skZGlybmFtZS4nLyddID0gdHJ1ZTsKaWYgKFxjb3VudCgkdG9wTGV2ZWxQYXRocykgPiAxKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQXJjaGl2ZSBoYXMgbW9yZSB0aGFuIG9uZSB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMsIGFuZCBubyBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBvbiB0aGUgdG9wIGxldmVsLCBzbyBpdFwncyBhbiBpbnZhbGlkIGFyY2hpdmUuIFRvcCBsZXZlbCBwYXRocyBmb3VuZCB3ZXJlOiAnLmltcGxvZGUoJywnLCBhcnJheV9rZXlzKCR0b3BMZXZlbFBhdGhzKSkpOwp9Cn0KfQoKaWYgKCR0b3BMZXZlbFBhdGhzICYmIGZhbHNlICE9PSAoJGluZGV4ID0gJHppcC0+bG9jYXRlTmFtZShrZXkoJHRvcExldmVsUGF0aHMpLiRmaWxlbmFtZSkpICYmICR6aXAtPmdldEZyb21JbmRleCgkaW5kZXgpICE9PSBmYWxzZSkgewpyZXR1cm4gJGluZGV4Owp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgZWl0aGVyIGF0IHRoZSB0b3AgbGV2ZWwgb3Igd2l0aGluIHRoZSB0b3Btb3N0IGRpcmVjdG9yeScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwoKZnVuY3Rpb24gaW5jbHVkZUlmRXhpc3RzKHN0cmluZyAkZmlsZSk6ID9DbGFzc0xvYWRlcgp7CnJldHVybiBmaWxlX2V4aXN0cygkZmlsZSkgPyBpbmNsdWRlICRmaWxlIDogbnVsbDsKfQoKaWYgKCghJGxvYWRlciA9IGluY2x1ZGVJZkV4aXN0cyhfX0RJUl9fLicvLi4vdmVuZG9yL2F1dG9sb2FkLnBocCcpKSAmJiAoISRsb2FkZXIgPSBpbmNsdWRlSWZFeGlzdHMoX19ESVJfXy4nLy4uLy4uLy4uL2F1dG9sb2FkLnBocCcpKSkgewplY2hvICdZb3UgbXVzdCBzZXQgdXAgdGhlIHByb2plY3QgZGVwZW5kZW5jaWVzIHVzaW5nIGBjb21wb3NlciBpbnN0YWxsYCcuUEhQX0VPTC4KJ1NlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb3dubG9hZC8gZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nIENvbXBvc2VyJy5QSFBfRU9MOwpleGl0KDEpOwp9CgpyZXR1cm4gJGxvYWRlcjsKPD9waHAKCi8qCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENvbXBvc2VyLgogKgogKiAoYykgTmlscyBBZGVybWFubiA8bmFkZXJtYW5AbmFkZXJtYW4uZGU+CiAqICAgICBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKgogKiBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldyB0aGUgTElDRU5TRQogKiBmaWxlIHRoYXQgd2FzIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb3VyY2UgY29kZS4KICovCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7CgovKioKICogQ2xhc3NMb2FkZXIgaW1wbGVtZW50cyBhIFBTUi0wLCBQU1ItNCBhbmQgY2xhc3NtYXAgY2xhc3MgbG9hZGVyLgogKgogKiAgICAgJGxvYWRlciA9IG5ldyBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIoKTsKICoKICogICAgIC8vIHJlZ2lzdGVyIGNsYXNzZXMgd2l0aCBuYW1lc3BhY2VzCiAqICAgICAkbG9hZGVyLT5hZGQoJ1N5bWZvbnlcQ29tcG9uZW50JywgX19ESVJfXy4nL2NvbXBvbmVudCcpOwogKiAgICAgJGxvYWRlci0+YWRkKCdTeW1mb255JywgICAgICAgICAgIF9fRElSX18uJy9mcmFtZXdvcmsnKTsKICoKICogICAgIC8vIGFjdGl2YXRlIHRoZSBhdXRvbG9hZGVyCiAqICAgICAkbG9hZGVyLT5yZWdpc3RlcigpOwogKgogKiAgICAgLy8gdG8gZW5hYmxlIHNlYXJjaGluZyB0aGUgaW5jbHVkZSBwYXRoIChlZy4gZm9yIFBFQVIgcGFja2FnZXMpCiAqICAgICAkbG9hZGVyLT5zZXRVc2VJbmNsdWRlUGF0aCh0cnVlKTsKICoKICogSW4gdGhpcyBleGFtcGxlLCBpZiB5b3UgdHJ5IHRvIHVzZSBhIGNsYXNzIGluIHRoZSBTeW1mb255XENvbXBvbmVudAogKiBuYW1lc3BhY2Ugb3Igb25lIG9mIGl0cyBjaGlsZHJlbiAoU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZSBmb3IgaW5zdGFuY2UpLAogKiB0aGUgYXV0b2xvYWRlciB3aWxsIGZpcnN0IGxvb2sgZm9yIHRoZSBjbGFzcyB1bmRlciB0aGUgY29tcG9uZW50LwogKiBkaXJlY3RvcnksIGFuZCBpdCB3aWxsIHRoZW4gZmFsbGJhY2sgdG8gdGhlIGZyYW1ld29yay8gZGlyZWN0b3J5IGlmIG5vdAogKiBmb3VuZCBiZWZvcmUgZ2l2aW5nIHVwLgogKgogKiBUaGlzIGNsYXNzIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIFN5bWZvbnkgVW5pdmVyc2FsQ2xhc3NMb2FkZXIuCiAqCiAqIEBhdXRob3IgRmFiaWVuIFBvdGVuY2llciA8ZmFiaWVuQHN5bWZvbnkuY29tPgogKiBAYXV0aG9yIEpvcmRpIEJvZ2dpYW5vIDxqLmJvZ2dpYW5vQHNlbGQuYmU+CiAqIEBzZWUgICAgaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0wLwogKiBAc2VlICAgIGh0dHBzOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItNC8KICovCmNsYXNzIENsYXNzTG9hZGVyCnsKICAgIC8qKiBAdmFyIFxDbG9zdXJlKHN0cmluZyk6dm9pZCAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGluY2x1ZGVGaWxlOwoKICAgIC8qKiBAdmFyIHN0cmluZ3xudWxsICovCiAgICBwcml2YXRlICR2ZW5kb3JEaXI7CgogICAgLy8gUFNSLTQKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5PHN0cmluZywgaW50Pj4KICAgICAqLwogICAgcHJpdmF0ZSAkcHJlZml4TGVuZ3Roc1BzcjQgPSBhcnJheSgpOwogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgbGlzdDxzdHJpbmc+PgogICAgICovCiAgICBwcml2YXRlICRwcmVmaXhEaXJzUHNyNCA9IGFycmF5KCk7CiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgJGZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheSgpOwoKICAgIC8vIFBTUi0wCiAgICAvKioKICAgICAqIExpc3Qgb2YgUFNSLTAgcHJlZml4ZXMKICAgICAqCiAgICAgKiBTdHJ1Y3R1cmVkIGFzIGFycmF5KCdGIChmaXJzdCBsZXR0ZXIpJyA9PiBhcnJheSgnRm9vXEJhciAoZnVsbCBwcmVmaXgpJyA9PiBhcnJheSgncGF0aCcsICdwYXRoMicpKSkKICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgYXJyYXk8c3RyaW5nLCBsaXN0PHN0cmluZz4+PgogICAgICovCiAgICBwcml2YXRlICRwcmVmaXhlc1BzcjAgPSBhcnJheSgpOwogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlICRmYWxsYmFja0RpcnNQc3IwID0gYXJyYXkoKTsKCiAgICAvKiogQHZhciBib29sICovCiAgICBwcml2YXRlICR1c2VJbmNsdWRlUGF0aCA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSAkY2xhc3NNYXAgPSBhcnJheSgpOwoKICAgIC8qKiBAdmFyIGJvb2wgKi8KICAgIHByaXZhdGUgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGJvb2w+CiAgICAgKi8KICAgIHByaXZhdGUgJG1pc3NpbmdDbGFzc2VzID0gYXJyYXkoKTsKCiAgICAvKiogQHZhciBzdHJpbmd8bnVsbCAqLwogICAgcHJpdmF0ZSAkYXBjdVByZWZpeDsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBzZWxmPgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICR2ZW5kb3JEaXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2ZW5kb3JEaXIgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT52ZW5kb3JEaXIgPSAkdmVuZG9yRGlyOwogICAgICAgIHNlbGY6OmluaXRpYWxpemVJbmNsdWRlQ2xvc3VyZSgpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzKCkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5wcmVmaXhlc1BzcjApKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCBhcnJheV92YWx1ZXMoJHRoaXMtPnByZWZpeGVzUHNyMCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgbGlzdDxzdHJpbmc+PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZml4ZXNQc3I0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByZWZpeERpcnNQc3I0OwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlycygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlyc1BzcjQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBzdHJpbmc+IEFycmF5IG9mIGNsYXNzbmFtZSA9PiBwYXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc01hcCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jbGFzc01hcDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIHN0cmluZz4gJGNsYXNzTWFwIENsYXNzIHRvIGZpbGVuYW1lIG1hcAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQ2xhc3NNYXAoYXJyYXkgJGNsYXNzTWFwKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2xhc3NNYXApIHsKICAgICAgICAgICAgJHRoaXMtPmNsYXNzTWFwID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNsYXNzTWFwLCAkY2xhc3NNYXApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jbGFzc01hcCA9ICRjbGFzc01hcDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBzZXQgb2YgUFNSLTAgZGlyZWN0b3JpZXMgZm9yIGEgZ2l2ZW4gcHJlZml4LCBlaXRoZXIKICAgICAqIGFwcGVuZGluZyBvciBwcmVwZW5kaW5nIHRvIHRoZSBvbmVzIHByZXZpb3VzbHkgc2V0IGZvciB0aGlzIHByZWZpeC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAkcHJlZml4ICBUaGUgcHJlZml4CiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkcGF0aHMgICBUaGUgUFNSLTAgcm9vdCBkaXJlY3RvcmllcwogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAgICAgICAgJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBkaXJlY3RvcmllcwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKICAgICAgICBpZiAoISRwcmVmaXgpIHsKICAgICAgICAgICAgaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICRwYXRocywKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAsCiAgICAgICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkZmlyc3QgPSAkcHJlZml4WzBdOwogICAgICAgIGlmICghaXNzZXQoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdKSkgewogICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSAkcGF0aHM7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICgkcHJlcGVuZCkgewogICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICRwYXRocywKICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XQogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdLAogICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgc2V0IG9mIFBTUi00IGRpcmVjdG9yaWVzIGZvciBhIGdpdmVuIG5hbWVzcGFjZSwgZWl0aGVyCiAgICAgKiBhcHBlbmRpbmcgb3IgcHJlcGVuZGluZyB0byB0aGUgb25lcyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBuYW1lc3BhY2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCAgVGhlIHByZWZpeC9uYW1lc3BhY2UsIHdpdGggdHJhaWxpbmcgJ1xcJwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJHBhdGhzICAgVGhlIFBTUi00IGJhc2UgZGlyZWN0b3JpZXMKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICAgICAgICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgZGlyZWN0b3JpZXMKICAgICAqCiAgICAgKiBAdGhyb3dzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZFBzcjQoJHByZWZpeCwgJHBhdGhzLCAkcHJlcGVuZCA9IGZhbHNlKQogICAgewogICAgICAgICRwYXRocyA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIGlmICghJHByZWZpeCkgewogICAgICAgICAgICAvLyBSZWdpc3RlciBkaXJlY3RvcmllcyBmb3IgdGhlIHJvb3QgbmFtZXNwYWNlLgogICAgICAgICAgICBpZiAoJHByZXBlbmQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgJHBhdGhzLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCwKICAgICAgICAgICAgICAgICAgICAkcGF0aHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSkpIHsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZGlyZWN0b3JpZXMgZm9yIGEgbmV3IG5hbWVzcGFjZS4KICAgICAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkcHJlZml4KTsKICAgICAgICAgICAgaWYgKCdcXCcgIT09ICRwcmVmaXhbJGxlbmd0aCAtIDFdKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9ICRwYXRoczsKICAgICAgICB9IGVsc2VpZiAoJHByZXBlbmQpIHsKICAgICAgICAgICAgLy8gUHJlcGVuZCBkaXJlY3RvcmllcyBmb3IgYW4gYWxyZWFkeSByZWdpc3RlcmVkIG5hbWVzcGFjZS4KICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAkcGF0aHMsCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0KICAgICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBBcHBlbmQgZGlyZWN0b3JpZXMgZm9yIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCBuYW1lc3BhY2UuCiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdLAogICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgc2V0IG9mIFBTUi0wIGRpcmVjdG9yaWVzIGZvciBhIGdpdmVuIHByZWZpeCwKICAgICAqIHJlcGxhY2luZyBhbnkgb3RoZXJzIHByZXZpb3VzbHkgc2V0IGZvciB0aGlzIHByZWZpeC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAkcHJlZml4IFRoZSBwcmVmaXgKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz58c3RyaW5nICRwYXRocyAgVGhlIFBTUi0wIGJhc2UgZGlyZWN0b3JpZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldCgkcHJlZml4LCAkcGF0aHMpCiAgICB7CiAgICAgICAgaWYgKCEkcHJlZml4KSB7CiAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskcHJlZml4WzBdXVskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHNldCBvZiBQU1ItNCBkaXJlY3RvcmllcyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UsCiAgICAgKiByZXBsYWNpbmcgYW55IG90aGVycyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBuYW1lc3BhY2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCBUaGUgcHJlZml4L25hbWVzcGFjZSwgd2l0aCB0cmFpbGluZyAnXFwnCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkcGF0aHMgIFRoZSBQU1ItNCBiYXNlIGRpcmVjdG9yaWVzCiAgICAgKgogICAgICogQHRocm93cyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRQc3I0KCRwcmVmaXgsICRwYXRocykKICAgIHsKICAgICAgICBpZiAoISRwcmVmaXgpIHsKICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSAoYXJyYXkpICRwYXRoczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRwcmVmaXgpOwogICAgICAgICAgICBpZiAoJ1xcJyAhPT0gJHByZWZpeFskbGVuZ3RoIC0gMV0pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBIG5vbi1lbXB0eSBQU1ItNCBwcmVmaXggbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRwcmVmaXhbMF1dWyRwcmVmaXhdID0gJGxlbmd0aDsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVHVybnMgb24gc2VhcmNoaW5nIHRoZSBpbmNsdWRlIHBhdGggZm9yIGNsYXNzIGZpbGVzLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICR1c2VJbmNsdWRlUGF0aAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXNlSW5jbHVkZVBhdGgoJHVzZUluY2x1ZGVQYXRoKQogICAgewogICAgICAgICR0aGlzLT51c2VJbmNsdWRlUGF0aCA9ICR1c2VJbmNsdWRlUGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIENhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHRoZSBhdXRvbG9hZGVyIHVzZXMgdGhlIGluY2x1ZGUgcGF0aCB0byBjaGVjawogICAgICogZm9yIGNsYXNzZXMuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVc2VJbmNsdWRlUGF0aCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51c2VJbmNsdWRlUGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIFR1cm5zIG9mZiBzZWFyY2hpbmcgdGhlIHByZWZpeCBhbmQgZmFsbGJhY2sgZGlyZWN0b3JpZXMgZm9yIGNsYXNzZXMKICAgICAqIHRoYXQgaGF2ZSBub3QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIGNsYXNzIG1hcC4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKICAgIHsKICAgICAgICAkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNob3VsZCBjbGFzcyBsb29rdXAgZmFpbCBpZiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgY2xhc3MgbWFwPwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDbGFzc01hcEF1dGhvcml0YXRpdmUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlOwogICAgfQoKICAgIC8qKgogICAgICogQVBDdSBwcmVmaXggdG8gdXNlIHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRhcGN1UHJlZml4CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBcGN1UHJlZml4KCRhcGN1UHJlZml4KQogICAgewogICAgICAgICR0aGlzLT5hcGN1UHJlZml4ID0gZnVuY3Rpb25fZXhpc3RzKCdhcGN1X2ZldGNoJykgJiYgZmlsdGVyX3ZhcihpbmlfZ2V0KCdhcGMuZW5hYmxlZCcpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikgPyAkYXBjdVByZWZpeCA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgQVBDdSBwcmVmaXggaW4gdXNlLCBvciBudWxsIGlmIEFQQ3UgY2FjaGluZyBpcyBub3QgZW5hYmxlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcGN1UHJlZml4KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFwY3VQcmVmaXg7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCRwcmVwZW5kID0gZmFsc2UpCiAgICB7CiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKCiAgICAgICAgaWYgKG51bGwgPT09ICR0aGlzLT52ZW5kb3JEaXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVycyA9IGFycmF5KCR0aGlzLT52ZW5kb3JEaXIgPT4gJHRoaXMpICsgc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVuc2V0KHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSk7CiAgICAgICAgICAgIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSA9ICR0aGlzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFVucmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVucmVnaXN0ZXIoKQogICAgewogICAgICAgIHNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJykpOwoKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPnZlbmRvckRpcikgewogICAgICAgICAgICB1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcyBvciBpbnRlcmZhY2UuCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwogICAgICogQHJldHVybiB0cnVlfG51bGwgVHJ1ZSBpZiBsb2FkZWQsIG51bGwgb3RoZXJ3aXNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQogICAgewogICAgICAgIGlmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKSB7CiAgICAgICAgICAgICRpbmNsdWRlRmlsZSA9IHNlbGY6OiRpbmNsdWRlRmlsZTsKICAgICAgICAgICAgJGluY2x1ZGVGaWxlKCRmaWxlKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaW5kcyB0aGUgcGF0aCB0byB0aGUgZmlsZSB3aGVyZSB0aGUgY2xhc3MgaXMgZGVmaW5lZC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSBUaGUgcGF0aCBpZiBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCiAgICB7CiAgICAgICAgLy8gY2xhc3MgbWFwIGxvb2t1cAogICAgICAgIGlmIChpc3NldCgkdGhpcy0+Y2xhc3NNYXBbJGNsYXNzXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jbGFzc01hcFskY2xhc3NdOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSB8fCBpc3NldCgkdGhpcy0+bWlzc2luZ0NsYXNzZXNbJGNsYXNzXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKICAgICAgICAgICAgJGZpbGUgPSBhcGN1X2ZldGNoKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGhpdCk7CiAgICAgICAgICAgIGlmICgkaGl0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRmaWxlID0gJHRoaXMtPmZpbmRGaWxlV2l0aEV4dGVuc2lvbigkY2xhc3MsICcucGhwJyk7CgogICAgICAgIC8vIFNlYXJjaCBmb3IgSGFjayBmaWxlcyBpZiB3ZSBhcmUgcnVubmluZyBvbiBISFZNCiAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSAmJiBkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewogICAgICAgICAgICAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLmhoJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKICAgICAgICAgICAgYXBjdV9hZGQoJHRoaXMtPmFwY3VQcmVmaXguJGNsYXNzLCAkZmlsZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlKSB7CiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBleGlzdC4KICAgICAgICAgICAgJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRmaWxlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgbG9hZGVycyBrZXllZCBieSB0aGVpciBjb3JyZXNwb25kaW5nIHZlbmRvciBkaXJlY3Rvcmllcy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgc2VsZj4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkTG9hZGVycygpCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgICRjbGFzcwogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAgJGV4dAogICAgICogQHJldHVybiBzdHJpbmd8ZmFsc2UKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBmaW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAkZXh0KQogICAgewogICAgICAgIC8vIFBTUi00IGxvb2t1cAogICAgICAgICRsb2dpY2FsUGF0aFBzcjQgPSBzdHJ0cigkY2xhc3MsICdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IpIC4gJGV4dDsKCiAgICAgICAgJGZpcnN0ID0gJGNsYXNzWzBdOwogICAgICAgIGlmIChpc3NldCgkdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJGZpcnN0XSkpIHsKICAgICAgICAgICAgJHN1YlBhdGggPSAkY2xhc3M7CiAgICAgICAgICAgIHdoaWxlIChmYWxzZSAhPT0gJGxhc3RQb3MgPSBzdHJycG9zKCRzdWJQYXRoLCAnXFwnKSkgewogICAgICAgICAgICAgICAgJHN1YlBhdGggPSBzdWJzdHIoJHN1YlBhdGgsIDAsICRsYXN0UG9zKTsKICAgICAgICAgICAgICAgICRzZWFyY2ggPSAkc3ViUGF0aCAuICdcXCc7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRzZWFyY2hdKSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoRW5kID0gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAkbGFzdFBvcyArIDEpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskc2VhcmNoXSBhcyAkZGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiAkcGF0aEVuZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFNSLTQgZmFsbGJhY2sgZGlycwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5mYWxsYmFja0RpcnNQc3I0IGFzICRkaXIpIHsKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3I0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQU1ItMCBsb29rdXAKICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKICAgICAgICAgICAgLy8gbmFtZXNwYWNlZCBjbGFzcyBuYW1lCiAgICAgICAgICAgICRsb2dpY2FsUGF0aFBzcjAgPSBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgMCwgJHBvcyArIDEpCiAgICAgICAgICAgICAgICAuIHN0cnRyKHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAkcG9zICsgMSksICdfJywgRElSRUNUT1JZX1NFUEFSQVRPUik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUEVBUi1saWtlIGNsYXNzIG5hbWUKICAgICAgICAgICAgJGxvZ2ljYWxQYXRoUHNyMCA9IHN0cnRyKCRjbGFzcywgJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdKSkgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF0gYXMgJHByZWZpeCA9PiAkZGlycykgewogICAgICAgICAgICAgICAgaWYgKDAgPT09IHN0cnBvcygkY2xhc3MsICRwcmVmaXgpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBTUi0wIGZhbGxiYWNrIGRpcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCBhcyAkZGlyKSB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyMCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFNSLTAgaW5jbHVkZSBwYXRocy4KICAgICAgICBpZiAoJHRoaXMtPnVzZUluY2x1ZGVQYXRoICYmICRmaWxlID0gc3RyZWFtX3Jlc29sdmVfaW5jbHVkZV9wYXRoKCRsb2dpY2FsUGF0aFBzcjApKSB7CiAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKQogICAgewogICAgICAgIGlmIChzZWxmOjokaW5jbHVkZUZpbGUgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2NvcGUgaXNvbGF0ZWQgaW5jbHVkZS4KICAgICAgICAgKgogICAgICAgICAqIFByZXZlbnRzIGFjY2VzcyB0byAkdGhpcy9zZWxmIGZyb20gaW5jbHVkZWQgZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gIHN0cmluZyAkZmlsZQogICAgICAgICAqIEByZXR1cm4gdm9pZAogICAgICAgICAqLwogICAgICAgIHNlbGY6OiRpbmNsdWRlRmlsZSA9IFxDbG9zdXJlOjpiaW5kKHN0YXRpYyBmdW5jdGlvbigkZmlsZSkgewogICAgICAgICAgICBpbmNsdWRlICRmaWxlOwogICAgICAgIH0sIG51bGwsIG51bGwpOwogICAgfQp9Cjw/cGhwCgovKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBDb21wb3Nlci4KICoKICogKGMpIE5pbHMgQWRlcm1hbm4gPG5hZGVybWFuQG5hZGVybWFuLmRlPgogKiAgICAgSm9yZGkgQm9nZ2lhbm8gPGouYm9nZ2lhbm9Ac2VsZC5iZT4KICoKICogRm9yIHRoZSBmdWxsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpZXcgdGhlIExJQ0VOU0UKICogZmlsZSB0aGF0IHdhcyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc291cmNlIGNvZGUuCiAqLwoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFZlcnNpb25QYXJzZXI7CgovKioKICogVGhpcyBjbGFzcyBpcyBjb3BpZWQgaW4gZXZlcnkgQ29tcG9zZXIgaW5zdGFsbGVkIHByb2plY3QgYW5kIGF2YWlsYWJsZSB0byBhbGwKICoKICogU2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA3LXJ1bnRpbWUubWQjaW5zdGFsbGVkLXZlcnNpb25zCiAqCiAqIFRvIHJlcXVpcmUgaXRzIHByZXNlbmNlLCB5b3UgY2FuIHJlcXVpcmUgYGNvbXBvc2VyLXJ1bnRpbWUtYXBpIF4yLjBgCiAqCiAqIEBmaW5hbAogKi8KY2xhc3MgSW5zdGFsbGVkVmVyc2lvbnMKewogICAgLyoqCiAgICAgKiBAdmFyIG1peGVkW118bnVsbAogICAgICogQHBzYWxtLXZhciBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fXxhcnJheXt9fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZDsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbHxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRjYW5HZXRWZW5kb3JzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheVtdCiAgICAgKiBAcHNhbG0tdmFyIGFycmF5PHN0cmluZywgYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRpbnN0YWxsZWRCeVZlbmRvciA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lcyB3aGljaCBhcmUgcHJlc2VudCwgZWl0aGVyIGJ5IGJlaW5nIGluc3RhbGxlZCwgcmVwbGFjZWQgb3IgcHJvdmlkZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ1tdCiAgICAgKiBAcHNhbG0tcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZFBhY2thZ2VzKCkKICAgIHsKICAgICAgICAkcGFja2FnZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgJHBhY2thZ2VzW10gPSBhcnJheV9rZXlzKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcGFja2FnZXNbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXlfa2V5cyhhcnJheV9mbGlwKFxjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCAkcGFja2FnZXMpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lcyB3aXRoIGEgc3BlY2lmaWMgdHlwZSBlLmcuICdsaWJyYXJ5JwogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgJHR5cGUKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXNCeVR5cGUoJHR5cGUpCiAgICB7CiAgICAgICAgJHBhY2thZ2VzQnlUeXBlID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBmb3JlYWNoICgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHBhY2thZ2VbJ3R5cGUnXSkgJiYgJHBhY2thZ2VbJ3R5cGUnXSA9PT0gJHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZXNCeVR5cGVbXSA9ICRuYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhY2thZ2VzQnlUeXBlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgaXMgaW5zdGFsbGVkCiAgICAgKgogICAgICogVGhpcyBhbHNvIHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIHByb3ZpZGVkIG9yIHJlcGxhY2VkIGJ5IGFub3RoZXIgcGFja2FnZQogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICRwYWNrYWdlTmFtZQogICAgICogQHBhcmFtICBib29sICAgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKCRwYWNrYWdlTmFtZSwgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMgPSB0cnVlKQogICAgewogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkaW5jbHVkZURldlJlcXVpcmVtZW50cyB8fCAhaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSkgfHwgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSA9PT0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYWNrYWdlIHNhdGlzZmllcyBhIHZlcnNpb24gY29uc3RyYWludAogICAgICoKICAgICAqIGUuZy4gSWYgeW91IHdhbnQgdG8ga25vdyB3aGV0aGVyIHZlcnNpb24gMi4zKyBvZiBwYWNrYWdlIGZvby9iYXIgaXMgaW5zdGFsbGVkLCB5b3Ugd291bGQgY2FsbDoKICAgICAqCiAgICAgKiAgIENvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zOjpzYXRpc2ZpZXMobmV3IFZlcnNpb25QYXJzZXIsICdmb28vYmFyJywgJ14yLjMnKQogICAgICoKICAgICAqIEBwYXJhbSAgVmVyc2lvblBhcnNlciAkcGFyc2VyICAgICAgSW5zdGFsbCBjb21wb3Nlci9zZW12ZXIgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhpcyBjbGFzcyBhbmQgZnVuY3Rpb25hbGl0eQogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAgICRwYWNrYWdlTmFtZQogICAgICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRjb25zdHJhaW50ICBBIHZlcnNpb24gY29uc3RyYWludCB0byBjaGVjayBmb3IsIGlmIHlvdSBwYXNzIG9uZSB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgY29tcG9zZXIvc2VtdmVyIGlzIHJlcXVpcmVkIGJ5IHlvdXIgcGFja2FnZQogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0aXNmaWVzKFZlcnNpb25QYXJzZXIgJHBhcnNlciwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkKICAgIHsKICAgICAgICAkY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoKHN0cmluZykgJGNvbnN0cmFpbnQpOwogICAgICAgICRwcm92aWRlZCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoc2VsZjo6Z2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpKTsKCiAgICAgICAgcmV0dXJuICRwcm92aWRlZC0+bWF0Y2hlcygkY29uc3RyYWludCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBjb25zdHJhaW50IHJlcHJlc2VudGluZyBhbGwgdGhlIHJhbmdlKHMpIHdoaWNoIGFyZSBpbnN0YWxsZWQgZm9yIGEgZ2l2ZW4gcGFja2FnZQogICAgICoKICAgICAqIEl0IGlzIGVhc2llciB0byB1c2UgdGhpcyB2aWEgaXNJbnN0YWxsZWQoKSB3aXRoIHRoZSAkY29uc3RyYWludCBhcmd1bWVudCBpZiB5b3UgbmVlZCB0byBjaGVjawogICAgICogd2hldGhlciBhIGdpdmVuIHZlcnNpb24gb2YgYSBwYWNrYWdlIGlzIGluc3RhbGxlZCwgYW5kIG5vdCBqdXN0IHdoZXRoZXIgaXQgZXhpc3RzCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZyBWZXJzaW9uIGNvbnN0cmFpbnQgdXNhYmxlIHdpdGggY29tcG9zZXIvc2VtdmVyCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmFuZ2VzID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgICRyYW5nZXNbXSA9ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygnYWxpYXNlcycsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgICRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2FsaWFzZXMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ3JlcGxhY2VkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVwbGFjZWQnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ3Byb3ZpZGVkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJvdmlkZWQnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCcgfHwgJywgJHJhbmdlcyk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgdmVyc2lvbiwgdXNlIHNhdGlzZmllcyBvciBnZXRWZXJzaW9uUmFuZ2VzIGlmIHlvdSBuZWVkIHRvIGtub3cgaWYgYSBnaXZlbiB2ZXJzaW9uIGlzIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWyd2ZXJzaW9uJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsndmVyc2lvbiddOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsIElmIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlcGxhY2VkIG9yIHByb3ZpZGVkIGJ1dCBpcyBub3QgcmVhbGx5IGluc3RhbGxlZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFzIHZlcnNpb24sIHVzZSBzYXRpc2ZpZXMgb3IgZ2V0VmVyc2lvblJhbmdlcyBpZiB5b3UgbmVlZCB0byBrbm93IGlmIGEgZ2l2ZW4gdmVyc2lvbiBpcyBwcmVzZW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsIElmIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlcGxhY2VkIG9yIHByb3ZpZGVkIGJ1dCBpcyBub3QgcmVhbGx5IGluc3RhbGxlZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFzIHJlZmVyZW5jZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlZmVyZW5jZSgkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ107CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgaW5zdGFsbCBwYXRoLiBQYWNrYWdlcyBvZiB0eXBlIG1ldGFwYWNrYWdlcyBhbHNvIGhhdmUgYSBudWxsIGluc3RhbGwgcGF0aC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aCgkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydpbnN0YWxsX3BhdGgnXSkgPyAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2luc3RhbGxfcGF0aCddIDogbnVsbDsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAcHNhbG0tcmV0dXJuIGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3RQYWNrYWdlKCkKICAgIHsKICAgICAgICAkaW5zdGFsbGVkID0gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CgogICAgICAgIHJldHVybiAkaW5zdGFsbGVkWzBdWydyb290J107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByYXcgaW5zdGFsbGVkLnBocCBkYXRhIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEFsbFJhd0RhdGEoKSBpbnN0ZWFkIHdoaWNoIHJldHVybnMgYWxsIGRhdGFzZXRzIGZvciBhbGwgYXV0b2xvYWRlcnMgcHJlc2VudCBpbiB0aGUgcHJvY2Vzcy4gZ2V0UmF3RGF0YSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRhdGFzZXQgbG9hZGVkLCB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IGV4cGVjdC4KICAgICAqIEByZXR1cm4gYXJyYXlbXQogICAgICogQHBzYWxtLXJldHVybiBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJhd0RhdGEoKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdnZXRSYXdEYXRhIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgZGF0YXNldCBsb2FkZWQsIHdoaWNoIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0LiBVc2UgZ2V0QWxsUmF3RGF0YSgpIGluc3RlYWQgd2hpY2ggcmV0dXJucyBhbGwgZGF0YXNldHMgZm9yIGFsbCBhdXRvbG9hZGVycyBwcmVzZW50IGluIHRoZSBwcm9jZXNzLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgLy8gb25seSByZXF1aXJlIHRoZSBpbnN0YWxsZWQucGhwIGZpbGUgaWYgdGhpcyBmaWxlIGlzIGxvYWRlZCBmcm9tIGl0cyBkdW1wZWQgbG9jYXRpb24sCiAgICAgICAgICAgIC8vIGFuZCBub3QgZnJvbSBpdHMgc291cmNlIGxvY2F0aW9uIGluIHRoZSBjb21wb3Nlci9jb21wb3NlciBwYWNrYWdlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy85OTM3CiAgICAgICAgICAgIGlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSBpbmNsdWRlIF9fRElSX18gLiAnL2luc3RhbGxlZC5waHAnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZCA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokaW5zdGFsbGVkOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmF3IGRhdGEgb2YgYWxsIGluc3RhbGxlZC5waHAgd2hpY2ggYXJlIGN1cnJlbnRseSBsb2FkZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5W10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fT4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxSYXdEYXRhKCkKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMZXRzIHlvdSByZWxvYWQgdGhlIHN0YXRpYyBhcnJheSBmcm9tIGFub3RoZXIgZmlsZQogICAgICoKICAgICAqIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGNvbXBsZXggaW50ZWdyYXRpb25zIGluIHdoaWNoIGEgcHJvamVjdCBuZWVkcyB0byB1c2UKICAgICAqIHRoaXMgY2xhc3MgYnV0IHRoZW4gYWxzbyBuZWVkcyB0byBleGVjdXRlIGFub3RoZXIgcHJvamVjdCdzIGF1dG9sb2FkZXIgaW4gcHJvY2VzcywKICAgICAqIGFuZCB3YW50cyB0byBlbnN1cmUgYm90aCBwcm9qZWN0cyBoYXZlIGFjY2VzcyB0byB0aGVpciB2ZXJzaW9uIG9mIGluc3RhbGxlZC5waHAuCiAgICAgKgogICAgICogQSB0eXBpY2FsIGNhc2Ugd291bGQgYmUgUEhQVW5pdCwgd2hlcmUgaXQgd291bGQgbmVlZCB0byBtYWtlIHN1cmUgaXQgcmVhZHMgYWxsCiAgICAgKiB0aGUgZGF0YSBpdCBuZWVkcyBmcm9tIHRoaXMgY2xhc3MsIHRoZW4gY2FsbCByZWxvYWQoKSB3aXRoCiAgICAgKiBgcmVxdWlyZSAkQ1dEL3ZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwYCAob3Igc2ltaWxhcikgYXMgaW5wdXQgdG8gbWFrZSBzdXJlCiAgICAgKiB0aGUgcHJvamVjdCBpbiB3aGljaCBpdCBydW5zIGNhbiB0aGVuIGFsc28gdXNlIHRoaXMgY2xhc3Mgc2FmZWx5LCB3aXRob3V0CiAgICAgKiBpbnRlcmZlcmVuY2UgYmV0d2VlbiBQSFBVbml0J3MgZGVwZW5kZW5jaWVzIGFuZCB0aGUgcHJvamVjdCdzIGRlcGVuZGVuY2llcy4KICAgICAqCiAgICAgKiBAcGFyYW0gIGFycmF5W10gJGRhdGEgQSB2ZW5kb3IvY29tcG9zZXIvaW5zdGFsbGVkLnBocCBkYXRhIHNldAogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQHBzYWxtLXBhcmFtIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59ICRkYXRhCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVsb2FkKCRkYXRhKQogICAgewogICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkZGF0YTsKICAgICAgICBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3IgPSBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheVtdCiAgICAgKiBAcHNhbG0tcmV0dXJuIGxpc3Q8YXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZCgpCiAgICB7CiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRjYW5HZXRWZW5kb3JzKSB7CiAgICAgICAgICAgIHNlbGY6OiRjYW5HZXRWZW5kb3JzID0gbWV0aG9kX2V4aXN0cygnQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXInLCAnZ2V0UmVnaXN0ZXJlZExvYWRlcnMnKTsKICAgICAgICB9CgogICAgICAgICRpbnN0YWxsZWQgPSBhcnJheSgpOwoKICAgICAgICBpZiAoc2VsZjo6JGNhbkdldFZlbmRvcnMpIHsKICAgICAgICAgICAgZm9yZWFjaCAoQ2xhc3NMb2FkZXI6OmdldFJlZ2lzdGVyZWRMb2FkZXJzKCkgYXMgJHZlbmRvckRpciA9PiAkbG9hZGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdKSkgewogICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRbXSA9IHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19maWxlKCR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJykpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHZhciBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fSAkcmVxdWlyZWQgKi8KICAgICAgICAgICAgICAgICAgICAkcmVxdWlyZWQgPSByZXF1aXJlICR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJzsKICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl0gPSAkcmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQgJiYgc3RydHIoJHZlbmRvckRpci4nL2NvbXBvc2VyJywgJ1xcJywgJy8nKSA9PT0gc3RydHIoX19ESVJfXywgJ1xcJywgJy8nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gJGluc3RhbGxlZFtjb3VudCgkaW5zdGFsbGVkKSAtIDFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgLy8gb25seSByZXF1aXJlIHRoZSBpbnN0YWxsZWQucGhwIGZpbGUgaWYgdGhpcyBmaWxlIGlzIGxvYWRlZCBmcm9tIGl0cyBkdW1wZWQgbG9jYXRpb24sCiAgICAgICAgICAgIC8vIGFuZCBub3QgZnJvbSBpdHMgc291cmNlIGxvY2F0aW9uIGluIHRoZSBjb21wb3Nlci9jb21wb3NlciBwYWNrYWdlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy85OTM3CiAgICAgICAgICAgIGlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKICAgICAgICAgICAgICAgIC8qKiBAdmFyIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59ICRyZXF1aXJlZCAqLwogICAgICAgICAgICAgICAgJHJlcXVpcmVkID0gcmVxdWlyZSBfX0RJUl9fIC4gJy9pbnN0YWxsZWQucGhwJzsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkcmVxdWlyZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGY6OiRpbnN0YWxsZWQgIT09IGFycmF5KCkpIHsKICAgICAgICAgICAgJGluc3RhbGxlZFtdID0gc2VsZjo6JGluc3RhbGxlZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkaW5zdGFsbGVkOwogICAgfQp9CnsKICAgICIkc2NoZW1hIjogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAogICAgImRlc2NyaXB0aW9uIjogIkEgcmVwcmVzZW50YXRpb24gb2YgcGFja2FnZXMgbWV0YWRhdGEuIiwKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAib25lT2YiOiBbCiAgICAgICAgeyAicmVxdWlyZWQiOiBbICJwYWNrYWdlcyIgXSB9LAogICAgICAgIHsgInJlcXVpcmVkIjogWyAicHJvdmlkZXJzIiBdIH0sCiAgICAgICAgeyAicmVxdWlyZWQiOiBbICJwcm92aWRlci1pbmNsdWRlcyIsICJwcm92aWRlcnMtdXJsIiBdIH0KICAgIF0sCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicGFja2FnZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgaGFzaG1hcCBvZiBwYWNrYWdlIG5hbWVzIGluIHRoZSBmb3JtIG9mIDx2ZW5kb3I+LzxuYW1lPi4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmVyc2lvbnMiIH0KICAgICAgICB9LAogICAgICAgICJwcm92aWRlcnMtdXJsIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gcmV0cmlldmUgcHJvdmlkZXIgZGF0YSBmcm9tLCBlLmcuICcvcC8lcGFja2FnZSUkJWhhc2glLmpzb24nLiIKICAgICAgICB9LAogICAgICAgICJwcm92aWRlci1pbmNsdWRlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgaGFzaG1hcCBvZiBwcm92aWRlciBsaXN0aW5ncy4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvdmlkZXIiIH0KICAgICAgICB9LAogICAgICAgICJwcm92aWRlcnMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGhhc2htYXAgb2YgcGFja2FnZSBuYW1lcyBpbiB0aGUgZm9ybSBvZiA8dmVuZG9yPi88bmFtZT4uIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb3ZpZGVyIiB9CiAgICAgICAgfSwKICAgICAgICAibm90aWZ5LWJhdGNoIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gY2FsbCBhZnRlciBtdWx0aXBsZSBwYWNrYWdlcyBoYXZlIGJlZW4gaW5zdGFsbGVkLCBlLmcuICcvZG93bmxvYWRzLycuIgogICAgICAgIH0sCiAgICAgICAgInNlYXJjaCI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuZHBvaW50IHRoYXQgcHJvdmlkZXMgc2VhcmNoIGNhcGFiaWxpdGllcywgZS5nLiAnL3NlYXJjaC5qc29uP3E9JXF1ZXJ5JSZ0eXBlPSV0eXBlJScuIgogICAgICAgIH0sCiAgICAgICAgIndhcm5pbmciOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIG91dHB1dCBieSBDb21wb3NlciBhcyBhIHdhcm5pbmcgd2hlbiB0aGlzIHNvdXJjZSBpcyBjb25zdWx0ZWQuIgogICAgICAgIH0KICAgIH0sCiAgICAiZGVmaW5pdGlvbnMiOiB7CiAgICAgICAgInZlcnNpb25zIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBoYXNobWFwIG9mIHZlcnNpb25zIGFuZCB0aGVpciBtZXRhZGF0YS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmVyc2lvbiIgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJvbmVPZiI6IFsKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wYWNrYWdlIiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL21ldGFwYWNrYWdlIiB9CiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgICJwYWNrYWdlLWJhc2UiOiB7CiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOb3JtYWxpemVkIHZlcnNpb24sIG9wdGlvbmFsIGJ1dCBjYW4gc2F2ZSBjb21wdXRhdGlvbmFsIHRpbWUgb24gY2xpZW50IHNpZGUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRvbG9hZCI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgInJlcXVpcmUiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICJyZXBsYWNlIjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAiY29uZmxpY3QiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICJwcm92aWRlIjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAidGltZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJwYWNrYWdlIjogewogICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZS1iYXNlIiB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiZGlzdCI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIjogeyAidHlwZSI6ICJvYmplY3QiIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgeyAib25lT2YiOiBbCiAgICAgICAgICAgICAgICAgICAgeyAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZlcnNpb24iLCAic291cmNlIiBdIH0sCiAgICAgICAgICAgICAgICAgICAgeyAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZlcnNpb24iLCAiZGlzdCIgXSB9CiAgICAgICAgICAgICAgICBdIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgIm1ldGFwYWNrYWdlIjogewogICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZS1iYXNlIiB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICJtZXRhcGFja2FnZSIgXSB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZlcnNpb24iLCAidHlwZSIgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXIiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInNoYTI1NiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIYXNoIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlLiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQp7CiAgICAiJHNjaGVtYSI6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAgICJ0aXRsZSI6ICJQYWNrYWdlIiwKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgbmFtZSwgaW5jbHVkaW5nICd2ZW5kb3ItbmFtZS8nIHByZWZpeC4iLAogICAgICAgICAgICAicGF0dGVybiI6ICJeW2EtejAtOV0oW18uLV0/W2EtejAtOV0rKSpcL1thLXowLTldKChbXy5dfC17MSwyfSk/W2EtejAtOV0rKSokIgogICAgICAgIH0sCiAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2hvcnQgcGFja2FnZSBkZXNjcmlwdGlvbi4iCiAgICAgICAgfSwKICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGljZW5zZSBuYW1lLiBPciBhbiBhcnJheSBvZiBsaWNlbnNlIG5hbWVzLiIKICAgICAgICB9LAogICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSB0eXBlLCBlaXRoZXIgJ2xpYnJhcnknIGZvciBjb21tb24gcGFja2FnZXMsICdjb21wb3Nlci1wbHVnaW4nIGZvciBwbHVnaW5zLCAnbWV0YXBhY2thZ2UnIGZvciBlbXB0eSBwYWNrYWdlcywgb3IgYSBjdXN0b20gdHlwZSAoW2EtejAtOS1dKykgZGVmaW5lZCBieSB3aGF0ZXZlciBwcm9qZWN0IHRoaXMgcGFja2FnZSBhcHBsaWVzIHRvLiIsCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJwYXR0ZXJuIjogIl5bYS16MC05LV0rJCIKICAgICAgICB9LAogICAgICAgICJhYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIiwgInN0cmluZyJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGhhcyBiZWVuIGFiYW5kb25lZCwgaXQgY2FuIGJlIGJvb2xlYW4gb3IgYSBwYWNrYWdlIG5hbWUvVVJMIHBvaW50aW5nIHRvIGEgcmVjb21tZW5kZWQgYWx0ZXJuYXRpdmUuIERlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICB9LAogICAgICAgICJ2ZXJzaW9uIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSB2ZXJzaW9uLCBzZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCN2ZXJzaW9uIGZvciBtb3JlIGluZm8gb24gdmFsaWQgc2NoZW1lcy4iLAogICAgICAgICAgICAicGF0dGVybiI6ICJedj9cXGQrKFxcLlxcZCspezAsM318XmRldi0iCiAgICAgICAgfSwKICAgICAgICAiZGVmYXVsdC1icmFuY2giOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbnRlcm5hbCB1c2Ugb25seSwgZG8gbm90IHNwZWNpZnkgdGhpcyBpbiBjb21wb3Nlci5qc29uLiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHZlcnNpb24gaXMgdGhlIGRlZmF1bHQgYnJhbmNoIG9mIHRoZSBsaW5rZWQgVkNTIHJlcG9zaXRvcnkuIERlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICB9LAogICAgICAgICJub24tZmVhdHVyZS1icmFuY2hlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBzdHJpbmcgb3IgcmVnZXggcGF0dGVybnMgZm9yIG5vbi1udW1lcmljIGJyYW5jaCBuYW1lcyB0aGF0IHdpbGwgbm90IGJlIGhhbmRsZWQgYXMgZmVhdHVyZSBicmFuY2hlcy4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJrZXl3b3JkcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdGFnL2tleXdvcmQgdGhhdCB0aGlzIHBhY2thZ2UgcmVsYXRlcyB0by4iCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZWFkbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWxhdGl2ZSBwYXRoIHRvIHRoZSByZWFkbWUgZG9jdW1lbnQuIgogICAgICAgIH0sCiAgICAgICAgInRpbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYWNrYWdlIHJlbGVhc2UgZGF0ZSwgaW4gJ1lZWVktTU0tREQnLCAnWVlZWS1NTS1ERCBISDpNTTpTUycgb3IgJ1lZWVktTU0tRERUSEg6TU06U1NaJyBmb3JtYXQuIgogICAgICAgIH0sCiAgICAgICAgImF1dGhvcnMiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYXV0aG9ycyIKICAgICAgICB9LAogICAgICAgICJob21lcGFnZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvbWVwYWdlIFVSTCBmb3IgdGhlIHByb2plY3QuIiwKICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgfSwKICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiZW1haWwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1haWwgYWRkcmVzcyBmb3Igc3VwcG9ydC4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiZW1haWwiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImlzc3VlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIGlzc3VlIHRyYWNrZXIuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZm9ydW0iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBmb3J1bS4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ3aWtpIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgd2lraS4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpcmMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSVJDIGNoYW5uZWwgZm9yIHN1cHBvcnQsIGFzIGlyYzovL3NlcnZlci9jaGFubmVsLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNoYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBzdXBwb3J0IGNoYXQuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byBicm93c2Ugb3IgZG93bmxvYWQgdGhlIHNvdXJjZXMuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZG9jcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIGRvY3VtZW50YXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicnNzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgUlNTIGZlZWQuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2VjdXJpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSB2dWxuZXJhYmlsaXR5IGRpc2Nsb3N1cmUgcG9saWN5IChWRFApLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJmdW5kaW5nIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3B0aW9ucyB0byBmdW5kIHRoZSBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2Ugb2YgdGhlIHBhY2thZ2UuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVHlwZSBvZiBmdW5kaW5nIG9yIHBsYXRmb3JtIHRocm91Z2ggd2hpY2ggZnVuZGluZyBpcyBwb3NzaWJsZS4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidXJsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIGEgd2Vic2l0ZSB3aXRoIGRldGFpbHMgb24gZnVuZGluZyBhbmQgYSB3YXkgdG8gZnVuZCB0aGUgcGFja2FnZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc291cmNlIgogICAgICAgIH0sCiAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGlzdCIKICAgICAgICB9LAogICAgICAgICJfY29tbWVudCI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBrZXkgdG8gc3RvcmUgY29tbWVudHMgaW4iCiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCBhcmUgcmVxdWlyZWQgdG8gcnVuIHRoaXMgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCB0aGlzIHBhY2thZ2UgcmVxdWlyZXMgZm9yIGRldmVsb3BpbmcgaXQgKHRlc3RpbmcgdG9vbHMgYW5kIHN1Y2gpLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInJlcGxhY2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICh2YWx1ZXMpIHRoYXQgY2FuIGJlIHJlcGxhY2VkIGJ5IHRoaXMgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiBjb25zdHJhaW50cyAodmFsdWVzKSB0aGF0IHRoaXMgcGFja2FnZSBwcm92aWRlcyBpbiBhZGRpdGlvbiB0byB0aGlzIHBhY2thZ2UncyBuYW1lLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCBkZXNjcmlwdGlvbnMgKHZhbHVlcykgdGhhdCB0aGlzIHBhY2thZ2Ugc3VnZ2VzdHMgd29yayB3ZWxsIHdpdGggaXQgKHRoaXMgd2lsbCBiZSBzdWdnZXN0ZWQgdG8gdGhlIHVzZXIgZHVyaW5nIGluc3RhbGxhdGlvbikuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwb3NpdG9yaWVzIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBhZGRpdGlvbmFsIHJlcG9zaXRvcmllcyB3aGVyZSBwYWNrYWdlcyBjYW4gYmUgZm91bmQuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYm9vbGVhbiIsICJlbnVtIjogW2ZhbHNlXSB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsgInR5cGUiOiAiYm9vbGVhbiIsICJlbnVtIjogW2ZhbHNlXSB9LAogICAgICAgICAgICAgICAgICAgICAgICAibWluUHJvcGVydGllcyI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXhQcm9wZXJ0aWVzIjogMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIm1pbmltdW0tc3RhYmlsaXR5IjogewogICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIl0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWluaW11bSBzdGFiaWxpdHkgdGhlIHBhY2thZ2VzIG11c3QgaGF2ZSB0byBiZSBpbnN0YWxsLWFibGUuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGRldiwgYWxwaGEsIGJldGEsIFJDLCBzdGFibGUuIiwKICAgICAgICAgICAgImVudW0iOiBbImRldiIsICJhbHBoYSIsICJiZXRhIiwgInJjIiwgIlJDIiwgInN0YWJsZSJdCiAgICAgICAgfSwKICAgICAgICAicHJlZmVyLXN0YWJsZSI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNldCB0byB0cnVlLCBzdGFibGUgcGFja2FnZXMgd2lsbCBiZSBwcmVmZXJyZWQgdG8gZGV2IHBhY2thZ2VzIHdoZW4gcG9zc2libGUsIGV2ZW4gaWYgdGhlIG1pbmltdW0tc3RhYmlsaXR5IGFsbG93cyB1bnN0YWJsZSBwYWNrYWdlcy4iCiAgICAgICAgfSwKICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYXV0b2xvYWQiCiAgICAgICAgfSwKICAgICAgICAiYXV0b2xvYWQtZGV2IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVzY3JpcHRpb24gb2YgYWRkaXRpb25hbCBhdXRvbG9hZCBydWxlcyBmb3IgZGV2ZWxvcG1lbnQgcHVycG9zZSAoZWcuIGEgdGVzdCBzdWl0ZSkuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAicHNyLTAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgbmFtZXNwYWNlcyAoa2V5cykgYW5kIHRoZSBkaXJlY3RvcmllcyB0aGV5IGNhbiBiZSBmb3VuZCBpbnRvICh2YWx1ZXMsIGNhbiBiZSBhcnJheXMgb2YgcGF0aHMpIGJ5IHRoZSBhdXRvbG9hZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgbmFtZXNwYWNlcyAoa2V5cykgYW5kIHRoZSBQU1ItNCBkaXJlY3RvcmllcyB0aGV5IGNhbiBtYXAgdG8gKHZhbHVlcywgY2FuIGJlIGFycmF5cyBvZiBwYXRocykgYnkgdGhlIGF1dG9sb2FkZXIuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gYXJyYXkgb2YgcGF0aHMgdGhhdCBjb250YWluIGNsYXNzZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzLW1hcCBnZW5lcmF0aW9uIHByb2Nlc3MuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJmaWxlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gYXJyYXkgb2YgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIHJlcXVpcmVkIG9uIGV2ZXJ5IHJlcXVlc3QuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAidGFyZ2V0LWRpciI6IHsKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEZvcmNlcyB0aGUgcGFja2FnZSB0byBiZSBpbnN0YWxsZWQgaW50byB0aGUgZ2l2ZW4gc3ViZGlyZWN0b3J5IHBhdGguIFRoaXMgaXMgdXNlZCBmb3IgYXV0b2xvYWRpbmcgUFNSLTAgcGFja2FnZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGVpciBmdWxsIHBhdGguIFVzZSBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuIiwKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgImluY2x1ZGUtcGF0aCI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2ggc2hvdWxkIGdldCBhZGRlZCB0byBQSFAncyBpbmNsdWRlIHBhdGguIFRoaXMgaXMgb25seSBwcmVzZW50IHRvIHN1cHBvcnQgbGVnYWN5IHByb2plY3RzLCBhbmQgYWxsIG5ldyBjb2RlIHNob3VsZCBwcmVmZXJhYmx5IHVzZSBhdXRvbG9hZGluZy4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJiaW4iOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGZpbGVzLCBvciBhIHNpbmdsZSBmaWxlLCB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGJpbmFyaWVzIGFuZCBzeW1saW5rZWQgaW50byBiaW4tZGlyIChmcm9tIGNvbmZpZykuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYXJjaGl2ZSI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9ucyBmb3IgY3JlYXRpbmcgcGFja2FnZSBhcmNoaXZlcyBmb3IgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBiYXNlIG5hbWUgZm9yIGFyY2hpdmUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHBhdHRlcm5zIGZvciBwYXRocyB0byBleGNsdWRlIG9yIGluY2x1ZGUgaWYgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvbiBtYXJrLiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNvbmZpZyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbXBvc2VyIG9wdGlvbnMuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAicGxhdGZvcm0iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiAodmFsdWVzKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb2NrIHRoZSBwbGF0Zm9ybSBwYWNrYWdlcyBvbiB0aGlzIG1hY2hpbmUsIHRoZSB2ZXJzaW9uIGNhbiBiZSBzZXQgdG8gZmFsc2UgdG8gbWFrZSBpdCBhcHBlYXIgbGlrZSB0aGUgcGFja2FnZSBpcyBub3QgcHJlc2VudC4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFsbG93LXBsdWdpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHtcInBhdHRlcm5cIjogdHJ1ZXxmYWxzZX0gd2l0aCBwYWNrYWdlcyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBsb2FkZWQgYXMgcGx1Z2lucywgb3IgdHJ1ZSB0byBhbGxvdyBhbGwsIGZhbHNlIHRvIGFsbG93IG5vbmUuIERlZmF1bHRzIHRvIHt9IHdoaWNoIHByb21wdHMgd2hlbiBhbiB1bmtub3duIHBsdWdpbiBpcyBhZGRlZC4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJvY2Vzcy10aW1lb3V0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdGltZW91dCBpbiBzZWNvbmRzIGZvciBwcm9jZXNzIGV4ZWN1dGlvbnMsIGRlZmF1bHRzIHRvIDMwMCAoNW1pbnMpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXNlLWluY2x1ZGUtcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIENvbXBvc2VyIGF1dG9sb2FkZXIgd2lsbCBhbHNvIGxvb2sgZm9yIGNsYXNzZXMgaW4gdGhlIFBIUCBpbmNsdWRlIHBhdGguIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtcGFyZW50LWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hlbiBydW5uaW5nIENvbXBvc2VyIGluIGEgZGlyZWN0b3J5IHdoZXJlIHRoZXJlIGlzIG5vIGNvbXBvc2VyLmpzb24sIGlmIHRoZXJlIGlzIG9uZSBwcmVzZW50IGluIGEgZGlyZWN0b3J5IGFib3ZlIENvbXBvc2VyIHdpbGwgYnkgZGVmYXVsdCBhc2sgeW91IHdoZXRoZXIgeW91IHdhbnQgdG8gdXNlIHRoYXQgZGlyZWN0b3J5J3MgY29tcG9zZXIuanNvbiBpbnN0ZWFkLiBPbmUgb2Y6IHRydWUgKGFsd2F5cyB1c2UgcGFyZW50IGlmIG5lZWRlZCksIGZhbHNlIChuZXZlciBhc2sgb3IgdXNlIGl0KSBvciBcInByb21wdFwiIChhc2sgZXZlcnkgdGltZSksIGRlZmF1bHRzIHRvIHByb21wdC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZWZlcnJlZC1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBpbnN0YWxsIG1ldGhvZCBDb21wb3NlciB3aWxsIHByZWZlciB0byB1c2UsIGRlZmF1bHRzIHRvIGF1dG8gYW5kIGNhbiBiZSBhbnkgb2Ygc291cmNlLCBkaXN0LCBhdXRvLCBvciBhbiBvYmplY3Qgb2Yge1wicGF0dGVyblwiOiBcInByZWZlcmVuY2VcIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXVkaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VjdXJpdHkgYXVkaXQgY29uZmlndXJhdGlvbiBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgYWR2aXNvcnkgaWRzLCByZW1vdGUgaWRzIG9yIENWRSBpZHMgKGtleXMpIGFuZCB0aGUgZXhwbGFuYXRpb25zICh2YWx1ZXMpIGZvciB3aHkgdGhleSdyZSBiZWluZyBpZ25vcmVkLiBUaGUgbGlzdGVkIGl0ZW1zIGFyZSByZXBvcnRlZCBidXQgbGV0IHRoZSBhdWRpdCBjb21tYW5kIHBhc3MuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJzdHJpbmciXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGFkdmlzb3J5IGlkcywgcmVtb3RlIGlkcyBvciBDVkUgaWRzIHRoYXQgYXJlIHJlcG9ydGVkIGJ1dCBsZXQgdGhlIGF1ZGl0IGNvbW1hbmQgcGFzcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJhYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaWdub3JlIiwgInJlcG9ydCIsICJmYWlsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciBhYmFuZG9uZWQgcGFja2FnZXMgc2hvdWxkIGJlIGlnbm9yZWQsIHJlcG9ydGVkIGFzIHByb2JsZW1zIG9yIGNhdXNlIGFuIGF1ZGl0IGZhaWx1cmUuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RpZnktb24taW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tcG9zZXIgYWxsb3dzIHJlcG9zaXRvcmllcyB0byBkZWZpbmUgYSBub3RpZmljYXRpb24gVVJMLCBzbyB0aGF0IHRoZXkgZ2V0IG5vdGlmaWVkIHdoZW5ldmVyIGEgcGFja2FnZSBmcm9tIHRoYXQgcmVwb3NpdG9yeSBpcyBpbnN0YWxsZWQuIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGJlaGF2aW91ciwgZGVmYXVsdHMgdG8gdHJ1ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGh1Yi1wcm90b2NvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgcHJvdG9jb2xzIHRvIHVzZSBmb3IgZ2l0aHViLmNvbSBjbG9uZXMsIGluIHByaW9yaXR5IG9yZGVyLCBkZWZhdWx0cyB0byBbXCJodHRwc1wiLCBcInNzaFwiLCBcImdpdFwiXS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLW9hdXRoIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBnaXRodWIgQVBJIG9hdXRoIHRva2VucywgdHlwaWNhbGx5IHtcImdpdGh1Yi5jb21cIjpcIjx0b2tlbj5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGxhYi1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4gZ2l0bGFiIEFQSSBvYXV0aCB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRsYWIuY29tXCI6e1wiZXhwaXJlcy1hdFwiOlwiPGV4cGlyYXRpb24gZGF0ZT5cIiwgXCJyZWZyZXNoLXRva2VuXCI6XCI8cmVmcmVzaCB0b2tlbj5cIiwgXCJ0b2tlblwiOlwiPHRva2VuPlwifX0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgInRva2VuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGlyZXMtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoaXMgR2l0TGFiIHRva2VuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZyZXNoLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSByZWZyZXNoIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBnaXRsYWIgcHJpdmF0ZSB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRsYWIuY29tXCI6XCI8dG9rZW4+XCJ9LCBvciBhbiBvYmplY3Qgd2l0aCB1c2VybmFtZSBhbmQgdG9rZW4ga2V5cy4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJvYmplY3QiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ1c2VybmFtZSIsICJ0b2tlbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VybmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdXNlcm5hbWUgdXNlZCBmb3IgR2l0TGFiIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdG9rZW4gdXNlZCBmb3IgR2l0TGFiIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRsYWItcHJvdG9jb2wiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImdpdCIsICJodHRwIiwgImh0dHBzIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcHJvdG9jb2wgdG8gZm9yY2UgdXNlIG9mIHdoZW4gY3JlYXRpbmcgYSByZXBvc2l0b3J5IFVSTCBmb3IgdGhlIGBzb3VyY2VgIHZhbHVlIG9mIHRoZSBwYWNrYWdlIG1ldGFkYXRhLiBPbmUgb2YgYGdpdGAgb3IgYGh0dHBgLiBCeSBkZWZhdWx0LCBDb21wb3NlciB3aWxsIGdlbmVyYXRlIGEgZ2l0IFVSTCBmb3IgcHJpdmF0ZSByZXBvc2l0b3JpZXMgYW5kIGh0dHAgb25lIGZvciBwdWJsaWMgcmVwb3MuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiZWFyZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IGJlYXJlciBhdXRoZW50aWNhdGlvbiB0b2tlbiwgZm9yIGV4YW1wbGUge1wiZXhhbXBsZS5jb21cIjpcIjx0b2tlbj5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc2FibGUtdGxzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBgZmFsc2VgLiBJZiBzZXQgdG8gdHJ1ZSBhbGwgSFRUUFMgVVJMcyB3aWxsIGJlIHRyaWVkIHdpdGggSFRUUCBpbnN0ZWFkIGFuZCBubyBuZXR3b3JrIGxldmVsIGVuY3J5cHRpb24gaXMgcGVyZm9ybWVkLiBFbmFibGluZyB0aGlzIGlzIGEgc2VjdXJpdHkgcmlzayBhbmQgaXMgTk9UIHJlY29tbWVuZGVkLiBUaGUgYmV0dGVyIHdheSBpcyB0byBlbmFibGUgdGhlIHBocF9vcGVuc3NsIGV4dGVuc2lvbiBpbiBwaHAuaW5pLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2VjdXJlLWh0dHAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGB0cnVlYC4gSWYgc2V0IHRvIHRydWUgb25seSBIVFRQUyBVUkxzIGFyZSBhbGxvd2VkIHRvIGJlIGRvd25sb2FkZWQgdmlhIENvbXBvc2VyLiBJZiB5b3UgcmVhbGx5IGFic29sdXRlbHkgbmVlZCBIVFRQIGFjY2VzcyB0byBzb21ldGhpbmcgdGhlbiB5b3UgY2FuIGRpc2FibGUgaXQsIGJ1dCB1c2luZyBcIkxldCdzIEVuY3J5cHRcIiB0byBnZXQgYSBmcmVlIFNTTCBjZXJ0aWZpY2F0ZSBpcyBnZW5lcmFsbHkgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzZWN1cmUtc3ZuLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB3aGljaCBzaG91bGQgYmUgdHJ1c3RlZC9tYXJrZWQgYXMgdXNpbmcgYSBzZWN1cmUgU3VidmVyc2lvbi9TVk4gdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHN2bjovLyBwcm90b2NvbCBpcyBzZWVuIGFzIGluc2VjdXJlIGFuZCB3aWxsIHRocm93LiBUaGlzIGlzIGEgYmV0dGVyL3NhZmVyIGFsdGVybmF0aXZlIHRvIGRpc2FibGluZyBgc2VjdXJlLWh0dHBgIGFsdG9nZXRoZXIuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhZmlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHdheSB0byBzZXQgdGhlIHBhdGggdG8gdGhlIG9wZW5zc2wgQ0EgZmlsZS4gSW4gUEhQIDUuNisgeW91IHNob3VsZCByYXRoZXIgc2V0IHRoaXMgdmlhIG9wZW5zc2wuY2FmaWxlIGluIHBocC5pbmksIGFsdGhvdWdoIFBIUCA1LjYrIHNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCB5b3VyIHN5c3RlbSBDQSBmaWxlIGF1dG9tYXRpY2FsbHkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYXBhdGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgY2FmaWxlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaWYgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGRpcmVjdG9yeSBwb2ludGVkIHRvIGJ5IGNhcGF0aCBpcyBzZWFyY2hlZCBmb3IgYSBzdWl0YWJsZSBjZXJ0aWZpY2F0ZS4gY2FwYXRoIG11c3QgYmUgYSBjb3JyZWN0bHkgaGFzaGVkIGNlcnRpZmljYXRlIGRpcmVjdG9yeS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImh0dHAtYmFzaWMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IHtcInVzZXJuYW1lXCI6IFwiLi4uXCIsIFwicGFzc3dvcmRcIjogXCIuLi5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidXNlcm5hbWUiLCAicGFzc3dvcmQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHVzZXJuYW1lIHVzZWQgZm9yIEhUVFAgQmFzaWMgYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3N3b3JkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwYXNzd29yZCB1c2VkIGZvciBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdG9yZS1hdXRocyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCB0byBkbyBhZnRlciBwcm9tcHRpbmcgZm9yIGF1dGhlbnRpY2F0aW9uLCBvbmUgb2Y6IHRydWUgKHN0b3JlKSwgZmFsc2UgKGRvIG5vdCBzdG9yZSkgb3IgXCJwcm9tcHRcIiAoYXNrIGV2ZXJ5IHRpbWUpLCBkZWZhdWx0cyB0byBwcm9tcHQuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2ZW5kb3ItZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgcGFja2FnZXMgYXJlIGluc3RhbGxlZCwgZGVmYXVsdHMgdG8gXCJ2ZW5kb3JcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbi1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxvY2F0aW9uIHdoZXJlIGFsbCBiaW5hcmllcyBhcmUgbGlua2VkLCBkZWZhdWx0cyB0byBcInZlbmRvci9iaW5cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRhdGEtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBvbGQgcGhhciBmaWxlcyBhcmUgc3RvcmVkLCBkZWZhdWx0cyB0byBcIiRob21lXCIgZXhjZXB0IG9uIFhERyBCYXNlIERpcmVjdG9yeSBjb21wbGlhbnQgdW5peGVzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgY2FjaGVzIGFyZSBsb2NhdGVkLCBkZWZhdWx0cyB0byBcIn4vLmNvbXBvc2VyL2NhY2hlXCIgb24gKm5peCBhbmQgXCIlTE9DQUxBUFBEQVRBJVxcQ29tcG9zZXJcIiBvbiB3aW5kb3dzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZmlsZXMtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBmaWxlcyAoemlwIGRvd25sb2FkcykgYXJlIGNhY2hlZCwgZGVmYXVsdHMgdG8gXCJ7JGNhY2hlLWRpcn0vZmlsZXNcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXJlcG8tZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSByZXBvIChnaXQvaGcgcmVwbyBjbG9uZXMpIGFyZSBjYWNoZWQsIGRlZmF1bHRzIHRvIFwieyRjYWNoZS1kaXJ9L3JlcG9cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXZjcy1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxvY2F0aW9uIHdoZXJlIHZjcyBpbmZvcyAoZ2l0IGNsb25lcywgZ2l0aHViIGFwaSBjYWxscywgZXRjLiB3aGVuIHJlYWRpbmcgdmNzIHJlcG9zKSBhcmUgY2FjaGVkLCBkZWZhdWx0cyB0byBcInskY2FjaGUtZGlyfS92Y3NcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXR0bCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgY2FjaGUgdGltZS10by1saXZlLCBkZWZhdWx0cyB0byAxNTU1MjAwMCAoNiBtb250aHMpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZmlsZXMtdHRsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY2FjaGUgdGltZS10by1saXZlIGZvciBmaWxlcywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGNhY2hlLXR0bC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLWZpbGVzLW1heHNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJpbnRlZ2VyIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjYWNoZSBtYXggc2l6ZSBmb3IgdGhlIGZpbGVzIGNhY2hlLCBkZWZhdWx0cyB0byBcIjMwME1pQlwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtcmVhZC1vbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gdXNlIHRoZSBDb21wb3NlciBjYWNoZSBpbiByZWFkLW9ubHkgbW9kZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbi1jb21wYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImF1dG8iLCAiZnVsbCIsICJwcm94eSIsICJzeW1saW5rIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBiaW5hcmllcywgZGVmYXVsdHMgdG8gXCJhdXRvXCIgKGF1dG9tYXRpY2FsbHkgZ3Vlc3NlZCksIGNhbiBiZSBcImZ1bGxcIiAoY29tcGF0aWJsZSB3aXRoIGJvdGggV2luZG93cyBhbmQgVW5peC1iYXNlZCBzeXN0ZW1zKSBhbmQgXCJwcm94eVwiIChvbmx5IGJhc2gtc3R5bGUgcHJveHkpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzY2FyZC1jaGFuZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBzdHlsZSBvZiBoYW5kbGluZyBkaXJ0eSB1cGRhdGVzLCBkZWZhdWx0cyB0byBmYWxzZSBhbmQgY2FuIGJlIGFueSBvZiB0cnVlLCBmYWxzZSBvciBcInN0YXNoXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRvbG9hZGVyLXN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBzdHJpbmcgdG8gYmUgdXNlZCBhcyBhIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBDb21wb3NlciBhdXRvbG9hZGVyLiBXaGVuIG51bGwgYSByYW5kb20gb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3B0aW1pemUtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWx3YXlzIG9wdGltaXplIHdoZW4gZHVtcGluZyB0aGUgYXV0b2xvYWRlci4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZXBlbmQtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgZmFsc2UsIHRoZSBjb21wb3NlciBhdXRvbG9hZGVyIHdpbGwgbm90IGJlIHByZXBlbmRlZCB0byBleGlzdGluZyBhdXRvbG9hZGVycywgZGVmYXVsdHMgdG8gdHJ1ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwLWF1dGhvcml0YXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBjb21wb3NlciBhdXRvbG9hZGVyIHdpbGwgbm90IHNjYW4gdGhlIGZpbGVzeXN0ZW0gZm9yIGNsYXNzZXMgdGhhdCBhcmUgbm90IGZvdW5kIGluIHRoZSBjbGFzcyBtYXAsIGRlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXBjdS1hdXRvbG9hZGVyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgQ29tcG9zZXIgYXV0b2xvYWRlciB3aWxsIGNoZWNrIGZvciBBUEN1IGFuZCB1c2UgaXQgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGRlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZ2l0aHViIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgR2l0SHViIEVudGVycHJpc2Ugc2V0dXBzLCBkZWZhdWx0cyB0byBbXCJnaXRodWIuY29tXCJdLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRodWItZXhwb3NlLWhvc3RuYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byB0cnVlLiBJZiBzZXQgdG8gZmFsc2UsIHRoZSBPQXV0aCB0b2tlbnMgY3JlYXRlZCB0byBhY2Nlc3MgdGhlIGdpdGh1YiBBUEkgd2lsbCBoYXZlIGEgZGF0ZSBpbnN0ZWFkIG9mIHRoZSBtYWNoaW5lIGhvc3RuYW1lLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZ2l0bGFiIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgY3VzdG9tIEdpdExhYiBzZXR1cHMsIGRlZmF1bHRzIHRvIFtcImdpdGxhYi5jb21cIl0uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpdGJ1Y2tldC1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4ge1wiY29uc3VtZXIta2V5XCI6IFwiLi4uXCIsIFwiY29uc3VtZXItc2VjcmV0XCI6IFwiLi4uXCJ9LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImNvbnN1bWVyLWtleSIsICJjb25zdW1lci1zZWNyZXQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZXIta2V5IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb25zdW1lci1rZXkgdXNlZCBmb3IgT0F1dGggYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWVyLXNlY3JldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29uc3VtZXItc2VjcmV0IHVzZWQgZm9yIE9BdXRoIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MtdG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIE9BdXRoIHRva2VuIHJldHJpZXZlZCBmcm9tIEJpdGJ1Y2tldCdzIEFQSSwgdGhpcyBpcyB3cml0dGVuIGJ5IENvbXBvc2VyIGFuZCB5b3Ugc2hvdWxkIG5vdCBzZXQgaXQgbm9yIG1vZGlmeSBpdC4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzcy10b2tlbi1leHBpcmF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZ2VuZXJhdGVkIHRva2VuJ3MgZXhwaXJhdGlvbiB0aW1lc3RhbXAsIHRoaXMgaXMgd3JpdHRlbiBieSBDb21wb3NlciBhbmQgeW91IHNob3VsZCBub3Qgc2V0IGl0IG5vciBtb2RpZnkgaXQuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtZ2l0aHViLWFwaSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gIElmIHNldCB0byBmYWxzZSwgZ2xvYmFsbHkgZGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgR2l0SHViIEFQSSBmb3IgYWxsIEdpdEh1YiByZXBvc2l0b3JpZXMgYW5kIGNsb25lcyB0aGUgcmVwb3NpdG9yeSBhcyBpdCB3b3VsZCBmb3IgYW55IG90aGVyIHJlcG9zaXRvcnkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhcmNoaXZlLWZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBhcmNoaXZpbmcgZm9ybWF0IHdoZW4gbm90IHByb3ZpZGVkIG9uIGNsaSwgZGVmYXVsdHMgdG8gXCJ0YXJcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFyY2hpdmUtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IGFyY2hpdmUgcGF0aCB3aGVuIG5vdCBwcm92aWRlZCBvbiBjbGksIGRlZmF1bHRzIHRvIFwiLlwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaHRhY2Nlc3MtcHJvdGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgLmh0YWNjZXNzIGZpbGVzIGluIHRoZSBjb21wb3NlciBob21lLCBjYWNoZSwgYW5kIGRhdGEgZGlyZWN0b3JpZXMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzb3J0LXBhY2thZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUsIENvbXBvc2VyIHdpbGwgc29ydCBwYWNrYWdlcyB3aGVuIGFkZGluZy91cGRhdGluZyBhIG5ldyBkZXBlbmRlbmN5LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibG9jayI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgYSBjb21wb3Nlci5sb2NrIGZpbGUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwbGF0Zm9ybS1jaGVjayI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gXCJwaHAtb25seVwiIHdoaWNoIGNoZWNrcyBvbmx5IHRoZSBQSFAgdmVyc2lvbi4gU2V0dGluZyB0byB0cnVlIHdpbGwgYWxzbyBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgUEhQIGV4dGVuc2lvbnMuIElmIHNldCB0byBmYWxzZSwgQ29tcG9zZXIgd2lsbCBub3QgY3JlYXRlIGFuZCByZXF1aXJlIGEgcGxhdGZvcm1fY2hlY2sucGhwIGZpbGUgYXMgcGFydCBvZiB0aGUgYXV0b2xvYWRlciBib290c3RyYXAuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFyYml0cmFyeSBleHRyYSBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgYnkgcGx1Z2lucywgZm9yIGV4YW1wbGUsIHBhY2thZ2Ugb2YgdHlwZSBjb21wb3Nlci1wbHVnaW4gbWF5IGhhdmUgYSAnY2xhc3MnIGtleSBkZWZpbmluZyBhbiBpbnN0YWxsZXIgY2xhc3MgbmFtZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAic2NyaXB0cyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2NyaXB0IGxpc3RlbmVycyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlL2FmdGVyIHNvbWUgZXZlbnRzLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInByZS1pbnN0YWxsLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgdGhlIGluc3RhbGwgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LWluc3RhbGwtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBpbnN0YWxsIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXVwZGF0ZS1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIHRoZSB1cGRhdGUgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXVwZGF0ZS1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIHVwZGF0ZSBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1zdGF0dXMtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSB0aGUgc3RhdHVzIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1zdGF0dXMtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBzdGF0dXMgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtcGFja2FnZS1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSBhIHBhY2thZ2UgaXMgaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtcGFja2FnZS1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIGEgcGFja2FnZSBpcyBpbnN0YWxsZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXBhY2thZ2UtdXBkYXRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSBhIHBhY2thZ2UgaXMgdXBkYXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXBhY2thZ2UtdXBkYXRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIGEgcGFja2FnZSBpcyB1cGRhdGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1wYWNrYWdlLXVuaW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgYSBwYWNrYWdlIGhhcyBiZWVuIHVuaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtcGFja2FnZS11bmluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgYSBwYWNrYWdlIGhhcyBiZWVuIHVuaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1hdXRvbG9hZC1kdW1wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSB0aGUgYXV0b2xvYWRlciBpcyBkdW1wZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1hdXRvbG9hZC1kdW1wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBhdXRvbG9hZGVyIGlzIGR1bXBlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXJvb3QtcGFja2FnZS1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSByb290LXBhY2thZ2UgaXMgaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtY3JlYXRlLXByb2plY3QtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBjcmVhdGUtcHJvamVjdCBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzY3JpcHRzLWRlc2NyaXB0aW9ucyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVzY3JpcHRpb25zIGZvciBjdXN0b20gY29tbWFuZHMsIHNob3duIGluIGNvbnNvbGUgaGVscC4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAogICAgImRlZmluaXRpb25zIjogewogICAgICAgICJhdXRob3JzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGF1dGhvcnMgdGhhdCBjb250cmlidXRlZCB0byB0aGUgcGFja2FnZS4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIG1haW4gbWFpbnRhaW5lcnMsIG5vdCB0aGUgZnVsbCBsaXN0LiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRnVsbCBuYW1lIG9mIHRoZSBhdXRob3IuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1haWwgYWRkcmVzcyBvZiB0aGUgYXV0aG9yLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIb21lcGFnZSBVUkwgZm9yIHRoZSBhdXRob3IuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkF1dGhvcidzIHJvbGUgaW4gdGhlIHByb2plY3QuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVzY3JpcHRpb24gb2YgaG93IHRoZSBwYWNrYWdlIGNhbiBiZSBhdXRvbG9hZGVkLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInBzci0wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIG5hbWVzcGFjZXMgKGtleXMpIGFuZCB0aGUgZGlyZWN0b3JpZXMgdGhleSBjYW4gYmUgZm91bmQgaW4gKHZhbHVlcywgY2FuIGJlIGFycmF5cyBvZiBwYXRocykgYnkgdGhlIGF1dG9sb2FkZXIuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIFBTUi00IGRpcmVjdG9yaWVzIHRoZXkgY2FuIG1hcCB0byAodmFsdWVzLCBjYW4gYmUgYXJyYXlzIG9mIHBhdGhzKSBieSB0aGUgYXV0b2xvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBwYXRocyB0aGF0IGNvbnRhaW4gY2xhc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3MtbWFwIGdlbmVyYXRpb24gcHJvY2Vzcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBmaWxlcyB0aGF0IGFyZSBhbHdheXMgcmVxdWlyZWQgb24gZXZlcnkgcmVxdWVzdC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gYXJyYXkgb2YgcGF0dGVybnMgdG8gZXhjbHVkZSBmcm9tIGF1dG9sb2FkIGNsYXNzbWFwIGdlbmVyYXRpb24uIChlLmcuIFwiZXhjbHVkZS1mcm9tLWNsYXNzbWFwXCI6IFtcIi90ZXN0L1wiLCBcIi90ZXN0cy9cIiwgXCIvVGVzdHMvXCJdIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbXBvc2VyLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmNzLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGF0aC1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2FydGlmYWN0LXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGVhci1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhY2thZ2UtcmVwb3NpdG9yeSIgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAiY29tcG9zZXItcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsiY29tcG9zZXIiXSB9LAogICAgICAgICAgICAgICAgInVybCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImNhbm9uaWNhbCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJvbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYWxsb3dfc3NsX2Rvd25ncmFkZSI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJmb3JjZS1sYXp5LXByb3ZpZGVycyI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAidmNzLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbInZjcyIsICJnaXRodWIiLCAiZ2l0IiwgImdpdGxhYiIsICJiaXRidWNrZXQiLCAiZ2l0LWJpdGJ1Y2tldCIsICJoZyIsICJmb3NzaWwiLCAicGVyZm9yY2UiLCAic3ZuIl0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vLWFwaSI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJzZWN1cmUtaHR0cCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJzdm4tY2FjaGUtY3JlZGVudGlhbHMiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAidHJ1bmstcGF0aCI6IHsgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICJicmFuY2hlcy1wYXRoIjogeyAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSB9LAogICAgICAgICAgICAgICAgInRhZ3MtcGF0aCI6IHsgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICJwYWNrYWdlLXBhdGgiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJkZXBvdCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImJyYW5jaCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInVuaXF1ZV9wZXJmb3JjZV9jbGllbnRfbmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInA0dXNlciI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInA0cGFzc3dvcmQiOiB7ICJ0eXBlIjogInN0cmluZyIgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGF0aC1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJwYXRoIl0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInN5bWxpbmsiOiB7ICJ0eXBlIjogWyJib29sZWFuIiwgIm51bGwiXSB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJhcnRpZmFjdC1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJhcnRpZmFjdCJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGVhci1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJwZWFyIl0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInZlbmRvci1hbGlhcyI6IHsgInR5cGUiOiAic3RyaW5nIiB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwYWNrYWdlLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJwYWNrYWdlIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJwYWNrYWdlIl0gfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBhY2thZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgIm9uZU9mIjogWwogICAgICAgICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvaW5saW5lLXBhY2thZ2UiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9pbmxpbmUtcGFja2FnZSIgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiaW5saW5lLXBhY2thZ2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibmFtZSIsICJ2ZXJzaW9uIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSBuYW1lLCBpbmNsdWRpbmcgJ3ZlbmRvci1uYW1lLycgcHJlZml4LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRhcmdldC1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEZvcmNlcyB0aGUgcGFja2FnZSB0byBiZSBpbnN0YWxsZWQgaW50byB0aGUgZ2l2ZW4gc3ViZGlyZWN0b3J5IHBhdGguIFRoaXMgaXMgdXNlZCBmb3IgYXV0b2xvYWRpbmcgUFNSLTAgcGFja2FnZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGVpciBmdWxsIHBhdGguIFVzZSBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAia2V5d29yZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsaWNlbnNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWwogICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IgogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0aG9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2F1dGhvcnMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlcGxhY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNvbmZsaWN0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hdXRvbG9hZCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXJjaGl2ZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGZpbGVzLCBvciBhIHNpbmdsZSBmaWxlLCB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGJpbmFyaWVzIGFuZCBzeW1saW5rZWQgaW50byBiaW4tZGlyIChmcm9tIGNvbmZpZykuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImluY2x1ZGUtcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoIHNob3VsZCBnZXQgYWRkZWQgdG8gUEhQJ3MgaW5jbHVkZSBwYXRoLiBUaGlzIGlzIG9ubHkgcHJlc2VudCB0byBzdXBwb3J0IGxlZ2FjeSBwcm9qZWN0cywgYW5kIGFsbCBuZXcgY29kZSBzaG91bGQgcHJlZmVyYWJseSB1c2UgYXV0b2xvYWRpbmcuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NvdXJjZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Rpc3QiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiLCAicmVmZXJlbmNlIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtaXJyb3JzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXJsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2hhc3VtIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibWlycm9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo8P3BocAoKCgppZiAoUEhQX1ZFUlNJT05fSUQgPCA1MDYwMCkgewppZiAoIWhlYWRlcnNfc2VudCgpKSB7CmhlYWRlcignSFRUUC8xLjEgNTAwIEludGVybmFsIFNlcnZlciBFcnJvcicpOwp9CiRlcnIgPSAnQ29tcG9zZXIgMi4zLjAgZHJvcHBlZCBzdXBwb3J0IGZvciBhdXRvbG9hZGluZyBvbiBQSFAgPDUuNiBhbmQgeW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJywgcGxlYXNlIHVwZ3JhZGUgUEhQIG9yIHVzZSBDb21wb3NlciAyLjIgTFRTIHZpYSAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS0yLjIiLiBBYm9ydGluZy4nLlBIUF9FT0w7CmlmICghaW5pX2dldCgnZGlzcGxheV9lcnJvcnMnKSkgewppZiAoUEhQX1NBUEkgPT09ICdjbGknIHx8IFBIUF9TQVBJID09PSAncGhwZGJnJykgewpmd3JpdGUoU1RERVJSLCAkZXJyKTsKfSBlbHNlaWYgKCFoZWFkZXJzX3NlbnQoKSkgewplY2hvICRlcnI7Cn0KfQp0cmlnZ2VyX2Vycm9yKAokZXJyLApFX1VTRVJfRVJST1IKKTsKfQoKcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NvbXBvc2VyL2F1dG9sb2FkX3JlYWwucGhwJzsKCnJldHVybiBDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTY5NjU3OTkxMjo6Z2V0TG9hZGVyKCk7Cjw/cGhwCgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIENsYXNzTG9hZGVyCnsKCnByaXZhdGUgc3RhdGljICRpbmNsdWRlRmlsZTsKCgpwcml2YXRlICR2ZW5kb3JEaXI7CgoKCgoKcHJpdmF0ZSAkcHJlZml4TGVuZ3Roc1BzcjQgPSBhcnJheSgpOwoKCgpwcml2YXRlICRwcmVmaXhEaXJzUHNyNCA9IGFycmF5KCk7CgoKCnByaXZhdGUgJGZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheSgpOwoKCgoKCgoKCgpwcml2YXRlICRwcmVmaXhlc1BzcjAgPSBhcnJheSgpOwoKCgpwcml2YXRlICRmYWxsYmFja0RpcnNQc3IwID0gYXJyYXkoKTsKCgpwcml2YXRlICR1c2VJbmNsdWRlUGF0aCA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXAgPSBhcnJheSgpOwoKCnByaXZhdGUgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkbWlzc2luZ0NsYXNzZXMgPSBhcnJheSgpOwoKCnByaXZhdGUgJGFwY3VQcmVmaXg7CgoKCgpwcml2YXRlIHN0YXRpYyAkcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2ZW5kb3JEaXIgPSBudWxsKQp7CiR0aGlzLT52ZW5kb3JEaXIgPSAkdmVuZG9yRGlyOwpzZWxmOjppbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzKCkKewppZiAoIWVtcHR5KCR0aGlzLT5wcmVmaXhlc1BzcjApKSB7CnJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCBhcnJheV92YWx1ZXMoJHRoaXMtPnByZWZpeGVzUHNyMCkpOwp9CgpyZXR1cm4gYXJyYXkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzUHNyNCgpCnsKcmV0dXJuICR0aGlzLT5wcmVmaXhEaXJzUHNyNDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlycygpCnsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmFsbGJhY2tEaXJzUHNyNCgpCnsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3NNYXAoKQp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXA7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENsYXNzTWFwKGFycmF5ICRjbGFzc01hcCkKewppZiAoJHRoaXMtPmNsYXNzTWFwKSB7CiR0aGlzLT5jbGFzc01hcCA9IGFycmF5X21lcmdlKCR0aGlzLT5jbGFzc01hcCwgJGNsYXNzTWFwKTsKfSBlbHNlIHsKJHRoaXMtPmNsYXNzTWFwID0gJGNsYXNzTWFwOwp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKewokcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKaWYgKCEkcHJlZml4KSB7CmlmICgkcHJlcGVuZCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAokcGF0aHMsCiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwCik7Cn0gZWxzZSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwLAokcGF0aHMKKTsKfQoKcmV0dXJuOwp9CgokZmlyc3QgPSAkcHJlZml4WzBdOwppZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSkpIHsKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gJHBhdGhzOwoKcmV0dXJuOwp9CmlmICgkcHJlcGVuZCkgewokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKJHBhdGhzLAokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0KKTsKfSBlbHNlIHsKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSwKJHBhdGhzCik7Cn0KfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBzcjQoJHByZWZpeCwgJHBhdGhzLCAkcHJlcGVuZCA9IGZhbHNlKQp7CiRwYXRocyA9IChhcnJheSkgJHBhdGhzOwppZiAoISRwcmVmaXgpIHsKCmlmICgkcHJlcGVuZCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCA9IGFycmF5X21lcmdlKAokcGF0aHMsCiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0Cik7Cn0gZWxzZSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0LAokcGF0aHMKKTsKfQp9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSkpIHsKCiRsZW5ndGggPSBzdHJsZW4oJHByZWZpeCk7CmlmICgnXFwnICE9PSAkcHJlZml4WyRsZW5ndGggLSAxXSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwp9CiR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9ICRwYXRoczsKfSBlbHNlaWYgKCRwcmVwZW5kKSB7CgokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKJHBhdGhzLAokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0KKTsKfSBlbHNlIHsKCiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0sCiRwYXRocwopOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXQoJHByZWZpeCwgJHBhdGhzKQp7CmlmICghJHByZWZpeCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IChhcnJheSkgJHBhdGhzOwp9IGVsc2UgewokdGhpcy0+cHJlZml4ZXNQc3IwWyRwcmVmaXhbMF1dWyRwcmVmaXhdID0gKGFycmF5KSAkcGF0aHM7Cn0KfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHNyNCgkcHJlZml4LCAkcGF0aHMpCnsKaWYgKCEkcHJlZml4KSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gKGFycmF5KSAkcGF0aHM7Cn0gZWxzZSB7CiRsZW5ndGggPSBzdHJsZW4oJHByZWZpeCk7CmlmICgnXFwnICE9PSAkcHJlZml4WyRsZW5ndGggLSAxXSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwp9CiR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXNlSW5jbHVkZVBhdGgoJHVzZUluY2x1ZGVQYXRoKQp7CiR0aGlzLT51c2VJbmNsdWRlUGF0aCA9ICR1c2VJbmNsdWRlUGF0aDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVzZUluY2x1ZGVQYXRoKCkKewpyZXR1cm4gJHRoaXMtPnVzZUluY2x1ZGVQYXRoOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKewokdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNDbGFzc01hcEF1dGhvcml0YXRpdmUoKQp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFwY3VQcmVmaXgoJGFwY3VQcmVmaXgpCnsKJHRoaXMtPmFwY3VQcmVmaXggPSBmdW5jdGlvbl9leGlzdHMoJ2FwY3VfZmV0Y2gnKSAmJiBmaWx0ZXJfdmFyKGluaV9nZXQoJ2FwYy5lbmFibGVkJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSA/ICRhcGN1UHJlZml4IDogbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBjdVByZWZpeCgpCnsKcmV0dXJuICR0aGlzLT5hcGN1UHJlZml4Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCRwcmVwZW5kID0gZmFsc2UpCnsKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKCmlmIChudWxsID09PSAkdGhpcy0+dmVuZG9yRGlyKSB7CnJldHVybjsKfQoKaWYgKCRwcmVwZW5kKSB7CnNlbGY6OiRyZWdpc3RlcmVkTG9hZGVycyA9IGFycmF5KCR0aGlzLT52ZW5kb3JEaXIgPT4gJHRoaXMpICsgc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzOwp9IGVsc2Ugewp1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwpzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0gPSAkdGhpczsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkKewpzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpKTsKCmlmIChudWxsICE9PSAkdGhpcy0+dmVuZG9yRGlyKSB7CnVuc2V0KHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSk7Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCnsKaWYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpIHsKJGluY2x1ZGVGaWxlID0gc2VsZjo6JGluY2x1ZGVGaWxlOwokaW5jbHVkZUZpbGUoJGZpbGUpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRGaWxlKCRjbGFzcykKewoKaWYgKGlzc2V0KCR0aGlzLT5jbGFzc01hcFskY2xhc3NdKSkgewpyZXR1cm4gJHRoaXMtPmNsYXNzTWFwWyRjbGFzc107Cn0KaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgfHwgaXNzZXQoJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10pKSB7CnJldHVybiBmYWxzZTsKfQppZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKJGZpbGUgPSBhcGN1X2ZldGNoKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGhpdCk7CmlmICgkaGl0KSB7CnJldHVybiAkZmlsZTsKfQp9CgokZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLnBocCcpOwoKCmlmIChmYWxzZSA9PT0gJGZpbGUgJiYgZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJy5oaCcpOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKYXBjdV9hZGQoJHRoaXMtPmFwY3VQcmVmaXguJGNsYXNzLCAkZmlsZSk7Cn0KCmlmIChmYWxzZSA9PT0gJGZpbGUpIHsKCiR0aGlzLT5taXNzaW5nQ2xhc3Nlc1skY2xhc3NdID0gdHJ1ZTsKfQoKcmV0dXJuICRmaWxlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZExvYWRlcnMoKQp7CnJldHVybiBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAkZXh0KQp7CgokbG9naWNhbFBhdGhQc3I0ID0gc3RydHIoJGNsYXNzLCAnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7CgokZmlyc3QgPSAkY2xhc3NbMF07CmlmIChpc3NldCgkdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJGZpcnN0XSkpIHsKJHN1YlBhdGggPSAkY2xhc3M7CndoaWxlIChmYWxzZSAhPT0gJGxhc3RQb3MgPSBzdHJycG9zKCRzdWJQYXRoLCAnXFwnKSkgewokc3ViUGF0aCA9IHN1YnN0cigkc3ViUGF0aCwgMCwgJGxhc3RQb3MpOwokc2VhcmNoID0gJHN1YlBhdGggLiAnXFwnOwppZiAoaXNzZXQoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRzZWFyY2hdKSkgewokcGF0aEVuZCA9IERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJGxhc3RQb3MgKyAxKTsKZm9yZWFjaCAoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRzZWFyY2hdIGFzICRkaXIpIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuICRwYXRoRW5kKSkgewpyZXR1cm4gJGZpbGU7Cn0KfQp9Cn0KfQoKCmZvcmVhY2ggKCR0aGlzLT5mYWxsYmFja0RpcnNQc3I0IGFzICRkaXIpIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3I0KSkgewpyZXR1cm4gJGZpbGU7Cn0KfQoKCmlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKSkgewoKJGxvZ2ljYWxQYXRoUHNyMCA9IHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAwLCAkcG9zICsgMSkKLiBzdHJ0cihzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJHBvcyArIDEpLCAnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IpOwp9IGVsc2UgewoKJGxvZ2ljYWxQYXRoUHNyMCA9IHN0cnRyKCRjbGFzcywgJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7Cn0KCmlmIChpc3NldCgkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF0pKSB7CmZvcmVhY2ggKCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XSBhcyAkcHJlZml4ID0+ICRkaXJzKSB7CmlmICgwID09PSBzdHJwb3MoJGNsYXNzLCAkcHJlZml4KSkgewpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyMCkpIHsKcmV0dXJuICRmaWxlOwp9Cn0KfQp9Cn0KCgpmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCBhcyAkZGlyKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyMCkpIHsKcmV0dXJuICRmaWxlOwp9Cn0KCgppZiAoJHRoaXMtPnVzZUluY2x1ZGVQYXRoICYmICRmaWxlID0gc3RyZWFtX3Jlc29sdmVfaW5jbHVkZV9wYXRoKCRsb2dpY2FsUGF0aFBzcjApKSB7CnJldHVybiAkZmlsZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKQp7CmlmIChzZWxmOjokaW5jbHVkZUZpbGUgIT09IG51bGwpIHsKcmV0dXJuOwp9CgoKCgoKCgoKCnNlbGY6OiRpbmNsdWRlRmlsZSA9IFxDbG9zdXJlOjpiaW5kKHN0YXRpYyBmdW5jdGlvbigkZmlsZSkgewppbmNsdWRlICRmaWxlOwp9LCBudWxsLCBudWxsKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFZlcnNpb25QYXJzZXI7CgoKCgoKCgoKCgpjbGFzcyBJbnN0YWxsZWRWZXJzaW9ucwp7CgoKCgpwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGNhbkdldFZlbmRvcnM7CgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZEJ5VmVuZG9yID0gYXJyYXkoKTsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXMoKQp7CiRwYWNrYWdlcyA9IGFycmF5KCk7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKJHBhY2thZ2VzW10gPSBhcnJheV9rZXlzKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10pOwp9CgppZiAoMSA9PT0gXGNvdW50KCRwYWNrYWdlcykpIHsKcmV0dXJuICRwYWNrYWdlc1swXTsKfQoKcmV0dXJuIGFycmF5X2tleXMoYXJyYXlfZmxpcChcY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2FycmF5X21lcmdlJywgJHBhY2thZ2VzKSkpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQYWNrYWdlc0J5VHlwZSgkdHlwZSkKewokcGFja2FnZXNCeVR5cGUgPSBhcnJheSgpOwoKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewpmb3JlYWNoICgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CmlmIChpc3NldCgkcGFja2FnZVsndHlwZSddKSAmJiAkcGFja2FnZVsndHlwZSddID09PSAkdHlwZSkgewokcGFja2FnZXNCeVR5cGVbXSA9ICRuYW1lOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlc0J5VHlwZTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0luc3RhbGxlZCgkcGFja2FnZU5hbWUsICRpbmNsdWRlRGV2UmVxdWlyZW1lbnRzID0gdHJ1ZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmIChpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CnJldHVybiAkaW5jbHVkZURldlJlcXVpcmVtZW50cyB8fCAhaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSkgfHwgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSA9PT0gZmFsc2U7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhdGlzZmllcyhWZXJzaW9uUGFyc2VyICRwYXJzZXIsICRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpCnsKJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKChzdHJpbmcpICRjb25zdHJhaW50KTsKJHByb3ZpZGVkID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cyhzZWxmOjpnZXRWZXJzaW9uUmFuZ2VzKCRwYWNrYWdlTmFtZSkpOwoKcmV0dXJuICRwcm92aWRlZC0+bWF0Y2hlcygkY29uc3RyYWludCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCiRyYW5nZXMgPSBhcnJheSgpOwppZiAoaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddKSkgewokcmFuZ2VzW10gPSAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ByZXR0eV92ZXJzaW9uJ107Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ2FsaWFzZXMnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2FsaWFzZXMnXSk7Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3JlcGxhY2VkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewokcmFuZ2VzID0gYXJyYXlfbWVyZ2UoJHJhbmdlcywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZXBsYWNlZCddKTsKfQppZiAoYXJyYXlfa2V5X2V4aXN0cygncHJvdmlkZWQnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3Byb3ZpZGVkJ10pOwp9CgpyZXR1cm4gaW1wbG9kZSgnIHx8ICcsICRyYW5nZXMpOwp9Cgp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ZlcnNpb24nXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ZlcnNpb24nXTsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXTsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3JlZmVyZW5jZSddKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ107Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKcmV0dXJuIGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnaW5zdGFsbF9wYXRoJ10pID8gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydpbnN0YWxsX3BhdGgnXSA6IG51bGw7Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3RQYWNrYWdlKCkKewokaW5zdGFsbGVkID0gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CgpyZXR1cm4gJGluc3RhbGxlZFswXVsncm9vdCddOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSYXdEYXRhKCkKewpAdHJpZ2dlcl9lcnJvcignZ2V0UmF3RGF0YSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRhdGFzZXQgbG9hZGVkLCB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IGV4cGVjdC4gVXNlIGdldEFsbFJhd0RhdGEoKSBpbnN0ZWFkIHdoaWNoIHJldHVybnMgYWxsIGRhdGFzZXRzIGZvciBhbGwgYXV0b2xvYWRlcnMgcHJlc2VudCBpbiB0aGUgcHJvY2Vzcy4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CgppZiAobnVsbCA9PT0gc2VsZjo6JGluc3RhbGxlZCkgewoKCmlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKc2VsZjo6JGluc3RhbGxlZCA9IGluY2x1ZGUgX19ESVJfXyAuICcvaW5zdGFsbGVkLnBocCc7Cn0gZWxzZSB7CnNlbGY6OiRpbnN0YWxsZWQgPSBhcnJheSgpOwp9Cn0KCnJldHVybiBzZWxmOjokaW5zdGFsbGVkOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEFsbFJhd0RhdGEoKQp7CnJldHVybiBzZWxmOjpnZXRJbnN0YWxsZWQoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWxvYWQoJGRhdGEpCnsKc2VsZjo6JGluc3RhbGxlZCA9ICRkYXRhOwpzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3IgPSBhcnJheSgpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkKCkKewppZiAobnVsbCA9PT0gc2VsZjo6JGNhbkdldFZlbmRvcnMpIHsKc2VsZjo6JGNhbkdldFZlbmRvcnMgPSBtZXRob2RfZXhpc3RzKCdDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcicsICdnZXRSZWdpc3RlcmVkTG9hZGVycycpOwp9CgokaW5zdGFsbGVkID0gYXJyYXkoKTsKCmlmIChzZWxmOjokY2FuR2V0VmVuZG9ycykgewpmb3JlYWNoIChDbGFzc0xvYWRlcjo6Z2V0UmVnaXN0ZXJlZExvYWRlcnMoKSBhcyAkdmVuZG9yRGlyID0+ICRsb2FkZXIpIHsKaWYgKGlzc2V0KHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXSkpIHsKJGluc3RhbGxlZFtdID0gc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdOwp9IGVsc2VpZiAoaXNfZmlsZSgkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCcpKSB7CgokcmVxdWlyZWQgPSByZXF1aXJlICR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJzsKJGluc3RhbGxlZFtdID0gc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdID0gJHJlcXVpcmVkOwppZiAobnVsbCA9PT0gc2VsZjo6JGluc3RhbGxlZCAmJiBzdHJ0cigkdmVuZG9yRGlyLicvY29tcG9zZXInLCAnXFwnLCAnLycpID09PSBzdHJ0cihfX0RJUl9fLCAnXFwnLCAnLycpKSB7CnNlbGY6OiRpbnN0YWxsZWQgPSAkaW5zdGFsbGVkW2NvdW50KCRpbnN0YWxsZWQpIC0gMV07Cn0KfQp9Cn0KCmlmIChudWxsID09PSBzZWxmOjokaW5zdGFsbGVkKSB7CgoKaWYgKHN1YnN0cihfX0RJUl9fLCAtOCwgMSkgIT09ICdDJykgewoKJHJlcXVpcmVkID0gcmVxdWlyZSBfX0RJUl9fIC4gJy9pbnN0YWxsZWQucGhwJzsKc2VsZjo6JGluc3RhbGxlZCA9ICRyZXF1aXJlZDsKfSBlbHNlIHsKc2VsZjo6JGluc3RhbGxlZCA9IGFycmF5KCk7Cn0KfQoKaWYgKHNlbGY6OiRpbnN0YWxsZWQgIT09IGFycmF5KCkpIHsKJGluc3RhbGxlZFtdID0gc2VsZjo6JGluc3RhbGxlZDsKfQoKcmV0dXJuICRpbnN0YWxsZWQ7Cn0KfQo8P3BocAoKCgokdmVuZG9yRGlyID0gZGlybmFtZShfX0RJUl9fKTsKJGJhc2VEaXIgPSBkaXJuYW1lKCR2ZW5kb3JEaXIpOwoKcmV0dXJuIGFycmF5KAonQXR0cmlidXRlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9BdHRyaWJ1dGUucGhwJywKJ0NVUkxTdHJpbmdGaWxlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9DVVJMU3RyaW5nRmlsZS5waHAnLAonQ29tcG9zZXJcXEluc3RhbGxlZFZlcnNpb25zJyA9PiAkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHAnLAonSnNvbkV4Y2VwdGlvbicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9SZXNvdXJjZXMvc3R1YnMvSnNvbkV4Y2VwdGlvbi5waHAnLAonTm9ybWFsaXplcicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3N0dWJzL05vcm1hbGl6ZXIucGhwJywKJ1BocFRva2VuJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9QaHBUb2tlbi5waHAnLAonUmV0dXJuVHlwZVdpbGxDaGFuZ2UnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL1JldHVyblR5cGVXaWxsQ2hhbmdlLnBocCcsCidTdHJpbmdhYmxlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9TdHJpbmdhYmxlLnBocCcsCidVbmhhbmRsZWRNYXRjaEVycm9yJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9VbmhhbmRsZWRNYXRjaEVycm9yLnBocCcsCidWYWx1ZUVycm9yJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9WYWx1ZUVycm9yLnBocCcsCik7Cjw/cGhwCgoKCiR2ZW5kb3JEaXIgPSBkaXJuYW1lKF9fRElSX18pOwokYmFzZURpciA9IGRpcm5hbWUoJHZlbmRvckRpcik7CgpyZXR1cm4gYXJyYXkoCidhNGExMTlhNTZlNTBmYmIyOTMyODFkOWE0ODAwN2UwZScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9ib290c3RyYXAucGhwJywKJzZlM2ZhZTI5NjMxZWYyODA2NjBiM2NkYWQwNmYyNWE4JyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy9mdW5jdGlvbi5waHAnLAonMGU2ZDdiZjRhNTgxMWJmYTVjZjQwYzVjY2Q2ZmFlNmEnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvYm9vdHN0cmFwLnBocCcsCiczMjBjZGUyMmY2NmRkNGY1ZDNmZDYyMWQzZTg4Yjk4ZicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS9ib290c3RyYXAucGhwJywKJzg4MjVlZGU4M2YyZjI4OTEyNzcyMmQ0ZTg0MmNmN2U4JyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwLnBocCcsCidlNjlmN2Y2ZWUyODdiOTY5MTk4YzNjOWQ2Nzc3YmQzOCcgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvYm9vdHN0cmFwLnBocCcsCicwZDU5ZWUyNDBhNGNkOTZkZGJiNGZmMTY0ZmNjZWE0ZCcgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9ib290c3RyYXAucGhwJywKJ2I2Yjk5MWE1NzYyMGUyZmI2YjJmNjZmMDNmZTlkZGMyJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocCcsCidhZDE1NWY4ZjFjZjBkNDE4ZmU0OWUyNDhkYjhjNjYxYicgPT4gJHZlbmRvckRpciAuICcvcmVhY3QvcHJvbWlzZS9zcmMvZnVuY3Rpb25zX2luY2x1ZGUucGhwJywKJzIzYzE4MDQ2ZjUyYmVmM2VlYTAzNDY1N2JhZmRhNTBmJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL2Jvb3RzdHJhcC5waHAnLAopOwo8P3BocAoKCgokdmVuZG9yRGlyID0gZGlybmFtZShfX0RJUl9fKTsKJGJhc2VEaXIgPSBkaXJuYW1lKCR2ZW5kb3JEaXIpOwoKcmV0dXJuIGFycmF5KAopOwo8P3BocAoKCgokdmVuZG9yRGlyID0gZGlybmFtZShfX0RJUl9fKTsKJGJhc2VEaXIgPSBkaXJuYW1lKCR2ZW5kb3JEaXIpOwoKcmV0dXJuIGFycmF5KAonU3ltZm9ueVxcUG9seWZpbGxcXFBocDgxXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwJyksCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwNzNcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3MycpLAonU3ltZm9ueVxcUG9seWZpbGxcXE1ic3RyaW5nXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJyksCidTeW1mb255XFxQb2x5ZmlsbFxcSW50bFxcR3JhcGhlbWVcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lJyksCidTeW1mb255XFxQb2x5ZmlsbFxcQ3R5cGVcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZScpLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcU3RyaW5nXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvc3RyaW5nJyksCidTeW1mb255XFxDb21wb25lbnRcXFByb2Nlc3NcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wcm9jZXNzJyksCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L2ZpbmRlcicpLAonU3ltZm9ueVxcQ29tcG9uZW50XFxGaWxlc3lzdGVtXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZmlsZXN5c3RlbScpLAonU3ltZm9ueVxcQ29tcG9uZW50XFxDb25zb2xlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvY29uc29sZScpLAonU2VsZFxcU2lnbmFsXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3NlbGQvc2lnbmFsLWhhbmRsZXIvc3JjJyksCidTZWxkXFxQaGFyVXRpbHNcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc2VsZC9waGFyLXV0aWxzL3NyYycpLAonU2VsZFxcSnNvbkxpbnRcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludCcpLAonUmVhY3RcXFByb21pc2VcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvcmVhY3QvcHJvbWlzZS9zcmMnKSwKJ1BzclxcTG9nXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3Bzci9sb2cvUHNyL0xvZycpLAonUHNyXFxDb250YWluZXJcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvcHNyL2NvbnRhaW5lci9zcmMnKSwKJ0pzb25TY2hlbWFcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYScpLAonQ29tcG9zZXJcXFhkZWJ1Z0hhbmRsZXJcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjJyksCidDb21wb3NlclxcU3BkeFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYycpLAonQ29tcG9zZXJcXFNlbXZlclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9zZW12ZXIvc3JjJyksCidDb21wb3NlclxcUGNyZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9wY3JlL3NyYycpLAonQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvc3JjJyksCidDb21wb3NlclxcQ2xhc3NNYXBHZW5lcmF0b3JcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMnKSwKJ0NvbXBvc2VyXFxDYUJ1bmRsZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9jYS1idW5kbGUvc3JjJyksCidDb21wb3NlclxcJyA9PiBhcnJheSgkYmFzZURpciAuICcvc3JjL0NvbXBvc2VyJyksCik7Cjw/cGhwCgoKCmNsYXNzIENvbXBvc2VyQXV0b2xvYWRlckluaXRDb21wb3NlclBoYXIxNjk2NTc5OTEyCnsKcHJpdmF0ZSBzdGF0aWMgJGxvYWRlcjsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZENsYXNzTG9hZGVyKCRjbGFzcykKewppZiAoJ0NvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyJyA9PT0gJGNsYXNzKSB7CnJlcXVpcmUgX19ESVJfXyAuICcvQ2xhc3NMb2FkZXIucGhwJzsKfQp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvYWRlcigpCnsKaWYgKG51bGwgIT09IHNlbGY6OiRsb2FkZXIpIHsKcmV0dXJuIHNlbGY6OiRsb2FkZXI7Cn0KCnNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgnQ29tcG9zZXJBdXRvbG9hZGVySW5pdENvbXBvc2VyUGhhcjE2OTY1Nzk5MTInLCAnbG9hZENsYXNzTG9hZGVyJyksIHRydWUsIHRydWUpOwpzZWxmOjokbG9hZGVyID0gJGxvYWRlciA9IG5ldyBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIoXGRpcm5hbWUoX19ESVJfXykpOwpzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcihhcnJheSgnQ29tcG9zZXJBdXRvbG9hZGVySW5pdENvbXBvc2VyUGhhcjE2OTY1Nzk5MTInLCAnbG9hZENsYXNzTG9hZGVyJykpOwoKcmVxdWlyZSBfX0RJUl9fIC4gJy9hdXRvbG9hZF9zdGF0aWMucGhwJzsKY2FsbF91c2VyX2Z1bmMoXENvbXBvc2VyXEF1dG9sb2FkXENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE2OTY1Nzk5MTI6OmdldEluaXRpYWxpemVyKCRsb2FkZXIpKTsKCiRsb2FkZXItPnJlZ2lzdGVyKHRydWUpOwoKJGZpbGVzVG9Mb2FkID0gXENvbXBvc2VyXEF1dG9sb2FkXENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE2OTY1Nzk5MTI6OiRmaWxlczsKJHJlcXVpcmVGaWxlID0gXENsb3N1cmU6OmJpbmQoc3RhdGljIGZ1bmN0aW9uICgkZmlsZUlkZW50aWZpZXIsICRmaWxlKSB7CmlmIChlbXB0eSgkR0xPQkFMU1snX19jb21wb3Nlcl9hdXRvbG9hZF9maWxlcyddWyRmaWxlSWRlbnRpZmllcl0pKSB7CiRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bJGZpbGVJZGVudGlmaWVyXSA9IHRydWU7CgpyZXF1aXJlICRmaWxlOwp9Cn0sIG51bGwsIG51bGwpOwpmb3JlYWNoICgkZmlsZXNUb0xvYWQgYXMgJGZpbGVJZGVudGlmaWVyID0+ICRmaWxlKSB7CiRyZXF1aXJlRmlsZSgkZmlsZUlkZW50aWZpZXIsICRmaWxlKTsKfQoKcmV0dXJuICRsb2FkZXI7Cn0KfQo8P3BocAoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7CgpjbGFzcyBDb21wb3NlclN0YXRpY0luaXRDb21wb3NlclBoYXIxNjk2NTc5OTEyCnsKcHVibGljIHN0YXRpYyAkZmlsZXMgPSBhcnJheSAoCidhNGExMTlhNTZlNTBmYmIyOTMyODFkOWE0ODAwN2UwZScgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL2Jvb3RzdHJhcC5waHAnLAonNmUzZmFlMjk2MzFlZjI4MDY2MGIzY2RhZDA2ZjI1YTgnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvZnVuY3Rpb24ucGhwJywKJzBlNmQ3YmY0YTU4MTFiZmE1Y2Y0MGM1Y2NkNmZhZTZhJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvYm9vdHN0cmFwLnBocCcsCiczMjBjZGUyMmY2NmRkNGY1ZDNmZDYyMWQzZTg4Yjk4ZicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlL2Jvb3RzdHJhcC5waHAnLAonODgyNWVkZTgzZjJmMjg5MTI3NzIyZDRlODQyY2Y3ZTgnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL2Jvb3RzdHJhcC5waHAnLAonZTY5ZjdmNmVlMjg3Yjk2OTE5OGMzYzlkNjc3N2JkMzgnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvYm9vdHN0cmFwLnBocCcsCicwZDU5ZWUyNDBhNGNkOTZkZGJiNGZmMTY0ZmNjZWE0ZCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczL2Jvb3RzdHJhcC5waHAnLAonYjZiOTkxYTU3NjIwZTJmYjZiMmY2NmYwM2ZlOWRkYzInID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9zdHJpbmcvUmVzb3VyY2VzL2Z1bmN0aW9ucy5waHAnLAonYWQxNTVmOGYxY2YwZDQxOGZlNDllMjQ4ZGI4YzY2MWInID0+IF9fRElSX18gLiAnLy4uJyAuICcvcmVhY3QvcHJvbWlzZS9zcmMvZnVuY3Rpb25zX2luY2x1ZGUucGhwJywKJzIzYzE4MDQ2ZjUyYmVmM2VlYTAzNDY1N2JhZmRhNTBmJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvYm9vdHN0cmFwLnBocCcsCik7CgpwdWJsaWMgc3RhdGljICRwcmVmaXhMZW5ndGhzUHNyNCA9IGFycmF5ICgKJ1MnID0+IAphcnJheSAoCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwODFcXCcgPT4gMjMsCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwODBcXCcgPT4gMjMsCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwNzNcXCcgPT4gMjMsCidTeW1mb255XFxQb2x5ZmlsbFxcTWJzdHJpbmdcXCcgPT4gMjYsCidTeW1mb255XFxQb2x5ZmlsbFxcSW50bFxcTm9ybWFsaXplclxcJyA9PiAzMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PiAzMSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcJyA9PiAyMywKJ1N5bWZvbnlcXENvbnRyYWN0c1xcU2VydmljZVxcJyA9PiAyNiwKJ1N5bWZvbnlcXENvbXBvbmVudFxcU3RyaW5nXFwnID0+IDI1LAonU3ltZm9ueVxcQ29tcG9uZW50XFxQcm9jZXNzXFwnID0+IDI2LAonU3ltZm9ueVxcQ29tcG9uZW50XFxGaW5kZXJcXCcgPT4gMjUsCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4gMjksCidTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCcgPT4gMjYsCidTZWxkXFxTaWduYWxcXCcgPT4gMTIsCidTZWxkXFxQaGFyVXRpbHNcXCcgPT4gMTUsCidTZWxkXFxKc29uTGludFxcJyA9PiAxNCwKKSwKJ1InID0+IAphcnJheSAoCidSZWFjdFxcUHJvbWlzZVxcJyA9PiAxNCwKKSwKJ1AnID0+IAphcnJheSAoCidQc3JcXExvZ1xcJyA9PiA4LAonUHNyXFxDb250YWluZXJcXCcgPT4gMTQsCiksCidKJyA9PiAKYXJyYXkgKAonSnNvblNjaGVtYVxcJyA9PiAxMSwKKSwKJ0MnID0+IAphcnJheSAoCidDb21wb3NlclxcWGRlYnVnSGFuZGxlclxcJyA9PiAyMywKJ0NvbXBvc2VyXFxTcGR4XFwnID0+IDE0LAonQ29tcG9zZXJcXFNlbXZlclxcJyA9PiAxNiwKJ0NvbXBvc2VyXFxQY3JlXFwnID0+IDE0LAonQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCcgPT4gMjYsCidDb21wb3NlclxcQ2xhc3NNYXBHZW5lcmF0b3JcXCcgPT4gMjcsCidDb21wb3NlclxcQ2FCdW5kbGVcXCcgPT4gMTgsCidDb21wb3NlclxcJyA9PiA5LAopLAopOwoKcHVibGljIHN0YXRpYyAkcHJlZml4RGlyc1BzcjQgPSBhcnJheSAoCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwODFcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEnLAopLAonU3ltZm9ueVxcUG9seWZpbGxcXFBocDgwXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3MycsCiksCidTeW1mb255XFxQb2x5ZmlsbFxcTWJzdHJpbmdcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcnLAopLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXE5vcm1hbGl6ZXJcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZScsCiksCidTeW1mb255XFxDb250cmFjdHNcXFNlcnZpY2VcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvc3RyaW5nJywKKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wcm9jZXNzJywKKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmluZGVyXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2ZpbmRlcicsCiksCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvZmlsZXN5c3RlbScsCiksCidTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvY29uc29sZScsCiksCidTZWxkXFxTaWduYWxcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvc2lnbmFsLWhhbmRsZXIvc3JjJywKKSwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc2VsZC9waGFyLXV0aWxzL3NyYycsCiksCidTZWxkXFxKc29uTGludFxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludCcsCiksCidSZWFjdFxcUHJvbWlzZVxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvcmVhY3QvcHJvbWlzZS9zcmMnLAopLAonUHNyXFxMb2dcXCcgPT4gCmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3Bzci9sb2cvUHNyL0xvZycsCiksCidQc3JcXENvbnRhaW5lclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvcHNyL2NvbnRhaW5lci9zcmMnLAopLAonSnNvblNjaGVtYVxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYScsCiksCidDb21wb3NlclxcWGRlYnVnSGFuZGxlclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjJywKKSwKJ0NvbXBvc2VyXFxTcGR4XFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYycsCiksCidDb21wb3NlclxcU2VtdmVyXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9zZW12ZXIvc3JjJywKKSwKJ0NvbXBvc2VyXFxQY3JlXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9wY3JlL3NyYycsCiksCidDb21wb3NlclxcTWV0YWRhdGFNaW5pZmllclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvc3JjJywKKSwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PiAKYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMnLAopLAonQ29tcG9zZXJcXENhQnVuZGxlXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9jYS1idW5kbGUvc3JjJywKKSwKJ0NvbXBvc2VyXFwnID0+IAphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4vLi4nIC4gJy9zcmMvQ29tcG9zZXInLAopLAopOwoKcHVibGljIHN0YXRpYyAkY2xhc3NNYXAgPSBhcnJheSAoCidBdHRyaWJ1dGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvQXR0cmlidXRlLnBocCcsCidDVVJMU3RyaW5nRmlsZScgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9DVVJMU3RyaW5nRmlsZS5waHAnLAonQ29tcG9zZXJcXEluc3RhbGxlZFZlcnNpb25zJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocCcsCidKc29uRXhjZXB0aW9uJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvUmVzb3VyY2VzL3N0dWJzL0pzb25FeGNlcHRpb24ucGhwJywKJ05vcm1hbGl6ZXInID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3N0dWJzL05vcm1hbGl6ZXIucGhwJywKJ1BocFRva2VuJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1BocFRva2VuLnBocCcsCidSZXR1cm5UeXBlV2lsbENoYW5nZScgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9SZXR1cm5UeXBlV2lsbENoYW5nZS5waHAnLAonU3RyaW5nYWJsZScgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9TdHJpbmdhYmxlLnBocCcsCidVbmhhbmRsZWRNYXRjaEVycm9yJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwJywKJ1ZhbHVlRXJyb3InID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVmFsdWVFcnJvci5waHAnLAopOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbml0aWFsaXplcihDbGFzc0xvYWRlciAkbG9hZGVyKQp7CnJldHVybiBcQ2xvc3VyZTo6YmluZChmdW5jdGlvbiAoKSB1c2UgKCRsb2FkZXIpIHsKJGxvYWRlci0+cHJlZml4TGVuZ3Roc1BzcjQgPSBDb21wb3NlclN0YXRpY0luaXRDb21wb3NlclBoYXIxNjk2NTc5OTEyOjokcHJlZml4TGVuZ3Roc1BzcjQ7CiRsb2FkZXItPnByZWZpeERpcnNQc3I0ID0gQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTY5NjU3OTkxMjo6JHByZWZpeERpcnNQc3I0OwokbG9hZGVyLT5jbGFzc01hcCA9IENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE2OTY1Nzk5MTI6OiRjbGFzc01hcDsKCn0sIG51bGwsIENsYXNzTG9hZGVyOjpjbGFzcyk7Cn0KfQoKQ29weXJpZ2h0IChDKSAyMDE2IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKIyMKIyMgQnVuZGxlIG9mIENBIFJvb3QgQ2VydGlmaWNhdGVzCiMjCiMjIENlcnRpZmljYXRlIGRhdGEgZnJvbSBNb3ppbGxhIGFzIG9mOiBUdWUgQXVnIDIyIDAzOjEyOjA0IDIwMjMgR01UCiMjCiMjIFRoaXMgaXMgYSBidW5kbGUgb2YgWC41MDkgY2VydGlmaWNhdGVzIG9mIHB1YmxpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcwojIyAoQ0EpLiBUaGVzZSB3ZXJlIGF1dG9tYXRpY2FsbHkgZXh0cmFjdGVkIGZyb20gTW96aWxsYSdzIHJvb3QgY2VydGlmaWNhdGVzCiMjIGZpbGUgKGNlcnRkYXRhLnR4dCkuICBUaGlzIGZpbGUgY2FuIGJlIGZvdW5kIGluIHRoZSBtb3ppbGxhIHNvdXJjZSB0cmVlOgojIyBodHRwczovL2hnLm1vemlsbGEub3JnL3JlbGVhc2VzL21vemlsbGEtcmVsZWFzZS9yYXctZmlsZS9kZWZhdWx0L3NlY3VyaXR5L25zcy9saWIvY2tmdy9idWlsdGlucy9jZXJ0ZGF0YS50eHQKIyMKIyMgSXQgY29udGFpbnMgdGhlIGNlcnRpZmljYXRlcyBpbiBQRU0gZm9ybWF0IGFuZCB0aGVyZWZvcmUKIyMgY2FuIGJlIGRpcmVjdGx5IHVzZWQgd2l0aCBjdXJsIC8gbGliY3VybCAvIHBocF9jdXJsLCBvciB3aXRoCiMjIGFuIEFwYWNoZSttb2Rfc3NsIHdlYnNlcnZlciBmb3IgU1NMIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KIyMgSnVzdCBjb25maWd1cmUgdGhpcyBmaWxlIGFzIHRoZSBTU0xDQUNlcnRpZmljYXRlRmlsZS4KIyMKIyMgQ29udmVyc2lvbiBkb25lIHdpdGggbWstY2EtYnVuZGxlLnBsIHZlcnNpb24gMS4yOS4KIyMgU0hBMjU2OiAwZmYxMzdiYWJjNmE1NTYxYTljZmJlOWYyOTU1ODk3MmU1YjUyODIwMjY4MWI3ZDM4MDNkMDNhM2U4MjkyMmJkCiMjCgoKR2xvYmFsU2lnbiBSb290IENBCj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGRUQ0NBbDJnQXdJQkFnSUxCQUFBQUFBQkZVdGF3NVF3RFFZSktvWklodmNOQVFFRkJRQXdWekVMTUFrR0ExVUVCaE1DUWtVeApHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2YjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzCmIySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXdNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlYKQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRApWUVFERXhKSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhCkR1YVpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZHp4dElLKzZOaVk2YXJ5bUFaYXZweHkwU3k2c2MKVEhBSG9UMEtNTTBWalUvNDNkU01VQlVjNzFEdXhDNzMvT2xTOHBGOTRHM1ZOVENPWGtOejhrSHAxV3Jqc29rNlZqazRid1k4aUdsYgpLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkR3NuVU9odWdaaXRWdGJOVjRGcFdpNmNnS09PdnlKQk5QCmMxU1RFNFU2Rzd3ZU5MV0xCWXk1ZDR1eDJ4OGdrYXNKVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclgKZ3pUL0xDckJiQmxEU2dlRjU5Tjg5aUZvNytyeVVwOS9rNURQQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSZ2UyWWFSUTJYeW9sUUwzMEV6VFNvLy96OVN6QU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBMW5QbmZFOTIwSTIvN0xxaXZqVEZLREsxZlB4c25Dd3J2UW1lVTc5clhxb1JTTGJsQ0tPenlqMWhUZE5HQ2JNK3c2RGoKWTFVYjhycnZyVG5oUTdrNG8rWXZpaVk3NzZCUVZ2bkdDdjA0emNRTGNGR1VsNWdFMzhOZmxOVVZ5UlJCbk1SZGRXUVZEZjlWTU95RwpqLzhON3l5NVkwYjJxdnpmdkduOUxoSklaSnJnbGZDbTd5bVBBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhICmhtNHF4Rll4bGRCbmlZVXIrV3ltWFVhZERLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUMKWDRYU1FSamJnYk1FSE1VZnBJQnZGU0RKM2d5SUNoM1dabFhpL0VqSktTWnA0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJRU9HUGUrREFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1ClpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnBibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHAKYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgpCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4Ck56VXdOVEZhRncweU9UQTNNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTMKZDNkM0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbApNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1ClpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXFLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTApHcDE4RXpvT0gxdTNIcy9sSkJRZXNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyCmhSU0dsVnVYTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVFhUelcKbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvSG9aZGVub1Z2ZThBamhVaQpWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUg0UUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVVmVTQjBSR0F2dGlKdVFpak1mbWhKQWtXdVhBd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBRHViajFhYk1PZFRtWHg2ZWFkTmw5Y1psWkQ3QmgvS00zeEdZNCtXWmlUNlFCc2hKOHJtY25QeQpULzR4bWYzSURFeG9VOGFBZ2hPWStyYXQybDA5OGM1dTloVVJsSUlNN2orVnJ4R3JEOWN2M2g4RGoxY3NIc203bWhwRWxlc1lUNllmCnpYMVhFQytiQkFsYWhMVnUyQjA2NGRhZTBXeDVYbmtjRk1YajBFeVRPMlU4N2Q4OXZxYmxsUnJEdFJuRHZWNWJ1LzhqNzJnWnl4S1QKSjF3RExXOHcwQjYyR3F6ZVd2ZlJxcWducHY1NWdjUjVtVE5YdWhLd3FlQkNiSlBLVnQ3K2JZUUxDSXQramVyWG1DSEc4K2M4ZVM5ZQpuTkZNRlkzaDdDSTN6SnBEQzVmY2dKQ05zMmViYjBnSUZWYlB2L0VyZkY2YWR1bFprTVY4Z3pVUlpWRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKUlRFU01CQUdBMVVFCkNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWURWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGkKWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWERUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQwpTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5WlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzCmRHbHRiM0psSUVONVltVnlWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUUKdXlLcm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anJJWjNBUVNzQgpVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllS21wWWNxV2U0UHd6VjkvbFNFeS9DCkc5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1WG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDkKWGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnlkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcgpsM1JqTTcxb0dESHdlSTEydi95ZWpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JClZEYUdlenExQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUIKQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyOWhrVEk3Z1FDdmxZcE5SaApjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3hqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1CmhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMEVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2EKWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6a3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SApSQ3dCWGJzZHRUTFNSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVgpCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhPVEEzQmdOVkJBc1RNSGQzZHk1bGJuUnlkWE4wTG01bGRDOURVRk1nYVhNZ2FXNWpiM0p3CmIzSmhkR1ZrSUdKNUlISmxabVZ5Wlc1alpURWZNQjBHQTFVRUN4TVdLR01wSURJd01EWWdSVzUwY25WemRDd2dTVzVqTGpFdE1Dc0cKQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBMk1URXlOekl3TWpNMApNbG9YRFRJMk1URXlOekl3TlRNME1sb3dnYkF4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11Ck1Ua3dOd1lEVlFRTEV6QjNkM2N1Wlc1MGNuVnpkQzV1WlhRdlExQlRJR2x6SUdsdVkyOXljRzl5WVhSbFpDQmllU0J5WldabGNtVnUKWTJVeEh6QWRCZ05WQkFzVEZpaGpLU0F5TURBMklFVnVkSEoxYzNRc0lFbHVZeTR4TFRBckJnTlZCQU1USkVWdWRISjFjM1FnVW05dgpkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFMYVZ0a05DK3NadEttOUkzNVJNT1ZjRjdzTjVFVUZvTnUzcy9wb0JqNkU0S1B6M0VFWm1MazBlR3JFYVRzYlJ3SldJc01uL01Zc3oKQTl1M2czcytJSVJlN2JKV0tLZjQ0TGxBY1RmRnkwY09seXBvd0NLVlloWGJSOW4xMEN2L2drdkpyVDdlVE51UWdGQS9DWXFFQU93dwpDajBZemZ2OUtsbWFJNVVYTEVXZUgyNURlVzBNWEpqK1NLZkZJMGRjWHYxdTV4NjA5bWhGMFlhRFc2S0tqYkhqS1lEK0pYR0lyYjY4Cmo2eFNsa3VxVVkza0V6RVo2RTVObjl1c3MyclZ2RGxVY2NwNmVuK1EzWDBkZ05tQnUxa213aEgrNXBQaTk0RGtaZnMwTnc0cGdIQk4KcnppR0xwNS9WNitlRjY3ckhNc29JVisySE5qbm9nUWkrZFBhMk1zQ0F3RUFBYU9Cc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXJCZ05WSFJBRUpEQWlnQTh5TURBMk1URXlOekl3TWpNME1scUJEekl3TWpZeE1USTNNakExCk16UXlXakFmQmdOVkhTTUVHREFXZ0JSb2tPUm5wS1pUZ01lR1pxVHg5MHREKzRTOWJUQWRCZ05WSFE0RUZnUVVhSkRrWjZTbVU0REgKaG1hazhmZExRL3VFdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFDVDFEQ3cxd01nS3RENVkraVJEQVVncVY4WnludHlUdFN4MjlDVysxUmFHU3dNQ1BleXZJV29uWDl0TzFLekt0dm4xSVNNClkvWVB5eVlCa1ZCczlGOFU0cE4wd0JPZU1EcFE0N1JneFJ6d0lrU05jVWVzeUJySjZadWFBR0FULzNCK1h4Rk5TUnV6RlZKN3lWVGEKdjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUDlXUWNDazNSdktxc255clEvMzkvMm4zcXNlMHdKY0dFMmpUUwpXM2lEVnV5Y05zTW00aEgyWjBrZGtxdU0rK3YvZXU2RlNxZFFnUENuWEVxVUxsOEZtVHhTUWVETnRHUFBBVU82bklQY2oyQTc4MXEwCnRIdXUyZ3VRT0hYdmdSMW0wdmRYY0RhenYvd29yM0VsaFZzVC9oNS9XclE4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNvbW9kbyBBQUEgU2VydmljZXMgcm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNakNDQXhxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI3TVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNBd1MKUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIREFkVFlXeG1iM0prTVJvd0dBWURWUVFLREJGRGIyMXZaRzhnUTBFZwpUR2x0YVhSbFpERWhNQjhHQTFVRUF3d1lRVUZCSUVObGNuUnBabWxqWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXdNREF3Ck1Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2V6RUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdVkyaGwKYzNSbGNqRVFNQTRHQTFVRUJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhJVEFmQmdOVgpCQU1NR0VGQlFTQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBTDVBbmZSdTRlcDJoeHhOUlVTT3ZrYklnd2Fkd1NyK0dCK081QUw2ODZ0ZFVJb1dNUXVhQnRERmNDTE5TUzFVWTh5MmJtaEcKQzFQcXkwd2t3THh5VHVyeEZhNzBWSm9TQ3NONnNqTmc0dHFKVmZNaVdQUGUzTS92ZzRhaWpKUlBuMmp5bUpCR2hDZkhkci9qekRVcwppMTRIWkdXQ3dFaXdxSkg1WVo5MklGQ29rY2RtdGV0NFlnTlc4SW9hRStveG94NmdtZjA0OXZZbk1saHZCL1ZydVBzVUs2KzNxc3pXClkxOXpqTm9GbWFnNHFNc1hlRFpSck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakgKWXB5K2c4Y21lejZLSmNmQTNaM21OV2dRSUoyUDJON1N3NFNjRFY3b0w4a0NBd0VBQWFPQndEQ0J2VEFkQmdOVkhRNEVGZ1FVb0JFSwpJejZXOFFmczRxOHA3NEtsZjlBd3BMUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2V3WURWUjBmCkJIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdlFVRkJRMlZ5ZEdsbWFXTmhkR1ZUWlhKMmFXTmwKY3k1amNtd3dOcUEwb0RLR01HaDBkSEE2THk5amNtd3VZMjl0YjJSdkxtNWxkQzlCUVVGRFpYSjBhV1pwWTJGMFpWTmxjblpwWTJWegpMbU55YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUNGYjhBdkNiNlArayt0Wjd4a1NBemsvRXhmWUFXTXltdHJ3VVNXZ0VkdWptCjdsM3NBZzlnMW8xUUdFOG1UZ0hqNXJDbDdyKzhkRlJCdi8zOEVyakhUMXIwaVdBRmYyQzNCVXJ6OXZIQ3Y4UzVkSWEyTFgxcnpOTHoKUnQwdnh1QnF3OE0wQXl4OWx0MWF3ZzZuQ3BuQkJZdXJEQy96WERyUGJEZFZDWWZlVTBCc1dPLzh0cXRsYmdUMkc5dzg0Rm9WeHA3Wgo4VmxJTUNGbEEyenM2U0Z6N0pzRG9lQTNyYUFWR0kvNnVnTE9weXlwRUJNczFPVUlKcXNpbDJENGtGNTAxS0thVTczeXFXamdvbTdDCjEyeXhvdytldit0bzUxYnlydkxqS3pnNkNZRzFhNFhYdmkzdFB4cTNzbVBpOVdJc2d0UnFBRUZROFRtRG41WHBOcGFZYmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXgKT0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2FHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzYKWEp4Z0Z5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUpXcHptTStZawpsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3kKbFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDFrc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dAo2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCndRNWhZSWl6UHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZy96T2gKRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVIb3ljUjdoWVFlN3hGU2t5eQpCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCkowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWQKRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVQphNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmZCbHVvcm5GZEx3VXYKWitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4MwpVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtClZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUtXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0sKK0pEU1Y2SVpVYVV0bDBIYUIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyVwpJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCldWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdEbWJBNENEL3BYdmsxQitUSlltNVgKZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSQo0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04ClZDTEFBVkJwUTU3MHN1OXQrT3phOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1QKRUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReApPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETVYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZwpEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkOGx5eUJUTnZpamJPMEJOTy83OUsKRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3Z2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didgpCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCnA1aWpKVU12Ny9GZkp1R0lUZmhlYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjgKblQ4S0tkamNUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0V0FFWApNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCkdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QTRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHoKdUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVApCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCllYUmxJR052Ym5OMGFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdWRDNHdMUVlJS3dZQgpCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEClZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEdBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTQKeXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRQpBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCnF5TTA3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtZDFvNDE3K3MKaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQrTEoydy93NEU2b00za0pwSzI3egpQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyClBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXAKOGtva1V2ZDAvYnBPNXFnZEFtNnhEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQwpialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CmcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwald5MTBRSkxaWXhrTmM5MXAKdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicgpxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUApVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3CkhoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTVXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVAKVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3Cjh5bDg5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKREthVnYwdU0KRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjlNcytrMlk3Q0k5ZU5xUFBZSmF5WAo1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTlFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkCkRKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjIKSkNoekFnTUJBQUdqUHpBOU1CMEdBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkdrbDNnCjBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmclVqOTRuSzlOcnZqVlQ4K2EKbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241QncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSgpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlVKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaCjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdFJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWkKRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClhSYW1wIEdsb2JhbCBDQSBSb290Cj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJUVVKUnM3QmpxMVp4TjFaZnZkWStnclRBTkJna3Foa2lHOXcwQkFRVUZBRENCZ2pFTE1Ba0dBMVVFCkJoTUNWVk14SGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmoKZFhKcGRIa2dVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQgpkWFJvYjNKcGRIa3dIaGNOTURReE1UQXhNVGN4TkRBMFdoY05NelV3TVRBeE1EVXpOekU1V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14CkhqQWNCZ05WQkFzVEZYZDNkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2cKVTJWeWRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UllVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcApkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1lKQjY5RmJTNjM4ZU1wU2UyT0F0cDg3Wk9xQ3d1CklSMWNSTjhoWFg0amRQNWVmclJLdDZhdEg2N2dCaGJpbTF2WlozUnJYWUNQS1oyR0c5bWNEWmh0ZGhBb1dPUmxzSDlLbUhtZjRNTXgKZm9BcnRZekFRRHNSaHRETG9vWTJZS1RWTUlKdDJXN1FEeElFTTVkZlQyRmE4T1Q1a2F2bkhUdTg2TS8wYXkwMGZPSklZUnlPODJGRQp6RytnU3FtVXNFM2E1NmswZW5JNHFFSE1QSlFSZmV2SXBveTNoc3ZLTXp2WlBUZUwrM28raGl6bmM5Y0tWNnhrbXhucjlBOEVDSXFzCkF4Y1paUFJhSlNLTk5DeXk5bWdkRW0zVGloNFUyc1NQcHVJamhkVjZEYjFxNE9uczdCZTdRaHRucWlYdFJZTWgvTUhKZk5WaVB2cnkKeFMzVC9kUmxBZ01CQUFHamdaOHdnWnd3RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1aUG9qMEdZNFFKbk01aTVBU3NqVnkxNmJZYk1EWUdBMVVkSHdRdk1DMHdLNkFwCm9DZUdKV2gwZEhBNkx5OWpjbXd1ZUhKaGJYQnpaV04xY21sMGVTNWpiMjB2V0VkRFFTNWpjbXd3RUFZSkt3WUJCQUdDTnhVQkJBTUMKQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFKRVZPUU1CRzJmN1NoejVDbUJib2RwTmwyTDVKRk1uMTRKa1RwQXV3MGtiSzVyYwovS2g0WnpYeEhmQVJ2YmRJNHhEMkRkOC8wc20ycWxXa1NMb0MyOTVaTGhWYk81MFdmVWZYTitwZlRYWVNOcnNmMTZHQkJFWWdveXh0CnFaNEJmajhwemdDVDMvM0prbk9KaVdTZTV5dmtISkVzMHJuT2ZjNXZNWm5UNXI3U0hwRHdDUlI1WENPclRkTGFJUjlObVhtZDRjOG4KbnhDYkhJZ05zSXBrUVRHNERteVFKS1NiWEhHUHVydCtIQnZiYW9BUElienAyNmEzUVBTeWk2bXg1TythR3RBOWFabnVxQ2lqNFR5ego4TElSbk05OFFPYmQ1ME45b3RnNnRhbU44alNaeE5RUTRRYjlDWVFRTys3RVRQVHNKM3hDd25SOGdvb0p5YlFESmJ3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbyBEYWRkeSBDbGFzcyAyIENBCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBRENDQXVpZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVkKVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRVlXUmtlU0JEYkdGemN5QXlJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBME1EWXlPVEUzTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHCkExVUVCaE1DVlZNeElUQWZCZ05WQkFvVEdGUm9aU0JIYnlCRVlXUmtlU0JIY205MWNDd2dTVzVqTGpFeE1DOEdBMVVFQ3hNb1IyOGcKUkdGa1pIa2dRMnhoYzNNZ01pQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTQXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0VOQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQVBWWVlZd2h2CjJ2TE0wRDkvQWxRaVZCRFlzb0hVd0hVOVMzL0hkOE0rZUtzYUE3VWdheTlxSzdIRmlIN0V1eDZ3d2RoRkoyK3FOMWozaHliWDJDMzIKcVJlM0gzSTJUcVlYUDJXWWt0c3FibDJpL29qZ0M5NS81WTBWNGV2TE90WGlFcUlUTGRpT3IxOFNQYUFJQlFpMlhLVmxPQVJGbVI2agpZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWWF2eDRBNmxOZjRERCtxdGEvS0ZBcE1vWkZ2Nnl5TzllY3czdWQ3MmE5bm1ZCnZMRUhaNklWRGQyZ1dNWkVld28rWWloZnVrRUhVMWpQRVg0NGRNWDQvN1Zwa0krRWRPcVhHNjhDQVFPamdjQXdnYjB3SFFZRFZSME8KQkJZRUZOTEVzTktSMUV3UmNiTmh5ejJoL3Qyb2F0VGpNSUdOQmdOVkhTTUVnWVV3Z1lLQUZOTEVzTktSMUV3UmNiTmh5ejJoL3QybwphdFRqb1dla1pUQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjVJRWR5YjNWd0xDQkpibU11Ck1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0cKQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFESkw4N0xLUHBIOEVzYWhCNHlPZDZBekJoUmNrQjRZOXdpbQpQUW9aK1llQUVXNXA1SllYTVA4MGtXTnlPTzdNSEFHakhaUW9wREgyZXNSVTEvYmxNVmdEb3N6T1l0dVVSWE8xdjBYSkpMWFZnZ0t0CkkzbHBqYmkyVGM3UFRNb3pJK2djaUtxZGkwRnVGc2tnNVltZXpUdmFjUGQrbVNZZ0ZGUWxxMjV6aGVhYklaMEtiSUlPcVBqQ0RQb1EKSG15Vzc0Y054QTloaTYzdWd5dVYrSTZTaEhJNTZ5RHFnKzJEelpkdUNMenJUaWEyY3l2azAvWk0vaVp4NG1FUmRFci9WeHFIRDNWSQpMczlSYVJlZ0FoSmhsZFhSUUxJUVRPN0VyQkJEcHFXZUN0V1ZZcG9OejRpQ3hUSU01Q3VmUmVZTm55aWNzYmtxV2xldE53K3ZIWC9iCnZaOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIENsYXNzIDIgQ0EKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVEekNDQXZlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJvTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRUNoTWMKVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcFUzUmhjbVpwWld4a0lFTnNZWE56SURJZwpRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF3TmpJNU1UY3pPVEUyV2hjTk16UXdOakk1TVRjek9URTJXakJvCk1Rc3dDUVlEVlFRR0V3SlZVekVsTUNNR0ExVUVDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUcKQTFVRUN4TXBVM1JoY21acFpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWdNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRFFBd2dnRUlBb0lCQVFDM01zais2WEdtQklXdERCRmszODVONzhnREdJYy9vYXY3UEthZjhNT2gydFRZCmJpdFRrUHNrcEQ2RThKN29YK3psSjBUMUtLWS9lOTdnS3ZESXIxTXZuc29GQVpNZWoyWWNPYWROK2xxMmN3UWxadXQzZitkWnhrcVoKSlJSVTZ5Ykg4MzhaMVRCd2o2K3dSaXIvcmVzcDdkZWZxZ1NIbzlUNWlhVTBYOXREa1lJMjJXWThzYmk1Z3YyY09qNFF5RHZ2Qm1WbQplcHNaR0QzL2NWRThNQzVmdmoxM2M3SmRCbXpESTFhYUs0VW1raHluQXJQa1B3MnZDSG1DdURZOTZwelROYk84YWNyMXpKM28vV1NOCkY0QXpibDVLWFpuSkhvZTBuUnJBMVc0VE5TTmUzNXRmUGUvVzkzYkM2ajY3ZUEwY1FtZHJCTmo0MXRwdmkvSkVvQUdyQWdFRG80SEYKTUlIQ01CMEdBMVVkRGdRV0JCUy9YN2ZSenQwZmh2UmJWYXpjMXhEQ0RxbUk1ekNCa2dZRFZSMGpCSUdLTUlHSGdCUy9YN2ZSenQwZgpodlJiVmF6YzF4RENEcW1JNTZGc3BHb3dhREVMTUFrR0ExVUVCaE1DVlZNeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vCmJtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQXNUS1ZOMFlYSm1hV1ZzWkNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGcKUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUFXZFA0aWQwY2thVmFHcwphZlB6V2RxYkFZY2FUMWVwb1hrSkt0djNMN0llek1kZWF0aURoNkdYNzBrMVBuY0dRVmhpdjQ1WXVBcG5QK3l6M1NGbUg4bFUrbkxNClBVeEEySUd2ZDU2RGVydWl4L1UwRjQ3WkVVRDAvQ3dxVFJWL3AySmRMaVhUQUFzZ0doMW8rUmU0OUwyTDdTaFozVTBXaXhlRHlMSmwKeHkxNnBhcThVNFp0M1Zla3l2Z2dRUXRvOFBUN2RMNVdYWHA1OWZrZGhlTXRsYjcxY1pCRHpJMGZtZ0FLaHlucFZTSllBQ1BxNHhKRApLVnRIQ04yTVFXcGxCcWpsSWFwQnRKVWhsYmw5MFRTckU5YXR2TnppUFRuTnZUNTFjS0VZV1FQSklyU1BuTlZlS3RlbHR0UUtiZmkzClFCRkdtaDk1RG1LL0Q1ZnM0QzhmRjVRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdHpDQ0FwK2dBd0lCQWdJUURPZmc1UmZZUnY2UDVXRDhHL0F3T1RBTkJna3Foa2lHOXcwQkFRVUZBREJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXcKSWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdRMEV3SGhjTk1EWXhNVEV3TURBd01EQXdXaGNOTXpFeApNVEV3TURBd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMCkV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXcKZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3REaFhPNUVPQVhMR0g4N2RnK1hFU3BhN2NKcFNJcXZUTwo5U0E1S0ZoZ0RQaUEycWtWbFRKaFBMV3hLSVNLaXR5ZkNneURGM3FQa0t5SzUzbFRYREdFS3ZZUG1ESTJkc3plM1R5b291OXEreUh5ClVtSGZueURYSCtLeDJmNFlaTklTVzEvNVdCZzF2RWZOb1RiNWEzL1VzRGcrd1J2RGpEUFoyQzhZL2lnUHM2ZUQxc051Uk1CaE5aWVcKL2xtY2kzWnQxL0dpU3cwci93dHkycDVnMEk2UU5jWjRWWWNnb2MvbGJRcklTWHd4bUROc0l1bUgwREphb3JvVGdoSHRPUmVkbVRweQpvZWI2cE5uVkZ6RjFyb1Y5SXE0L0FVYUc5aWg1eUxIYTVGY1h4SDRjRHJDMGtxWldzNzJ5bCsycXAvQzN4YWcvbFJiUS82R1c2d2hmCkdIZFBBZ01CQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUkYKNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBZkJnTlZIU01FR0RBV2dCUkY2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQW9nNjgzK0x0OE9OeWMzcGtsTC8zY21iWU11UkNkV0t1aCt2eTFkbmVWck9mek00VUtMa05sMkJjCkVreFk1Tk05ZzBsRldKYzFhUnFvUitwV3hubXJFdGhuZ1lUZmZ3azhsT2E0Sml3Z3ZUMnpLSW4zWC84aTRwZUVIK2xsNzRmZzM4Rm4KU2JOZDY3SUpLdXNtN1hpK2ZUOHI4N2NtTlcxZmlRRzJTVnVmQVFXYnF6MGx3Y3kyZjhMeGI0YkcrbVJvNjRFdGxPdEN0L3FNSHQxaQo4YjVRWjdkc3ZmUHhIMnNNTmdjV2Z6ZDhxVnR0ZXZFU1JtQ0QxeWNFdmt2T2w3N0RaeXBvRWQrQTV3d3pacjhURFJSdTgzOGZZeEFlCitvMGJKVzFzajZXM1lRR3gwcU1tb1JCeG5hM2l3L25EbVZHM0t3Y0l6aTdtVUxLbitncEZMNkx3OGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHJ6Q0NBcGVnQXdJQkFnSVFDRHZnVnBCQ1JyR2hkV3JKV1pISFNqQU5CZ2txaGtpRzl3MEJBUVVGQURCaE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3CkhnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkRRVEFlRncwd05qRXhNVEF3TURBd01EQmFGdzB6TVRFeE1UQXcKTURBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkMwpkeTVrYVdkcFkyVnlkQzVqYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRU5CTUlJQklqQU5CZ2txCmhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNGp2aEVYTGVxS1RUbzFlcVVLS1BDM2VReWFLbDdoTE9sbHNCQ1NETUFaT24KVGpDM1UvZER4R2tBVjUzaWpTTGRod1pBQUlFSnpzNGJnNy9melR0eFJ1TFdac2NGczNZbkZvOTduaDZWZmU2M1NLTUkydGF2ZWd3NQpCbVYvU2wwZnZCZjRxNzd1S05kMGYzcDRtVm1GYUc1Y0l6Skx2MDdBNkZwdDQzQy9keEMvL0FIMmhkbW9SQkJZTXFsMUdOWFJvcjVICjRpZHE5Sm96K0VrSVlJdlVYN1E2aEwraHFrcE1mVDdQVDE5c2RsNmdTemVSbnR3aTVtM09GQnFPYXN2K3piTVVaQmZIV3ltZU1yL3kKN3ZyVEMwTFVxN2RCTXRvTTFPLzRnZFc3alZnL3RSdm9TU2lpY05veEJOMzNzaGJ5VEFwT0I2anRTajFldFgramtNT3ZKd0lEQVFBQgpvMk13WVRBT0JnTlZIUThCQWY4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTk1UU5WYlJUTHRtCjhLUGlHeHZEbDdJOTBWVXdId1lEVlIwakJCZ3dGb0FVQTk1UU5WYlJUTHRtOEtQaUd4dkRsN0k5MFZVd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnRUJBTXVjTjZwSUV4SUsrdDFFbkU5U3NQVGZyZ1QxZVhrSW95UVkvRXNyaE1BdHVkWEgvdlRCSDFqTHVHMmNlblRubUNtcgpFYlhqY0tDaHpVeUltWk9Na1hEaXF3OGN2cE9wLzJQVjVBZGcwNk8vblZzSjhkV080MVAwam1QNlA2ZmJ0R2JmWW1iVzBXNUJqZkl0CnRlcDNTcCtkV09JcldjQkFJKzB0S0lKRlBubFVraWFZNElCSXFEZnY4Tlo1WUJiZXJPZ096VzZzUkJjNEwwbmE0VVUrS3JrMlU4ODYKVUFiM0x1akVWMGxzWVNFWTFRU3RlRHdzT29CcnArdXZGUlRwMkluQnVUaHM0cEZzaXY5a3VYY2xWekRBR3lTajRkenAzMGQ4dGJRawpDQVV3N0MyOUM3OUZ2MUM1cWZQcm1BRVNyY2lJeHBnMFg0MEtQTWJwMVpXVmJkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJUUFxeGNKbW9MUUp1UEMzbnlya1lsZHpBTkJna3Foa2lHOXcwQkFRVUZBREJzTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1Tc3cKS1FZRFZRUURFeUpFYVdkcFEyVnlkQ0JJYVdkb0lFRnpjM1Z5WVc1alpTQkZWaUJTYjI5MElFTkJNQjRYRFRBMk1URXhNREF3TURBdwpNRm9YRFRNeE1URXhNREF3TURBd01Gb3diREVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERFUnBaMmxEWlhKMElFbHVZekVaCk1CY0dBMVVFQ3hNUWQzZDNMbVJwWjJsalpYSjBMbU52YlRFck1Da0dBMVVFQXhNaVJHbG5hVU5sY25RZ1NHbG5hQ0JCYzNOMWNtRnUKWTJVZ1JWWWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1iTTVYUG0rOVM3NVMwdApNcWJmNVlFL3ljMGxTYlp4S3NQVmxEUm5vZ29jc0Y5cHBrQ3h4TGV5ajlDWXBLbEJXVHJUM0pUV1BOdDBPS1JLekUwbGd2ZEtwVk1TCk9PN3pTVzF4a1g1anRxdW1YOE9raFBoUFlsRysrTVhzMnppUzR3YmxDSkVNeENoQlZmdkxXb2tWZm5Ib05iOU5jZ2s5dmpvNFVGdDMKTVJ1TnM4Y2tSWnFuckcwQUZGb0V0N29UNjFFS21FRkJJazVsWVllQlFWQ21lVnlKM2hsS1Y5VXU1bDBjVXl4K21NMGFCaGFrYUhQUQpOQVFUWEtGeDAxcDhWZHRlWk9FM2h6QldCT1VSdENtQUV2RjVPWWlpQWhGOEoyYTNpTGQ0OHNvS3FEaXJDbVRDdjJaZGxZVEJvU1VlCmgxMGFVQXNnRXN4QnUyNExVVGk0UzhzQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0hRWURWUjBPQkJZRUZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQjhHQTFVZEl3UVlNQmFBRkxFK3cya0QrTDlIQWRTWQpKaG9JQXU5alpDdkRNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFjR2dhWDNOZWNuenlJWmdZSVZ5SGJJVWY0S21lcXZ4Z3lka0FRClY4R0s4M3JaRVdXT05mcWUvRVcxbnRsTU1VdTRrZWhETEk2emVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnAKbXlQSW5uZ2lLM0JENDFWSE1XRVo3MWpGaFM5T01QYWdNUllqeU9maVpSWXp5NzhhRzZBOStNcGVpekdMWUFpSkxRd0dYRkszeFBrSwptTkVWWDU4U3ZudzJZemk5UktSLzVDWXJDc1NYYVEzcGpPTEFFRmU0eUhZU2tWWHlTR25ZdkNvQ1d3OUUxQ0F4Mi9TNmNDWmRrR0NlCnZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXArT2t1RTZOMzZCOUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3dpc3NTaWduIEdvbGQgQ0EgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdWpDQ0E2S2dBd0lCQWdJSkFMdEFIRVAxWGsrd01BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WQkFZVEFrTklNUlV3CkV3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG5iaUJIYjJ4a0lFTkJJQzBnUnpJd0hoY04KTURZeE1ESTFNRGd6TURNMVdoY05Nell4TURJMU1EZ3pNRE0xV2pCRk1Rc3dDUVlEVlFRR0V3SkRTREVWTUJNR0ExVUVDaE1NVTNkcApjM05UYVdkdUlFRkhNUjh3SFFZRFZRUURFeFpUZDJsemMxTnBaMjRnUjI5c1pDQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXIrVHVmb3NrRGhKdXFWQXRGa1E3a3BKY3lyaGRoSkpDRXlxOFpWZUNRRDVYSk0xUWl5VXEKdDIvODc2TFF3QjhDSkVvVGxvOGpFK1lvV0FDalI4Y0dwNFFqSzd1OWxpdC9WY3lMd1ZjZkRtSmxEOTA5Vm9wejJxNStiYnFCSEg1QwpqQ0ExMlVOTmhQcUUyMUlzOHc0bmR3dHJ2eEV2Y25pZkx0Zys1aGczV2lweStkcGlrSktWeWgrYzZiTThLOHZ6QVJPL1dzL0J0UXBnCnZkMjFtV1JUdUtDV3MyL2lKbmVSak9CaUVBS2ZOQStrMVpJelVkNitqYnFFZW1BOGF0dWZLK3plM2dFL2JrM2xVSWJMdEsvdFJFREYKeWxxTTJ0SXJmS2p1dnFibENxb09wZDhGVXJkVnh5SmRNbXFYbDJNVDI4bmJlVFo3aFRwS3hWS0orU1RublhlcGd2OVZIS1Z4YVN2UgpBaVR5c3liVWE5b0VWZVhCQ3NkdE1EZVFLdVNlRkROZUZoZFZ4VnUxeXpTSmt2R2RKbytoQjlUR3NuaFEyd3dNQzN3TGpFSFh1ZW5kCmpJajNvMDJ5TXN6WUY5ck50ODVtbmRUOVh2KzlsejRwZGVkK3AySllyeVUwcFVISFBid05VTW9EQXc4SVdoK1ZjM2hpdjY5eUZHa08KcGVVRERuaU9KaWhDOEFjTFlpQVFaemxHK3FrRHpBUTRlbWJ2SUlPMWpFcFdqcEVBL0k1Y2d0NklvTVBpYUc1OWplODgzV1gwWGF4Ugo3eVNBcnFwV2wyLzVyWDNhWVQrWWR6eWxrYlljakNiYVphSUpiY0hpVk9PNXlreE1nSTkzZTJDYUh0KzI4a2dlRHJwT1ZHMlk0T0dpCkdxSjNVTS9FWTVMc1J4bWQ2K1pyenNFQ0F3RUFBYU9CckRDQnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QWRCZ05WSFE0RUZnUVVXeVY3bHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3SHdZRFZSMGpCQmd3Rm9BVVd5VjdscVJsVVg2NApPZlBBZUdaZTZEcm44TzR3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFQ0FRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjBjRG92CkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTY0NVI4OGE3QTNoZm0KNWRqVjlWU3dnL1M3elY0RmUwK2ZkV2F2UE9oV2Z2eHllRGdEMlN0aUd3QzUrT2xnemN6T1VZckhVREZ1NFVwK0dDOXBXYlk5WklFcgo0NE9FNWlLSGpuM2c3Z0taWWJnZTlMZ3JpQklXaE1JeGt6aVdNYWE1TzFNL3d5U1RWbHRwa3V6RndiczRBT1BzRjZtNDNNZDhBWU9mCk1rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0Nid3E3RXNpSFN5Y1IrUjR0eDVNL250dGZKbXRTMlM2SzhSVEdSSTBWcWJlL3ZkNm0KR3U2dUxmdElkeGYrdSt5dkdQVXFVZkE1aEplVmJHNGJ3eXZFZEdCNUpiQUtKOS9mWHRJNXowVjlRa3Zmc3l3ZXhjWmR5bFU2b0p4cAptby9hNzdLd1BKK0hiQklyWlhBVlVqRWFKTTl2TVNOUUg0eFBqeVBEZEVGakhGV29GTjArNEZGUXovRWJNRllPa3JDQ2hkaUR5eUprCnZDMjRKZFZVb3JnRzZxMlNwQ1Nnd1lhMVNoTnFSODh1QzFhVlZNdk9tdHRxdEtheTIwRUloaWQzOTJxZ1Ftd0xPTTdYZFZBeWtzTGYKS3pBaVNORFZRVGdsWGFUcFhaL0dsSFhRUmYwd2wwT1BrS3NLeDRaellFcHBMZDZsZU5jRzJtcWVTejUzT2lBVElnSFF2MmllWTJCcgpOVTBMYmJxaFBjQ1Q0SDhqczFXdGNpVk9Sdm5TRnUrd1pNRUJudW5Lb0dxWURzL1lZUEl2U2Jqa1F1RTROUmIweUc1UDk0Rlc2THFqCnZpT3ZydjF2QStBQ096QjIraHR0UWM4QnNlbTR5V2IwMnliek9xUjA4a2trVzhtdzBGZkIrajU2NFpmSgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTd2lzc1NpZ24gU2lsdmVyIENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdlRDQ0E2V2dBd0lCQWdJSVR4dlVMMVM3TDBzd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFQmhNQ1EwZ3hGVEFUCkJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVlVM2RwYzNOVGFXZHVJRk5wYkhabGNpQkRRU0F0SUVjeU1CNFgKRFRBMk1UQXlOVEE0TXpJME5sb1hEVE0yTVRBeU5UQTRNekkwTmxvd1J6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVEJnTlZCQW9UREZOMwphWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF4UEdIZjlONE1mYzR5ZmpEbVVPOHgvZThOK2RPY2JwTGo2VnpIVnh1bUs0RFY2NDQKTjBNdkZ6MGZ5TTVvRU1GNHJoa0RLeEQ2TEhtRDl1aTVhTGxWOGdSRXB6bjUvQVNMSHZHaVRTZjVZWHU2dCtXaUU3YnJZVDdRYk5IbQorL3BlN1IyMG5xQTFXNkdTeS9CSmt2NkZDZ1UrNXRrTDRrKzczSlUzL0pIcE1qVWkwUjg2VGllRm5iQVZsRExhWVExSFRXQkNycEpICjZJTmFVRmpwaW91NVhhSGMzWmxLSHpabnUwamtnN1kzNjBnNnJ3OW5qeGNINkFUSzcyb3hoOVRBdHZtVWNYdG5aTGkya1VwQ2UyVXUKTUdvTTlaRHVsZWJ5ellMczJhRks3UGF5UytWRmhlWnRlSk1FTHB5Q2JUYXB4REZrSDRhREN5cjBOUXA0eVZYUFFiQkg2VENmbWI1aApxQWFFdVNoNlh6alpHNms0c0lOL2M4SERPMGdxZ2c4aG03ak1xRFhEaEJ1RHN6NitwSlZwQVRxSkFIZ0UyY24wbVJtclZuNWJpNFk1CkZaR2tFQ3dKTW9CZ3M1UEFLcllZQzUxK2pVbnlFRXAvK2RWR0x4bVNvNW1uSnF5N2pEem1EcnhIQjl4elVmRndaQzhJK2JSSEhUQnMKUk9vcE40V1NhR2E4Z3pqK2V6a3UwMUR3SC90ZVlMYXBwdm9uUWZHYkdITHk5WVIwU3NsbnhGU3VTR1Rmak5GdXNCM2hCNDhJSHBtYwpjZWxNMktYM1J4SWZkTkZSbm9iendxSWpRQXR6MjB1bTUzTUdqTUdnNmNGWnJFYjY1aS80ejNHY1JtMjV4QldOT0hrRFJVanZ4RjNYCkNPNkhPU0tHc2cwUFdFUDNjYWxJTHYzcTFoOENBd0VBQWFPQnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVRjZETndlUkJ0anBiTzh0Rm5iMGN3cGo2aGxnd0h3WURWUjBqQkJnd0ZvQVVGNkROd2VSQgp0anBiTzh0Rm5iMGN3cGo2aGxnd1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRURBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwCmNEb3ZMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSFBHZ2VBbjBpMFAKNEpVdzRwcEJmMUFzWDE5aVlhbUdhbWtZREhSSjFsMkU2a0ZTR0c5WXJWQldJR3JHdlNocFdKSGNrUkUxcVRvZHZCcWxZSjdZSDM5RgprV25aZnJ0NGNzRUdEeXJPajRWd1lheWd6UXU0T1NsV2hESk9ocnM5eENyWjF4OXk3djVSb1NKQnNYRUNZeHFDc0dLclhsY1NIOS9MCjNYV2d3RjE1a0l3YjRGRG0zakgrbUh0d1g2V1EySzM0QXJadjAyRGRRRXNpeFQydE9ucWZHaHBIa1hrenVvTGNNbWtEbG00ZlMvQngKL3VObmNxQ3h2MXlMNVBxWklzZUV1UnVOSTVjLzdTWGd6Mlc3OVdFRTc5MGVzbHBCSWxxaG4xMHM2RnZKYmFrTURIaXFZTVpXandGYQpER2k4YVJsNXhCOStsd1cveGVra1VWN1UxVXRUN2RraldqWURaYVBCQTYxQk1QTkdHNFdRcjJXMTFiSGtGbHQ0ZFIyWGVtMVpxU3FQCmU5N0RoNGtRbVVsemVNZzl2VkUxZENyVjhYNXBHeXE3TzcwbHVKcGFQWEpoa0dhSDdneldUZFFSZEF0cS9nc0QvS05WVjRuK1NzdXUKV3hjRnlQS05JekZUT05JdGFqK0N1WTBJYXZkZVFYUnV3eEYrQjZ3cFlKRS9PTXBYRUEyOU1DL0hwZVpCb05xdUJZZWFvS1JsYkV3SgpESW02dU5PNXdKT0tNUHFONVpwckZRRk9aNnJhWWxZK2hBaG0wc1EyZmFjK0VQeUk0TlNBNVFDOXF2Tk9CcU42YXZsaWN1TUpUK3ViCkRnRWo4Wis3Zk56Y2JCR1hKYkx5dEdNVTBnWXFaNHlEOWM3cUI5aWFhaDdzNUFxN0trenJDV0E1enNwaTJDNXUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlVHJ1c3QgQ0EKPT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQklNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeQpkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6TVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlCkJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnZjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWApPWkV6WnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTzBnTWRBKzl0CkRXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvd1c4eFFteFNQbWpMOHhrMDM3dUgKR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2o3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYgowMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUzhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1ICnVyc0NBd0VBQWFPQm5UQ0JtakFUQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnSllZagphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0MzZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3UKU2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZgptYng4SVZRcjVGaWl1MWNwcnA2cG94a21ENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2ZaCm5NVUZkQXZuWnlQU0NQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZSBHbG9iYWwgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JICmJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3hNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWcKTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3ZwpRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4CllEaUppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhL0ZIdGFNYlEKYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0pqbklGSG92ZFJJV0NRdEJKd0IxZwo4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSUhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWCkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3c0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkKMFhQbmozcERBZ01CQUFHamdaMHdnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3dLYUFuCm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzR0FRUUJnamNWQVFRREFnRUEKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2KwpPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE9IMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuCkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbUk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUKM0NZTnY2WkhkQWJZaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxCmRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXdNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQk1TUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRApUMDFQUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzVWNFYlZBU1kwNm0vd2VhS1hUdUgKKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3dwp4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOFE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWCjRFYWpjTnhvMmY4RVNJbDMzclhwKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0EKMUtHenFTWCtEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPbktWSQpyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWsKYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1UVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVlTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQCk9HRUlxQjZCQ3NBdklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNHpKVlNrL0J3SlZtYwpJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOCis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUJaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTE1Ba0dBMVVFQmhNQwpSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCkNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeApHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm8KYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1JGdFNyWXBuMVBsSUxCczVCQUgrWAo0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pCnd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWRwpGQWtLK3FEbWZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHZHRGVBClUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aWduYQo9PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHFEQ0NBcENnQXdJQkFnSUpBUDdjNHdFUHlVai9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1EUXhDekFKQmdOVkJBWVRBa1pTTVJJdwpFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhNQjRYRFRBM01EWXlPVEUxTVRNd05Wb1hEVEkzCk1EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVUm9hVzE1YjNScGN6RVJNQThHQTFVRUF3d0kKUTJWeWRHbG5ibUV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElhUEhKMXRhek5IVW1naDdzdEw3cQpYT0VtN1JGSFllR2lmQlo0UUNIa1lKNWF5R1BoeExHV2t2OFliV2tqNFN0aTk5M2lOaStSQjdsSXp3N3NlYllzNXpSTGNBZ2xvenlICkd4bnlnUWNQT0pBWjB4SCtoclR5MFY0ZUhwYk5nR3pPT3pHVHR2S2cwS21WRW4ybG1zeHJ5SVJXaWpPcDV5SVZVeGJ3ekJmc1YxL3AKb2dxWUNkN2pYNXh2M0VqamhRc1ZXcWE2bjZ4STR3bXk5L1F5M2w0MHZoeDRYVUpiemc0aWowMlExMzB5R0xNTExHcS9qajhVRVlrZwpEbmNVdFQyVUNJZjNKUjdWc21BQTdHOHFLQ1Z1S2o0WVl4Y2xQejVFSUJiMkpzZ2xyZ1ZLdE9kakxQT01GbE4rWFBzUkdnakJSbUtmCklyanh3bzFwM1BvNldBYmZBZ01CQUFHamdid3dnYmt3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVR3UzK1FUbVEKdENSWnZnSHlVdFZGOWxvNTNCRXdaQVlEVlIwakJGMHdXNEFVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JHaE9LUTJNRFF4Q3pBSgpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoZ2drQS90empBUS9KClNQOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKaFFNZWtuSDJRcS9obzJHZTYvUEFEL0tsMU5xVjV0YSthRFk5Zm00ZlRJcnYwUThoYlY2bFVtUE9Fdmp2S3RwdjZ6ZitFd0xIeXpzKwpJbXZhWVM1LzFISTkzVERoSGt4QUdZd1AxNXpSZ3pCN21GbmNmY2E1RENsTW9UT2k2MmM2WllUVGx1THRka1Z3ajdVcjN2a2oxa2x1ClBCUzF4cDgxSGxEUXdZOXFjRVFDWXN1dUhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkKMWdrSWwyUGx3UzZ3dDBRbXdDYkFyMVV3bmp2Vk5pb1pCUFJjSHYvUExMZi8wUDJIUUJIVkVTTzdTTUFocWFRb0xmMFYrTEJPSy9RdwpXeUg4RVpFMHZrSHZlNTJYZGYrWGxjQ1dXQy9xdTBiWHUrVFpMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZzRENDQTVpZ0F3SUJBZ0lRRmNpOVpVZGNyN2lYQUY3a0J0SzhuVEFOQmdrcWhraUc5dzBCQVFVRkFEQmVNUXN3Q1FZRFZRUUcKRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MFpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZwpVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05ERXlNakF3TWpNeE1qZGFGdzB6TkRFeU1qQXdNak14Ck1qZGFNRjR4Q3pBSkJnTlZCQVlUQWxSWE1TTXdJUVlEVlFRS0RCcERhSFZ1WjJoM1lTQlVaV3hsWTI5dElFTnZMaXdnVEhSa0xqRXEKTUNnR0ExVUVDd3doWlZCTFNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0U1VQN28zYmlETjFaODJ0SDMwNlRtMmQweThVODJOMHl3RWhhamZxaEZBSFN5WmJDVU5zCklaNXF5TlVEOVdCcGo4endJdVFmNS9kcUlqRzNMQlh5NFA0QWFrUC9oMlhHdFJyQnAweHRJbkFoaWpIeWwzU0pDUkltSEo3SzJSS2kKbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1hEWm9UTTFQUllmbDYxZGQ0czVvejl3Q0d6aDFObERpdgpxT3g0VVhDS1hCQ0RVU0gzRVQwMGhsN2xTTTJYZ1lJMVRCbnNaZlpyeFFXaDdrY1Qxck1oSjVRUUN0a2tPN3ErUkJOR01EK1hQTmpYCjEycnVPempqSzlTWERya2I1d2RKZnpjcStYZDR6MVR0VzBhZG80QU9rVVBCMWx0ZkZMcWZwbzBrUjBCWnYzSTRzalpzTi8rWjBWME8KV1FxcmFmZkFzZ1JGZWxRQXJyNVQ5clhuNGZnOG96SFNxZjRoVW1URnBtZndkUWNHbEJTQlZjWW41QUdQRjhGcWNkZStTL3VVV0gxKwpFVE94UXZkaWJCald6d2xvUG45czloNlBZcTJsWTlzSnB4OGlRa0VlYjVtS1B0ZjVQMEI2ZWJDbEFaTFNuVDBJRmFVUUFTMnpNbmFvCmxRMnplcHI3QnhCNEVXL2hqOGU2RHlVYWRDcmxISmhCbWQ4aGgraVZCbW9LczJwSGRtWDJPcytQWWhjWmV3b296UnJTZ3g0aHh5eS8KdnY5aGFMZG5HN3Q0VFkzT1orWGt3WTYzSTJiaW5aQjFOSmlwTml1S21wUzVuZXpNaXJINEpZbGNXcll2akI5dGVTU25VbWpEaERYaQpabzFqRGlWTjFSbXk1bmszcHlLZFZERUNBd0VBQWFOcU1HZ3dIUVlEVlIwT0JCWUVGQjRNOTdabjh1R1NKZ2xGd0ZVNUxuYy9Ra3FpCk1Bd0dBMVVkRXdRRk1BTUJBZjh3T1FZRVp5b0hBQVF4TUM4d0xRSUJBREFKQmdVckRnTUNHZ1VBTUFjR0JXY3FBd0FBQkJSRnNNTEgKQ2xaODdsdDRESlg1R0ZQQnBoellFREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBQ2JPRFUxa0JQcFZKdWZHQnV2bDJJQ08xSjJCMAoxR3FaTkY1c0FGUFpuL0ttc1NRSFJHb3F4cVdPZUJMb1I5bFlHeE1xWG5tYm53b3FaNllsUHdacFZuUERpbVpJK3ltQlYzUUd5cHpxCktPZzRaeVlyOGRXMVAyV1QrRFpkam8yTlFDQ0hHZXJ2SjhBOXREa1BKWHRvVUhSVm5BeFpmVm85UVpRbFVnamdSeXdWTVJuVnZ3ZFYKeHJzU3RaZjBYNE9GdW5IQjJXeUJFWFlLQ3JDL2dwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUApOWHVicmpscEMySmdRQ0EyajYvN051NHRDRW9kdUwrYlhQanFwUnVnYzZiWStHN2dNd1JmYUtvbmgrM1p3WkNjN2IzamFqV3ZZOStyCkdObTY1dWxLNmxDS0QyR1RIdUl0R2VJd2xEV1NYUTYyQjY4WmdJOUhrRkZMTGszZGhlTFNDbElLRjVyOEdyQlFBdVVCbzJNM0lVeEUKeEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMvalE2ZmJqcEtkeDJxY2d3K0JSeApnTVllTmtoMElrRmNoNExvR0hHTFFZbEU1MzVZVzZpNGpSUHBwMnpEUisyekdwMWlybzJDNnBTZTNWa1F3NjNkNGszak1kWEg3T2p5CnNQNlNIaFlLR3Z6WjgvZ250c20rSGJSc1pKQi85T1RFVzljM3JrSU8zYVFhYjN5SVZNVVdidUY2YUM3NE9yOE5wRHlKTzNpblRtT0QKQkNFSVo0M3lna25RVy8yeHpRK0RoTlErSUlYM1NqMHJuUDBxQ2dsTjZvSDRFWnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmNlcnRTSUdOIFJPT1QgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE9EQ0NBaUNnQXdJQkFnSUdJQVlGRm5BQ01BMEdDU3FHU0liM0RRRUJCUVVBTURzeEN6QUpCZ05WQkFZVEFsSlBNUkV3RHdZRApWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRBZUZ3MHdOakEzTURReE56SXdNRFJhCkZ3MHpNVEEzTURReE56SXdNRFJhTURzeEN6QUpCZ05WQkFZVEFsSlBNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUUKQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SQpKVXFPdGR1MEtCdXFWNURvMFNMVFpMclRrK2pVcklaaFFHcGdWMmhVaEUyOGFsUUNCZi9mbTVvcXJsMEhqMHJES0gvdit5djZlZkhICnJmQVFVeVNRaTJiSnFJaXJyMXFqQU9tK3VrYnVXM043TEJlQ2dWNWlMS0VDWmJPOXhTc0Fmc1Q4QXpOWERlM2krczVkUmRZNHpUVzIKc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1FPQTcrajB4Ym0wYnFRZld3Q0hURAowSWd6dG56WGROL2NoTkZERG5VNW9TVkFLT3A0eXc0c0xqbWRqSXR1Rmh3dkpvSVE0dU5sbEFvRXdGNzNYVnY0RU9MUXVucEwrOTQzCkFBQWFXeWpqMHB4elBqS0htS0hKVVMvWDNxd3pzMDhDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEIKQWY4RUJBTUNBY1l3SFFZRFZSME9CQllFRk9DTW05c2xTYlB4ZkliV3NrS0hDOUJyb05ua01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQgpBUUErMGh5SkxqWDgrSFhkNW45bGlQUnlUTWtzMXpKTzg5MFplVWU5amp0Ymt3OVFTU1FUYXhRR2N1OEowNkdoNDBDRXllY1lNblE4ClNHNFBuMHZVOXg3VGs0WmtWSmRqY2xEVlZjLzZJSk1Db3B2REk1Tk9GbFYyb0hCNWJjMGhIODh2TGJ3WjQ0Z3grRmthZ1FuSWw2WjAKeDJERVc4eFhqckoxL1JzQ0NkdFpiM0tUYWZjeFFkYUlPTCtIc3IwV2VmbXE1TDZJSmQxaEp5TWN0VEVIQkRhMEdwQzlvSFJ4VUlsdAp2QlRqRDRhdThhcyt4NkFKektOSTBlRGJaT2VTdGMrdmNrTndpL25EaER3VHFuNlNtMWRUay9wd3dwRU9NZm1iWjEzcGxqaGVYN056ClRvZ1ZaOTZlZGhCaUlMNVZhWlZEQURsTjl1NndXazVKUkZSWVgwS0QKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUZUQ0NBdjJnQXdJQkFnSUdTVUVzNUFBUU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHbk1Rc3dDUVlEVlFRR0V3SklWVEVSTUE4RwpBMVVFQnd3SVFuVmtZWEJsYzNReEZUQVRCZ05WQkFvTURFNWxkRXh2WTJzZ1MyWjBMakUzTURVR0ExVUVDd3d1VkdGdXc3cHp3NjEwCmRzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWektURTFNRE1HQTFVRUF3d3NUbVYwVEc5amF5QkIKY21GdWVTQW9RMnhoYzNNZ1IyOXNaQ2tnUnNXUmRHRnV3N3B6dzYxMGRzT2hibmt3SGhjTk1EZ3hNakV4TVRVd09ESXhXaGNOTWpneApNakEyTVRVd09ESXhXakNCcHpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY01DRUoxWkdGd1pYTjBNUlV3RXdZRFZRUUtEQXhPClpYUk1iMk5ySUV0bWRDNHhOekExQmdOVkJBc01MbFJoYnNPNmM4T3RkSGJEb1c1NWEybGhaTU96YXlBb1EyVnlkR2xtYVdOaGRHbHYKYmlCVFpYSjJhV05sY3lreE5UQXpCZ05WQkFNTUxFNWxkRXh2WTJzZ1FYSmhibmtnS0VOc1lYTnpJRWR2YkdRcElFYkZrWFJoYnNPNgpjOE90ZEhiRG9XNTVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXhDUmVjNzVMYlJURG9mVGpsNUJ1CjBqQkZIanp1WjlsazRCcUtmOG93eW9QaklNSGo5RHJUbEY4YWZGdHR2ekJQaENmMm54OUp2TWFaQ3BEeUQvVi9RNFEzWTFHTGVxVncKL0hwWXpZNmI3Y05HYklSd1hkcnpBWkFqL0U0d3FYN2hKMlBuN1dROG9MakpNMlArRnBEL3NMajkxNmpBd0pSREM3YlZXYWFlVnRBawpIM0I1cjlzNVZBMWxkZGtWUVpRQnIxN3M5bzN4LzYxay9pQ2ExMXpyL3FZZkNHU2ppM1pWclI0N0tHQXVoeVhvcXE4ZnhtUkdJTGR3CmZ6emVTTnVXVTdjNWQrUWE0c2NXaEhhWFd5KzdHUldGK0dtRjlabW5xZkkwcDZtMnBnUDhiNFk5Vkh4MkJKdHIrVUJkQURUSExwbDEKbmVXSUE2cE4rQVBTUW5iQUd3SURBS2lMbzBVd1F6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUVNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVelBwbmsvQzJ1TkNsd0I3elUvMk1VOStEMTVZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdC83aHdXCnFadzhVUUNnd0JFSUJhZVo1bThCaUZSaGJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGEKWXRPVVpjVGg1bTJDK0M4bGNMSWhKc0Z5VVIrTUxNT0VrTU5hajdyUDlLZGxwZXVZMGZzRnNrWjFGU05xYjRWak1JRHcxWjRmS1J6QwpiTEJRV1YyUVd6dW9EVERQdjMxL3p2R2RnNzNKUm00Z3B2bGhVYm9oTDN1K3BSVmpvZFNWaC9HZXVmT0o4ejJGdUxqYnZyVzVLZm5hCk53VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTJYakc0S3Z0ZTluSGZSQ2FleE9ZTmtiUXUKZFpXQVVXcExNS2F3WXFHVDhadll6c1JqZFQ5WlI3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlU2lnbiBSb290Q0ExMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyTUNrR0ExVUVDaE1pClNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0dBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlMKYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBME1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzdwpLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xCmNtVlRhV2R1SUZKdmIzUkRRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkwKVEpzemkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3SThoOXV1eXdHTwp3dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVk1kckFHL0x1WXBtR1l6Ky8zWk1xCmc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5VUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclAKTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmk4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QQpicFNBQ1cyMnMyOTNielVJVVBzQ2g4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYCnQ5NHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLQ2gKT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htS2JhYmZTVlNTVU9yVEM0cgpibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFFYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRCk9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXclFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDEKeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1cFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MQpsZ2VMS0JPYmpCbU5RU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNqQ0NBdktnQXdJQkFnSUpBTUorUXdST1J6OFpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUgpNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2CmMyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KZFRBZUZ3MHdPVEEyTVRZeE1UTXdNVGhhRncweU9URXlNekF4TVRNd01UaGFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVJNQThHQTFVRQpCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0ClUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvZFRDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9uNGovTmpyZHFHMktmZ1F2dlBrZDZtSnZpWnBXTndyWnV1eWpOQQpmVzJXYnFFT1JPN2hFNTJVUWxLYXZYV0ZkQ3lvRGgyVHRoaTNqQ3lvei90Y2NibmE3UDdvZm8va0x4MnlxSFdIMkxlaDVUdlBtVXBHCjBJTVpmY0NoRWh5VmJVcjAyTWVsVFRNdWhUbEFkWDRVZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0EKcHhuMW50eFZVd09YZXdkSS81bjdONG9reEZuTVVCQmpqcXFwR3JDRUdvYjVYN3V4VUc2azBRck0xWEYrSDZjYmZQVlRiaUpmeXl2bQoxSHhkcnRiQ3hremxCUUhaN1ZmOHdTTjUvUHJJSklPVjg3VnFVUUhRZDlicEVxSDVHb1A3Z2h1NXNKZjBkZ1l6UTBtZy93dTErclVDCkF3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJUTEQ4YmYKUWtQTVBjdTFTQ09oR25xbUtyczBhREFmQmdOVkhTTUVHREFXZ0JUTEQ4YmZRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWJCZ05WSFJFRQpGREFTZ1JCcGJtWnZRR1V0YzNwcFoyNXZMbWgxTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFESjBRNWVMdFhNczN3K3kvdzkvdzBvCmxaTUV5TC9helhtNFE1RHdwTDd2OHU4aG1MelUxRjBHOXU1QzdEQnNvS3FweXZHdml2by9DM05xUHVvdVFINGZybFJoZWVzdUNEZlgKSS9PTW43NGRzZUdrZGR1ZzRsUVVzYm9jS2FRWTloSzZvaFFVNHpFMXlFRC90K0FGZGxmQkhGbnkrTC9rN1NWaVhJVHdmbjRmczc3NQp0eUVSekFNQlZuQ25FSkllR3pTQkhxMmNHc01FUE8wQ1lkWWVCdk5mT29meUsvRkZoK1U5ck5ISFY0UzlhNjdjMlBtMkcySndDejAyCnlVTHlNdGQ2WWViUzJ6M1B5S25KbTl6YldFVFhieml2ZjNqVG82MGFkYm9jd1RaOGp4NXRITU4xUnE0MUJhYjJYRDBoN2xid3lZSWkKTFhwVXEzRERmU0psZ25DVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFh6Q0NBa2VnQXdJQkFnSUxCQUFBQUFBQklWaFRDS0l3RFFZSktvWklodmNOQVFFTEJRQXdUREVnTUI0R0ExVUVDeE1YUjJ4dgpZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVak14RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoCmJGTnBaMjR3SGhjTk1Ea3dNekU0TVRBd01EQXdXaGNOTWprd016RTRNVEF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFQKYVdkdUlGSnZiM1FnUTBFZ0xTQlNNekVUTUJFR0ExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbgpiakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNd2xkcEI1Qm5naUZ2WEFnN2FFeWlpZS9RVjJFY1d0CmlITDhSZ0pEeDdLS25RUmZKTXN1UytGZ2drYmhVcXNNZ1Vkd2JOMWswZXYxTEtNUGdqME1LNjZYMTdZVWhoQjV1enNUZ0hlTUNPRkoKMG1waUx4OWUrcFpvMzRrbmxUaWZCdGMreWNzbVdRMXozckRJNlNZT2d4WEc3MXVMMGdSZ3lrbW1LUFpwTy9iTHlDaVI1WjJLWVZjMwpySFFVM0hUZ091NXlMeTZjKzlDN3YvVTlBT0VHTStpQ0s2NVRwam9XYzR6ZFFRNGdPc0MwcDZIcHNrK1FMakpnNlZmTHVRU1NhR2psCk9DWmdkYktmZC8rUkZPK3VJRW44clVBVlNORUNNV0VaWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjIKeG1tRmdoY0NBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRQpGSS93UzMrb0xrVWtyazFRK21PYWk5N2kzUnU4TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTFFOdkFVS3IreUF6djk1WlVSVW03CmxnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcGpqTTVSY09PNUxsWGJLcjgKRXBic1U4WXQ1Q1JzdVpSais5eFRhR2RXUG9PNHp6VWh3OGxvL3M3YXdsT3F6SkNLNmZCZFJveVYzWHBZS0JvdkhkN05BRGRCaisxRQpiZGRUS0pkKzgyY0VIaFhYaXBhMDA5NU1KNlJNRzNOemR2UVhtY0lmZWc3akxRaXRDaHdzL3p5clZRNFBrWDQyNjhOWFNiN2hMaTE4CllJdkRRVkVUSTUzTzl6SnJsQUdvbWVjc014ODZPeVhTaGtET095eUdlTWxoTHhTNjd0dFZiOStFN2dVSlRiMG8ySExPMDJKUVpSN3IKa3BlRE1kbXp0Y3BIV0Q5ZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFQmhNQ1JWTXhRakJBCkJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTIKTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeU16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJdwpRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCCk5qSTJNelF3Tmpnd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1REQKVXRkOXRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU1jYXM5VVg0UApCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmR0w5SXRXWTE2Q2s2V2FWSUNxamFZCjdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUgKRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2hYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SQpwbEQ5YW1NTDlaTVdHeG1Qc3UyYm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYCk1iU2N5SkN5Wi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYUVic1gKTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9US0k4eFdWdlR5UUttdEZMSwpicGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkY2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVCnZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaE9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWQKRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSApEaHBrTHpDQnBnWURWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnZBQ0FBWkFCbEFDQUEKYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbEFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeApBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4CjUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazlhbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWsKUjcxa01ydjJKWVNpSjBMMUlMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUApUNDgxUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUzNhL0RUZzRmCkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrU2VUeTM2THNzVXpBS2gzbnRMRmwKb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYzZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUgpjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTVpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9SCnNhUzhJOG5rdm9mL3VaUzIrRjBnU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVEQKS0NPTS9pY3pRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCakxNaQo2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkl6ZW5wZS5jb20KPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNE1Rc3dDUVlEVlFRRwpFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6Ck1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXUKUVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESgowM3JLRHg2c3A0Ym9GbVZxc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLCkNsYU94ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZITG1ZUlkyeFUKK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlh1YU9LbU1Qc096VEZsVUZwZm5YQwpQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRHlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUCk9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYksKRjdqSmVvZFdMQm9CSG15K0U2MFFyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSwowR3FmdkV5TkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOExoaWorCjBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQlFGcU5lYitMejB2UHFoYkIKbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJRApBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHVabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crClNWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZ1FUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkcKTmpJZ1V6Z3hRekJCQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPCkJCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCNHBnd1dTcDlNaURyQXl3NmwKRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYQprRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2YXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxCmhUL0FRS002V2Z4WlN6d29KTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3MKZzFsd0xEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1RWeXZlaFFQNQphVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHa0xoT2JOQTVtZTBtclpKZlFSc041Cm5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSEMKQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC9Rbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRabwpRMGl5Mit0ekpPZVJmMVNrdG9BK25hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaCldyT1p5R2xzUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ3pFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEdqQVlCZ05WQkFvVEVVZHZSR0ZrWkhrdVkyOXRMQ0JKYm1NdQpNVEV3THdZRFZRUURFeWhIYnlCRVlXUmtlU0JTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1Ck1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2dZTXhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDYKYjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNUm93R0FZRFZRUUtFeEZIYjBSaFpHUjVMbU52YlN3Z1NXNWpMakV4TUM4RwpBMVVFQXhNb1IyOGdSR0ZrWkhrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDl4WWdqeCtsazA5eHZKR0tQM2dFbFk2U0tERTZiRklFTUJPNFR4NW9WSm55ZnEKOW9RYlRxQzAyM0NZeHpJQnNRVStCMDd1OVBwUEwxa3dJdWVyR1ZacjRvQUgvUE1XZFlBNVVYdmwrVFcyZEU2cGpZSVQ1TFkvcVFPRAorcUsraWhWcWY5NEx3N1laRkFYSzZzT29CSlE3Um53eURmTUFaaUxJaldsdE5vd1JHTGZUc2h4Z3REajZBb3pPMDkxR0I5NEtQdXRkCmZNaDgrN0FyVTZTU1ltbFJKUVZoR2tTQmpDeXBRNVlqMzZ3Nmdab09LY1VjcWVsZEhyYWVuakFLT2M3eGlJRDdTMTNNTXV5RllrTWwKTkFKV0p3R1J0RHR3S2o5dXNlaWNpQUY5bjlUNTIxTnRZSjIvTE9kWXE3aGZSdnpPeEJzRFBBbnJTVEZjYVVhejRFY0NBd0VBQWFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGRHFhaFFjUVp5aTI3L2E5CkJVRnVJTUdVMmcvZU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1oyMTE1MWZtWFdXY0RZZkYrT3dZeGRTMmhJSTVQWlllMDk2YWMKdk5qcEw5RGJXdTdQZEl4enREaEMyZ1Y3K0FKMXVQMmxzZGV1OXRmZUU4dFRFSDZLUnRHWCtyY3VLeEdya0xBbmdQbm9uMXJwTjUrcgo1TjlzczRVWG5UM1pKRTk1a1RYV1h3VHJnSU9ybWdJdHRSRDAySkRIQkhOQTdYSWxvS21mN0o2cmFCS1pWOGFQRWpvSnBMMUUvUVlWCk44R2I1REtqN1RqbzJHVHpMSDRVL0FMcW44My9CMmdYMnlLUU9DMTZqZEZVOFdualh6UEtlajE3Q3VQS2YxODU1ZUoxdXNWMkdEUE8KTFBBdlRLMzNzZWZPVDZqRW0wcFVCc1YvZmRVSUQrSWMvbjRYdUt4ZTl0UVdza01KREUzMnAydTBtWVJseW5xSTR1SkV2bHozNmh6MQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDNUQ0NBc1dnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzCmIyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBTVRLVk4wWVhKbWFXVnNaQ0JTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDAKZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2dZOHhDekFKQmdOVkJBWVRBbFZUTVJBdwpEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeVptbGxiR1FnClZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdNQVlEVlFRREV5bFRkR0Z5Wm1sbGJHUWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkIKZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwzdHdRUDg5by84QXJGdgpXNTlJMloxNTRxSzNBMkZXR01OSHR0ZktQVFV1aVVQM29XbWIzb29hL1JNZ25MUkpkeklwVnYyNTdJemRJdnB5M0NkaGwrNzJXb1RzCmJobTVpU3pjaEZ2VmRQdHJYOFdKcFJCU2lVWlY5TGgxSE9aLzVGU3VTL2hWY2xjQ0dmZ1hjVm5ySGlnSGRNV2RTTDVzdFBTa3NQTmsKTjNtU3dPeEdYbi9oYlZOTVlxL05Id3RqdXpxZCsveDVBSmhoZE04bWdrQmo4N0p5YWhrTm1jclVEblhNTi91TGljRlo4V0ovWDdOZgpaVEQ0cDdkTmRsb2VkbDQwd09pV1ZwbUtzL0IvcE0yOTNESXhmSkhQNEY4UitHdXFTVnpSbVpUUm91TmpXd2wydFZaaTRVdDBIWmJVCkp0UUlCRm5RbUE0TzV0Nzh3K3dma1BFQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0hRWURWUjBPQkJZRUZId01NaCtuMlRCL3hIMW9vMktvb2M2ckIxc25NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFSV2ZvbApUd052bEprN21oK0NoVG5VZGdXVVh1RW9rMjFpWFFuQ29LalVzSFU0OFRScW5lU2Zpb1ltVWVZczBjWXRicFVnU3BJQjdMaUtaM3N4CjRtY3VqSlVESmk1RG5Vb3g5ZzYxREx1MzRqZC9Jcm9Bb3c1N1V2dHJ1enZFMDNsUlRzMlE5R2NIR2NnOFJub05BWDNGV09kdDVvVXcKRjVva3hCRGdCUGZnOG4vVXFnci9RaDAzN1pUbFpGa1NJSGM0MHpJK09JRjFsblA2YUkreHk4NGZ4ZXo2bkg3UGZySHhCeTIyL0wvSwpwTC9RbHdWS3ZPb1lLQUtRdlZSNENTRngwOUY5SGRrV3NLbGhQZEFLQUNMOHgzdkxDV1JGQ3p0QWdmZDlmREwxbU1wWWpuMHE3cEJaCmMyVDVOblJlSmFIMVpnVXVmemtWcVNyN1VJdU9oV24wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEN3pDQ0F0ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1RIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXMKYjJkcFpYTXNJRWx1WXk0eE96QTVCZ05WQkFNVE1sTjBZWEptYVdWc1pDQlRaWEoyYVdObGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbApJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1pneEN6QUpCZ05WCkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFQKZEdGeVptbGxiR1FnVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRzd09RWURWUVFERXpKVGRHRnlabWxsYkdRZ1UyVnlkbWxqWlhNZwpVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQU5VTU9zUXErVTdpOWI0WmwxK09pRk94SHovTHo1OGdFMjBwT3NnUGZUejNhM1k0WTlrMllLaWJYbHdBZ0xJdldYLzIKaC9rbFE0Ym5hUnRTbXBEaGNlUFlMUTFPYi9iSVNkbTI4eHBXcml1MmRCVHJ6L3NtNHhxNkhaWXVhanRZbElsSFZ2OGxvSk53VTRQYQpoSFFVdzJlZUJHZzYzNDVBV2gxS1RzOURrVHZuVnRZQWNNdFM3bnQ5cmpybnZESDVSZmJDWU04VFdRSXJnTXcwUjkrNTNwQmxiUUxQCkxKR21wdWZlaFJoSmZHWk9venB0cWJYdU5DNjZEUU80TTk5SDY3RnJqU1habTg2QjBVVkdNcFp3aDk0Q0RrbERoYlpzYzd0azZtRkIKck1uVVZOK0hMOGNpc2liTW4xbFVhSi84dmlvdnhGVWNkVUJnRjRVQ1ZUbUxmd1VDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkp4ZkFOK3FBZGN3S3ppSW9yaHRTcHp5RVpHRE1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUUJMTnFhRWQybmRPeG1mWnlNSWJ3NWh5ZjJFM0YvWU5vSE4yQnRCTFo5ZzNjY2FhTm5SYm9iaGlDUFAKRTk1RHorSTBzd1NkSHluVnYvaGV5TlhCdmU2U2J6SjA4cEdDTDcyQ1FucXRLcmNnZlUyOGVsVVN3aFhxdmZkcWxTNXNkSi9QSExUeQp4UUdqaGRCeVBxMXpxd3ViZFF4dFJiZU9sS3lXTjdXZzBJOFZSdzdqNklQZGovM3ZRUUYzekNlcFlvVXo4amNJNzNIUGR3YmV5QmtkCmlFRFBmVVlkL3g3SDRjNy9JOXZHK28xVlRxa0M1MGNSUmo3MC9iMTdLU2E3cVdGaU55aTJMU3IyRUlaa3lYQ24wcTIzS1hCNTZqemEKWXlXZi9XaTNNT3h3KzNXS3QyMWdaN0lleUxucDJLaHZBb3RuRFUwbVYzSGFJUHpCU2xDTnNTaTYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWZmaXJtVHJ1c3QgQ29tbWVyY2lhbAo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWQzY0dKeWFwc1h3d0RRWUpLb1pJaHZjTkFRRUxCUUF3UkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTCkJnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnpkQ0JEYjIxdFpYSmphV0ZzTUI0WERURXcKTURFeU9URTBNRFl3TmxvWERUTXdNVEl6TVRFME1EWXdObG93UkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seQpiVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnpkQ0JEYjIxdFpYSmphV0ZzTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBOWh0UFp3Y3JvUlgxQmlMTEh3R3k0M05GQmtSSkxMdEpKUlRXenNPM3F5eFB4a0V5bEZmNkVxZGIKRHVLUEh4NkdHYWVxdFMyNVh3Mkt3cStGTlhreUxic2NZamZ5c1Z0S1Bjck5jVi9wUXI2VTZNamUrU0pJWk1ibHE4WXJiYTBGOFByVgpDOCthNWZCUXBJczdSNlVqVzNwNitETS91TytabCtNZ3dkWW9pYytVKzdsRjdlTkFGeEhVZFBBTE1lSXJKbXFiVEZldXJDQSt1a1Y2CkJmTzltMmtWcm4xT0lHUEVOWFk2QndMSk4vM0hSKzdvOFhZZGN4WHlsNlMxeUhwNTJVS3FLMzljL3M0bVQ2Tm1nVFd2UkxwVUhod3cKTW1XZDVqeVRYbEJPZXVNNjFHN01HdnY1MGpldUpDcXJWd01pS0ExSmRYKzNLTnAxdjQ3ajNBNTVNUUlEQVFBQm8wSXdRREFkQmdOVgpIUTRFRmdRVW5aUEdVNHRleXE4L254NFA1Wm1WdkNUMmxJOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmlzOUFRT3pjQU4vd3I5MUxvV1h5bTllMmlaV0VuU3RCMDNUWDhuZlVZR1hVUEcKaGk0K2M3SW1mVStUcWJiRUtwcXJJWmNVc2Q2TTA2dUpGZGhySk5UeEZxN1lwRnpVZjFHTzdSZ0JzWk5qdmJ6NFlZQ2FuckhPUW5EaQpxWDBHSlgwbm9mNXY3TE1lSk5yalMxVWFBRHMxdER2WjExMHcvWUVUaWZMQ0JpdnRaOFNPeVVPeVhHc1ZpUUs4WXZ4TzhyVXpxckp2CjB3cWlVT1AyTytndVJNTGJaamlwTTFaSThXMGJNNDBOakQ5Z041M1R5bTErTkg0Tm4zSjJpeHVmY3YxU05VRkZBcFl2SExLYWMwa2gKc1VsSFJVZTA3Mm8wRWNsTm1zeFp0OVlDbmxwT1piV1VyaHZmS2JBVzhiOEFuZ2M2RjJTMUJMVWpJWmtLbFR1WGZPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWZmaXJtVHJ1c3QgTmV0d29ya2luZwo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWZFOEVPUnpVbVMwd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTCkJnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnpkQ0JPWlhSM2IzSnJhVzVuTUI0WERURXcKTURFeU9URTBNRGd5TkZvWERUTXdNVEl6TVRFME1EZ3lORm93UkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seQpiVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnpkQ0JPWlhSM2IzSnJhVzVuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBdElUTU14Y3VhNVJzYTJGU29PdWp6M21VVE9XVWdKbkxWV1JFWlk5blpPSUc0MXczU2ZZdm00U0UKSGkzeVlKMHdUc3lFaGVJc3p4NmUvamFyTTNjMVJOZzFsaG85TnVoNkR0alZSNkZxYVl2Wi9MczZybmxhMWZUV2NidWFrQ05ybXJlSQpkSWNNSGwrNW5pMzZxMU1yM0x0MlBwTk1DQWlNSHFJakhOUnFyU0s2bVFFdWJXWEx2aVJtVlNSTFFFU3hHOWZod29YQTNoQS9QZTI0Ci9QSHhJMVBjdjJXWGI5bjVRSEdOZmIyVjFNNitvRjRuSTk3OXB0QW1EZ0FwNnp4RzhEMWd2ejlRMHR3bVFWR2VGRGRDQktOd1Y2Z2IKaCswdCtudnVqQXJqcVdhSkdjdEIrZDFFTm1IUDRuZEd5SDMyOUpLQk52M2JOUEZ5ZnZNTUZyMjBGUUlEQVFBQm8wSXdRREFkQmdOVgpIUTRFRmdRVUJ4L1M1NXphd202aVFMU3dlbEFRVUhURXlMMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSWxYc2haNnFNTDkxdG1ibXpUQ25MUXlGRTJucE4vc3ZxZSsrRVBia1RmT3RESXUKVUZVYU5VNTJRM0VnNzVOM1RoVndMb2ZEd1IxdDNNdTFKOVFzVnRGU1V6cEUwblBJeEJzRlpWcGlrcHp1UVkweDIrYzA2bGtoMVFGNgoxMlM0WkRuTnllMnY3VXNEU0tlZ21RR0EzR1dqTnE1bFdVaFBna3ZJWmZGWEhlVlpMZ28vYk5qUjllVUp0R3hVQUFyZ0ZVMkhkVzIzCldKWmEzVzNTQUtEMG0waSt3emVrdWpiZ2ZJZUZseG9Wb3Q0dW9sdTlyeGo1a0ZETmNGbjRKMmRIeThlZ0J6cDkwU3hkYkJrNlpyVjkKL1pGdmdyRytDSlBiRkVmeG9qZkhSWjQ4eDNldlpLaVQzL1pwZzRKZzhrbENOTzFhQUZTRkhCWTJrZ3hjK3FhdHY5cz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWZmaXJtVHJ1c3QgUHJlbWl1bQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUmpDQ0F5NmdBd0lCQWdJSWJZd1VSckdtQ3U0d0RRWUpLb1pJaHZjTkFRRU1CUUF3UVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTCkJnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRNQjRYRFRFd01ERXkKT1RFME1UQXpObG9YRFRRd01USXpNVEUwTVRBek5sb3dRVEVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeQpkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVY25WemRDQlFjbVZ0YVhWdE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXhCTGZxVi8rUWQzZDlaK0s0L2FzNFR4NG1yelk4SDk2b0RNcTNJMGdXNjR0YitlVDJUWndhbWpQamxHamhWdG4KQktBUUpHOWRLSUxCbDFmWVNDa1R0dUcra1UzZmhReFRHSm9lSktKUGovQ2loUXZMOUNsLzBxUlk3aVpOeWFxb2U1cloramplUkZjVgo1ZmlNeU5sSTRnMFdKeDBleUlPRkpiZTZxbFZCekFNaVN5MlJqWXZtaWE5bXgrbi9LK2s4ck5yU3M4UGhhSnlKK0hvQVZ0NzBWWlZzCis3cGszV0tMM3d0M011dGl6Q2FhbTd1cVlvTk10QVo2TU1ncHYrMEdUWmU1SE1ReEs5VmZ2Rk1TRjV5WlZ5bG1kMkVoTVFjdUpVbWQKR1BMdTh5dHhqTFc2T1FkSmQvenZMcEtRQlkwdEwzZDc3ME8vTmJ1YTJQbHpweXp5MEZmdUtFNG1YNCtRYUFrdnVQamNCdWt1bWo1UgpwOUVpeEFxbk9FaHNzL24vZmF1R1YrTzYxb1Y0ZDdwRDZraC85dGkrSTIwZXY5RTJiRmhjOGU2a0dWUWE5UVBTZHViaGpMMDhzOU5JClMrTEkrSCtTcUhaR25FSmxQcVFld1FjRFdrWXR1SmZ6dDlXeVZTSHZ1dHhNQUpmN0ZKVW5NNy9vUTBkRzBnaVpGbUE3bW43UzV1MDQKNnV3QkhqeElWa2tKeDB3M0FKNklEc0J6NFc5bTZYSkhNRDRRNVFzRHlacENBR3pGbEg1aHhJcmZmNElhQzFuRVdUSjNzN3hnYVZZNQovYlFHZXl6V1pEYlp2VWp0aEI5K3BTS1BLcmhDOUlLMzFGT1FlRTR0R3YyQmIwVFhPd0YwbGtMZ0FPSXVhK3JGN25Lc3U3Lys2cXFvCitOejJzbm1LdG1jQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZKM0FaNllNSXRrbTlVV3JwbVZTRVNmWVJheGpNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCREFVQUE0SUNBUUN6VjAwUVlrNDY1S3pxdUJ5dgpNaVBJczBsYVVaeDJLSTE1cWxkR0Y5WDFVdmEzUk9nSVJMOFloTklMZ00zRkV2MEFWUVZoaDBIY3RTU2VQTVRZeVB0d25pOTRsb01nCk50NThEMmtUaUtWMU5wZ0lwc2Jmck03aldOYTNQdDY2OCtzMFFOaWlnZlY0UHkvVnBmelpvdFJlQkE0WHJmNUI4T1d5Y3ZwRWdqTkMKNkMxWTkxYU1Zais2UXJDY0RGeCtMbVVtWEZOUEFMSjRmcUVObVMyTnVCMk9vc1N3L1dEUU1LU095QVJpcWNUdE5kNTZsKzBPT0Y2UwpMNU53cGFtY2I2ZDlFeDEreGdoSXNWNW42MUVJSmVubUpXdFNLWkdjMGpsekNGZmVtUWEwVzUwUUJ1SENBS2k0SEVvQ0NoVFF3VUhLCis0dzFJWDJDT1BLcFZKRVpOWk9VYldvNnhiTFF1NG1HaytpYnlRODZwM3E0b2ZCNFJ2cjhOeS9saW9UejMvNEUyYUZvb0M4azRnbVYKQnRXVnl1RWtsdXQ4OXBNRnUrMXo2UzNSZFRuWDV5VGIyRTVmUTQrZTBCUTV2MVZ3U0psWE1iU2M3a3FZQTVZd0gyQUc3aHNqL29GZwpJeHBIWW9XbHpCazBnRyt6ckJyam4vQjdTSzNWQWRsbnRxbHlrK290WnJXeXVPUTlQTEx2VEl6cTZ3ZS9xeldhVllhOEdLYTFxRjYwCmcyeHJhVURUbjl6eHcybHJ1ZUZ0Q2ZUeHFsQjJDbnA5ZWhlaFZaWkNtVEVKM1dBUmpRVXdmdWFPUnRHZEZOckhGK1FGbG96RUpMVWIKenhRSHNrRDRvNTVCaHJ3RTBHdVd5Q3FBTlAyLzd3YWozVmpGaFQwK2ovNmVLZUMydUFsb0dSd1lRdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IFByZW1pdW0gRUNDCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCL2pDQ0FZV2dBd0lCQWdJSWRKY2xpc2MvZWxRd0NnWUlLb1pJemowRUF3TXdSVEVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WCkJBb01DMEZtWm1seWJWUnlkWE4wTVNBd0hnWURWUVFEREJkQlptWnBjbTFVY25WemRDQlFjbVZ0YVhWdElFVkRRekFlRncweE1EQXgKTWpreE5ESXdNalJhRncwME1ERXlNekV4TkRJd01qUmFNRVV4Q3pBSkJnTlZCQVlUQWxWVE1SUXdFZ1lEVlFRS0RBdEJabVpwY20xVQpjblZ6ZERFZ01CNEdBMVVFQXd3WFFXWm1hWEp0VkhKMWMzUWdVSEpsYldsMWJTQkZRME13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBCklnTmlBQVFOTUY0YkZaMEQwS0Y1TmJjNlBKSjZ5aFVjeldMem5DWmNCejNsVlBxajFzd1M2dlFVWCtpT0dhc3ZMa2ptckJoRGVLelEKTjhPOXNzMHM1a2ZpR3VaanVEMHVMM2pFVDl2MEQ2Um9URlZ5YTVVZFRoaENsWGpNTnp5UjRwdGxLeW1qUWpCQU1CMEdBMVVkRGdRVwpCQlNhcnlsNndCRTFOU1pSTUFERGF2NUExYTdXUERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFLCkJnZ3Foa2pPUFFRREF3Tm5BREJrQWpBWENmT0hpRkJhcjhqQVFyOUhYL1ZzYW9iZ3hDZDA1RGhUMXdWL0d6VGp4aSt6eWdrOE41M1gKNTdoRzhmMmg0bkVDTUVKWmgwUFVVZCs2MHdreVdzNklmbGM5bkY5Q2EvVUhMYlh3Z3BQNVdXK3VaUHBZNVlzZTQyTyt0WUhOYndLTQplUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHV6Q0NBcU9nQXdJQkFnSURCRVRBTUEwR0NTcUdTSWIzRFFFQkJRVUFNSDR4Q3pBSkJnTlZCQVlUQWxCTU1TSXdJQVlEVlFRSwpFeGxWYm1sNlpYUnZJRlJsWTJodWIyeHZaMmxsY3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEWlhKMGRXMGdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3hJakFnQmdOVkJBTVRHVU5sY25SMWJTQlVjblZ6ZEdWa0lFNWxkSGR2Y21zZ1EwRXdIaGNOTURneE1ESXkKTVRJd056TTNXaGNOTWpreE1qTXhNVEl3TnpNM1dqQitNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWlZXNXBlbVYwYnlCVQpaV05vYm05c2IyZHBaWE1nVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1TSXdJQVlEVlFRREV4bERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjNiM0pySUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKQVE4QU1JSUJDZ0tDQVFFQTQvdDlvM0s2d3ZESkZJZjFhd0ZPNFc1QUI3cHRKMTEvOTFzdHMxckhVVitycERLbVlZZTJiZytHMGpBQwpsL2pYYVZlaEdEbGRhbVI1eGdGWnJEd3hTamg4MGdUU1N5am9JRjg3QjZMTVRYUGI4NjVQeDFiVldxZVdpZnJ6cTJqVUk0WlpKODhKCko3eXNibktESERCeTMrQ2k2ZExoZEhVWnZTcWVleFZVQkJ2WFF6bXRWU2pGNGhxNzlNRGtyamhKTTh4MmhaODVSZEtrbnZJU2pGSDQKZk9RdGYvV3NYK3NXbjdFdDBick1rVUozVENYSmtEaHYyL0RNKzQ0ZWwxaysxV0JPNWdVbzdVbDVFMHU2U05zditYTFRPY3IrSDlnMApjdlcwUU04eEFjUHMzaEV0RjEwZnVGRFJYaG1uYWQ0SE15aktVSlg1cDFUTFZJWlFSYW41U1FJREFRQUJvMEl3UURBUEJnTlZIUk1CCkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUUlkczNMQi84azlzWE43YnVRdk9LRU4wWjE5ekFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUthb3JTTE9BVDJtby85aTBFaWRpMTV5c0hoRTQ5d2Nyd245STBqNnZTckV1VlVFdFJDagpqU2ZlQzRKajBPN2VERGQ1UVZzaXNyQ2FRVnltY09EVTBIZkxJOU1BNEd4V0wrRnBEUTNacXI4aGdWRFpCcVdvLzVVMzBLcis0clAxCm1TMUZoSXJsUWduWGRBSXY5NG5ZbWVtOEo5UkhqYm9OUmh4M3p4U2tITG1rTWNTY0tIUUROUDh6R1NhbDZRMTB0ejZYeG5ib0o1YWoKWnQzaHJ2SkJXOHFZVm9OemNPU0dHdEl4UWJvdnZpMFRXblp2VHVoT2dRNC9Xd01pb0JLK1psZ1JTc3NEeExRcUtpMldGK0E1Vkx4SQowM1lublpvdEJxYko3RG5TcTl1Zm1nc25BalVwc1VDVjUvbm9uRldJR1ViV3R6VDFmczQ1bXRrNDhWSDNUeXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQW1PZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJmTVFzd0NRWURWUVFHRXdKVVZ6RVNNQkFHQTFVRUNnd0oKVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVVYwTkJJRkp2YjNRZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3T0RJNE1EY3lORE16V2hjTk16QXhNak14TVRVMU9UVTVXakJmTVFzd0NRWURWUVFHCkV3SlVWekVTTUJBR0ExVUVDZ3dKVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVVYwTkIKSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwpBb0lCQVFDd2ZuSzRwQU9VNXFmZUNUaVJTaEZBaDZkOFdXUVVlN1VSRU4zK3Y5WEF1MWJpaFNYME5YSVArRlBRUWVGRUFjSzBITU14ClFoWkhoVE1pZHJJS2J3L2xKVkJQaFlhK3Y1Z3VFR2NldmhFRmhnV1F4Rm5RZkhnUXNJQmN0K0hISzNYTGZKK3V0ZEdkSXpkanA5eEMKb2kyU0JCdFF3WHU0UGh2SlZnU0xMMUticmFsVzZjSC9yYWxZaHpDMmdmZVhSZndaVnpzcmIrUkg5SmxGL2gzeCtKZWppQjAzSEZ5UAo0SFlsbWxENG9GVC9SSkIySTlJeXhzT3JCci84KzcvenJYMlNZZ0piS2RNMW81T2FRMlJnWGJMNk12ODdCSzlOUUdyNXgrUHZJLzFyCnkrVVBpemdON2dyOC9nK1luekF4M1d4U1pmbUxnYjRpNFJ4WUE3cVJHNGtIQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScU9Gc21qZDZMV3ZKUGVsU0RHUmpqQ0RXbXVqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBUUVBUE5WM1BkcmZpYnFIREFoVWFpQlFrcjZ3UVQyNUptU0RDaS9vUU1DWEtDZUNNRXJKay85cTU2WUFmNGxDCm10WVI1VlBPTDh6eTJnWEUvdUpReERxR2ZjemFmaEFKTzVJMUtsT3kvdXNyQmRsc1hlYlE3OU5xWnA0VktJVjY2SUlBckI2bkNXbFcKUXROb1VSaStWSnEvUkVHNlNiNGd1bWxjN3JoM3pjNXNINjJEbGhoOURyVVVPWVR4S09rdG81NTdIbnB5V29PemVXL3Z0UHpRQ3FWWQpUMGJmKzIxNVdmS0VJbEt1RDh6N2ZEdm5hc3BIWWNONitOT1NCQis0SUlUaE5sUVd4MERlTzRwejNOL0dDVXpmN05yLzFGTkNvY255ClloMGlnenlYeGZrWllpZXNaU0xYMHp6RzVZNnlVOHhKenJ3dy9uc09NNUQ3N2RJVWtSOEhydz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREJkTVFzd0NRWURWUVFHRXdKS1VERWxNQ01HQTFVRUNoTWMKVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFQ3hNZVUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaApkR2x2YmlCU2IyOTBRMEV5TUI0WERUQTVNRFV5T1RBMU1EQXpPVm9YRFRJNU1EVXlPVEExTURBek9Wb3dYVEVMTUFrR0ExVUVCaE1DClNsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4SnpBbEJnTlZCQXNUSGxObFkzVnkKYVhSNUlFTnZiVzExYm1sallYUnBiMjRnVW05dmRFTkJNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTkFWT1ZLeFVyTzZ4Vm1DeEYxU3JqcERaWUJMeC9LV3ZOczJsOWFtWkl5b1h2RGpDaHozMzVjOVM2NzJYZXdodFVHcnpibCtkcCsrCitUNDJOS0E3d2ZZeEVVVjBrejFYZ01YNWlabks1YXRxMUxYYVFaQVF3ZGJXUW9uQ3YvUTRFcFZNVkFYM051UkZnM3NVWmRiY0RFM1IKM240TXF6dkVGYjQ2VnFaYWIzWnBVcWw2dWNqcmFwcGRVdEF0Q21zMUZna1FoTkJxeWpvR0FEZEg1SDVYVHorTDYyZTRpS3JGdmxOVgpzcEhFZmJtd2hSa0dlQzdiWVJyNmhmVktrYUhuRnRXT29qbmZsTGh3SHlnL2kveEFYbU9EUElNcUdwbHJ6OTVaYWp2OGJ4YlhILzFLCkVPdE9naFk2ckNjTVUvR3QxU1N3YXdOUXdTMDhGdDFFTkNjYWRmc0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGQXFGcVhkbEJaaDgKUUlINEQ1Y3NPUEVLN0R6UE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQk1PcU5FckxsRnNjZVRmc2dMQ2tMZlpPb2M3bGxzQ0xxSlgycktTcFdlZW84SHhkcEZjb0p4RGpyU3pHK250S0VqCnUvWWtuOHNYL295bXpzTFMyOHlOL0hIOEF5bkJiRjB6WDJTMlpUdUpieGgyZVBYY29rZ2ZHVCtPayt2eCtoZnV6VTdqQkJKVjF1WGsKM2ZzK0JYemlIVjdHcDd5WFQyZzY5ZWt1Q2tPMnIxZGNZbWg4dC8yamlvU2dyR0srS3dtSE5QQnFBYnViS1ZZOC9nQTN6eU5zOFU2cQp0blJHRW15UjdqVFY3SnFSNTBTK2tERnkxVWtDOWdMbDlCL3JmTm1XVmFuLzdJcjVtVWYvTlZvQ3FnVExpbHVIY1NtUnZhUzBlZzI5Cm12VlhJd0FISVJjL1NqblJCVWtMcDdZM2dhVmRqS296WG9Fb2ZLZDlKK3NBcm8wMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdXpDQ0E2T2dBd0lCQWdJSVZ3b1JsMExFNDh3d0RRWUpLb1pJaHZjTkFRRUxCUUF3YXpFTE1Ba0dBMVVFQmhNQ1NWUXhEakFNCkJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHdNek0xT0RVeU1EazJOekVuTUNVR0ExVUUKQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MElFTkJNQjRYRFRFeE1Ea3lNakV4TWpJd01sb1hEVE13TURreQpNakV4TWpJd01sb3dhekVMTUFrR0ExVUVCaE1DU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6CklGTXVjQzVCTGk4d016TTFPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTAKSUVOQk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcDhiRXBTbWtMTy9sR01Xd1VLTnZVVHVmQ2xySgp3a2c0Q3NJY29CaC9rYldIdVVBLzNSMW9Id2lEMVMwZWlLRDRqMWFQYlprQ2twQVcxVjhJYkluWDRheThJTUt4NElOUmltbE5BSlphCmJ5L0FSSDZqRHVTUnpWanUzUHZISGtWSDNTZTVDQUdmcGlFZDlVRXRMMHo5S0szZ2lxMGl0Rlpsam9aVWo1TkRLZDQ1Um5pak1DTzYKemZCOUUxZkFYZEtEYTBoTXhLdWZnRnBiT3IzSnB5SS9nQ2N6V3c2M2lneGRCemNJeTJ6U2VrY2lSRFhGek13dWp0MHE3YmQ5WmcxZgpZVkVpVlJ2alJ1UGpQZEExWXByYnJ4VElXNkhNaVJ2aE1DYjhvSnNmZ2FkSEh3VHJvem1TQnArWjA3L1Q2azlRbkJuK2xvY2VQR1gyCm94Z2tnNFlRNTFRK3FEcDJKRStCSWNYakR3TDRrNVJISUx2KzFBN1RhTG5keEhxRWd1TlRWSG5kMjV6UzhnZWJMcmE4UHUyRmJlOGwKRWZLWEdrSmg5MHFYNkl1eEVBZjZaWUd5b2puUDl6ei9HUHZHOFZxTFdlSUNySHVTMEU0VVQxbEY5Z3hlS0YrdzZEOUZ6OCt2bTIvNwpoTk4zV3BWdnJKU0VudTY4d0VxUFNwUDRSQ0hpTVVWaFVFNFEyT00xZkV3WnRONEZ2Nk1HbjhpMXplUWYxeGNHRFhxVmRGVU5hQnI4CkVCdGlaSjF0NEpXZ3c1UUhWdzBVNXIwRis3aWY1dCtMNHNibmZwYjJVOFdBTkZBb1dQQVNVSEVYTUxybWVHTzg5TEt0bXl1eS91RTUKakY2NkN5Q1UzbnVEdVAvalZvMjNFZWs3alBLeHdWMmRwQXRNSzlteUdQVzFuMHNDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkZMWQppRHJJbjNobTdZbnplemh3bE1rQ0FqYlFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVXRpSU9zaWZlR2J0CmlmTjdPSENVeVFJQ050QXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUxlM0tId0dDbVNVeUkKV09ZZGlQY1VaRWltMkZnS0RrOFROZDgxSGRUdEJqSElnVDVxMWQwN0dqTHVrRDBSMGk3MGpzTmpMaU5tc0dlK2I3YkFFemxncXFJMApKWk4xVXQ2bm5hME9oNGxTY1dvV1BCa2RnL2lhS1dXKzlEK2EyZkR6V29jaGNZQk55K0E0bXorNyt1QXdUYytHMDJVUUdSalJsd0t4CkszSkNhS3lndlU1YTJoaS9hNWlCMFAyYXZsNFZTTTBSRmJuQUtWeTA2SWozUGphdXQyTDlIbUxlY0hnUUhFaGIycnlrT0xwbjdWVSsKWGxmZjFBTkFUSUdrMGs5anB3bENDUlQ4QUtuQ2dITlBMc0JBMlJGN1NPcDZBc0RUNnlnQkpsaDB3Y0J6SW0yVGxmMDVmYnNxNC9hQwo0eXlYWDA0ZmtaVDYvaXlqMkhZYXVFMnlPRStiK2gxSVlIa200dlA5cWRDYTZIQ1BTWHJXNWIwS0R0c3Q4NDIvNitPa2ZjdkhsWEhvCjJxTjh4Y0w0ZEpJRUc0YXNwQ0pUUUxhcy9reDJ6L3VVTXNBMW4zWS9idVdRYnFDbUpxSzRMTDdSSzRYOXAyakl1Z0Vyc1d4MEhiaHoKbGVmdXQ4Y2w4QUJNQUxKK3RndUxIUFBBVUo0bHVlQUkzalptL3plbDBidFVaQ3pKSjdWTGtuNWwvOU10NGJsT3ZIK2tRU0dRUVhlbQpPUi9xbnVPZjBHWnZCZXlxZG42L2F4YWc2N1hIL0pKVUx5c1JKeVUzZUV4UmFyRHp6RmhkRlBGcVNCWC93Z2Uyc1kwUGpseFFSck05CnZ3R1lUN0paVkVjK05IdDRiVmFUTG5QcVppaDR6UjBVdjZDUEx5NjRMbzd5RklyTTZiVjgrMnlkREtYaGxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWRNQnNHQTFVRUNnd1UKUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZ1EyeGhjM01nTWlCU2IyOTBJRU5CTUI0WApEVEV3TVRBeU5qQTRNemd3TTFvWERUUXdNVEF5TmpBNE16Z3dNMW93VGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxCmVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXdIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURJZ1VtOXZkQ0JEUVRDQ0FpSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5mSFh2ZkJCOVIzKzBNaDlQVDFhZVR1TWdIYm80WWY1RmtOdXVkMQpnMUxyNmh4aEZVaTdIUWZLaks2dzNKYWQ2c05na29hQ0tIT2NWZ2IvUzJUd0RDbzNTYlhsend4ODd2Rkt1M013WmZQVkw0TzJmdVBuCjlaNnJZUG5UOFoyU2RJcmtISmFzVzREcHRmUXhoNk5SL01kK29XK09VM2ZVbDhGVk01SStHQzkxMUsyR1NjdVZyMVFHYk5nR0U0MWIKLytFbUdWbkFKTHFCY1htUVJGQm9KSlJmdUxNUjhTbEJZYU5CeXlNMjFjSHhNbEFRVG4vMGhwUHNoTk9PdkV1L1hBRk9CejNjRklxVQpDcVRxYy9zTFVlZ1RCeGo2RHZFcjBWUVZmVHpoOTdRWlFtZGlYbmZnb2xYc3R0bHBGOVU2cjBUdFNzV2U1SG9uZk9WMTE2ckxKZWZmCmF3cmJEMDJUVHFpZ3pYc3U4bGtCYXJjTnVBZUJmb3M0R3pqbUNsZVpQZTRoNktQMURCYmRpK3cwanB3cUhBQVZGNDFvZzlKd254Z0kKelJGbzFjbHJVczNFUm8vY3RmUFlWM01lNlpRNUJML1QzampldEZQc2FSeWlmc1NQNUJ0d3JmS2krZnYzRm1SbWFaOUpVYUxpRlJobgpCa3AvMVd5MVRiTXo0R0hyWGI3cG1BOHkxeDFMUEM1YUFWS1JDZkxmNm8zWUJrQmpxaEhrL3NNM25oUlNQL1RpelBKaGs5SDlaMnZYClVxNi9hS3RBUTZCWE5WTjQ4RlA0WVVJSFpNYlhiNXRNT0ExanJHS3ZOb3VpY3dvTjlTRzlkS3BONm5JRFNkdkhYeDFpWThmOTNaSHMKTSs3MWJiUnVNR2pleU5ZbXNIVmVlN1FISUppaGRqSzRUV3hQQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRApWUjBPQkJZRUZNbUFkK0Jpa29MMVJwenp1dmRNdzk2NG82MDVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBVTE4aDlicXdPbEk1TEpLd2JBREo3ODRnN3dieWxwN3BwSFIvZWhiOHQvVzIreFViUDZ1bXdISmRFTEZ4N3J4UDQ2MnMKQTIwdWNTNnZ4T090bzcwTUVhZTAvMHF5ZXhBUUg2ZFhRYkxBcnZRc1dkWkhFSWp6SVZFcE1NcGdocTlHcXgzdE9sdXdsTjVFNDBFSQpvc0hzSGRiOVQ3YldSOUFVQzhybXlyVjdkMzVCSDE2RHg3YU1PWmF3UDVhQlFXOWdrT0xvK2ZzaWNkbDlzejFHdjdTRXI1QWNENDhTCmFxL3Y3aDU2cmdKS2loY3JkdjZzVklra0xFOC90cktuVG95b2taZjdLY1o3WEMyNXkyYTJ0NmhiRWxHRnRRbCtZbmh3L3FscVlMWWQKRG5rTS9jcnFKSUJ5dzVjLzhuZXJReUlLeCt1MkRJU0NMSUJyUVlvSXdPdWxhOStaRXN1SzFWNkFESkhnSmdnMlNNWDZPQkUxL3lXRApMZko2djlyOWp2Nmx5MFVzSDhTSVU2NTNEdG1hZHNXT0xCMmp1dFhzTXE3QXFxejMwWHBONjlRSDRrajNJbzZ3cEo5cXpvNnlzbUQwCm95TFFJK3VVV25wcDNRKy9RRmVzYTFsUTJhT1o0VzcralFGNUp5TVYzcEtkZXdsTld1ZExTREJhR09ZS2JlYVA0Tks3NXQ5OGJpR0MKd1dnNVRiU1lXR1ppekVxUVhzUDZKd1N4ZVJWMG1jeStyU0RlSm1BYzYxWlJwcVBxNUtNL3AvOWgzUEZhVFd3eUkwUHVyS2p1N2tvUwpDVHhkY2NLK2VmckNoMmdkQy8xY2Fjd0cwSnA5VkprcXlUa2FHYTlMS2tQelkxMWFXT0l2NHgza3FkYlFDdENldjllQkNmSEp4eVlOCnJKZ1dWcUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJ1eXBhc3MgQ2xhc3MgMyBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkTUJzR0ExVUVDZ3dVClFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWdRMnhoYzNNZ015QlNiMjkwSUVOQk1CNFgKRFRFd01UQXlOakE0TWpnMU9Gb1hEVFF3TVRBeU5qQTRNamcxT0Zvd1RqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMQplWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3SGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklETWdVbTl2ZENCRFFUQ0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWGFDcFVXVU9PVjhsNmRkakVHTW5xYjhSQjJ1QUNhdFZJMnpTUkgKc0o4WVpMeWE5dnJWZWRpUVlrd2lMOTQ0UGRiZ3FPa2NMTnQ0RWVtT2FGRVZjc2Z6TTRma29GMExYT0JYQnlvdzljM0VOM2NvVFJpUgo1ci9WVXYxeExYQSs1OGJFaXVQd0tBdjBkcGloaTRkVnNqb1QvTGMrSnplT0l1T29UeXJ2WUxzOXR6bkREZ0ZIbVYwU1Q5dEQrbGVoCjdmbWR2aEZISmxzVG1LdGRGb3F3Tnh4WG5VWC9pSlkydjd2S0IzdHZoMlBYMERKcTFsMXNEUEd6YmpuaWF6RXVPUUFuRk40NHdPd1oKWm9ZUzZKMXlGaE5rVXNlcE54ejlnakR0aEJnZDlLNWMvM0FUQU91eDlUTjZTOVpWK0FXTlMybXc5Yk1vTmx3VXhGRnpUV3NMOFRRSAoyeGM1MTl3b2UydjFuL011d1U4WEtoRHp6TXJvNi8xcnF5NmFueTJDYmdUVVVnR1RMVDJHL0g3ODMrOUNIYVpyNzdrZ3h2ZTlvS2VWCi9hZm1pU1RZekl3MGJPSWpMOWtTR2lHNVZaRnZDNUY1R1F5dFFJZ0xjT0o2MGc3WWFFaTdnaE01RUZqcDJDb0h4aExiV052U08xVVEKUndVVloySitHR09tUmo4SkRsUXlYcjhOWW5vbjc0RG8yOWxMQmxvM1dpWFFDQkozMUc4SlVKYzl5QjNEMzR4Rk1GYkcwMlNyWnZQQQpYcGFjdzhUdnczeHJpenA1ZjdOSnp6M2lpWitnTUV1RnVaeVVKSG1QZld1cFJXZ1BLOUR4Mmh6TGFiaktTV0p0eU5Call0MWdEMWlxCmo2RzhCYVZtb3M4YmRyS0VaTEZNT1ZMQU1McndqRXNDc0xhM0FnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKVlIwT0JCWUVGRWU0emYvbGIrNzRzdXd2VGc3NUpiQ09QR3ZETUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQWdFQUFDQWpRVFVFa01KQVltRHY0alZNMXorczRqU1F1S0Z2ZHZvV0ZxUklOeXpwa01MeVBQZ0tuOWlCNWJ0YjJpVXNwS2RWCmNTUXk5c2dMOHJ4cStKT3NzZ2ZDWDUvYnpNaUtxcjVxYitGSkVNd3gxNEM3dThqWW9nNWtWK3FpOWNLcE1SWFNJR3JzL0NJQktNK0cKdUlBZXFjd1JwVHp5RnJOSG5melNnQ0hFeTlCSGNFR2h5b01aQ0N4dDhsMTNuSW9VRTlRMkhKTHc1UVkzM0tibWtKczRqMXhyRzBhRwpRMEpmUGdFSFUxUmRaWDMzaW5PaG1sUmFIeWxERkNmQ2hRKzFpSHNhTzVTM0hXQ250WnpuS1dsWFdwdVRla013R3dQWFlzaEFwcXI4ClpPUksxNUZUQWFnZ2lHNmNYMFM1eTJDQk5PeHYwMzNhU0YvcnRKQzhMYWtjQzZ3YzFhSm9JSUFFMXZ5eGp5KzdTakVOU29ZYzYrSTIKS1NiMTJ0akU4blZoejM2dWRtTktla0JsazRmNEhvQ01odVdHMW84Ty9GTXNZT2dXWVJxaVBrTjd6VGxnVkdyMThva21BV2lEU0tJego2TWtFa2JJUk5CRSs2dEJER1I4RGs1QU0vMUU5Vi9SQmJ1SExvTDdyeVdQTmJjemsrRGFxYUozdHZWMlhjRVFOdGc0MTNPRU1YYnVnClVaVExmaGJyRVMramtrWElUSEhadk1tWlVsZEdMMURQdlRWcDlEMFZ6Z2FsTEE4KzlvRzZsTHZEdTc5bGVOS0dlZjlKT3hxRERQRGUKZU96SThrMU1HdDZDS2ZqQld0cnQ3dVluWHVoRjBKMGNVYWhvcTBUajBJdHE0L2c3dTl4TjEyVHlVYjdtcXF0YTZUSHVCcnh6dnhOaQpDcC9IdVpjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb00KSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVQpjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd0hoY05NRGd4Ck1EQXhNVEF5T1RVMldoY05Nek14TURBeE1qTTFPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHoKZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRApaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzlkWlB3WWlKdkpLN2dlbmFzZmIzWkpOVzR0L3pOOEVMZzYzaUlWbDZibWxRZFRReUsKOXRQUGNQUlN0ZGlUQk9OR2huRkJTaXZ3S2l4VkE5Wkl3K0E1T08zeVhEdy9STHlUUFdHclRzME52dkFnSjFnT1JIOEVHb2VsMTVZVQpOcERRU1h1aGRmc2FhM094K002cENTenlVOVhERkVTNGhxWDJpeXM1MnFNelZObjZjaHIzSWhVY2lKRnJmMmJsdzJxQXNDVHozNFpGCmlQMFpmM1dISHgreEd3cHpKRnU1WmVBc1ZNaGcwMllYUCtITVZETnprUUk2cG45N2RqbWlINWEyT0s2MXlKTjBIWjY1dE9WZ25TOVcKMGVEclhsdE1FbkFNYkVRZ3F4SFk5Qm4yMHB4U04rZjZ0c0l4TzByVUZKbXR4eHIxWFYvNkI3aDhEUi9XZ3g2ekFnTUJBQUdqUWpCQQpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUzFBL2QyTzJHQ2FoS3FHRlByCkF5R1V2LzdPeWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVZqM3ZsTlc5Mm5PeVdMNnVrSzJZSjVmK0FiR3dVZ0M0VGVRYklYUWIKZnNEdVhta3FKYTljMWgzYTBubko4NWNwNElhSDNnUlpEL0ZaMUdTRlM1bXZKUVFleVVhcGw5NkNzaHR3bjV6MnIzRXgzWHNGcFN6VAp1Y3BIOXNyeTl1ZXR1VWcvdkJhM3dXMzA2Z212N1BPMTV3V2VwaDZLVTFIV2s0SE1kSlAydWRxbUpRVjBlVnArUUQ2Q1N5WVJNRzdoClAwSEhSd0ExMWZYVDkxUStnVDNhU1dxYXMrOFFQZWJyYjlISUlrZkx6TThCTVpMWkdPTWl2Z2tlR2o1YXN1UnJERlI2ZlVOT3VJbWwKZTllaVBaYUd6UEltTkMxcWtwMmFHdEF3NGwxT0JMQmZpeUIrZDhFOWxZTFJScG83UEhpNGI2SFFEV1NpZUI0cFRwUERwRlFVV3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTXpDQ0F4dWdBd0lCQWdJRENZUHpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLCkRBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQWUKRncwd09URXhNRFV3T0RNMU5UaGFGdzB5T1RFeE1EVXdPRE0xTlRoYU1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RQpMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOT3lTczk2Uis5MW15UDZPaS9XVUVXSk5UckdhOXYrMndCb3FPQUQKRVIwM1VBaWZUVXBvbERXelU5R1VZNmNnVnEvZVVYanNLajN6U0VoUVBncmZSbFdMSjIzREVFME5rVkpEMklmZ1hVNDJ0U0hLWHpsQQpCRjliZnN5anhpdXBRQjdaTm9UV1NQT1NIalJHSUNUQnBGR09TaHJ2VUQ5cFhSbC9SY1BIQVk5UnlTUG9jcTYwdkZZSmZ4TExITEd2CktaQUt5VlhNRDlPMEd1MUhOVnBLN1p4ekJDSFFxcjBNRTdVQXlpWnN4R3NNbEZxVmxOcFFtdkgvcFN0bU1hVEpPS0RmSFIrNENTN3oKcCtoblVxdVZIK0JHUHRpa3c4cGF4VEdBNkVpYW41UnAvaG5kMkhOOGdjcVczbzd0c3pJRlpZUTA1dWI5VnhDMVgzYS9MN0FRRGNVQwpBd0VBQWFPQ0FSb3dnZ0VXTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRlAzYUZNU2ZNTjRodlI1Q09meXJZeU5KCjRQR0VNQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0Iwd1lEVlIwZkJJSExNSUhJTUlHQW9INmdmSVo2YkdSaGNEb3ZMMlJwY21WamRHOXkKZVM1a0xYUnlkWE4wTG01bGRDOURUajFFTFZSU1ZWTlVKVEl3VW05dmRDVXlNRU5zWVhOekpUSXdNeVV5TUVOQkpUSXdNaVV5TURJdwpNRGtzVHoxRUxWUnlkWE4wSlRJd1IyMWlTQ3hEUFVSRlAyTmxjblJwWm1sallYUmxjbVYyYjJOaGRHbHZibXhwYzNRd1E2QkJvRCtHClBXaDBkSEE2THk5M2QzY3VaQzEwY25WemRDNXVaWFF2WTNKc0wyUXRkSEoxYzNSZmNtOXZkRjlqYkdGemMxOHpYMk5oWHpKZk1qQXcKT1M1amNtd3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSCtYMnpESTM2U2NmU0Y2Z0hET0ZCSnBpQlNWWUVRQnJMTHBNRStiVU1KbQoySDZOTUxWd01lbmlhY2Z6Y05zZ0ZZYlFEZkMrckFGMWhNNStuMDIvdDJBN25QUEtIZUplYU5pam5aZmxRR0RTTmlIKzBMUzRGOXAwCm8zL1UzN0NZQXF4dmEyc3NKU1J5b1dYdUpWcmw1akxuOHQrclNmcnprR2tqMndUWjUxeFkvR1hVbDc3TS9DNEt6Q1VxTlFUNFlKRVYKZFQxQi95TWZHY2hzNjRKVEJLYmtUQ0pOall5NnpsdHo3R1JVVUczUm5GWDdhY00ydzR5OFBJV21hd29tRGVDVG1HQ3Vmc1lrbDRwaApYNUdPWnBJSmh6Yk5pNXN0UHZaUjFGRFVXU2k5Zy9MTUtIdFRobTNZSm9odzErcVJ6VDY1eXNDUWJsckdYblJsMTF6K28rST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVF6Q0NBeXVnQXdJQkFnSURDWVAwTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRSwpEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3Ck9UQWVGdzB3T1RFeE1EVXdPRFV3TkRaYUZ3MHlPVEV4TURVd09EVXdORFphTUZBeEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUsKREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBdwpPVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKbnhoRFJ3dWkrM01LQ092WHdFejc1aXZKbjlncGZTCmVncG5samdKOWhCT2xTSnptWTNhRlMzbkJmd1pjeUszanBnQXZEdzlyS0ZzKzlaNUpVdXQ4TXhrMm9nK0tiZ1BDZE0wM1RQMVl0SGgKelJucDdoaFBURml1NGg3V0RGc1ZXdGc2dU1RWVpCN2pNN0sxaVhkT0RML1psR3NUbDI4U28vNlpxUVRNRmV4Z2FEYnRDSHUzOWIrVAo3V1l4ZzR6R2NUU0hUaGZxcjR1UmpSeFdRYTRpTjE0MzhoM1owUzBOTDJsUnA3NW1wb282S3IzSEdySGhGUEMrT2gyNXoxdXhhdjYwCnNVWWdvdnNlTzNEdms1aDlqSE9XOHNYdmhYQ3RLU2I4SGdRK0hLRFlEOHRTZzJKODdvdFRsWkNwVjZMcVlRWFkrVTNFSi9wdXJlMzUKMTFIM2E2VUNBd0VBQWFPQ0FTUXdnZ0VnTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5PVWlreGlFeW9aTHN5dgpjb3A5TnRlYUhOeG5NQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0IzUVlEVlIwZkJJSFZNSUhTTUlHSG9JR0VvSUdCaG45c1pHRndPaTh2ClpHbHlaV04wYjNKNUxtUXRkSEoxYzNRdWJtVjBMME5PUFVRdFZGSlZVMVFsTWpCU2IyOTBKVEl3UTJ4aGMzTWxNakF6SlRJd1EwRWwKTWpBeUpUSXdSVllsTWpBeU1EQTVMRTg5UkMxVWNuVnpkQ1V5TUVkdFlrZ3NRejFFUlQ5alpYSjBhV1pwWTJGMFpYSmxkbTlqWVhScApiMjVzYVhOME1FYWdSS0JDaGtCb2RIUndPaTh2ZDNkM0xtUXRkSEoxYzNRdWJtVjBMMk55YkM5a0xYUnlkWE4wWDNKdmIzUmZZMnhoCmMzTmZNMTlqWVY4eVgyVjJYekl3TURrdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUEwN1h0YVBLU1VpTzhhRVhVSEw3UCsKUFBvZVVTYnJoL1lwM3VEeDFNWWtDZW5CejFVYnRERFp6aHIrQmxHbUZhUXQ3N0pMdnlBb0pVblJwalozTk9oazMxS3hFY2R6ZXMwNQpuc0t0akhFaDhscHJyOTg4VGxXdnNvUmxGSW01ZDhzcU1iN1BvMjNQYjBpVU1rWnY1M0dNb0thRUdUY0g4Z05GQ1N1R2RYemZYMmxYCkFOdHUyS1p5SWt0UTFIV1lWdCszR1A5RFExQ3Vla1I3OEhsUjEwTTlwOU9CMC9ESlQ3bmF4cGVHMElMRDVFSnQvckRpWkU0T0p1ZEEKTkNhMUNJblhDR05qT0NkMUhqUHFicWpkbjVsUGRFMkJpWUJMM1pxWEtWd3Z2b0ZCdVl6LzZuMWdCcDdOMXozVExxTVZ2S2ptSnVWdgp3OXk0QXlIcW54YnhMRlMxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNBIERpc2lnIFJvb3QgUjIKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFUQ0NBMUdnQXdJQkFnSUpBSks0aU51d2lzRmpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GSXhDekFKQmdOVkJBWVRBbE5MTVJNdwpFUVlEVlFRSEV3cENjbUYwYVhOc1lYWmhNUk13RVFZRFZRUUtFd3BFYVhOcFp5QmhMbk11TVJrd0Z3WURWUVFERXhCRFFTQkVhWE5wClp5QlNiMjkwSUZJeU1CNFhEVEV5TURjeE9UQTVNVFV6TUZvWERUUXlNRGN4T1RBNU1UVXpNRm93VWpFTE1Ba0dBMVVFQmhNQ1Uwc3gKRXpBUkJnTlZCQWNUQ2tKeVlYUnBjMnhoZG1FeEV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScApjMmxuSUZKdmIzUWdVakl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2lvOFFBQ2RhRlhTMXRGUGJDCnczT2VOY0p4Vlg2Qis2dEdVT0RCZkVsNDVxdDVXRHphLzN3Y245aVhBbmcrYTBFRTZVRzl2Z01zUmZZdlpOU3JYYU5IUFdTYjZXaWEKeHN3YlA3cStzb3MwQWk2WVZSbjhqRytxWDlwTXprMERJYVBZMGpTVFZwYkxUQXdBRmp4ZkdzM0l4MnltcmRNeHA3em81ZUZtMXRMNwpBN1JCWmNrUXJnNEZZOGFBYW1rdy9kTHVrTzhOSjkrZmxYUDA0U1hhYkJiZVFUZzA2b3Y4MGVnRUZHRXRRWDZzeDNkT3kxRlUrMTZTCkdCc0VXbWpHeWNUNnR4T2dtTGNSSzdmV1Y4eDhuaGZSeXlYK2hrNGtMbFlNZUUyZUFSS21LNmNCWlc1OFloMkVoTi9xd0d1MXBTcVYKZzhOVEVReHpIUXV5UnBEUlFqck9RRzZWcmYvR2xLMXVsNFNPZlcrZWlvQU5TVzF6NG51U0hzUHp3ZlByTGdWdjJSdlBOM1lFeUxSYQo1QmVueTkxMkg5QVpkdWdzQmJQV25EVFlsdHhoaDVFRjVFUUlNOEhhdVFobDFLNnlOZzNydWppNkRPV2JudXVOWnQyWno5YUpRZllFCmtvb3BLVzFyT2h6bmRYMENjUTd6d09lOXl4bmRuV0N5d21aZ3RyRUU3c25taHJtYVprQ281eEh0Z1VVRGkvWm5XZWpCQmhHOTNjK0EKQWs5bFFIaGNSMURJbStZZmdYdmtSS2hiaFpyaTNsclZ4L2s2UkdaTDVESlVmT1JzbkxNT1BSZWlzalFTMW42eXFFbTcwWG9vUUw2aQpGaC9mNURjZkVYUDdrQXBsUTZJTmZQZ0dBVlV6ZmJBTnVQVDFycVZDVjN3MkVZeDdYc1FEbll4NW5RSURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV0Wm40cjdDVTllTWcxZ3F0ems1V3BDNXUKUXUwd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFDWUdYbkRuWlRQSWdtN1puQmM2RzNwbXNnSDJlRHRwWGkvcS8wNzVLTU9ZS21GTQp0Q1FTaW4xdEVSVDNuTFhLNXJ5ZUo0NU1HY2lwdlhyQTF6WU9iWVZ5YnFqR29tMzIrbk5qZjd4dWVRZ2NuWXFmR29wVHB0aTcyVFZWCnNSSEZxUU96Vmp1NWhKTWlYbjdCOWhKU2krb3NaN3orTmt6MXVNL1JzMG1TTzlNcERwa2JsdmRodUR2RUs3WjRiTFFqYi9EOTA3SmUKZFIrWmxhaXM5dHJoeFRGNys5RkdzOUs4WjdSaVZMb0o5Mk93azZLYStlbFNMb3RnRXF2ODlXQlc3eEJjaThRYVF0eURXMlFPeTdXOAoxay9CZkR4dWpSTnQrM3ZyTU5EY1RhL0YxYmFsVEZ0eHllZ3h2dWc0QmtpaEd1THEwdDRTT1ZnYS80QU9nblhtdDhrSGJBN3Yvemp4Cm1ISEV0MzhPRmRBbGFiMGluU3Z0QmZaR1I2enR3UERVTytMczdwWmJrQk5PSGxZNjY3RHZscnVXSXhHNjhrT0dkR1NWeUNoMTN4MDEKdXRJM2d6aFRPRFk3ejJ6cCtXc08wUHNFNkU5MzEyVUJlSVlNZWo0aFl2Ri9ZM0VNeVo5RTI2Z25vblcrYm9FKzE4RHJHNWdQY0Z3MApzb3JNd0lVWTYyNTZzL2Rhb1FlL3FVS1M4MkFpbCtRVW9RZWJUbmJBam4zOXBDWEhSKzMvSDNPc3pNT2w2VzhLanB0bHdsQ0Z0YU9nClV4TE1WWWRoODRHdUVFWmh2VVFodU1JOWRNOStKRFg2SEFjT216MGl5dTh4TDR5c0VyM3ZRQ2o4S1dlZnNoTlBaaVRFVXhucEhpa1YKNytadHNIOHRaLzN6YkJ0MVJxUGxTaGZwcE5jTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQ0NWUkFJWjEKPT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIMHpDQ0JidWdBd0lCQWdJSVhzTzNwa04vcE9Bd0RRWUpLb1pJaHZjTkFRRUZCUUF3UWpFU01CQUdBMVVFQXd3SlFVTkRWbEpCClNWb3hNUkF3RGdZRFZRUUxEQWRRUzBsQlEwTldNUTB3Q3dZRFZRUUtEQVJCUTBOV01Rc3dDUVlEVlFRR0V3SkZVekFlRncweE1UQTEKTURVd09UTTNNemRhRncwek1ERXlNekV3T1RNM016ZGFNRUl4RWpBUUJnTlZCQU1NQ1VGRFExWlNRVWxhTVRFUU1BNEdBMVVFQ3d3SApVRXRKUVVORFZqRU5NQXNHQTFVRUNnd0VRVU5EVmpFTE1Ba0dBMVVFQmhNQ1JWTXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2JxYXUvWVVxWHJ5K1hacHAwWDlEWmx2M1A0dVJtN3g4ZlJ6UENSS1BmbXQ0ZnRWVGRGWHhwTlJGdnU4Z00Kam1vWUh0aVAyUmE4RUVnMlhQQmpzNUJhWENRMzE2UFd5d2x4dWZFQmNvU3dmZHROZ00zODAyL0orTnEyRG9MU1JZV29HMmlvUGVqMApSR3k5b2NMTEE3Nk1QaE1BaE45S1NNRGpJZ3JvNlRlbkdFeXhDUTBqVm44RVRka1hoQmlseU5wQWxIUHJ6ZzVYUEFPQk9wMEtvVmRECmFheFhiWG1RZU9XMXREdll2RXlOS0tHbm82ZTZBazRsMFNxdTdhNERJcmhySUE4d0tGU1ZmK0R1emdwbW5kRkFMVzRpcjUwYXdRVVoKMG0vQThwLzRlN01DUXZ0UXFSMHRrdzhqcThiQkQ1TC8wS0lWOVZNSmNSei9SUk9FNWlaZStPQ0lIQXI4RnJhb2N3YTQ4R09FQXFERwpXdXpuZE45d3JxT0RKZXJXeDVlSGs2Zkdpb296bDJBM0VENlhQbTRwRmRhaEQ5R0lMQktmYjZxa3hrTHJRYUxqbFVQVEFZVnRqcnM3Cjh5TTJ4LzQ3NEtFbEIwaXJ5WWwwL3dpUGdML0FsbVh6N3V4TGFMMmRpTU14czBEeDZNLzJPTHVjNU5GLzFPVlltM3o2MVBNT20zV1IKNUxwU0xobCswZlhOV2huOHVnYjIrMUtvUzVrRTNmajV0SXRRbzA1aWlmQ0hKUHFEUXNHSCt0VXRLU3BhY1hwa2F0Y25ZR01OMjg1Sgo5WTBma0lreUYvaHpRN2pTV3BPR1lkYmhkUXJxZVdaMmlFOXg2d1FsMWdwYWVwUGx1VXNYUUEreHRybjEzay9jNExPc094RndZSVJLClEyNlpJTUFwY1FyQVpRSURBUUFCbzRJQ3l6Q0NBc2N3ZlFZSUt3WUJCUVVIQVFFRWNUQnZNRXdHQ0NzR0FRVUZCekFDaGtCb2RIUncKT2k4dmQzZDNMbUZqWTNZdVpYTXZabWxzWldGa2JXbHVMMEZ5WTJocGRtOXpMMk5sY25ScFptbGpZV1J2Y3k5eVlXbDZZV05qZGpFdQpZM0owTUI4R0NDc0dBUVVGQnpBQmhoTm9kSFJ3T2k4dmIyTnpjQzVoWTJOMkxtVnpNQjBHQTFVZERnUVdCQlRTaDdUajN6Y25rMVgyClZ1cUI1VGJNakI0L3ZUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTktIdE9QZk55ZVRWZlpXNm9IbE5zeU0KSGorOU1JSUJjd1lEVlIwZ0JJSUJhakNDQVdZd2dnRmlCZ1JWSFNBQU1JSUJXRENDQVNJR0NDc0dBUVVGQndJQ01JSUJGQjZDQVJBQQpRUUIxQUhRQWJ3QnlBR2tBWkFCaEFHUUFJQUJrQUdVQUlBQkRBR1VBY2dCMEFHa0FaZ0JwQUdNQVlRQmpBR2tBOHdCdUFDQUFVZ0JoCkFPMEFlZ0FnQUdRQVpRQWdBR3dBWVFBZ0FFRUFRd0JEQUZZQUlBQW9BRUVBWndCbEFHNEFZd0JwQUdFQUlBQmtBR1VBSUFCVUFHVUEKWXdCdUFHOEFiQUJ2QUdjQTdRQmhBQ0FBZVFBZ0FFTUFaUUJ5QUhRQWFRQm1BR2tBWXdCaEFHTUFhUUR6QUc0QUlBQkZBR3dBWlFCagpBSFFBY2dEekFHNEFhUUJqQUdFQUxBQWdBRU1BU1FCR0FDQUFVUUEwQURZQU1BQXhBREVBTlFBMkFFVUFLUUF1QUNBQVF3QlFBRk1BCklBQmxBRzRBSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFZUUJqQUdNQWRnQXVBR1VBY3pBd0JnZ3JCZ0VGQlFjQ0FSWWsKYUhSMGNEb3ZMM2QzZHk1aFkyTjJMbVZ6TDJ4bFoybHpiR0ZqYVc5dVgyTXVhSFJ0TUZVR0ExVWRId1JPTUV3d1NxQklvRWFHUkdoMApkSEE2THk5M2QzY3VZV05qZGk1bGN5OW1hV3hsWVdSdGFXNHZRWEpqYUdsMmIzTXZZMlZ5ZEdsbWFXTmhaRzl6TDNKaGFYcGhZMk4yCk1WOWtaWEl1WTNKc01BNEdBMVVkRHdFQi93UUVBd0lCQmpBWEJnTlZIUkVFRURBT2dReGhZMk4yUUdGalkzWXVaWE13RFFZSktvWkkKaHZjTkFRRUZCUUFEZ2dJQkFKY3hBcC9uL1VOblNFUVU1Q21IN1V3b1p0Q1BOZHBOWWJkS2wwMjEyNURnQlM0T3hublE4cGRwRDcwRQpSOW0rMjdVcDJwdlpycW1aMWRNOE1KUDFqYUdvL0FhTlJQVEtGcFY4TTl4aWk2ZzMrQ2ZZQ1MwYjc4Z1VKeUNwWkVUL0x0WjFxbXhOCllFQVpTVU5VWTlyaXpMcG01VTlFZWx2WmFvRXJRTlYvK1FFbldDekk3VWlSZkQrbUFNL0VLWE1STnQ2R0dUNmQ3aG1LRzlXdzdZNDkKbkNyQURkZzladU04RGIzVmxGemk0cWMxR3dRQTlqOWFqZXBEdlYrSkhhbkJzTXlaNGswQUN0ckpKMXZuRTVCYzVQVXpvbFZ0M09BSgpUUyt4SmxzbmRRQUp4R0ozS1FoZm5sbXN0bjZ0bjFRd0lnUEJIbkZrL3ZrNENwWVkzUUlVckNQTEJod2VwSDJORGQ0blFlaXQyaFczCnNDUGRLNmpUMmlXSDdlaFZSRTJJOURaK2hKcDRyUGNPVmtrTzFqTWwxb1JRUW13Z0VoMHExYjY4OG5DQnBIQmd2Z1cxbTU0RVJMNWgKSTZ6cHBTU01FWUNVV3FLaXVVblN3ZHpScCsweEVTeWVHYWJ1NFZYaHdPclBEWVRrRjdlaWZLWGVWU1VHN3N6QWgxeEEyc3lWUDFYZwpOY2U0aEw2MFhjMTZnd0Z5N29mbVh4MnV0WVhHSnQvbXdacnBIZ0pIbnlxb2JhbGJ6K3hGZDMrWUo1b3lYU3JqaE83Rm1HWXZsaUFkCjNkakRKOWV3K2Y3WmZjM1FuNDhMRkZoUm55K0x3emd0M3VpUDFvMkhwUFZXUXhhWkxQU2tWclEwdUdFM3ljSllnQnVnbDZIOFdZM3AKRWZiUkQwdFZORVlxaTRZNwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUV0NBIEdsb2JhbCBSb290IENBCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lDREw0d0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0dBMVVFQmhNQ1ZGY3hFakFRQmdOVkJBb1QKQ1ZSQlNWZEJUaTFEUVRFUU1BNEdBMVVFQ3hNSFVtOXZkQ0JEUVRFY01Cb0dBMVVFQXhNVFZGZERRU0JIYkc5aVlXd2dVbTl2ZENCRApRVEFlRncweE1qQTJNamN3TmpJNE16TmFGdzB6TURFeU16RXhOVFU1TlRsYU1GRXhDekFKQmdOVkJBWVRBbFJYTVJJd0VBWURWUVFLCkV3bFVRVWxYUVU0dFEwRXhFREFPQmdOVkJBc1RCMUp2YjNRZ1EwRXhIREFhQmdOVkJBTVRFMVJYUTBFZ1IyeHZZbUZzSUZKdmIzUWcKUTBFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN3QmR2STY0ekVib29oNzQ1Tm5IRUtIMUp3N1cyQwpuSmZGMTB4T1JVbkxRRUsxRWpSc0djSjBwREZmaFFLWDdFTXpDbFBTbkl5T3Q3aDUyeXZWYXZLT1pzVHVLd0VIa3RTejBBTGZVUFpWCnIyWU95K0JIWUM4ck1qazFVam9vZy9oN0ZzWVl1R0xXUnlXUnp2QVpFazJ0WS9YVFAzVmZLZkNoTUJ3cW9KaW1GYjN1L1JrMjhPS1IKUTQvNnl0WVFKMGxNNzkzQjhZVndtOHJxcUZwRC9HMkdiM1BwTjBXcDhEYkh6SWgxSHJ0c0J2K2JhejRYN0dHcWNYekdIYUwzU2VrVgp0VHpXb1dIMUVmY0ZieDM5RWI3UU1BZkNLYkFKVGliYzQ2S29rV29md3BGRmlGemxtTGh4cFJVWnlYeDFFY3h3ZEU4dG14MlJSUDFXCktLRCt1NFpxeVBwY0MxamN4a3QyeUtzaTJYTVBwZlJhQW9rL1Q1NGlndTZpZEZNcVBWTW5hUjFzampJc1pBQW1ZMkUyVHFOR3R6OTkKc3kyc2JaQ2lsYUxPejlxQzV3YzBHWmJwdUNHcUtYNm1PTDZPS1VvaFpua2ZzOE8xQ1dmZTF0UUhSdk1xMnVZaU4yRExnYllQb0EvcAp5SlYvdjFXUkJYclBQUlhBYjk0SmxBR0QxelFiekVDbDhMaWJaOVdZa1R1bmhIaVZKcVJhQ1BncmRMUUFCRHpmdUJTTzZOK3BqV3huCmtqTWR3TGZTN0pMSXZnbS9MQ2tGYndKcm51Kzh2eXE4VzhCUWowRndjWWV5VGJjRXFZU2pNcSt1N21zWGk3S3gvbXpoa0l5SXFKZEkKenNoTnkvTUd6MTlxQ2tLeEhoNTNMNDZnNXBJT0J2d0ZJdEltNFRGUmZUTGNEd0lEQVFBQm95TXdJVEFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWHpTQmR1K1dIZFhsdGRrQ1k0UVd3YTZnCmNGR245MHhITmNnTDF5ZzlpWEhacWpOQjZoUWJiQ0VBd0d4Q0dYNmZhVnNnUXQraTB0ckVmSmRMamJEb3JNanVwV2tFbVFxU3Bxc24KTGhwTmdiK0UxSEFlclVmKy9VcWRNK0R5dWNSRkNDRUsybWxwYzNJTnZqVCtsSXV0d3g0MTE2S0Q3K1U0eDZXRkg2dlBOT3cvS1A0TQo4VmVHVHNsVjl4elUyS1Y5Qm5wdjFkOFEzNEZPSVdXeHR1RVhlWlZGQnM1ZnpOeEdpV05vUkkyVDlHUndvRDJkS0FYRE9YQzRZbnNnCi9lVGI2UWlodUo0OUNjZFAreXo0azNaQjNsTGc0VmZTblFPOGQ1NytuaWxlOThGUllCL2UyZ3V5TFhXM1EwaVQ1L1o1eG9SZGdGbGcKbFB4NG1JODhrMUh0UUpBSDMyUmpKTXRPY1FXaDE1UWFpREx4SW5RaXJxV20yQkpwVEdDakF1NHI3TlJqa2d0ZXZpOTJhNk8ySnJ5UApBOWdLOGt4a1JyMDVZdVdXNnpSakVTak1sZkd0NysvY2dGaEk2VXU0Nm1XczZmeUF0YlhJUmZtc3daL1p1ZXBpaUk3RThVdURFcTNtCmk0VFduc0xyZ3hpZmFyc2JKR0F6Y016czl6THpYTmw1ZmUrZXBQN0pJOE1rN2hXU3NUMlJUeWFHdldaekpCUHFwSzVqd2ExOWhBTTgKRUhpR0czbmp4UFB5QkpVZ3JpT0N4TE02QUdLLzVqWWs0VmU2eHg2UWRkVmZQNVZoSzhFN3plV3phR0hRUmlhcElWSnBMZXN1eCt0Mwp6cVk2dFFNelQzYlI1MXhVQVYzTGVQVEpETC9QRW80WExTTm9sT2VyL3FteUt3YlFCTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRlbGlhU29uZXJhIFJvb3QgQ0EgdjEKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRk9EQ0NBeUNnQXdJQkFnSVJBSlcrRnFEM0xrYnhlem1DY3ZxTHpaWXdEUVlKS29aSWh2Y05BUUVGQlFBd056RVVNQklHQTFVRQpDZ3dMVkdWc2FXRlRiMjVsY21FeEh6QWRCZ05WQkFNTUZsUmxiR2xoVTI5dVpYSmhJRkp2YjNRZ1EwRWdkakV3SGhjTk1EY3hNREU0Ck1USXdNRFV3V2hjTk16SXhNREU0TVRJd01EVXdXakEzTVJRd0VnWURWUVFLREF0VVpXeHBZVk52Ym1WeVlURWZNQjBHQTFVRUF3d1cKVkdWc2FXRlRiMjVsY21FZ1VtOXZkQ0JEUVNCMk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1LKwo2eWZ3SWFQemFTWlZmcDNGVlJhUlhQM3ZJYjlUZ0hvdDBwR01Zekh3N0NUd3c2WFNjbndRYmZRM3QrWG1mSG5xakxXQ2k2NUl0cXdBCjNHVjE3Q3BOWDhHSDlTQmxLNEdvUno2Skk1VXdGcEIvNkZjSFNPY1pycjlGWjdFM0d3WXEvdDc1ckgyRCsxNjY1SStYWjc1TGpvMWsKQjFjNFZXazBOajBUU085UDR0Tm1IcVRQR3JkZU5qUFV0QWE5R0FIOWQ0UlFBRVgxakYzb0k3eCsvalhoN1ZCN3FUQ05HZE1Kam1obgpYYjg4bHhoVHV5bGl4Y3BlY3NISGx0VGJMYUMwSDJrRDdPcmlVUEVNUFBDczgxTXQ4QnoxN1d3NU9YT0FGc2hTc0NQTjREN2MzVHhICm9MczFpdUtZYUl1KzViOXk3dEw2cGUwUzdmeVlHS2ttZHR3b1N4QWdITk4vRm5jdDdXK0E5MG03VXdXN1hXakgxTWgxRmorSldvdjMKRjBmVVRQSFNpWGsrVFQyWXFHSGVPaDdTK0Y0RDRNSEpISXpUalUzVGxUYXpOMTlqWTVzekZQQXRKbXRUZkltTU1zSnU3RDBoQURuSgpvV2ppVUlNdXNEb3I4emFnckMva2IySENVUWs1UG90VHVidG4ydHhUdVhaWk5wMUQ1U0RnUFRKZ2hTSlJ0OGN6dTkwVkw2UjRwZ2Q3CmdVWTJCSWJkZVRYSGxTdzdzS01YTmVWekg3UmNXZS9hNmhCbGUzclFmNSt6dENvM08zQ0xtMXU1Szdmc3NsRVNsMU1wV3RUd0VoRGMKVHdLN0VwSXZZdFEvYVVOOERkYjhXSFVCaUoxWUZrdmV1cEQvUndHSkJtcjJYN0tRYXJNQ3BnS0l2N05IZmlyWjFmcG9lRFZOQWdNQgpBQUdqUHpBOU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlR3ajFrNEFMUDFqNXFXCkROWHIrbnVxRitnVEVqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUF2dVJjWWs0azlBd0kvL0RUREdqa2swa2lQMFFuYjd0dDNvTm0KenFqTURmejFtZ2JsZHhTUjY1MUJlNWtxaE9YLy9DSEJYZkRrSDFlM2RhbWhYd0ltLzlmSDkwN2VUL2ozSEViQWVrOUFMQ0kxOEJteAowR3RuTExDbzRNQkFOelgyaEZ4YzQ2OUNlUDZueVExUTZnMkVkdlpSNzROVHhuci9EbFpKTG85NjFnem1KMVRqVFFwZ2NtTE5rUWZXCnBiL0ltV3Z0eEJubXEwd1JPTVZ2TWVKdVNjZy9kb0FtQXlZcDREYjI5aUJUNHhkd05CZWRZMmdlYSt6RFRZYTRFekF2WFVZTlIwUFYKRzZwWkRybGNqUVpJclhTSFg4ZjhNVlJCRStMSElRNmU0QjRONGNCN1E0V1F4WXBZeG1VS2VGZnl4aU1QQWRrZ1M5NFArNUtGZFNwYwpjNDF0ZXlXUnl1NUZyZ1pMQU16VHNWbFEyanFJT3lsRFJsNlhLMVRPVTIrTlN1ZVcrcjl4RGtLTGZQMG9vTkJJeXRyRWdVeTdvbk9UCkpzanJETlltaUxiQUpNKzd2VnZyZFgzcENJNkdNeXg1ZHdscHBZbjhzM0NRaDNhUDB5SzdRczY5Y3dzZ0ppclFtejF3SGlSc3pZZDIKcVJlV3Q4OE5rdnVPR0ttWVNkR2UvbUJFY2lHNUdlM0M5VEh4T1VpSWtDUjFWQmF0enZUNGFSUmtPZnVqdUxwd1FNY25ITC9FVmxQNgpZMlhROHh3T0Z2VnJobGhOR05Ua0RZNmxuVnVSM0hZa1VEL0dLdnZadDV5MTF1YlEyZWdaaXhWeFNLMjM2dGhaaU5TUXZ4YXoyZW1zCldXRlV5Qnk2eXNISzRia2dUSTg2azRtbG9NeS8wL1oxcEhXV2JWWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NCklsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlUKY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdIaGNOTURneApNREF4TVRBME1ERTBXaGNOTXpNeE1EQXhNak0xT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6CmRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkQKWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxWDlvYlgraHprZVhhWFBTaTVrZmw4MmhWWUFVZEFxU3ptMW56SG9xdk5LMzhEY0xaClNCbnVhWS9KSVB3aHFnY1o3YkJjckdYSFgrMENmSHQ4TFJ2V3VybUF3aGlDRm9UNlpyQUl4bFFqZ2VUTnVVay85azl1TjBnb09BL0YKdnVkb2NQMDVsMDNTeDVpUlVLckVSTE1qZlRsSDZWSmkxaEtUWHJjeGxrSUYrM2FuSHFQMXd2enBlc1ZzcVhGUDZzdDR2R0N2eDk3MAoyY3UrZmpPbGJwU0Q4RFQ2SWF2cWpuS2dQNlRlTUZ2dmhrMXFsVnREUktnUUZSemxBVmZGbVBIbUJpaVJxaURGdDFNbVVVT3lDeEdWCldPSEFEM2Jad0kxOGdmTnljSjV2L2hxTzJWODF4ckp2Tkh5K1NFL2lXam5YMkoxNG5wK0dQZ05lR1l0RW90WEhBZ01CQUFHalFqQkEKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMvV1NBMkFIbWdvQ0pyak5YeQpZZEs0TE11Q1NqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFNUU9pWVFzZmRPaHlOc1p0K1UyZStpS280WUZXejgyN24rcXJrUms0CnI2cDhGVTN6dHFPTnBmU085a1NwcCtnaGxhMCtBR0lXaVBBQ3V2eGhJK1l6bXpCNmF6WmllNjBFSTRSWVplTGJLNHJuSlZNM1lsTmYKdk5vQllpbWlwaWR4NWpvaWZzRnZIWlZ3SUVvSE5OL3EveFdBNWJyWGV0aGJkWHdGZWlsSGZrQ29NUk4zelVBN3RGRkhlaTRSNDBjUgozcDFtMEl2VlZHYjZnMVhxZk1JcGlSdnBiN1BPNGdXRXlTOCtlSVZpYnNsZndYaGpkRmpBU0JnTW1UbnJwTXdhdFhsYWpSV2MyQlFOCjlub0hWOGNpZ3dVdFBKc2xKajBZczZsRGZNaklxMlNQRHFPL25CdWRNTnZhMEJrdXFqengrek9BZHVUTnJSbFBCU2VPRTZGdXdnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQXRvcyBUcnVzdGVkUm9vdCAyMDExCj09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUlYRFBMWWl4ZnN6SXdEUVlKS29aSWh2Y05BUUVMQlFBd1BERWVNQndHQTFVRUF3d1ZRWFJ2Y3lCVQpjblZ6ZEdWa1VtOXZkQ0F5TURFeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzd0NRWURWUVFHRXdKRVJUQWVGdzB4TVRBM01EY3hORFU0Ck16QmFGdzB6TURFeU16RXlNelU1TlRsYU1Ed3hIakFjQmdOVkJBTU1GVUYwYjNNZ1ZISjFjM1JsWkZKdmIzUWdNakF4TVRFTk1Bc0cKQTFVRUNnd0VRWFJ2Y3pFTE1Ba0dBMVVFQmhNQ1JFVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDVgpoVHVYYnlvN0xqdlBwdk1wTmI3UEdLdytxdG40VGFBK0drZTV2SnJmOHY3TVBrZm9lcGJDSkk0MTlLa00vSUw5YmNGeVlpZTk2bXZyCjU0ck1WRDZRVU0rQTFKWDc2TFdDMUJURnRxbFZKVmZic1ZEMnNHQmtXWHBwendPM2J3Mit5ajV2ZEhMcXFqQXFjMksrU1pGaHlCSCsKRGdNcTkyb2czQUlWRFY0VmF2empnc0cxeFoxa0NXeWpXWmdISjhjYmxpdGhkSEZzUS9IM05Za1E0SjdzVmFFM0lxS0hCQVVzUjMyMApITGxpS1dZb3lyZmhrL1drbEFPWnVYQ0Z0ZVpJNm8xUS9ObmV6RzhIRHQwTGNwMkFNQllIbFQ4b0R2M0ZkVTlUMW5TYXRDUXVqZ0tSCnozYkZteDVWZEp4NEliSHdMZkVMbjhMVmxoZ2Y4RlFpZW93SEFnTUJBQUdqZlRCN01CMEdBMVVkRGdRV0JCU25wUWF4TEtZSllPN1IKbCtsd3JydzdHV3piSVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLZWxCckVzcGdsZzd0R1g2WEN1dkRzWgpiTnNoTUJnR0ExVWRJQVFSTUE4d0RRWUxLd1lCQkFHd0xRTUVBUUV3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCCkN3VUFBNElCQVFBbWR6VGJsRWlHS2tHZExENEdrR0RFakt3TFZMZ2Z1WHZUQnpuaytqNTdzajFPN1o4anZaZnphMXp2N3YxQXB0K2gKazZFS2hxenZJTkI1QWIxNDl4bllKREUwQkFHbXVoV2F3eWZjMkU4UHpCaGovNWtQRHBGcmRSYmhJZnpZSnNkSHQ2YlBXSEp4ZnJyaApUWlZITzhtdmJhRzB3ZXlKOXJRUE9MWGlaTndsejZiYjY1cGNtYUhGQ043OTV0clYxbHBGRE1TM3dyVVU3N1FSL3c0VnRmWDEyOGE5CjYxcW44RllpcVR4bFZNWVZxTDJHbnMyRGxtaDZjWUdKNFF2aDZoRWJhQWpNYVo3c25rR2VSREltZXVLSENuRTk2K1JhcE5MYnhjM0cKM21CL3VmTlBSSkx2S3JjWVBxY1oyUXQ5c1RkQlFyQzZZQjN5L2drUnNQQ0hlNmVkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMSBHMwo9PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVZUZoZkxxMHNHVXZqTndjMU5CTW90WmJVWlpNd0RRWUpLb1pJaHZjTkFRRUxCUUF3U0RFTE1Ba0cKQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBY0JnTlZCQU1URlZGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ01TQkhNekFlRncweE1qQXhNVEl4TnpJM05EUmFGdzAwTWpBeE1USXhOekkzTkRSYU1FZ3hDekFKQmdOVkJBWVRBa0pOCk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklERWcKUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNndmxBUWp1bnliRUMwQkp5RnVUSEszQzNrRWFrRQpQQnRWd2VkWU1CMGt0TVB2aGQ2TUxPSEJQZCtDNWsrdFI0ZHM3RnRKd1VyVnU0L3NoNngvZ3BxRzdEMERtVklCMGpXZXJOcndVOGxtClBOU3NBZ0hhSk5NN3FBSkdyNlFjNC9oeldIYTM5ZzZRRGJYd3o4ejYrY1pNNWNPR01BcU5GMzQxNjhYZnV3NmN3STJINDRnNGhXZjYKUHNlcjRCT2NCUmlZejVQMXNaSzAvQ1BUejlYRUowbmduanliQ0tPTFhTb2g0UHc1cWxQYWZYN1BHZ2xUdkYwRkJNK2hTbytMZG9JTgpvZmpTeHhSM1c1QTJCNEdiUGdiNlVsNWp4YVlBL3FYcFVodFN0Wkk1Y2dNSllyMndZQlp1cHQwbHdnTm0zZk1FMFVEaVRvdUc5Ry9sCmc2QW5oRjRFd2ZXUXZUQTl4TytvYWJ3NG02U2tsdEZpMm1uQUFaYXV5OFJSTk9vTXF2OGhqbG1QU2x6a1lacW4wdWtxZUkxUlBUb1YKN3FKWmpxbGMzc1g1a0NMbGlFVngzWkdaYkhxZlBUMllmRjcydmhab29GNnVDeVA4V2crcUluWXR5YUVRSGVUVFJDT1FpSi9HS3ViWAo5WnF6V0I0dk1Ja0lHMVNpdFpnajdBaDNISlZkWWRITGlaeGZva3FSbXU4aHFra1dDS2k5WVNneHlYU3RoZmJaeGJHTDBlVVFNazFmCml5QTZQRWtmTTRWWkRkdkxDWFZEYVhQN2EzRjk4Ti9FVEgzR295N0lsWG5MYzZLT1RrMGsrMTdrQkw1eUc2WW5MVWxhbVhyWFhBa2cKdDMrVXVVL3hEUnhlaUVJYkViZm5rZHVlYlBScTM0d0dtQU90ekNqdnBVZnpVd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVbzVmVzgxNmlFT0dyUlo4OEYyUTg3Z0Z3bk13d0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBQmo2VzNYOFBuckhYM2ZIeXQvUFg4TVN4RUJkMURLcXVHclgxUlVWUnBnanBlYVFXeGlaVE9PdFFxT0MKTVRhSXplbjd4QVNXU0lzQng0MEJ6MXN6QnBaR1puUWRUKzNCdHJtMERXSE1ZMzdYTG5lTWxod3FJMmhyaFZkMmNETVQvdUZQcGlOMwpHUG9hak9pOVpjblBQL1RKRjl6cng3ekFCQzR0Umk5cFpzTWJqLzdzUHRQS2xMOTJDaVVOcVhzQ0hLblFPMThMd0lFNlBXVGh2NmN0ClRyMU54TmdweGlJWTBNV3NjZ0tDUDZvNm9qb2lsekhkQ0dQRGRSUzVZQ2d0VzJqZ0ZxbG1naU5SOWV0VDJER2JlK20zblV2cmlCYlAKK1YwNGlra3dqKzN4NnhuMGR4b3hHRTFuVkd3dmIyWDUyejNzSWV4ZTlQU0x5bUJsVk5GeFpQVDVwcU9CTXpZemNmQ2tlRjlPcllNaAozalJKamVoWnJKM3lkbG8yOGhQMHIrQUp4MkVxYlBmZ25hNjdoa29vYnk3dXRIbk5rRFBEczNiNjlmQnNuUUdRK3A2UTlweHl6MGZhCnd4L2tOU0JUOGxUUjMyR0RwZ0xpSlRqZWhUSXRYbk9RVWwxQ3hNNDlTK0g1R1lRZDFhSlF6RUg3UVJURHZkYkpXcU5qWmdLQXZRVTYKTzBlYzdBQW1UUFdJVWIrb0kzOFlCN0FMN1lzbW9XVFRZVXJyWEovZXM2OW5BN01mM1cxZGFXaHBxMTQ2N0h4cHZNYzdoVTZlRmJtMApGVS9EbFhwWTE4bHM2V3k1OHlsalhyUXM4QzA5N1ZwbDRLbGJRTUpJbVlGdG5oOEdLandTdElzUG02SWs4S2FOMW5yZ1M3WmtsbU9WCmhNSkt6Und1SkljellPWEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQSAyIEczCj09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVSRmMwSkZ1QmlaczE4czY0S3p0YnB5YndkU2d3RFFZSktvWklodmNOQVFFTEJRQXdTREVMTUFrRwpBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTWlCSE16QWVGdzB4TWpBeE1USXhPRFU1TXpKYUZ3MDBNakF4TVRJeE9EVTVNekphTUVneEN6QUpCZ05WQkFZVEFrSk4KTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURJZwpSek13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2hyaVd5QVJqY1Y0Zy9SdXY1citMckkzSGltdEZoClppRmZxcThuVWVWdUd4YlVMWDFRc0ZOM3ZYZzZZT0prQXB0OGhwdldHbzZ0L3g4VmY5V1ZIaExMNWhTRUJNSGZOck1XbjRyanlkdVkKTk03WU14Y29SdnlueWZEU3ROVk5DWEpKK2ZLSDQ2bmFmYUY5YTdJNkphbHRVa1NzK0w1dSs5eW1jNUdRWWFZREZDRHk1NGVqaUsydApvSXovcGdzbFVpWG5GZ0hWeTdnMWdReWpPL0RoNGZ4YVhjNkFjVzM0U2FzK083cTQxNEFCKzZYclc3UEZYbUFxTWFDdk4rZ2dPcCtvCk1pd016QWtkMDU2T1hieE1tTzdGR21oNzdGT202UlExbzkvTmdKOE1TUHNjOVBHL1NyajYxWXh4U3NjZnJmNUJtck9EWGZLRVZ1K2wKVjBQT0thMk1xMVcveFB0YkFkMGpJYUZZQUk3RDBHb1Q3UlBqRWl1QTNHZm1sYkxOSGlKdUt2aEIxUExLRkFlTmlsVVN4bW4xdUlabwpMMU5lc05LcUljR1k1akRqWjFYSG0yNnNHYWhWcGtVRzBDTTYyK3RsWFNvUkVmQTdUOHB0OURURWNlVC9BRnIyWEs0allJVno4ZVFRCnNTV3UxWks3RThFTTREbmF0RGxYdGFzMXFuSWhPNE0xNXpIZmVpRnV1RElJZlIweWtSVktZbkxQNDNlaHZOVVJHM1lCWndqZ1FRdkQKNnhWdStLUVoyYUtycitJblVsWXJBb29zRkNUNXYwSUN2eWJJeG8vZ2JqaDlVeTNsN1ppemxXTm9mL2sxOU4rSXhXQTFrc0I4YVJ4aApsUmJRNjk0THJ6NEVFRVZsV0ZBNHIwanlXYllXOGp3TmtBTEdjQzRCclR3VjF3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVU3ZWR2ZGxxL1lPeEpXOGFsZDd0eUZuR2J4RDB3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFKSGZnRDlEQ1g1eHd2ZnJzNGlQNFZHeXZEMTErU2hkeUx5Wm0zdGRxdVhLNFFyMzZMTFRuOTFuTVg2NgpBYXJIYWtFN2tOUUlYTEpnYXBEd3lNNERZdm1MN2Z0dUt0d0dUVHdwRDRrV2lsaE1TQS9vaEdIcVBIS21kK1JDcm9palExaDVmcTdLCnBWTU5xVDF3dlNBWllhUnNPUHhETXVIQlIvLzQ3UEVSSWpLV25NTDJXMm1XZXlBTVEwR2FXL1paR1lqZVZZZzNVUXQ0WEFvZW8wTDkKeDUySUQ4RHllQUlrVkpPdmlZZUl5VXFBSGVyUWJqNWhMamE3TlE0bmx2MW1ORHRoY25QeEZseEhCbFJKQUhwWUVyQUs3NFg5c2JnegpkV3FUSEJMbVlGNXZIWC9KSHlQTGhHR2ZIb0pFK1YrdFlsVWttbEtZN1ZIbm9YNlhPdVl2SHhIYVU0QXNoWjZyTlJEYklsOXF4VjZYClUvSXlBZ2t3bzFqd0RRSFZjc2F4ZkdsN3cvVTJSY3hoYmw1TWxNVmVydWdPWG91Lzk4M2c3YUVPR3pQdVZCaitENzd2Zm9SclErTncKbU50ZGRiSU5XUWVGRlNNNTF2SGZxU1lQMWtqSHM2WWk5VE0zV3BWSG4zdTZHQlZ2LzlZVVpJTkowZ3BuSWRzUE5XTmdLQ0xqc1pXRAp6WVdtM1M4UDUyZFNicnN2aFh6MVNuUG54VDdBdlNFU0JULzh0d05KQWx2SUplYmlWRGoxZVllTUhWT3lUb1Y3QmpqSExQajRzSEtOCkplVjNVdlFESEVpbVVGK0lJREJ1OG9KRHF6MlhoT2RUK3lIQlR3OGltb2E0V1NyMlJ6MFppQzNvaGVHZTdJVUlhckZzTk1rZDdFZ3IKTzNqdFpzU09lV21EM24rTQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDMgRzMKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVUx2V2JBaWluMjNyLzFhT3A3cjBEb004U2FoMHdEUVlKS29aSWh2Y05BUUVMQlFBd1NERUxNQWtHCkExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWNCZ05WQkFNVEZWRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNeUJITXpBZUZ3MHhNakF4TVRJeU1ESTJNekphRncwME1qQXhNVEl5TURJMk16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTgpNUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRE1nClJ6TXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDenl3NFFaNDdxRkplbk1pb0tWalovYUV6SHMyODYKSXhTUi94bC9wY3FzN3JOMm5YcnBpeHVyYXpIYitndFRUSy9GcFJwNVBJcE0vNnpmSmQ1TzJZSXlDMFRleXR1TXJLTnVGb003cG1STApNb243RmhZNGZ1dEQ0dE4wU3NKaUNuTUszVW16VjlLd0NvV2RjVHplbzh2QU12TUJPU0JER3pYUlU3T3g3c1dUYVlJK0ZyVW9ScUhlCjZva0o3VU80QlVhS2h2VlpSNzRiYndFaEVMbjlxZElveWhBNUNjb1ROcytjcmExQWRIa3JBajgwLy9vZ2FYM1Q3bUgxdXJQbk1OQTMKSTRaeVlVVXBTRmxvYjNlbUxvRytCMDF2cjg3RVJST1JGSEFHangrZitJZHBzUTd2dzRrWjYrb2NZZng2YklyYzFnTUxuaWE2RXQzVQpWRG1ySnFNejZuV0IyaTNORDAva0E5SHZGWmNiYTVERkFwQ1RaZ0loc1VmZWk1cEtnTGxWajdXaUw4RFdNMmZhZnNTbnRBUkU2MGY3CjVsaTU5d3p3ZXl1eHdIQXB3MEJpTFR0SWFkd2pQRWpyZXdsNXFXM2FxRENZejRCeUE0aW1XMGF1Y25sOENBTWhaYTYzNFJ5bHNTcWkKTWQ1bUJQZkFkT2h4M3Y4OVdjeVdKaEtMaFpWWEdxdHJkUXRFUFJFb1BIdGh0K0tQWjAvbDdEeE1ZSUJwVnpnZUFWdU5WZWpIMzhETQpkeU0wU1hWODlwZ1I2eTNlN1VFdUZBVUNmK0QrSU9zMTV4R3NJczVYUGQ3Sk1HMFFBNFhOOGYrTUZyWEJzajZJYkdCL2tFK1Y5L1l0CnJRRTVCd1Q2ZFlCOXYwbFE3ZS9KeEh3YzY0QisyN2JRM1JQK3lkT2MxN0tYcVFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXhoZlF2S2pxQWtQeUd3YVpYU3VRSUxuWG5PUXdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQURSaDJWYTFFb2RWVGQyak5URkd1NlFIY3J4ZllXTG9wZnNMTjdFOHRyUDZLWjEvQXZXa3lhaVR0M3B4CktHbVBjK0ZTa05yVnZqcmx0M1pxVm9BaDMxM202VHFlNVQ3Mm9tbkhLZ3F3R0VmY0lIQjlVcU0rV1h6QnVzbklGVUJoeW5MV2NLelMKdC9BYzVJWXA4TTd2YUdQUXRTQ0tGV0dhZm9hWXRNbkNkdnZNdWpBV3pLTmh4blFUNVd2dm94WHFBLzRUaTJUazA4SFM2SVQ3U2RFUQpUWGxtNjZyOTlJMHhIbkFVcmR6ZVp4Tk1nUlZodkxmWmtYZHhHWUZndS9CWXBiV2NDL2VQSWxVbndFc0JiVHVaRGRRZG0yTm5MOUR1CkRjcG12SlJQcHEzdC9PNWpyRmMvWlNYUHNvYVAwQWovdUhZVWJ0N2xKK3lyZUxWVHViWS82Q0Q1MHFpK1lVYktoNHlFOC9ueG9HaWIKSWg2Qkpwc1FCSkZ4d0FZZjNLRFR1VmFuNDVndGY0T2QzNHdybkRLT01wVHdBVHdpS3A5RHdpN0RtRGtIT0h2OFhnQkNIL015Sm5tRApoUGJsOE1GUkVzQUxIZ1FqREZTbFRDOUp4VXJSdG01Z0RXdjhhNHVGSkdTM2lRNnJKVWRiUE05K1NiM0g2UXJHMnZkK0RoY0kwMGlYCjBIR1M4QTg1UGpScUhIM1k4aUt1dTJuME03U21TRlhSRHc0bTZPeTJDeTJuaFRYTi9WbkluOUhOUGxvcE5MazloTTZ4WmRSWmtaRlcKZFNIQmQ1NzVldUZnbmRPdEJCajBmT3RlazQ5VFNpSXArRWdyUGsyR3JGdC95d2FaV1dEWVdHV1ZqVVRSOTM5K0ozOTlyb0QxQjB5MgpQcHh4VkprRVMvMVkrWmowCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsakNDQW42Z0F3SUJBZ0lRQzVNY090WTVaK3BuSTcvRHI1cjBTekFOQmdrcWhraUc5dzBCQVFzRkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRdwpJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3Ck1URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEWjV5Z3ZVajgyY2ttSWt6VHorR29lTVZTQW42MVVRYlZICjM1YW8xSytBTGJrS3ozWDlpYVY5SlByaklnd3J2SlVYQ3pPL0dVMUJCcEFBdlF4TkVQNEh0ZWNjYmlKVk1XV1h2ZE1YMGg1aTg5dnEKYkZDTVA0UU1scyszeXdQZ3ltMmhGRXdiaWQzdEFMQlNmSytSYkxFNEU5SHBFZ2pBQUxBY0t4SGFkM0EybTY3T2VZZmNnbkRtQ1hSdwpWV212bzJpZnY5MjJlYlB5blhBcFZmU3IvNVZoODhsQWJ4M1J2cE83MDRncXU1Mi9jbHBXY1RzLzFQUFJDdjRvNzZQdTJabXZBOU9QCllMZnlrcUd4dlltSkh6RE53Nll1WWpPdUZnSjNSRnJuZ1FvOHAwUXVlYmcvQkx4Y29JZmhHNjlSanMzc0xQcjQvbTN3T255cWkrUm4KbFRHTkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJUTwp3MHE1bVZYeXVOdGd2NmwrdlZhMWx6YW4xakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBeXFWVmpPUElRVzVwSjZkMUVlODhoalp2CjBwM0dlRGdkYVphaWtta3VPR3liZlFUVWlhV3hNVGVLeVNITXEyek5peHlhMXI5STBqSm13WXJBOHk4Njc4RGoxSkdHMFZEakE5dHoKZDI5S09WUHQzaWJIdFgydkswTFJkV0xqU2lzQ3gxQkw0R25pbG13T1JHWVFSSSt0QmV2NGVheW1HK2czTkoxVHlXR3FvbEt2U25BVwpoc0k2eUxFVGNEYll6KzcwQ2pUVlcwejlCNXlpdXRrQmNsenpUY0hkRHJFY0RjUmp2cTMwRlB1SjdLSkJEa3pNeUZkQTBHNERxczBNCmpvbVptV3p3UERDdk9OOXZ2S08rS1NBbnEzVC9FeUo0M3BkU1ZSNkR0VlFnQSs2dXdFOVczamZNdzMrcUJDZTcwM2U0WXRzWGZKd28KSWhOemJNOG05WW9wNXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUmpDQ0FjMmdBd0lCQWdJUUM2RmEraDNmb0xWSlJLL05KS0JzN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWUQKVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMQpNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpNd2RqQVEKQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRWjU3eXNSR1h0emJnL1dQdU5zVmVwUkMwRkZmTHZDLzhRZEorMVlsSmZabjRmNWR3YgpSWGtMek1aVENwMk5YUUxacVZuZUFscjJsU29PalRoS2lrbkd2TVlET0FkZlZkcCtDVzdpZjE3UVJTQVBXWFlRMXFBazhDM2VOdkpzCktUbWpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlRMMEwycDRaZ0YKVWFGTk42S0RlYzZOSFNya2hEQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQWxwSUZGQW1zU1MzVjBUOGdqNDNEeWRYTGVmSW53ejVGeQpZWjVlRUpKWlZybUR4eERuT09sWUpqWjkxZVEwaGprQ01IdzJVL0F3NVdKak9wbml0cU03bXpUNkh0b1FrbkZla1JPbjNhUnVrc3d5CjF2VWhac2N2NnBaamFtVkZrcFVCdEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMgo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGpqQ0NBbmFnQXdJQkFnSVFBenJ4NXFjUnFhQzdLR1N4SFFuNjVUQU5CZ2txaGtpRzl3MEJBUXNGQURCaE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3CkhnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNakFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXgKTWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkMwpkeTVrYVdkcFkyVnlkQzVqYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN5TUlJQklqQU5CZ2txCmhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdXpmTk5OeDdhOG15YUpDdFNuWC9Scm9oQ2dpTjlSbFV5ZnVJMi9PdThqcUoKa1R4NjVxc0dHbXZQckMzb1hna2tSTHBpbW43V282aCs0RlIxSUFXc1VMZWNZeHBzTU56YUh4bXgxeDdlL2RmZ3k1U0RONjdzSDBOTwozWHNzMHIwdXBTL2txYml0T3RTWnBMWWw2WnRyQUdDU1lQOVBJVWtZOTJlUXEyRUduSS95dXVtMDZaSXlhN1h6VitoZEc4Mk1IYXVWCkJKVko4elV0bHVOSmJkMTM0L3RKUzdTc1ZRZXBqNVd6dENPN1RHMUY4UGFwc3BVd3RQMU1WWXduU2xjVWZJS2R6WE9TMHhaS0JneU0KVU5HUEhnbStGNkhtSWNyOWcrVVF2SU9sQ3NSbktQWnpGQlE5Um5iRGh4U0pJVFJOcnc5RkRLWkpvYnE3bk1XeE00TXBoUUlEQVFBQgpvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVVGlKVUlCaVY1dU51CjVnLzYrcmtTN1FZWGp6a3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR0JuS0pSdkRraGo2ekhkNm1jWTFZbDlQTVdMU24vcHZ0c3IKRjkrd1gzTjNLaklUT1lGblFvUWo4a1ZuTmV5SXYvaVBzR0VNTktTdUlFeUV4dHY0TmVGMjJkK21RcnZIUkFpR2Z6WjBKRnJhYkEwVQpXVFc5OGtuZHRoL0pzdzFIS2oyWkw3dGN1N1hVSU9HWlgxTkdGZHRvbS9Eek1OVStNZUtOaEo3aml0cmFsajQxRTZWZjhQbHdVSEJIClFSRlhHVTdBajY0R3hKVVRGeThiSlo5MThyR09tYUZ2RTdGQmNmNklLc2hQRUNCVjEvTVVSZVhnUlBUcWg1VXlrdzcrVTBiNkxKMy8KaXlLNVM5a0pSYVRlcExpYVdOMGJmVktmamxsRGlJR2tuaWJWYjYzZERjWTNmZTBEa2h2bGQxOTI3anlOeEYxV1c2TFpabTZ6TlRmbApNclk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IEczCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUHpDQ0FjV2dBd0lCQWdJUUJWVld2UEplcERVMXc2UVAxYXRGY2pBS0JnZ3Foa2pPUFFRREF6QmhNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWUQKVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JITXpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBdwpNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrCmFXZHBZMlZ5ZEM1amIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjek1IWXdFQVlIS29aSXpqMEMKQVFZRks0RUVBQ0lEWWdBRTNhZlp1NHE0Qy9zTGZ5SFM4TDYrYy9NelhScThOT3JleHB1ODBKWDI4TXpRQzdwaFcxRkdmcDR0bis2TwpZd3dYN0FkdzljK0VMa0NEbk9nL1FXMDdyZE9rRkZrMmVKMERRKzRRRTJ4eTNxNklwNkZydFVQT1o5d2ovd01jbytJK28wSXdRREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVczl0SXBQbWh4ZGl1TmtITUVXTnAKWWltOFM4WXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXhBSzI4OG13L0VrclJMVG5EQ2dtWGMvU0lOb3lJSjd2bWlJMVFoYWRqK1o0eQozbWFURC9ITXNRbVAzV3lyK210L29BSXdPV1pid21TTnVKNVEzS2pWU2FMdHg5elJTWDhYQWJqSWhvOU9qSWdycUpxcGlzWFJBTDM0ClZPS2E1VnQ4c3ljWAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa0RDQ0EzaWdBd0lCQWdJUUJac2JWNTZPSVRMaU9RZTlwM2QxWERBTkJna3Foa2lHOXcwQkFRd0ZBREJpTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TRXcKSHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMQpNVEl3TURBd1dqQmlNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWdSelF3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMvNXBCemFONjc1RjFLUERBaU1Ha3o3TUtuSlM3SklUM3lpdGhad3VFcApwejFZcTNhYXphNTdHNFFOeERBZjh4dWtPQmJyVnNhWGJSMnJzbm55eWhIUzVGL1dCVHhTRDFJZnhwNFZwWDYrbjZsWEZsbFZjcTlvCmszRENzcnAxbVdwek1wVFJFRVFRTHQrQzh3ZUU1blE3YlhIaUxRd2I3aURWeVNBZFl5a3R6dXhlVHNpVCtDRmhtelRyQmNaZTdGc2EKdk92Sno4MnNORUJmc1hwbTduZklTS2htVjFlZlZGaU9EQ3UzVDZjdzJWYnV5bnRkNDYzSlQxN2xOZWN4eTlxVFh0eU9qNERhdHBHWQpRSkI1dzNqSHRySEV0V29ZT0FNUWpkalVONlF1QlgySTlZSStFSkZ3cTFXQ1FUTFgyd1J6S202UkFYd2hUTlM4cmhzRGRWMTRadGs2Ck1VU2FNMEMvQ05kYVNhVEM1cW1nWjkya0o3eWhUem0xRVZnWDl5UmNSbzlrOThGcGlIYVlkajFaWFVKMmg0bVhhWHBJOE9DaUVodG0KbW5USzNrc2U1dzVqcnViVTc1S1NPcDQ5M0FEa1JTV0p0cHBFR1N0K3dKUzAwbUZ0NnpQWnhkOUxCQURNZlJ5Vnc0LzNJYkt5RWJlNwpmL0xWakhBc1FXQ3FzV01ZUkpVYWRtSis5b0N3Kytoa3BqUFJpUWZodmJmbVE2UVl1S1ozQWVFUGxBd2hIYkpVS1NXSmJPVU9VbEZICmRMNG1yTFpCZGQ1NnJGK05QOG04MDBFUkVsdmxFRkRyTWNYS2NoWWlDZDk4VEhVL1krd2hYOFFnVVd0dnNhdUdpMC9DMWtWZm5TRDgKb1I3RndJK2lzWDRLSnBuMTVHa3ZtQjB0OWRtcHNoM2xHd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZApEd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVN05mamd0SnhYV1JNM3k1blArZTZtSzRjRDA4d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBTHRoMlgycGJMNFh4SkVidzZHaUFJM2paR2dQVnM5M3JuRDUvWnBLbWJuSmVGd01ERi9rNWhRcFZnczJTVjFFWStDdG5KWVkKWmhzakRUMTU2VzFyMWxUNDBqekJRMEN1SFZEMVV2eVFPN3VZbVdscng4R25xR2lrSjl5ZCtTZXVNSVc1OW1kTk9qNlBXVGtpVTBUcgp5RjBEeXUxUWVuMWlJUXFBeUhObTBhQUZZRi9vcGJTbnI2ajNiVFdjZkZxSzFxSTRtZk40aS9STjBpQUwzZ1R1akp0SGdYSU53QlF5Cjd6QlpMcTdnY2ZKVzVHcVhiNUpRYlphTmFIcWFzallVZWdieUpMa0pFVkRYQ0xHNGlYcUVJMkZDS2VXanphSWdRZGZSbkdUWjZpYWgKaXhUWFRCbXlVRUZ4UFQ5TmNDT0dERXJjZ2RMTU1wU0VEUWdKbHh4UHdPNXJJSFF3MHVBNU5CQ0ZJUlVCQ09oVk10NXhTZGtvRjFCTgo1cjVOMFhXczBNcjdRYmhEcGFyVHd3VkVUeXcybStMNjRrVzRJMU5zQm05blZYOUd0VXcvYmloYWVTYlNwS2hpbDlJZTR1MUtpN3diCi9VZEtEZDluWm42eVcwSFFPK1QwTy9RRVkrbnZ3bFFBVWFDS0tzbk9lTXpWNm9jRUdMUE9yMG1Jci9PU21iYXo1bUVQMG9VQTUxQWEKNUJ1Vm5SbWh1Wnl4bTdFQUh1L1FEMDlDYk1rS3ZPNUQranB4cGNoTkpxVTEvWWxkdklWaUhUTFNvQ3RVN1pwWHdkdjZFTThadDR0SwpHNDhCdGllVlUraTJpVzFidkdqVUkraUxVYUpXK2ZDbWdLRFdIck84RHc5VGRTbXE2aE4zNU42TWdTR3RCeEJIRWEySFBRZlJkYnpQCjgyWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMkRDQ0E4Q2dBd0lCQWdJUVRLcjV5dHRqYitBZjkwN1lXd09HblRBTkJna3Foa2lHOXcwQkFRd0ZBRENCaFRFTE1Ba0dBMVVFCkJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0cKQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNVEU1TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DClIwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUUKQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQgpkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDUjZGU1MwZ3BXc2F3TkpOM0Z6MFJuCmRKa3JONk45STNBQWNieFQzOFQ2S2hLUFMzOFFWcjJmY0hLM1lYL0pTdzhYcHozanNBUmg3djhSbDhmMGhqNEsrajVjK1pQbU5IcloKRkd2bm5MT0ZvSUo2ZHE5eGtOZnMvUTM2bkd6NjM3Q0M5QlIrK2I3RXBpOVBmNWwvdGZ4blEzSzlEQURXaWV0ckxOUHRqNWdjRkt0Kwo1ZU51L05pbzVKSWsya05yWXJoVi9lckJ2R3kyaS9NT2pacmttMnhwbWZoNFNEQkYxYTNoRFR4RllQd3lsbEVudkdmRHlpNjJhK3BHCng4Y2dvTEVmWmQ1SUNMcWtUcW55ZzBZM2hPdm96SUZJUTJkT2NpcWJYTDFNR3lpS1hDSjd0S3VZMmU3Z1VZUERDVVpPYlQ2WitwVVgKMm53elYwRThqVkh0QzdaY3J5eGpHdDlYeUQrODZWM0VtNjlGbWVLaldpUzB1cWxXUGM5dnF2OUpXTDd3cVAvMHVLM3BOL3U2dVBRTApPdm5vUTBJZWlkaUV5eFB4MmJ2aGlXQzRqQ2hXckJRZG5Bcm5jZXZQRHQwOXFaYWhTTDA4OTYrMURTSk13QkdCN0ZZNzl0T2k0bHUzCnNnUWlVcFdBazJub2preGw4WkVETFhCMEF1cUxaeFVwYVZJQ3U5ZmZVR3BWUnIrZ295aGhmM0RRdzZLcUxDR3FSODRvbkFaRmRyK0MKR0NlMDFhNjB5MURtYS9STWhuRXc2YWJmRm9iZzJQOUEzZnZRUW9oL296TTZMbHdlUVJHQlk4NFljV3NyN0thS3R6RmNPbXBINE1ONQpXZFlnR3EveWFwaXFjcnhYU3RKTG5ic1EvTEJNUWVYdEhUMWVLSjJjekwrelVkcW5SK1dFVXdJREFRQUJvMEl3UURBZEJnTlZIUTRFCkZnUVV1NjkrQWozNnB2RThoSTZ0N2ppWTdOa3lNdFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcKRFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUFyeDFVYUV0NjVSdTJ5eVRVRVVBSk5Nbk12bHdGVFBvQ1dPQXZuOXNLSU45U0NZUEJNdApyRmFpc05aK0VaTHBMcnFlTHBweXNiMFpSR3hoTmFLYXRCWVNhVnFNNGRjK3BCcm9Md1Awcm1FZEVCc3FwSXQ2eGY0RnB1SEExc2orCm5xNlBLN285bWZqWWN3bFlSbTZtblBUWEo5T1YyamVEY2h6VGMrQ2lSNWtET0YzVlNYa0FLUnpIN0pzZ0hBY2thVmQ0c2puOE9vU2cKdFp4OGpiOHVrMkludHpuYUZ4aXV2VHdKYVArRW16elYxZ3NENDFlZUZQZlI2MC9JdlljanQ3WkpRM21GWExycmtndWh4dWhvcUV3VwpzUnFaQ3VoVExKSzdvUWtZZFF4bHFIdkxJN2Nhd2lpRnd4di8wQ3RpNzZSN0NaR1laNHdVQWMxb0JtcGpJWFVEZ0lpS2JvSEdoZktwCnBDM245S1VrRUVlRHlzMzBqWGxZc1FhYjV4b3EyWjBCMTVSOTdRTkt5dkRiNktrQlB2VldtY2tlamtrOXUrVUp1ZUJQU1pJOUZvSkEKek14Wnh1WTY3Ukl1YVR4c2xiSDlxaDE3ZjRhK0hnNHlSdnY3RTQ5MWYweUxTMFpqL2dBMFFIREJ3N21oM2FadzRnU3pRYnpwZ0pIcQpaSng2NFNJRHFaeHVidzVsVDJ5SGgxN3picUQ1ZGFXYlFPaFRzaWVkU3JuQWR5R04vNGZ5M3J5TTd4ZmZ0MGtMMGZKdU1Bc2FEazUyCjdSSDg5ZWxXc24yL3gyMEtrNHlsME1DMkhiNDZUcFNpMTI1c0M4S0tmUG9nODhUazVjME5xTXVSa3JGOGhleTFGR2xtRG9MbnpjN0kKTGFaUmZ5SEJOVk9GQmtwZG42MjdHMTkwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNqQ0NBOGFnQXdJQkFnSVFBZjF0TVB5anlsR29HN3hrRGpVRExUQU5CZ2txaGtpRzl3MEJBUXdGQURDQmlERUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLCkV4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01qQXhNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLCkV4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDQUVtVVhOZzdEMndpegowS3hYRFhidHpTZlRUSzFRZzJIaXFpQk5DUzFrQ2R6T2laL01QYW5zOXMvQjNQSFRzZFo3TnlnUkswZmFPY2E4T2htMFg2YTlmWjJqClkwSzJkdktwT3l1UitPSnYwT3dXSUpBSlB1TG9kTWtZdEpIVVltVGJmNk1HOFlnWWFwQWlQTHorRS9DSEZIdjI1QitPMU9SUnhoRm4KUmdoUnk0WVVWRCs4TS81K2JKei9GcDBZdlZHT05hYW5ac2h5WjlzaFpySFVtM2dEd0ZBNjZNenczTHllVFA2dkJaWTFIMWRhdC8vTworVDIzTExiMlZOM0k1eEk2VGE1TWlyZGNtclMzSUQzS2Z5STBybjQ3YUdZQlJPY0JUa1pUbXpOZzk1UytVemVRYzBQek1zTlQ3OXVxCi9uUk9hY2RyakdDVDNzVEhETi9oTXE3TWt6dFJlSlZuaSs0OVZ2NE0wR2tQR3cvekpTWnJNMjMzYmtmNmMwUGxmZzZsWnJFcGZES0UKWTFXSnhBM0JrMVF3R1JPczAzMDNwK3RkT213MVhOdEIxeExhcVVrTDM5aUFpZ21UWW82MVpzOGxpTTJFdUxFL3BEa1AyUUtlNnhKTQpsWHp6YXdXcFhoYUR6TGhuNHVnVG5jeGJndE5NcysxYi85N2xjNndqT3kwQXZ6VlZkQWxKMkVsWUduK1NOdVpSa2c3ekpuMGNUUmU4CnlleERKdEMvUVY5QXFVUkU5Sm5uVjRlZVVCOVhWS2crL1hSakw3RlFaUW5tV0VJdVF4cE10UEFsUjFuNkJCNlQxQ1pHU2xDQnN0NisKZUxmOFp4WGh5VmVFSGc5ajF1bGl1dFpmVlM3cVhNWW9DQVFsT2JnT0s2bnlUSmNjQno4TlV2WHQ3eStDRHdJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVVVM20vV3FvclNzOVVnT0hZbThDZDhySURac3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUZ6VWZBM1A5d0Y5UVpsbERIUEZVcC9MK00rWkJuOGIya01WbjU0Q1ZWZVcKRlBGU1BDZUhsQ2p0SHpvQk42SjIvRk5Rd0lTYnhtdE91b3doVDZLT1ZXS1I4MmtWMkx5STQ4U3FDLzN2cU9sTFZTb0dJRzFWZUNrWgo3bDh3WEVza0VWWC9KSnB1WGlvcjdndE5uMy8zQVRpVUZKVkRCd243WUtudUhLc1NqS0NhWHFlWWFsbHRpejhJKzhqUlJhOFlGV1NRCkVnOXpLQzdGNGlSTy9GanM4UFJGL2lLejZ5K08wdGxGWVFYQmwyK29kbktQaTR3MnI3OE5CYzV4amVhbWJ4OXNwbkZpeGRqUWczSU0KOFdjUmlReWNFMHh5Tk4rODFYSGZxbkhkNGJsc2pEd1NYV1hhdlZjU3RrTnIvK1hlVFdZUlVjK1pydXdYdHVoeGtZemVTZjdkTlhHaQpGU2VVSE05aDR5YTdiNk5uSlNGZDV0MGRDeTVvR3p1Q3IreURaNFhVbUZGMHNibVpnSW4vZjNnWlhIbEtZQzZTUUs1TU55b3N5Y2RpCnlBNWQ5elpieXVBbEpRRzAzUm9IbkhjQVA5RGMxZXc5MVBxN1A4eUYxbTkvcVMzZnVRTDM5WmVhdFRYYXcyZXdoMHFwS0o0amp2OWMKSjJ2aHNFL3pCKzRBTHRSWmg4dFNRWlhxOUVmWDdtUkJWWHlOV1FLVjNXS2R3cm51V2loMGhLV2J0NURIREFmZjlZazJkRExXS01HdwpzQXZnbkV6REhOYjg0Mm0xUjBhQkw2S0NxOU5qUkhERWpmOHRNN3F0ajN1MWNJaXVQaG5QUUNqWS9NaVF1MTJaSXZWUzVsakZINGd4ClErNklIZGZHamp4RGFoMm5HTjU5UFJieFl2bktrS2o5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBaFdnQXdJQkFnSVFYSXVaeFZxVXhkSnhWdDdOaVlETUpqQUtCZ2dxaGtqT1BRUURBekNCaURFTE1Ba0dBMVVFQmhNQwpWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVCmFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQwpWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVCmFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFhckZSYXFmbG9JK2Q2MVNSdlU4WmEyRXVyeHRXMgowZVp6Y2E3ZG5OWU1ZZjNib0lrRHVBVVU3RmZPN2wwLzRpR3p6dmZVaW5uZ280TitMWmZRWWNUeG1kd2xrV09yZnpDanRIRGl4NkV6Cm5QTy9MbHhUc1YremZUSi9palRqZVhtalFqQkFNQjBHQTFVZERnUVdCQlE2NFFtRzFNOFp3cFoyZEVsMjNPQTF4bU5qbWpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpBMlo2RVdDTnprbHdCQgpIVTYrNFdNQnp6dXFRaEZrb0oyVU9RSVJlVng3SGZwa3VlNFdRck8vaXNJSnhPemtzVTBDTVFEcEttRkhqRkpLUzA0WWNQYldSTlp1CjlZTzZiVmk5Sk5sV1NPcnZ4S0pHZ1locU9rYlJxWnROeVdIYTBWMVhhaGc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIakNDQWFTZ0F3SUJBZ0lSWUZsSjRDWXV1MVg1Q25lS2NmbEsyR3d3Q2dZSUtvWkl6ajBFQXdNd1VERWtNQ0lHQTFVRUN4TWIKUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRRApFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iClIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUUQKRXdwSGJHOWlZV3hUYVdkdU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUjBVT2x2dDlYYi9wT2RFaCtKOEx0dFY3SHBJNgpTRmtjOEdJeExjQjZLUDRhcDF5enRzeVg1MFhVV1ByUmQyMURvc0NIWlRRS0gzcmQ2end6b2NXZFRhUnZRWlU0ZjhrZWhPdlJua21TCmg1U0hERHFGU21hZm5WbVRUWmRoQm9aS28wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWQKQmdOVkhRNEVGZ1FVUGVZcFNKdnFCOG9oUkVvbTNtN2Uwb1BRbjFrd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeEFPVnBFc2x1MjhZeAp1Z2xCNFpmNCsvMmE0bjBTeWUxOFpOUExCU1dMVnRtZzUxNWRUZ3VEbkZ0MkthQUpKaUZxWWdJd2NkSzFqMXpxTytGNENZV29kWkk3CnlGejlTTzhOZENLb0NPSnV4VW5PeHd5OHAyRnA4ZmM3NFNyTCtTdnpacEEzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCklkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqeUVTMUFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQktNUXN3Q1FZRFZRUUcKRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3SlFZRFZRUURFeDVKWkdWdVZISjFjM1FnUTI5dGJXVnlZMmxoYkNCUwpiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGd4TWpJeldoY05NelF3TVRFMk1UZ3hNakl6V2pCS01Rc3dDUVlEVlFRR0V3SlZVekVTCk1CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkIKSURFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNuVUJuZVA1azkxRE5HOFc5UllZS3lxVStQWjRsZApoTmxUM1F3bzJkZncvNjZWUTNLWitiVmRmSXJCUXVFeFVIVFJnUTE4elpzaHEwUGlySzFlaG03ekNZb2ZXaks5b3V1VStlaGNDdXovCm1OS3ZjYk8wVTU5T2grK1N2TDNzVHpJd2lFc1hYbGZFVThMMkFwZU4yV0lydnlRZllvM2Z3N2dwUzBsNFBKTmdpQ0w4bWRvMnlNS2kKMUN4VUFHYzFibk8vQWxqd3BOM2xzS0ltZXNyZ05xVVpGdlg5dCsrdVAwRDFiVm9FL2M0MHlpVGNkQ01iWFRNVEVsM0VBU1gyTU4wQwpYWi9nMVVlOXRPc2JvYnRKU2RpZld3THppdVFra09SaVQwL0JyNHNPZEJlbzBYS0lhbm9CU2N5MFJubkdGN0hhbUI0SFdmcDFJWVZsCjNaQld6dnVycFdDZHhKMzVVckNMdllmNWp5c2pDaU4yTy9jejRja0E4Mm41UzZMZ1RyeCtrem1FQi9kRWNINytCMXJsc2F6UkdNenkKTmVWSlNRaktWc2s5K3c4WWZZczd3UlBDVFkvSlR3NDM2UitoRG1yZllpN0xOUVpSZVN6SUpUajAra3VuaVZ5YzB1TU5PWVpLZEh6VgpXWWZDUDA0TVhGTDBQZmRTZ3ZIcW82ejlTVFFhS1BOQmlEb1Q3dWplLzVrZFg3ckw2Qjd5dVZCZ3dESFRjK1h2dnFEdE13dDB2aUFnCnhHZHM4QWdEZWxXQWYwWk9scWYwSGo3aDl0Z0o0VE5rSzJQWE1sNmYrY0I3RDNodmw3eVRtdm1jRXBCNGVvQ0hGZGR5ZEp4VmRIaXgKdXVGdWNBUzZUNkM2YU1ONy96SHdjejA5bENxeEMwRU9vUDVOaUdWcmVUTzAxd0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVN1VRWndOUHdCb3Z1cEh1K1F1Y21WTWlPTm5Zd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBQTJ1a0RMMnBrdDhSSFlaWVI0bktNMWVWTzhsdk9NSWtQa3AxNjVvQ09HVUFGanZMaTUrVTFLTXRsd0gKNm9pNm1ZdFFsTmVDZ045aENRQ1RyUTBVNXM3QjhqZVVlTEJmbkxPaWM3aVBCWk00elkwK3NMajd3TSt4OHV3dExSdk03S3FhczZwZwpnaHN0TzhPRVBWZUtsaDZjZGJqVE1NMWdDSU9RMDQ1VThVMW13RjEwQTBDajdvVit3aDkzbkFib3dhY1lYVktWN2NuZEpaNXQrcW50Cm96bzAwRmw3MnUxUTh6Vy83ZXNVVFRISFlQVGE4WWVjNGtqaXhzVTMrd1lRK25WWlpqRkhLZHAybWh6cGdxN3ZtcmxSOTRnam1tbVYKWWp6bFZZQTIxMVFDLy9HNVhjN1VJMi9ZUllSS1cyWHZpUXpkRktjZ3l4aWxKYlFOK1FId290TDBBTWgwanFFcVNJNWwyeFBFNGlVWApmZXUraDFzWElGUlJrMHBUQXd2c1hjb3o3V0w5UmNjdlc5eFlvSUE1NXZyWC9oTVVwdTA5bEVwQ2ROVERkMWx6elk5R3ZsVTQ3L3JvCmtUTHFsMWdFSXQ0NHc4eThiY2t6T21vS2FUK2d5T3B5ajR4amhpTzliVHlXbnBYZ1NVeXFvcmtxRzV3MmdYanR3K2hHNGlaWlJIVWUKMlhXSlVjMFFoSjFoWU10ZCtaY2lUWTZZNXVOLzlsdTdyczNLU29GclhndnpVZUYwSytsK0o2ZlptVWxPK0tXQTJ5VVBIR05paXNregpaMnM4RUlQR3JkNm96UmFPamZBSE4zR2Y4cXY4UWZYQmkrd0FOMTBKNVU2QTcvcXhYRGdHcFJ0SzRkdzRMVHpjcXgrUUd0VktuTzdSCmNHek03dlJYK0JpNmhHNkgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlpqQ0NBMDZnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp6MFo4QUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCTk1Rc3dDUVlEVlFRRwpFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1Tb3dLQVlEVlFRREV5RkpaR1Z1VkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2CmNpQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGMxTXpNeVdoY05NelF3TVRFMk1UYzFNek15V2pCTk1Rc3dDUVlEVlFRR0V3SlYKVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1Tb3dLQVlEVlFRREV5RkpaR1Z1VkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCUwpiMjkwSUVOQklERXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDMklwVDhwRWl2NkVkckN2c25kdVR5ClA0bzdla29zTVNxTWpiQ3B3ekZycUhkMmhDYTJySUZDRFFqclZWaTdldmk4WlgzeW9HMkxxRWZwWW5ZZUVlNElGTkd5UkJiMDZ0RDYKSGk5ZTI4dHpRYTY4QUxCS0swQ3lyT0U3UzhJdG5lU2htK3dhT2g3d0NMUFE1Q1ExQjUrY3RNbFNiZHNIeW8rMVcvQ0Q4MC9ITGFYSQpyY3VWSUtReEtGZFlXdVNORzVxcm5nME04Z296T1NJNUNwY3U4MU4zdVVSRi9ZVExOaUNCV1MyYWIyMUlTR0hLVE45VDBhOVN2RVNmCnF5OXJnM0x2ZFlEYUJqTWJYY2phWThaTnpheG1NYzNSM2o2SEVEYmh1YVI2NzJCUXNzdktwbGJnTjYrck5CTTVKZWc1WnVTWWVxb1MKbUp4WlpvWStyZkd3eWo0R0QzdndFVXMzb0VSdGU4dW9qSEgwMWJXUk5zendGY1lyM2xFWHNaZE1VRDJ4bFZsOEJYMHRJZFVBdndGbgpvbDU3cGx6eTl5THhrQTJUMjZwRVVXYk1mWFlENjJxb0tqZ1psM1lOYTRwaCtiejI3bmI5Y0N2ZEtUejRDaDViUWh5TFZpOVZHeHloCkxyWEhGdWI0cWp5U2ptbTJBY0cxaHAySkR3czRsRlRvNnR5ZVBTVzhVeWJ0MWFzNXFzVkFURlNyc3JUWjJmalhjdHNjdkcyOVpWL3YKaURVcVppL3U5ck5sOERPTmZKaEJhVVlQUXh4cCtwdTEwR0ZxemNwTDJVeVFScXNWV2FGSFZDa3VneWhmSE1LaXEzSVhBQWFPUmV5TAo0ak05ZjlvWlJPUmljc1BmSXNieVZ0VGRYNVZ5N1cxZjkwZ0RXLzNGS3FEMmN5T0VFQnNCNXdJREFRQUJvMEl3UURBT0JnTlZIUThCCkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTQzSGdudGluUXRuYmNaRnJsSlBydzZQUkZLTXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUVmNjNRcXdFWkU0clUxZDkrVU9sMVFaZ2tpSFZJeXFaSm5ZV3Y2SUFjVllwWm14STFRagp0Mm9kSUZmbEFXSkJGOU1KMjNYTGJsU1FkZjRhbjRFS3d0M1g5d25RVzNJVjVCNEphajB6OHlHYTVoVityVkhWRFJEdGZVTEFqKzdBCm1nalZRZFpjRGlGcGJvQmhEaFhBdU0vRlNSSlN6TDQ2ek5RdU9BWGVOZjBmYjdpQWFKZzlUYURLUUdYU2MzejFpOWtLbFQvWVB5TnQKR3RFcUpCblpoYk1YNzNodXFWalJJOVBIRSsxeUpYOWRzWE53MEg4R2x3bUVLWUJoSGZwZS8zT3NvT09KdUJ4eEZjYmVNWDhTM09GdAptNi9uNko5MWVFeXJSanVhenI4RkdGMU5GVHdXbWhsUUJKcXltbTlsaTFKZlBGZ0VLQ1hBWm1FeGZybmdkYmthcUlIV2NoZXp4UU14Ck5SRjRlS0xnNlRDTWY0RGZXTjg4dWllVzRvQTBiZU9ZMDJRbnJFaCtLSGRjeGlWaEpmaUZER1g2eERJdnBaZ0Y1UGdMWnhZV3hvSzQKTWhuNStibDUzQi9ONjYrckR0MGIyMFhrZXVjQzRwVmQvR253VTJsaGxYVjVDMTVWNWpnY2xLbFpNNTdJY1hSNWYxR0p0c2hxdURESQphampEYnA3aE54YnFCV0pNV3hKSDdhZTBzMWhXeDBuemZ4Sm9DVEZ4OEczNFRrZjcxb1h1eFZoQUdhUWRwL2xMUXpmY2FGcFB6K3ZDClpIVGV0QlhaOUZSVUdpOGMxNWR4VkpDTzJTQ2RVeXQvcTQvaTZqQzhVRGZ2OFVlMWZYd3NCT3hvbmJSSlJCRDBja3NjWk9mODVtdVEKM1dsOWFmMEFWcVczckxhdHQ4bytBZStjCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUGpDQ0F5YWdBd0lCQWdJRVNsT01LREFOQmdrcWhraUc5dzBCQVFzRkFEQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WCkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnkKYlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZwpiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3CkhoY05NRGt3TnpBM01UY3lOVFUwV2hjTk16QXhNakEzTVRjMU5UVTBXakNCdmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1QKRFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeApPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzCmVURXlNREFHQTFVRUF4TXBSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNmhMWnkyNTRNYStLWjZUQUJwM2JxTXJpVlFSckoybUZPV0hMUAovdmFDZWI5ellRWUtwU2ZZczEvVFJVNGNjdFpPTXZKeWlnLzNneG5RYW9DQUFFVWVzTWZubXI4U1Z5Y2NvMmd2Q29lOWFtc09YbVh6CkhIZlYxSVdOY0NHMHN6TG5pNkxWaGprQ3NialNSODdreVVuRU82ZmUrMVI5Vjc3dzZHN0NlYkk2QzFYaVVKZ1dNaE5jTDNoV3djS1UKcy9KYTVDZWFueVRYeHV6UW15V0M0OHpDeEVYRmpKZDZCbXNxRVorcENtNUlPMi9iMUJFWlF2ZVBCNy8xVTErY1B2UVhMT1pwckU0eQpUR0ozNnJmbzViczB2Qm1McnB4UjU3ZCt0Vk94TXlMbGJjOXdQQnI2NHB0bnRvUDBqYVd2WWt4TjRGaXNaRFFTQS9pMmpaUmpKS1J4CkFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScWNpWjYKMEI3dmZlYzdhVkhVYkkyZmtCSm1xekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZVo4ZGxzYTJlVDhpallmVGh3TUVZR3BybWk1WgppWE1SckVQUjlSUC9qVGtyd1BLOVQzQ01xUy9xRjhRTFZKN1VHNWFZTXp5b3JXS2lBSGFyV1dsdUJoMSt4TGxFalppdkV0Umgyd29aClJrZno2L2Rqd1VBRlFLWFN0L1MxbWphL3FZaDJpQVJWQkN1Y2gzOGFOengrTGFVYTJOU0pYc3E5ckQxczJHMnYxZk4yRDgwN2lEZ2kKbld5VG1zUTl2NEliWlQrbUQxMnEvT1d5RmNxMXJjYThQZENFNk9vR2NyQk5PVEo0dno0Um5BdWtuWm9oOC9DYkN6QjQyOEhjaDBQKwp2R09heXNYQ0hNbkhqZjg3RWxnSTVyWTk3SG9zVHZ1RGxzNE1QR21IVkhPa2M4S1QvMUVRckJWVUFkajhCYkdKb1g5MGc1cEoxOXhPCmU0cEliNHRGOWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDK1RDQ0FvQ2dBd0lCQWdJTkFLYUxlU2tBQUFBQVVOQ1IrVEFLQmdncWhrak9QUVFEQXpDQnZ6RUxNQWtHQTFVRUJoTUNWVk14CkZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm4KWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREV5SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbApaQ0IxYzJVZ2IyNXNlVEV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1CklDMGdSVU14TUI0WERURXlNVEl4T0RFMU1qVXpObG9YRFRNM01USXhPREUxTlRVek5sb3dnYjh4Q3pBSkJnTlZCQVlUQWxWVE1SWXcKRkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OVRaV1VnZDNkM0xtVnVkSEoxYzNRdWJtVjBMMnhsWjJGcwpMWFJsY20xek1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBeE1pQkZiblJ5ZFhOMExDQkpibU11SUMwZ1ptOXlJR0YxZEdodmNtbDZaV1FnCmRYTmxJRzl1YkhreE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXQKSUVWRE1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQklRVHlkQzZiVUY3NG16UTYxVmZaZ0lhSlBSYmlXbEg0N2pDZmZIeQpBc1dmb1BaYjFZc0dHWVpQVXhCdEJ5UW5vYUQ0MVVjWllVeDl5cE1uNm5RTTcyK1dDZjVqN0hCZE5xMW5kNjdKblh4VlJEcWlZMUVmCjllTmkxS2xIQno3TUlLTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKRkxkajV4cmRqZWtJcGxXRHBPQnFVRUZsRVVKSk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HRjUyT1ZDUjk4Y3JsT1pGN1p2SEgzaAp2eEdVMFFPSWRlU05pYVNLZDBiZWJXSHZBdlg3dGQvTS9rNy8vcW5tcHdJd1c1blhoVGNHdFhzSS9lc25pMHFVK2VINnA0NG1DT2g4CmttaHRjOWh2SnF3aEFyaVp0eVpCV3lWZ3J0QklHdTRHCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNGQ0EgRVYgUk9PVAo9PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZqVENDQTNXZ0F3SUJBZ0lFR0VyTTFqQU5CZ2txaGtpRzl3MEJBUXNGQURCV01Rc3dDUVlEVlFRR0V3SkRUakV3TUM0R0ExVUUKQ2d3blEyaHBibUVnUm1sdVlXNWphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQgpJRVZXSUZKUFQxUXdIaGNOTVRJd09EQTRNRE13TnpBeFdoY05Namt4TWpNeE1ETXdOekF4V2pCV01Rc3dDUVlEVlFRR0V3SkRUakV3Ck1DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUlV3RXdZRFZRUUQKREF4RFJrTkJJRVZXSUZKUFQxUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEWFhXdk5FRDhmQlZuVgpCVTAzc1E3c21DdU9GUjM2azBzWGdpRnhFRkxYVVdSd0ZzSlZhVTJPRlcyZnZ3d2J3dUNqWjlZTXJNOGlycTkzVkNwTFRJcFRVbnJECjdpN2VzM0Vsd2VsZFBlNmhMNlAzS2p6Skl4MXFxeDJocC9IejdLRFZSTThWejNJdkhXT1g2Sm41L1pPa1ZJQk1VdFJTcXk1SjM1RE4KdUYrK1A5Nmh5azBnMUNYb2hDbFR0N0dJSC8vNjJwQ2ZDcWt0UVQreDhSZ3A3aFpaTERSSkdxZ0cxNmlJMGdOeWVqTGk2bWhOYml5VwpaWHZLV2ZyeTR0M3VNQ3o3ekVhc3hHUHJiMzgyS3pSekVwUi8zOHdtbnZGeVhWQmxXWTlwczRkZU1tL0RHSXExbFkrd2VqZmVXa1U3Cnh6Ymg3MmZST2RPWFczTmlHVWd0aHh3RyszU1lJRWx6OEFYU0c3R2dvN2NiY05PSWFibGExamowWXR3bGkzaS8rT2grdUZ6SmxVOWYKcHkyNUlHdlBhOTMxRGZTQ3QvU3laaTRRS1BhWFdudVdGbzhCR1Mxc2JuODVXQVprZ3dHRGc4Tk5rdDB5eG9la04ra1d6cW90YUs4SwpnV1U2Y01HYnJVMXRWTW9xTFV1Rkc3T0E1bkJGRFd0ZU5mQi9PN2ljNUFSd2lSSWxrOW9LbVNKZ2FtTmdUbllHbUU2OWc2MGRXSW9sCmhkTEhaUjR0anNiZnRzYmhmNG9FSVJVcGRQQStuSkNkREM3eGlqNWFxZ3dKSHNmVlBLUHRsOE1lTlBvNCtRZ080OEJkSzRQUlZtckoKdHFoVVV5NTRNbWM5Z245MDBQdmh0Z1ZndVhEYmpndjVFMWh2Y1dBUVVoQzV3VUVKNzNJZlp6RjQvNVlGalFJREFRQUJvMk13WVRBZgpCZ05WSFNNRUdEQVdnQlRqL2kzOUtOQUx0YnEyb3NTL0Jxb0ZqSlA3THpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCCi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQvNHQvU2pRQzdXNnRxTEV2d2FxQll5VCt5OHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUIKQUNYR3VtdnJoOHZlZ2ptV1BmQkVwMnVFY3dQZW5TdFB1aUIvdkhpeXo1ZXdHNXp6MTNrdTlVaTIwdnNYaU9iVGVqL3RVeFBRNGk5cQplY3NBSXlqbUhqZFhOWW1Fd25aUE5EYXRaOFBPUVFhSXhmZnUyQnE0MWd0L1VQK1RxaGRMak96dFVtQ3lwQWJxVHV2MGF4bjk2L1VhCjRDVXFtdHpIUVRiM3lIUUZoRG1WT2RZTE82UW4rZ2pZWEI3NEJHQlNFU2dvQS8vdlUyWUFwVW8wRm1aOC9RbWtycDVuR205QkMyc0cKRTV1UGhuRUZ0QytOaVdZektYWlVtaEg0Si9xeVA1SGd6ZzBiOHpBYXJiOGlYUnZUdnlVRlRlR1NHbitabnp4RWs4clVRRWxzZ0lmWApCRHJETWxJMURsYjRwZDE5eElzTkVSOVR5eDZ5Rjdab2QxcmcxTXZJQjY3MU9pNk9ON2ZRQVV0REtYZU1PWmVQZ2xyNFVlV0pvQmpuCmFIOWRDaTc3bzBjT1BhWWplc1lCeDQvSVhyOXRnRmEraWlTNk0rcWY0VElSbnZIU1Q0RDJHMEN2T0o0UlVIbHpFaExONW15ZExJaHkKUERDQkJwRWk2bG10MmhrdUlzS051WXlINEdhOGN5TmZJV1JqZ0VqMW9Ed1lQWlRJU0VFZFFMcGUvdjVXT2FISXoxNmVHV1JHRU5vWAprYmNGZ0t5TG1aSjk1NkxZQndzMkorZEllV0NLdzljVFhQaHlRTjlLeTgrWkFBb0FDeEdWMmxaRkE0Z0tuMmZRMVhteHFJMUFiUTNDCmVrRDY4MTlrUjVMTFU3bTdXYzVQL2RBVlV3SFkzK3ZaNW5idjBDTzdPNmw1czlVQ0tjMkpvNVlQU2pYblRrTEFkYzBIeitZczYzc3UKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdFRDQ0FwMmdBd0lCQWdJUWRyRWdVblR3aFlkR3MvZ2pHdmJDd0RBTkJna3Foa2lHOXcwQkFRc0ZBREJ0TVFzd0NRWURWUVFHCkV3SkRTREVRTUE0R0ExVUVDaE1IVjBsVFpVdGxlVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWdSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmwKWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aVlXd2dVbTl2ZENCSFFpQkRRVEFlRncweE5ERXlNREV4TlRBdwpNekphRncwek9URXlNREV4TlRFd016RmFNRzB4Q3pBSkJnTlZCQVlUQWtOSU1SQXdEZ1lEVlFRS0V3ZFhTVk5sUzJWNU1TSXdJQVlEClZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNUlFZHMKYjJKaGJDQlNiMjkwSUVkQ0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJCZTNIRW9rS3RhWApzY3JpSHZ0OU9PK1k5Ykk1bUU0bnVCRmRlOUlsbElpQ0ZTWnFHekc3cUZzaElTdllEMDZmV3ZHeFd1UjUxaklqSytGVHpKbEZYSHRQCnJieS9oMG9MUzVkYXFQWkk3SDE3RGMwaEJ0K2VGZjFCaWtpM0lQU2hlaHRYMUYxUS83cG4yQ09aSDhnLzQ5Ny9iMXQzc1d0dXVNbGsKOStIS1FVWU9LWEhRdVNQOHlZRmZUdmR2MzcrRXJYTmt1N2RDam1uMjFIWWRmcDJudUZlS1VXZHkxOVNvdUpWVVFITUQ5dXIwNi80bwpRbmMvblNNYnNyWTlnQlFIVEM1UDk5VUtGZzI5WmtNM2ZpTkRlY05BaHZWTUtkcU9tcTBOcFFTSGlCNkY0K2xUMVp2SWl3TmplT3ZnCkdVcHV1eTlyTTJSWWs2MXB2NDhiNzRKSXh3SURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVU5RL0lObU5lNHFQcytUdG1GYzVSVXVPUm1qMHdFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0VCQUVCTSs0ZXltWUdRZnAzRnNMQW16WWg3S3pLTmJyZ2hjVmlYZmE0M0ZLOCs1L2VhNG4zMmNaaVpCS3BECmRIaWo0MGxoUG5PTVRaVGcrWEhFdGhZT1UzZ2YxcUtITHdJNWdTazhyeFdZSVREK0tKQUFqTkhoeS9wZXlQMzRFRVk3b25oQ2tSZDAKVlFyZVVHZE5adEduLy8zWndMV29vNHJPWnZVUFE4Mm5LMWQ3WTBacXFpNVMyUFR0NFcydEtaQjRTTHJoSTZxamlleTFxNWJBdEV1aQpIWmVlZXZKdVFISGZhUEZsVGM1OEJkOVRaYW1sOExHWEJIQVZSZ09ZMU5LL1ZMU2dXSDFTYjlwV0ptTFUyTnVKTVc4YzhDTEMwMkljCk5jMU1hUlZVR3BDWTN1c2VYOHAzeDh1T1BVTnBuSnBZMENRNzN4dEFsbjQxcllISFRuRzZpQk09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNaQUZJUiBST09UIENBMgo9PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjakNDQWxxZ0F3SUJBZ0lVUG9wZEIreFYwakxWdCtPMlh3SHJMZHprMXVRd0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0cKQTFVRUJoTUNVRXd4S0RBbUJnTlZCQW9NSDB0eVlXcHZkMkVnU1hwaVlTQlNiM3BzYVdONlpXNXBiM2RoSUZNdVFTNHhHREFXQmdOVgpCQU1NRDFOYVFVWkpVaUJTVDA5VUlFTkJNakFlRncweE5URXdNVGt3TnpRek16QmFGdzB6TlRFd01Ua3dOelF6TXpCYU1GRXhDekFKCkJnTlZCQVlUQWxCTU1TZ3dKZ1lEVlFRS0RCOUxjbUZxYjNkaElFbDZZbUVnVW05NmJHbGplbVZ1YVc5M1lTQlRMa0V1TVJnd0ZnWUQKVlFRRERBOVRXa0ZHU1ZJZ1VrOVBWQ0JEUVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMzdkQ1UQpxRXZOUUxYT1llZVd5clNoMmd3aXNQcTFlM1lBZDR3THozMm9oc3dtVWVRZ1BZVU0xbGpqNS9RcUdKM2EwYTRtN3V0VDNQU1ExaE5LCkRKQTh3L1RhMG80TmtqcmNzYkgvT043RHVpMWZnTGtDdlVxZEd3KzB3OExCWndQZDNCdWNQYk93M2dBZXFEUkh1NXJyL2dzVXZUYUUKMmcwZ3YvcGJ5NmtXSUswNVlPNHZkYmJubDV6NVB2MStUVzlOTCsrSURXcjYzZkU5YmlDbG9CSzBUWEM1enRkeU80bVRwNENFSENkSgpja20xL3p1Vm5zSE15QUhzNkE2S0NwYm5zNmFINWRiNUJTc05sMEJ3UExxc2RWcWMxVTJkQWdyU1M1dG1TMFlIRjJXdG4yeUlBTndpCmllRGhaTlJudkRGNVlUeTd5a0hOWEdvQXlEdzRqbGl2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJRdUZxbEtHTFhMelBWdlVQTWpYL2hkNTZ6d3lEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQwpBUUVBdFhQNEE5eFpXeDEyNmFNcWU1QW9zazNBTTArcW1ySFV1T1FuLzZtV21jNUc0RzE4VEtJNHBBWnc4UFJCRWV3L1I0MC9jb2Y1Ck8vMmtieXRUQU9EL09ibHFCdzdySFJ6Mm9uS1F5NEk5RVlLTDBydWZLcThoNW1PR25Ya1o3L2U3RERXUXc0cnRUdy8xekJMWnBENjcKb1B3Z2xWOVBKaThSSTROT2RRY1B2NXZSdEIzcEVBVCt5bUNQb2t5NHJjL2hrQS9OcmdySFhYdTNVTkxVWWZyVkZkdlhuNGRSVk91bAo0K3ZKaGFBbElEZjdqczRNTklUaFBJR3lkMDVEcFloZmhtZWhQZWEwWEdHMlB0dit0eWpGb2dldXRjcktqU29TNzVmdHdqQ2t5U3A2CisvTk5JeHVaTXpTZ0x2V3BDei9VWGVIUGhKL2lHY0pmaXRZZ0h1Tnp0dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwakNDQTdxZ0F3SUJBZ0lRSWRiUVNrOGxEOGt5Ti95cVhoS042VEFOQmdrcWhraUc5dzBCQVEwRkFEQ0JnREVMTUFrR0ExVUUKQmhNQ1VFd3hJakFnQmdOVkJBb1RHVlZ1YVhwbGRHOGdWR1ZqYUc1dmJHOW5hV1Z6SUZNdVFTNHhKekFsQmdOVkJBc1RIa05sY25SMQpiU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURWtNQ0lHQTFVRUF4TWJRMlZ5ZEhWdElGUnlkWE4wWldRZ1RtVjBkMjl5CmF5QkRRU0F5TUNJWUR6SXdNVEV4TURBMk1EZ3pPVFUyV2hnUE1qQTBOakV3TURZd09ETTVOVFphTUlHQU1Rc3dDUVlEVlFRR0V3SlEKVERFaU1DQUdBMVVFQ2hNWlZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNRd0lnWURWUVFERXh0RFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CCklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDOStYajQ1dFdBREdTZGhodVdaR2MvSWpvZWRRRjkKNy90Y1o0ekp6RnhycVpIbXVVTGxJRXViMnB0N3VabGQyWnVBUzllRVFDc24wK2k2TUxzK0NScW5TWlh2SzBBa3dwZkhwKzZiSmUrbwpDZ0NYaFZxcW5kd3B5ZUkxQit0d1RVcld3Yk5XdUtGQk9KdlIrekYvaitCZjRiRS9ENDRXU1dEWEJvMFkrYW9tRUtzcTA5RFJaNDBiClJyNUhNTlV1Y3RIRlk5cm5ZM2xFZmt0akpJbUdMalEvS1V4U2l5cW53T0tSS0ltNXdGdjVIZG5uSjYzL21nS1h3Y1pRa3BzQ0xMMnAKdVRSWkNyK0VTdi9mL3JPZjY5bWU0SmdqN0tacmR4WXEyOHl0T3h5a2g5eEdjMTRaWW1oRlYrU1Fna0s3UXRid1llREJvejFtbzEzMApHTzZJeVkwWFJTbVpNblVDTWU0cEpzaHJBdWExWWtWL054VmFJMmlKMUQ3ZVRpZXc4RUFNdkUwWHkwMmlzeDdRQmxyZDlwUFBWM1daCjlmcUdHbWQ0czcrVy9qVGN2ZWRTVnVXejVYVjcxMEdSQmR4ZGFlT1ZEVU81L0lPV09aVjdiSUJhVHhOeXh0ZDlLWHBFdWxLa0t0VkIKUmdrZy9pS2d0bHN3amJ5SkROWFhjUGlIVXYzYTc2eFJMZ2V6VHY3UUNkcHc3NWo2VnVadDI3VlhTOXpsTENVVnlKNHVlRTc0MnB5ZQpoaXpLVi9NYTVjaVNpeHFDbG5yRHZGQVNhZGdPV2thTE91c20raVBKdHJDQnZrSUFwUGpXL2pBdXg5Skc5dVdPZGYzeXpMblFoMXZNCkJoQmd1NE0xdDE1bjNrZnNtVWp4cEtFVi9xMk1ZbzQ1VlU4NUZybXhZNTMvdHdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCUzJvVlE1QXNPZ1A0Nkt2UHJVK0J5bTBUb08vVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKS29aSQpodmNOQVFFTkJRQURnZ0lCQUhHbERzN2s2YjgvT05XSldzUUNZZnRNeFJRWExZdFBVMnNRRi94bGhNY1FTWkRlMjhjbWs0Z21iM0RXCkFsNDVvUGVQcTVhMXBSTmNnUlJ0RG9HQ0VSdUtUc1pQcGQxaUhrVGZDVm4wVzNjTE4rbUxJTWI0Q2s0dVdCenJNOURQaG1ESjJ2dUEKTDU1TVlJUjRQU0ZrMXZ0Qkh4Z1A1OGwxY2IyOVhONDBoejVCc0E3MnVkWS9DUk9XRkMvZW1oMWF1VmJPTlRxd1gzQk5YdU1wOFNNbwpjbG0ycThLTVppWWNkeXdtZGpXTEtLZHBvUGs3OVNQZGhSQjB5WkFEVnBIbnI3cEgxQktYRVNMam9rbVViT2UzbEV1NkxhVGFNNHRNCnBrVC9XanpHSFdUWXRUSGtwang2cUZjTDIrMWhHc3Z4em5OM1k2U0hiMHhST05ia1g4ZWZ0b0VxNUlWSWVWaGVPL2piQW9KbndUbmIKdzNSTFBUWWUrU21UaUdoYnFFUVpJZkNuNklFTkxPaVROclEzc3Nxd0d5WjZtaVVmbXBxQW5rc3FQL3VqbXY1ek1uSENuc1p5NFlwbwpKL0hrRDdURVRLVmhrL2lYRUFjcU1DV3B1Y2h4dU85b3pDMSs5ZUIrRDRLb2I3YTZiSU5EZDgyS2toZWhubHQ0RmoxRjRqTnkzZUZtCnlwblR5Y1VtL1Exb0JFYXV0dG1iakw0WnZySEc4aG5qWEFMS0xOaHZTZ2ZaeVRYYVFIWHl4S2NaYjU1Q0VKaDE1cFdMWUx6dHhSTFgKaXM3Vm1GeFdsZ1BGN25jR05mL1A1TzQvRTJIdTI5b3RoZkROcnAyeUdBbEZ3NUtoY2hmOFI3YWdDeXp4eE41RGFBaHFYenZ3ZG1QNwp6QVlzcHNiaURyVzV2aVNQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0N6Q0NBL09nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JwakVMTUFrR0ExVUVCaE1DUjFJeER6QU5CZ05WQkFjVApCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwCmFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hRREErQmdOVkJBTVROMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmwKWVhKamFDQkpibk4wYVhSMWRHbHZibk1nVW05dmRFTkJJREl3TVRVd0hoY05NVFV3TnpBM01UQXhNVEl4V2hjTk5EQXdOak13TVRBeApNVEl4V2pDQnBqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nClFXTmhaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UURBK0JnTlYKQkFNVE4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1VtOXZkRU5CSURJdwpNVFV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREMrS2svRzRuOFBEd0VYVDJRTnJDUk9uazhabHJ2CmJUa0JTUnEwdDg5L1RTTlR0NUFBNHhNcUtLWXg4WkVBNHlqc3JpRkJ6aC9hL1gwU1d3R0REN213WDVuaDhoS0RnRTBHUHQrc3IrZWgKaUdzeHIvQ0wwQmd6dU50RmFqVDBBb0FrS0FvQ0ZaVmVkaW9ObVRvVVcvYkx5MU84RTAwQmlEZVVKUnRDdkNMWWpxT1dYanJaTXRzKwo2UEFRWmUxMDRTK25mSzhuTkxzcGZadTJ6d25JNWRNSy9JaGxaWFFLM0hNY1hNMUFzUnpVdG9TTVRGRFBhSTZvV2E3Q0owNkNvalhkCkZQUWYvN0ozMVljdnFtNTlKQ2ZueHNzbTV1WCtad2RqMkVVTjNUcFpaVGxZZXBLWmNqMmNoRjZJSWJqVjlDejgyWEJTVDNpNHZUd3IKaTVXWTliUFJhTThnRkg1TVhGL25pK1gxTllFWk45Y1JDTGRtdnROS3pvTlhBRHJEZ2ZnWHk1STJYZEdqMkhVYjRZc242bnBJUWYxRgpHUWF0SjVsT3dYQkgzYldmZ1ZNUzViR01TRjB4UXhmampNWjZZNVpMS1RCT2hFNWlHVjQ4enBlUXBYOEI2NTNnK0l1SjNTV1lQWksyCmZ1L1o4VkZSZlMwbXlHbFpZZUNzYXJncU5oRUVlbEM5TW9TK0w5eHkxZGNkRmtma1IyWWdQL1NXeGErT0FYcWxEM3BrOVEwWWg5bXUKaU5YNmhNRTZ3R2tvTGZJTmFGR3E0NlYzeHFTUURxRTNpekVqUjhFSkNPdHU5M2liMTRMOGhDQ1pTUm0yRWtheCswVlZGcW1qWmF5YwpCdy9xYTl3ZkxnWnk3SWFJRXVRdDIxOEZMK1R3QTlNbU0rZUF3czFDb1JjMEN3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVjUlZueU1qSnZYVmRjdEE0R0dxZDgzRWtWQXN3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFIVzdiVlJMcWhCWVJqVHlZdGNXTmwwSVh0VnN5SWU5dEM1RzhqSDRmT3BDdFpNV1ZkeWhEQktnMm1GKwpEMWhZYzJSeXgraEZqdHlwOGlZL3hubU1zVk1JTTRHd1ZoTys1bEZjMkpzS1QwdWNWbE1DNlUvMkRXRHFUVUpWNkh3YklTSFRHenJNCmQvSzRrUEZveC9sYS92b3Q5TC9KOVVVYnpqZ1FLamVLZWFPMDR3bHNoWWFULzRtV0ozaUJqMmZqUm5SVWp0a05hZUpLOUUxMEEvK3kKZCsyVlo1ZmtzY1dydjJvajZOU1U0a1FvWXNSTDR2RFk0aWxyR25CK0pHR1RlMDhETWlVTlJTUXJsclJHYXI5S0MvZWFqOEdzR3NWbgo4MjgwMHZwelk0enZGckNvcEVZcStPc1M3SEswNy9ncmZveFN3SXVFVlBrdlB1TlZxTnhtc2RuaFg5aXpqRmswV2FTclQyeTdIeGpiCmRhdll5NUxObERoaERnY0dIMHRHRVBFVnZvMkZYRHRLSzRGNUQ3UnBuMGxRbDAzM0RsWmR3SlZxd2piREcyako5U3JjUjVxK3NzN0YKSmVqNkE3bmErUlp1a1lUMUhDakkvQ2JNMXh5UVZxZGZiem9Fdk0xNGlRdU9EeStqcWsraUd4STlGZ2hBRC9GR1ROZXFld2pCQ3ZWdApKOTRDajhyRHRTdks2ZXZJSVZNNHBjdzcySGMzTUtKUDJXL1I4a0N0UVhvWHhkWktOWW0zUWRWOGhuOVZUWU5LcFhNZ3dEcXZrUEdhCkpJN1pqbkhLZTdpRzJyS1BtVDRkRXcwU0VlN1VxL0RwRlhZQzVPRGZxaUFlVzJHRlpFQ3BrSmNOclZQU1doMkhhZ0NYWldLMHZtOXEKcC9Vc1F1MHlyYllobnI2OAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3d6Q0NBa3FnQXdJQkFnSUJBREFLQmdncWhrak9QUVFEQWpDQnFqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUQmtGMAphR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1CmN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFJEQkNCZ05WQkFNVE8waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmoKYUNCSmJuTjBhWFIxZEdsdmJuTWdSVU5ESUZKdmIzUkRRU0F5TURFMU1CNFhEVEUxTURjd056RXdNemN4TWxvWERUUXdNRFl6TURFdwpNemN4TWxvd2dhb3hDekFKQmdOVkJBWVRBa2RTTVE4d0RRWURWUVFIRXdaQmRHaGxibk14UkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqCklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1TVVRd1FnWUQKVlFRREV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklFVkRReUJTYjI5MApRMEVnTWpBeE5UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkpLZ1FlaExnb1JjNHZneEVabUdaRTRKSlMrZFFTOEtyalZQCmRKV3lVV1Jyald2bVAzQ1Y4QVZFUjZaeU9GQjJsUUphanE0b252a3RUcG52TEVodlRDVXA2TkZ4Vzk4ZHdYVTN0TmY2ZTNwQ25Hb0sKVmxwOGFRdXFnQWtrYkg3QlJxTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwTwpCQllFRkxRaUM0S1pKQUVPbkx2a0R2Mi8rNWNnazVrcU1Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HZk9GbUk0b3F4aVJhZXBsU1RBCkdpZWNNanZBd05XNnFlZjRCRU5UaGU1U0lkNmQ5U1dEUHA1WVN5L1haeE1PSVFJd0JlRjFBZDVvN1NvZlRVd0pDQTNzUzYxa0Z5am4KZGM1RlpYSWhGOHNpUVE2TUU1ZzRtbFJ0bThyaWZPb0NXQ0tSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCklTUkcgUm9vdCBYMQo9PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lSQUlJUXo3RFNRT05aUkdQZ3UyT0Npd0F3RFFZSktvWklodmNOQVFFTEJRQXdUekVMTUFrR0ExVUUKQmhNQ1ZWTXhLVEFuQmdOVkJBb1RJRWx1ZEdWeWJtVjBJRk5sWTNWeWFYUjVJRkpsYzJWaGNtTm9JRWR5YjNWd01SVXdFd1lEVlFRRApFd3hKVTFKSElGSnZiM1FnV0RFd0hoY05NVFV3TmpBME1URXdORE00V2hjTk16VXdOakEwTVRFd05ETTRXakJQTVFzd0NRWURWUVFHCkV3SlZVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnVaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVQKREVsVFVrY2dVbTl2ZENCWU1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUszb0pIUDBGRGZ6bTU0cgpWeWdjaDc3Y3Q5ODRrSXh1UE9aWG9IajNkY0tpL3ZWcWJ2WUFUeWpiM21pR2JFU1R0ckZqL1JRU2E3OGYwdW94bXlGKzBUTTh1a2oxCjNYbmZzN2ovRXZFaG1rdkJpb1p4YVVwbVpteVBmanh3djYwcElnYno1TURtZ0s3aVM0KzNtWDZVQTUvVFI1ZDhtVWdqVStnNHJrOEsKYjRNdTBVbFhqSUIwdHRvdjBEaU5ld053SVJ0MThqQTgrbyt1M2RwanErc1dUOEtPRVV0K3p3dm8vN1YzTHZTeWUwcmdUQklsREhDTgpBeW1nNFZNazdCUFo3aG0vRUxOS2pEK0pvMkZSM3F5SEI1VDBZM0hzTHVKdlc1aUI0WWxjTkhsc2R1ODdrR0o1NXR1a21pOG14ZEFRCjRRN2UyUkNPRnZ1Mzk2ajN4K1VDQjVpUE5naVY1K0kzbGcwMmRaNzdEbkt4SFp1OEEvbEpCZGlCM1FXMEt0WkI2YXdCZHBVS0Q5amYKMWIwU0h6VXZLQmRzMHBqQnFBbGtkMjVITjdyT3JGbGVhSjEvY3RhSnhRWkJLVDVaUHQwbTlTVEpFYWRhbzB4QUgwYWhtYlduT2xGdQpoanVlZlhLbkVnVjRXZTArVVhnVkN3T1BqZEF2QmJJK2Uwb2NTM01GRXZ6RzZ1QlFFM3hEazNTenluVG5qaDhCQ05BdzFGdHhOclFICnVzRXdNRnhJdDRJN21LWjlZSXFpb3ltQ3pMcTlnd1Fib29NRFFhSFdCZkVid3Jid3FIeUdPMGFvU0NxSTNIYWFkcjhmYXFVOUdZL3IKT1BOazNzZ3JEUW9vLy9mYjRoVkMxQ0xRSjEzaGVmNFk1M0NJclU3bTJZczZ4dDBuVVc3L3ZHVDFNME5QQWdNQkFBR2pRakJBTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSNXRGbm1lN2JsNUFGemdBaUl5QnBZCjl1bWJiakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBVlI5WXFieXlxRkRRRExIWUdta2dKeWtJckdGMVhJcHUrSUxsYVMvVjlsWkwKdWJoekVGblRJWmQrNTB4eCs3TFNZSzA1cUF2cUZ5RldoZkZRRGxucnp1Qlo2YnJKRmUrR25ZK0VnUGJrNlpHUTNCZWJZaHRGOEdhVgowbnh2d3VvNzd4L1B5OWF1Si9HcHNNaXUvWDErbXZvaUJPdi8yWC9xa1NzaXNSY09qL0tLTkZ0WTJQd0J5VlM1dUNiTWlvZ3ppVXd0CmhEeUMzKzZXVndXNkxMdjN4TGZIVGp1Q3ZqSElJbk56a3RIQ2dLUTVPUkF6STRKTVBKK0dzbFdZSGI0cGhvd2ltNTdpYXp0WE9vSncKVGR3Sng0bkxDZ2ROYk9oZGpzbnZ6cXZIdTdVclRrWFdTdEFtek9WeXlnaHFwWlhqRmFIM3BPM0pMRitsKy8rc0tBSXV2dGQ3dStOeAplNUFXMHdkZVJsTjhOd2RDak5QRWxwelZtYlVxNEpVYWdFaXVURGtIenN4SHBGS1ZLN3E0KzYzU00xTjk1UjFOYmRXaHNjZENiK1pBCkp6VmNveWkzQjQzbmpUT1E1eU9mKzFDY2VXeEcxYlFWczVadWZwc01sanE0VWkwLzFsdmgrd2pDaFA0a3FLT0oycXhxNFJncXNhaEQKWVZ2VEg5dzdqWGJ5TGVpTmRkOFhNMnc5VS90N3kwRmYvOXlpMEdFNDRaYTRyRjJMTjlkMTFUUEFtUkd1blVIQmNuV0V2Z0pCUWw5bgpKRWlVMFpzbnZnYy91YmhQZ1hSUjRYcTM3WjBqNHI3ZzFTZ0VFend4QTU3ZGVteVB4Z2NZeG4vZVI0NC9LSjRFQnMrbFZEUjN2ZXlKCm0ra1hROTliMjEvK2poNVhvczFBblg1aUl0cmVHQ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFDIFJBSVogRk5NVC1SQ00KPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmd6Q0NBMnVnQXdJQkFnSVBYWk9OTUdjMnlBWWRHc2RVaEdrSE1BMEdDU3FHU0liM0RRRUJDd1VBTURzeEN6QUpCZ05WQkFZVApBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKV2lCR1RrMVVMVkpEVFRBZUZ3MHdPREV3Ck1qa3hOVFU1TlRaYUZ3MHpNREF4TURFd01EQXdNREJhTURzeEN6QUpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkQKVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKV2lCR1RrMVVMVkpEVFRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQwpnZ0lCQUxweGdIcE1obTUveUJOdHdNWjlIQUNYanl3TUk3c1Fta0NwR3JlSGlQaWJWbXI3NW51T2k1S09weVZkV1JIYk5pNjNVUmNmCnFRZ2ZCQmNrV0tvM1NoamY1VG5VVi8zWHdTeVJBWkhpSXRRRHdGajhkMGZzano1MFE3cXNOSTFOT0habmpyREliekF6V0hGY3RQVnIKYnRRQlVMZ1RmbXhLbzBuUklCbnV2TUFwR0dXbjN2N3YzUXFRSWVjYVo1SkNFSmhmVHpDOFBoeEZ0QkRYYUVBVXdFRDY1M2NYZXVZTApqMlZiUE5tYVV0dTF2WjVHenozcmtRVUN3SmF5ZGt4TkVKWTdrdnFjZncrWjM3NGpOVVVlQWx6K3RhaWJtU1hhWHZNaXd6bjE1Q291CjA4WWZ4R3lxeFJ4cUFRVktMOUxGd2FnMEpsMW1wZElDSWZrWXR3YjFUcGx2cUt0TVVlalBVQmpGZDhnNUNTeEpraktacUxzWEYzbXcKV3NYbW84UlpaVWMxZzE2cDZEVUxtYnZrelNER20wb0dPYlZvL0NLNjdsV01LMDdxODdIai9MYVptdFZDK25GTkNNK0hIbXB4ZmZuVAp0T21sY1lGN3drNUhscVgyZG9XaktJL3BnRzZCVTZWdFg3aEkrY0w1TnFZdVNmKzRsc0tNQjdPYmlGajg2eHNjM2kxdzRwZVNNS0dKCjQ3eFZxQ2ZXUysyUXJZdjZZeVZaTGFnMTNjcVhNN3psemNlZDBlenZYZzVLa0FZbVk2MjUyVFV0QjdwMlpTeXNWNDk5OUFlVTE0RUMKbGwyakIwblZldEJYK1J2blUwWjFxckI1UXN0b2NRanBZTDA1YWM3MHI4TldRTWV0VXFJSjVHK0dSNG9mNnlnblhZTWdyd1RKYkZhYQppMGIxQWdNQkFBR2pnWU13Z1lBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFCkZQZDl4ZjNFNkpvYmQyU245UjJnekwrSFlKcHRNRDRHQTFVZElBUTNNRFV3TXdZRVZSMGdBREFyTUNrR0NDc0dBUVVGQndJQkZoMW8KZEhSd09pOHZkM2QzTG1ObGNuUXVabTV0ZEM1bGN5OWtjR056THpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUI1QkszL01qVHZERApuRkZsbTV3aW9vb01oZk56S1d0Ti9nSGlxUXhqQWI4RVo2V2RtRi85QVJQNjdKcGk2WWIrdG1MU2JreVUrOEIxUlh4bERQaXlOOCtzCkQ4K05iL2taOTQvc0h2SndudkRLdU8rMy8zWTNkbHYyYm9qenIySXlJcE1OT21xT0ZHWU1MVk4wVjJVZTFiTGRJNEU3cFdZakoyY0oKaitGM3FrUE5aVkVJN1ZGWS91WTUrY3RIaEtRVjhYYTdwTzZrTzhSZjc3SXpsaEVZdDhsbHZoamhvNlRjK2hqNTA3d1Rtemw2TkxyVApRZnY2TW9vcXR5dUdDMm1ET0w3TmlpNExjSzJOSnBMdUh2VUJLd3JaMXBlYmJ1Q29HUnc2SVlzTUhrQ3RBK2ZkWm43MXVTQU5BK2lXCitZSkYxRG5nb0FCZDE1am1mWjVuYzhPYUt2ZXJpNkU2Rk84MHZGSU9pWmlhQkVDRUhYNUZhWk5YenV2TytGQjhUeHh1QkVPYitkWTcKSXhqcDZvN1JUVWFOOFR2a2FzcTYreU8zbS9xWkFTbGFXRm90NC9uVWJRNG1yY0Z1Tkx3eStBd0YrbVdqMnpzM2d5THAxdHh5TS8xZAo4aUM5ZGp3ajJpajMrUnZyV1dUVjNGOXlmaUQ4elltMWtHZE5Zbm8vVHEwZHd6bitldlFvRnQ5QjlraUFCZGNQVVhtc0VLdlU3QU5tCjVtcXd1akdTUWtCcXZqclRjdUZxTjFXOHJCMlZ0MmxoOGtPUmRPYWcwd29rUnFFSXI5YmFSUm1XMUZNZFc0UjU4TUQzUisrTGo4VUcKcnAxTVlwMy9SZ1Q0MDhtMkVDVkFkZjRXcXNsS1lJWXZ1dTh3ZCtSVTRyaUVtVmlBcWhPTFVUcFBTUGFMdHJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWF6b24gUm9vdCBDQSAxCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQWltZ0F3SUJBZ0lUQm15Zno1bS9qQW81NHZCNGlrUG1salpieWpBTkJna3Foa2lHOXcwQkFRc0ZBREE1TVFzd0NRWUQKVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGdVbTl2ZENCRFFTQXhNQjRYRFRFMQpNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOekF3TURBd01Gb3dPVEVMTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2CmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnUTBFZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFMSjRnSEhLZU5YamNhOUhnRkIwZlc3WTE0aDI5SmxvOTFnaFlQbDBoQUV2ckFJdGh0T2dRM3BPc3FUUU5yb0J2bzNiU01nSApGelpNOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xd0lGQUdiSHJRCmdMS20rYS9zUnhtUFVEZ0gzS0tIT1ZqNHV0V3ArVWhuTUpidWxIaGViNG1qVWNBd2htYWhSV2E2Vk91anc1SDVTTnovMGVnd0xYMHQKZEhBMTE0Z2s5NTdFV1c2N2M0Y1g4akpHS0xoRCtyY2Rxc3EwOHA4a0RpMUw5M0ZjWG1uLzZwVUN5emlLcmxBNGI5djdMV0lieGNjZQpWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbWpnU3ViSnJJcWcwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0hRWURWUjBPQkJZRUZJUVl6SVUwN0x3TWxKUXVDRm1jeDdJUVRnb0lNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFDWThqZGFRWkNoR3NWMlVTZ2dOaU1PcnVZb3U2cjRsSzVJcERCL0cvd2tqVXUweUtHWDlyYnhlbkRJVTVQTQpDQ2pqbUNYUEk2VDUzaUhUZklVSnJVNmFkVHJDQzJxSmVIWkVSeGhsYkkxQmpqdC9tc3YwdGFkUTF3VXNOK2dEUzYzcFlhQUNidlh5CjhNV3k3VnUzM1BxVVhIZWVFNlYvVXEyVjh2aVRPOTZMWEZ2S1dsSmJZSzhVOTB2dm8vdWZRSlZ0TVZUOFF0UEhSaDhqcmRrUFNIQ2EKMlhWNGNkRnlRelIxYmxkWndnSmNKbUFwenlNWkZvNklRNlhVNU1zSSt5TVJRK2hES1hKaW9hbGRYZ2pVa0s2NDJNNFV3dEJWOG9iMgp4Sk5EZDJaaHdMbm9RZGVYZUdBRGJrcHlycVhSZmJvUW5vWnNHNHE1V1RQNDY4U1F2dkc1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtYXpvbiBSb290IENBIDIKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSVRCbXlmMHBZMWhwOEtEK1dHZVBoYkpydUtOekFOQmdrcWhraUc5dzBCQVF3RkFEQTVNUXN3Q1FZRApWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0Z1VtOXZkQ0JEUVNBeU1CNFhEVEUxCk1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHYKYmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWdRMEVnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQwpnZ0lCQUsyV255MmNTa3hLZ1hsUm1leUt5MnRnVVJPOFRXMEcvTEFJamQwWkVHckhKZ3cxMk1CdklJVHBsTEdiaFFQRFc5dEs2TWo0CmtIYlpXMC9qVE9nR05rM01tcXc5REpBcmt0UUdHV0NzTjBSNWhZR0NyVm8zNEEzTW5hWk1VbmJxUTUyM0JORlE5bFhnMWRLbVNZWHAKTituS2ZxNWNsVTFJbWordUlGcHRpSlhaTkxoU0drT1FzTDlzQmJtMmVMZnEwT1E2UEJKVFl2OUs4bnUrTlFXcEVqVGo4MlIwWWl3OQpBRWxhS1A0eVJMdUgzV1VuQW5FNzJrcjNIOXJOOXlGVmtFOFA3SzZDNFo5cjJVWFR1L0JmaCswOExEbUcyai9lN0hKVjYzbWpyZHZkCmZMQzZITTc4M2s4MWRzOFArSGdmYWpaUlJpZGhXK21lei9DaVZYMThKWXB2TDdURno0UXVLLzBOVVJCcysxOGJ2QnQreGE0N21BRXgKa3Y4TFYvU2FzcmxYNmF2dkRYYlI4Tzcwem9hbjRHN3B0R21oMzJuMk04WnBMcGNUbnFXSHNGY1FnVGZKVTdPN2YvYVMwWnpRR1BTUwpidHFEVDZaam1VeWwrMTd2SVdSNklGOXNaSVVWeXpmcFlnd0xLaGJjQVM0eTJqNUw5WjQ2OWhkQWxPK2VrUWlHK3I1anFGb3o3TXQwClE1WDViR2xTTnNjcGIveFZBMXdmKzUrOVIrdm5TVWVWQzA2SklnbEo0UFZoSHZHL0xvcHlib0JaLzFjNitYVXlvMDVmN08wb1l0bE4KYy9MTWdSZGc3YzNyM051bnlzVitBcjN5VkFoVS9iUXRDU3dYVkVxWTBWVGhVV2NJMHUxdWZtOC8waTJCV1NsbXk1QTVsUkVlZENmKwozZXV2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlN3CkRQQk1NUFFGV0FKSS9UUGxVcTlMaE9ObVVqQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFxcWlBanc1NG8rQ2kxTTNtOVpoNk8rb0EKQTdDWERwTzhXcWoyTEl4eWg2bXgvSDl6L1dOeGVLV0hXYzh3NFEwUXNoTmFiWUwxYXVhQW42QUZDMmprUjJ2SGF0KzIvWGN5Y3VVWQorZ24wb0pNc1hkS01kWVYyWlpBTUEzbTNNU05qclhpRENZWm9oTXIvK2M4bW1wSjU1ODFMeGVkaHB4Zkw4NmtTazVOcnArZ3ZVNUxFCllGaXd6QUpSR0Z1RmpXSlpZN2F0dE42YSt5YjNBQ2ZBWFZVM2RKbkpVSC9qV1M1RTR5d2w3dXhNTW5lMG54cnBTMTBneGRyOUhJY1cKeGtQbzFMc21ta1Z3WHFrTE4xUGlSbnNuL2VCRzhvbTN6RUsyeXlnbWJ0bWx5VHJJUVJOZzkxQ01GYTZ5YlJvVkdsZDQ1cElxMldXUQpnajlzQXErdUVqb25sallFMXgyaWdHT3BtL0hsdXJSOEZMQk95YkVmZEY4NDlsSHFtL29zb2hIVXFTMG5Ha1d4cjdKT2NRM0FXRWJXCmFRYkxVOHV6L210QnpVRitmVXdQZkhKNWVsbk5Ya29Pckp1cG1ITjVmTFQwekxtNEJ3eXlkRnk0eDIrSW9aQ245S3I1djJjNjlCb1YKWWg2M243NDlzU212WjZFUzhsZ1FHVk1ETUJ1NEdvbjJuTDJYQTQ2akNmTWRpeUh4dE4va0hOR2ZaUUlHNmx6V0U3T0U3NktsWEl4MwpLYWRvd0d1dVFOS290T3JOOEkxTE9Kd1ptaHNvVkxpSmtPL0tkWUUrSHZKa0pNY1lyMDcvUjU0SDlqVmxwTk1LVnYvMUYyUnM3NmdpCkpVbVR0dDhBRjlwWWZsM3V4UnV3MGRGZklSREgrZk82QWdvbkI4WHgxc2ZUNFBzSllHdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQW1hem9uIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCdGpDQ0FWdWdBd0lCQWdJVEJteWYxWFNYTm1ZL093dWEyZWllZGdQeVNqQUtCZ2dxaGtqT1BRUURBakE1TVFzd0NRWURWUVFHCkV3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGdVbTl2ZENCRFFTQXpNQjRYRFRFMU1EVXkKTmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWgpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnUTBFZ016QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDbVhwOFpCCmY4QU5tK2dCRzFiRzhsS2x1aTJ5RXVqU0x0ZjZ5Y1hZcW0wZmM0RTdPNWhyT1h3enBjVk9obzZBRjJoaVJWZDlSRmdkc3pmbFp3anIKWnQ2alFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3J0dHZYQnA0MwpyRENHQjVGd3g1ekVHYkY0d0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQTRJV1NveGUzamZrckJxV1RyQnFZYUdGeSt1R2gwUHNjCmVHQ21RNW5GdU1RQ0lRQ2NBdS94bEp5emx2bnJ4aXI0dGl6K09wQVVGdGVNWXlSSUhOOHdmZFZvT3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWF6b24gUm9vdCBDQSA0Cj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI4akNDQVhpZ0F3SUJBZ0lUQm15ZjE4RzdFRXdwUStWeGUzc3N5QnJCRGpBS0JnZ3Foa2pPUFFRREF6QTVNUXN3Q1FZRFZRUUcKRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0Z1VtOXZkQ0JEUVNBME1CNFhEVEUxTURVeQpOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaCk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWdRMEVnTkRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTktyaWpkUG8xTU4KL3NHS2UwdW9lMFpMWTdCaTlpMGIyd2h4SWRJQTZHTzltaWY3OERsdVhlbzlwY21CcXFOYklKaEZYUmJiL2VnUWJlT2M0T085WDRSaQo4M0JrTTZETEpDOXd1b2loS3FCMStJR3VZZ2JFZ2RzNWJpbXdIdm91WEtOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WCkhROEJBZjhFQkFNQ0FZWXdIUVlEVlIwT0JCWUVGTlBzeHpwbGJzemgybmFhVnZ1Yzg0WnRWK1dCTUFvR0NDcUdTTTQ5QkFNREEyZ0EKTUdVQ01EcUxJZkc5ZmhHdDBPOVlsaS9XNjUxK2tJMHJ6MlpWd3l6aktLbHdDa2NPOERkWkV2OHRtWlFvVGlwUE5VMHpXZ0l4QU9wMQpBRTQ3eERxVUVwSEpXRWFkSVJOeXA0aWNpdVJNU3R1VzFLeUxhMnRKRWxNenJkZmt2aVQ4dFFwMjFLVzhFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVZekNDQTB1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCMGpFTE1Ba0dBMVVFQmhNQ1ZGSXhHREFXQmdOVkJBY1QKRDBkbFlucGxJQzBnUzI5allXVnNhVEZDTUVBR0ExVUVDaE01VkhWeWEybDVaU0JDYVd4cGJYTmxiQ0IyWlNCVVpXdHViMnh2YW1scgpJRUZ5WVhOMGFYSnRZU0JMZFhKMWJYVWdMU0JVVlVKSlZFRkxNUzB3S3dZRFZRUUxFeVJMWVcxMUlGTmxjblJwWm1scllYTjViMjRnClRXVnlhMlY2YVNBdElFdGhiWFVnVTAweE5qQTBCZ05WQkFNVExWUlZRa2xVUVVzZ1MyRnRkU0JUVFNCVFUwd2dTMjlySUZObGNuUnAKWm1scllYTnBJQzBnVTNWeWRXMGdNVEFlRncweE16RXhNalV3T0RJMU5UVmFGdzAwTXpFd01qVXdPREkxTlRWYU1JSFNNUXN3Q1FZRApWUVFHRXdKVVVqRVlNQllHQTFVRUJ4TVBSMlZpZW1VZ0xTQkxiMk5oWld4cE1VSXdRQVlEVlFRS0V6bFVkWEpyYVhsbElFSnBiR2x0CmMyVnNJSFpsSUZSbGEyNXZiRzlxYVdzZ1FYSmhjM1JwY20xaElFdDFjblZ0ZFNBdElGUlZRa2xVUVVzeExUQXJCZ05WQkFzVEpFdGgKYlhVZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBJQzBnUzJGdGRTQlRUVEUyTURRR0ExVUVBeE10VkZWQ1NWUkJTeUJMWVcxMQpJRk5OSUZOVFRDQkxiMnNnVTJWeWRHbG1hV3RoYzJrZ0xTQlRkWEoxYlNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXIzVXdNNnE3YTlPWkxCSTNoTm1OZTVlQTAyN24vNXRRbFQ2UWxWWkMxeGw4Sm9TTmt2b0JIVG9QNG1RNHQ0eTgKNklqNWl5U3JMcVAxTitSQWpoZ2xlWU4xSHp2L2JLakZ4bGI0dE8yS1JLT3JiRXo4SGREYzcyaTl6K1NxenZCVjk2STAxSU5yTjN3Ywp3djYxQSt4WHpyeTB0Y1h0QUE5VE55cE45RThNZy91R3o4ditqRTY5aC9tbml5RlhuSHJmQTJlSkxKMlhZYWNRdUZXUWZ3NHRKemgwCjMrZjkyazRTNDAwVklnTEk0T0Q4RDYySzE4bFVVTXc3RDhvV2dJVFFVVmJEamxaL2lTSXpMK2FGQ3IybHFCczIzdFBjTEcwN3h4TzkKV1NNczV1V2s5OWdMN2VxUVFFU29sYnVUMWRDQU5MWkdlQTRmQUpORzRlN3ArZXhQRndJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVQpaVC9IaW9iR1BOMDhWRncxK0RydFVneEhWOGd3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUNvLzRmRXlqcTdobUZ4TFhzOXJIbW9KMGlLcEVzZGVWMzF6Vm1TQWhIcVQ1QW01RU0yZktpZmgKQUhlK1NNZzFxSUdmNUxnc3lYOE9zTkpMTjEzcXVkVUxYalM5OUhNcHcrMG1GWngrQ0ZPS1dJM1FTeWpmd2JQZklQUDU0K002Mzh5YwpsTmhPVDhOckY3ZjNjdWl0WmpPMUpWT3I0UGhNcVozOThnMjZycm5acXNacitaTzdycXU0bHp3REdycER4cGE1UlhJNHM2ZWhsajJSCmUzN0FJVk5NaCszeUMxU1ZVWlBWSXFVTml2R1REajVVRHJEWXlVN2M4akV5VnVwaytlcTFuUlptUW5MemY5T3hNVVA4cEk0WDhXMGoKcTVSbStLMzdEd2h1SmkxL0Z3Y0pzb3o3VU1DZmxvM1B0djBBblZvVW1yOENSUFhCd3A4aVhxSVBvZU09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlEQ0NBM0NnQXdJQkFnSUlmUW1YL3ZCSDZub3dEUVlKS29aSWh2Y05BUUVMQlFBd1lqRUxNQWtHQTFVRUJoTUNRMDR4TWpBdwpCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaSUVOUExpeE1WRVF1TVI4d0hRWURWUVFECkRCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUI0WERURTBNVEV5TmpBMU1UTXhOVm9YRFRRd01USXpNVEUxTlRrMU9Wb3cKWWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3QmdOVkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWgpJRU5QTGl4TVZFUXVNUjh3SFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTJhTVc4TWgwZEhlYjd6TU5Pd1orVmZ5MVlJOTJoaEpDZlZabVBvaUM3WEpqRHA2TDNUUXMKQWxGUnd4bjlXVlNFeWZGcnMweXc2ZWhHWFRqR29xY3VFVmU2Z2hXaW5JOXRzSmxLQ3ZMcmlYQmpUbm5FdDF1OW9sMng4a0VDSzYycApPcVBzZVFyc1h6cmovZStBUEswMG14cXJpQ1o3VnFLQ2hoL3JOWW1EZjErdUtVNDl0bTdzcnNId0o1dXU0L1RzNzY1Lzk0WTljbnJyCnBmdFpUcWZybFl3aU9YbmhMUWlQekx5UnVFSDNGTUVqcWNPdG1rVkVzN0xYTE0zR0tlSlFFSzVjeTRLT0Z4ZzJmWmZtaUpxd1RUUUoKOUN5NVdtWXFzQmVibmg1Mm5VcG1NVUhmUC92RkJ1OGJ0bjRhUmpiM1pHTTc0emtZSStkbmRSVFZkVmVTTjcyK2Foc21VUEkySmdhUQp4WEFCWkcxMlp1R1IyMjRId0dHQUxySXVMNHh3cDlFN1BMT1I1RzYyeER0dzhteVNsd25OUjMwWXdQTzduZy9XaTY0SHRsb1B6Z3NNClI2ZmxQcmk5ZmNlYk5hQmhsenBCZFJmTUs1WjNLcEloSHRtVmRpQm5hTThOdmQvV0h3bHFtdUxNYzNHa0wzMFNnTGRUTUVaZVMxU1oKRDJmSnBjanlJTUdDN0owUjM4SUMreG83MGUwZ211OWxaSklRRFNyaTNuRHhHR2VDakdIZXVMelJMNXo3RDlBcjdSdDJ1ZVE1VmZqNApvUjI0cW9BQVRJTG5zbjhKdUx3d29DOE45VktlanZlU3N3b0FIUUJVbHdiZ3NRZlp4dzljWlgwOGJWbFg1TzJsamVsQVU1OFZTNkJ4Cjlob2g0OXB3QmlGWUZJZUZkM21xZ25rQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZPTEpRSjlOenVpYW9YelBEajlseFNtSWFobFIKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURSU1ZmZwpwOHhvV0xvQkR5c1p6WTJ3WVVXc0VlMWpVR240SDMrK0ZvLzluZXNMcWpKSGR0Sm5KTzI5ZkRNeWx5ckhCWVptRFJkOUZCVWIxT3Y5Ckg1cjJYcGRwdHhvbHBBcXprVDlmTnF5TDdGZW9QdWVCaWhoWE9ZVjBHa0xINlZzVFg0LzVDT21TZEkzMVI5S3JPOWI3ZUdaT05uMzUKNlpMcEJONzlTV1A4YmZzVWNaTm5MMGRLdDduL0hpcHpjRVl3djFyeUwzbWw0WTBNMmZteVl6ZU1OMldGY0dwY1d3bHl1YTFqUExIZAorUHd5dnplRzVMdU9tQ2QrdWg4VzRYQVI4Z1BmSldJeUp5WVlNb1NmL3dBNkU3cWFUZlJQdUJSd0lySEtLNURPS2NGdzlDK2RmL0tRCkh0WmEzN2RHL09hRytzdmdJSFo2dXFiTDlYemVZcVd4aSs3ZWdtYUtUam93SHorQXk2MG51Z3hlMTlDeFZzcDNjYksxZGFGUXFVQkQKRjhJbzJjOVNpMXZJWTlSQ1BxQXpla1l1OXdvZ1JsUithazh4OFlGK1FuUTRaWE1uN3NaOHVJN1hwVHJYbUtHY2pCQlYwOXRMN0VDUQo4czF1VjlKaURueFhrN0duYmMyZGc3c3E1K1cyTzNGWXJmM1JSYnhha2U1VEZXL1RSUWwxYnJxUVhSNEV6emZmSHFobXNZem1JR3J2Ci9FaE9kSmhDcnlsdkxtckgrMzNSWmpFaXpJWUFmbWFEREVMMHZUU1N3eHJxVDhwK2NrMExjSXltU0x1bW9SVDIrMWhFbVJTdXFndVQKYWFBcEpVcWx5eXZkaW1ZSEZuZ1ZWM0ViN1BWSGhQT2VNVGQ2MVg4a3JlUzgvZjNNYm9Qb0RLaTNRV3dIM2IwOGhwY3YwZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNUQ0NBOFdnQXdJQkFnSUlleXliMHhhQU1wa3dEUVlKS29aSWh2Y05BUUVMQlFBd2ZERUxNQWtHQTFVRUJoTUNWVk14RGpBTQpCZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VFUwd2dRMjl5Y0c5eVlYUnBiMjR4Ck1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQlNVMEV3SGhjTk1UWXcKTWpFeU1UY3pPVE01V2hjTk5ERXdNakV5TVRjek9UTTVXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeApFREFPQmdOVkJBY01CMGh2ZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NCkxtTnZiU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUZKVFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dJUEFEQ0NBZ29DZ2dJQkFQa1AzYU1yZmN2UUt2N3NaNFdtNXk0YnVuZmg0L1d2cE96NlNsMlJ4RmRIYXhoM2EzYnkvWlBrUFEvQwpGcDRMWnNOV2xKNFhnNFhPVnUveUZ2MEFZdlVpQ1ZUb1pSZE9RYm5nVDBhWHFodkl1RzVpWG1teFg5c3FBbjc4Yk1yelFkanQwT2o4ClAyRkk3YkFERkIwUURrc1o0THRPN0labC96YnpYbWNDQzUyR1ZXSDllamp0L3VJWkFMZHZvVkJpZFhROG9QcklKWkswYm5vaXgvZ2UKb2VPeTNaRXhxeXNkQlArbFNnUTM2WVdrTXl2OTR0WlZOSHdacEVwb3g3S28wN2ZLb1pPSTY4R1h2SXo1SGRraWhDUjB4d1E5YXFrcAprOHpydUZ2aC9sOGxxalJZeU1FalZKMGJtQkhET0p4K1BZWnNwUTlBaG53QzlGd0NUeWpMcm5HZkR6cklNLzRSSlRYcS9MckZZRDNaCmZCalZzcW5UZFhnRGNpTEtPc01mN3l6bExxbjZuaXkyVVViOXJ3UFc2bUJvNm9VV05tdUY2UjdBczkzRUpOeUFLb0ZCYlpRK3lPREoKZ1VFQW5sNi9mOFVJbUtJWUxFSkFzL2x2T0NkTFRvRDBQWUZINEloODZoek90WFZjVVM0Y0szOGFjaWpuQUxYUmRNYlg1Sit0QjVPMgpVelUxL0Rma3cvWmRGcjRoYzk2U0N2aWdZMnE4bHBKcVB2aThaVldiM3ZVTmlTWUUvQ1VhcGlWcHk4SnR5bnppV1YrWHJPdnZMc2k4CjF4dFpQQ3ZNOGhuSWsyc25ZeG5QL09rbStNcHhtMytUL2pSbmhFNlo2L3l6ZUFremNMcG1wbmJ0RzNQckdxVU54Q0lUSUpSV0NrNHMKYkU2eC9jK2NDYnFpTSsySEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCVGRCQWtIb3ZWNmZWSlRFcEtWN2ppQUpRMm1XVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOMEVDUWVpOVhwOVVsTVNrcFh1T0lBbERhWlpNQTRHQTFVZER3RUIvd1FFCkF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBSUJnUmxDbjdKcDBjSGg1d1lmR1ZjcE54Sksxb2sxaU9NcThiczNBRC9DVXIKZElXUVBYaHE5TG1McFpjN3RSaVJ1eDZuK1VCYmtmbFZtYThlRWRCY0hhZG00N0dVQnd3eU9hYnFHN0I1MkIyY2NFVGppdDNFK1pVZgppamhEUHdHRnBVZW5QVWF5dk9VaWFQZDduTmdzUGdvaHlDMHpyTC9GZ1preGRNRjFjY1crc2ZBalJmU2RhL3daWTUyanZBVEdHQXNsCnUxT0pEN09BVU41RjdrUi9xNVI0WkpqVDlpamRoOWh3WlhUN0Rya1Q2NmNQWWFreWxzemV1KzFqVEJpN3FVRDNvRlJ1SUloeGRSanEKZXJRMGN1QWpKM2RjdHBEcWhpVkFxKzh6RDh1ZmdyNmlJUHYydFMwYTVzS0ZzWFFQKzhobEFxUlNBVWZkU1NMQnY5anJhNngrM3V4agpNeFczSXdpUHhnK05RVnJkanNXNWorVkZQM2pidXRJYlFMSCtjVTAvNElHaXVsNjA3QlhnazkwSUgzN2hWWmtMSWQ2VG5ncjc1cU5KCnZUWXcvdWQzc3FCMWw3VXRnWWdYWlNEMzJwQUFuOGxTekRMS05YejFQUS9ZSzlmMUptekpCalNXRnVwd1dSb3llWGtMdG9oL0QxSkkKUGI5czJLSkVMdEZPdDNKWTA0a1RsZjVFcS9qWGl4dHVuTHdzb0Z2VmFnQ3ZYemZoMWZvUUM1aWNodWNtajg3dzdHNktWd3VBNDA2eQp3S0JqWVpDNlZXZzNkR3Eya3R1Zm9ZWWl0bVVuRHV5Mm4wSmc1R2ZDdGRwQkM4VFRpMkVidlBvZmtTdlhSQWRldWltczJjWHA3MU5JCld1dUE4U2hZSWMyd0JsWDdKejlUa0hDcEJCNVhKN2s9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2pUQ0NBaFNnQXdJQkFnSUlkZWJmeThGb1c2Z3dDZ1lJS29aSXpqMEVBd0l3ZkRFTE1Ba0dBMVVFQmhNQ1ZWTXhEakFNQmdOVgpCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2CkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXkKTVRneE5EQXpXaGNOTkRFd01qRXlNVGd4TkRBeldqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBTwpCZ05WQkFjTUIwaHZkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52CmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUEKQkVWdXFWREVwaU0ybmw4b2pSZkxsaUprUDl4NmpoM01DTE9pY1NTNmprbTVCQnRIbGxpckxaWEk3WjRJTmNnbjY0bU1VMWpyWW9yKwo4RnNQYXpGU1kwRTdpYzNzN0xhTkdkTTBCOXk3eGdaL3drV1Y3TXQvcUNQZ0NlbUIrdk5IMDZOak1HRXdIUVlEVlIwT0JCWUVGSUxSCmhYTXc1elVFMDQ0Q2t2dmxwTkhFSWVqTk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVndEdGY3pEbk5RVFQKamdLUysrV2swY1FoNk0wd0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUcvbjYxa1JwR0RQWWJDVwplKzBGK1M4VGtkenQ1ZnhRYXhGR1JyTWNJUUJpdTc3RDUrak5CNW41RFF0ZGNqN0VxZ0l3SDd5NkMrSXdKUHQ4YllCVkNwaytnQTB6CjVXYWpzNk83cGRXTGp3a3NwbDErNHZBSENHaHQwbnhwYmwvZjVXcGwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGNnpDQ0E5T2dBd0lCQWdJSVZyWXB6VFM4ZVBZd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lJeEN6QUpCZ05WQkFZVEFsVlRNUTR3CkRBWURWUVFJREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXUKTVRjd05RWURWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeQpNQjRYRFRFM01EVXpNVEU0TVRRek4xb1hEVFF5TURVek1ERTRNVFF6TjFvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVE0d0RBWURWUVFJCkRBVlVaWGhoY3pFUU1BNEdBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWUQKVlFRRERDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXlNSUlDSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFqelpsUU9IV1RjRFh0T2xHMm12cU0wZk5UUGw5ZmI2OUxUM3cyM2poCmhxWFp1Z2xYYU8xWFBxRFFDRUdENXloQkpCL2pjaFhRQVJyN1huQWpzc3VmT2VQUHhVN0drbTBteG51N3M5b25uUXFHNllFM0JmN3cKY1hIc3d4enBZNklYRkozdkcyZlRoVlVDQXRaSnljeGE0YkgzYnpLZnlkUTdpRUdvbkwzTHE5dHRld2tmb2t4eWtOb3JDUHpQUEZUTwpadytvejEyV0dRdkU0M0xycmRGOUhTZnZrdXNRdjF2ck82L1BnTjNCMHBZRVczcCtwS2s4T0hha1lvNmdPVjdxZDg5ZEFGbVBaaXcrCkI2S2pCU1lSYVpmcWhiY1BsZ3RMeUVEaFVMb3Vpc3YzRDVvaTUzK2FOeFBOOGswVGF5SFJ3TXdpOHFGRzlrUnBuTXBoTlFjQWI5WmgKQ0JIcXVyajI2Yk5nNVUyNTdKOFVac2xYV052TmgybjRpb1lTQTBlL1poTjJySGQ5TkNTRmc4M1hxcHlRR3A4aExIOTR0MlM0Mk9pbQo5SGl6VmN1RTBqTEVlSzZqajJIZHpnaFRyZXlJL0JYa21nM21ueHAzemt5UHVCUVZQV0tjaGpnR0FHWVM1RmwyV2xQQUFwaWlFQ3RvClJIdU9lYzR6U25hcVc0RVdHN1dLMk5BQWUxNWl0QW5XaG1NT3BnV1ZTYm9vaTRpVHNqUWMyS1JWYnJjYzBONlpWVHNqOUNMZytTbG0KSnV3Z1VIZmJTZ3VQdnVVQ1lIQkJYdFN1VURraUZDYkxzanR6ZEZWSEIzbUJPYWd3RTBUbEJJcXVsaE1sUWcrNVU4U2IvTTNrSE40OAorcXZXQmtvZlo2YVlNQnpkTE52Y0dKVlhac2IvWEl0VzlYY0NBd0VBQWFOak1HRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WCkhTTUVHREFXZ0JUNVlMdlU0OVUwOXJqMUJvQWxwM1BiUm1tb25qQWRCZ05WSFE0RUZnUVUrV0M3MU9QVk5QYTQ5UWFBSmFkejIwWnAKcUo0d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCV3M0N0xDcDFKanIra3hKRzdaaGNGVVpoMQorK1ZRTEhxZThSVDZxOU9LUHYrUktZOWppOWkwcVZRQkRiNlRoaS81U20zSFh2VlgrY3BWSEJLK1J3ODJ4ZDlxdDl0MXdrY2xmN254ClkvaG9MVlVFMGZLTnNLVFB2RHhlSDNqbnBhQWdjTEFFeGJmM2NxZmVJZzI5TXlWR2pHU1NKdU0rTG1PVzJwdU1QZmdZQ2RjRHpIMkcKZ3VES0JBZFJVTmYva3RVTTc5cUduNW5YNjdldmFPSTVKcFM2YUxlL2c5UHFlbWM5WW1ldUplVnk2T0xrN0s0Uzlrc3JQSi9wc0VEegpPRlN6L2Jkb3lOckdqMUU4c3Z1UjNCem5tNTNodHcxeWorS2t4S2w0K2VzVXJNWkRCY0psT1NnWUFzT0NzcDBGdm1YdGxsOWxkRHo3CkNUVXVlNXdUL1JzUFhjZHRnVHBXRDh3NzRhOENMeUtzUnNwR1BLQWNUTlpFdEY0dVhCVm1DZUVtS2Y3R1VtRzZzWFAvd3d5YzVXeHEKbEQ4VXlrQVdsWVR6V2Ftc1gweGhrMjNSTzh5aWxRd2lwbWRuUkM2NTJkS0tRYk5tQzFyN2ZTT2w4aHF3Lzk2Ymc1UXUwVC9ma3JlUgpyd1U3WmNlZ2JMSE5ZaExEa0J2akpjNDB2RzkzZHJFUXcvY0ZHc0RXcjNSaVNCZDNrbW1RWVJ6ZWxZQjBWSThZSE1QekE5Qy9wRU4xCmhsTVllZ291Q1J3Mm41SDlnb29pUzlFT1VDWGR5d01NRjhtREFBaE9OVTJLaSszd0FwUm1MRVIveTVVbmxoZXRDVENzdG5FWGJvc1gKOWh3SjFDMDdtS1Z4MDFRVDJXRHo5VXRtVC9yeDdpQVNqYlNzVjdGRlk2R3NkcW5DK3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsRENDQWhxZ0F3SUJBZ0lJTENtY1d4YnRCWlV3Q2dZSUtvWkl6ajBFQXdJd2Z6RUxNQWtHQTFVRUJoTUNWVk14RGpBTUJnTlYKQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VFUwd2dRMjl5Y0c5eVlYUnBiMjR4TkRBeQpCZ05WQkFNTUsxTlRUQzVqYjIwZ1JWWWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3Ck1qRXlNVGd4TlRJeldoY05OREV3TWpFeU1UZ3hOVEl6V2pCL01Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXgKRURBT0JnTlZCQWNNQjBodmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakUwTURJR0ExVUVBd3dyVTFOTQpMbU52YlNCRlZpQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OUFnRUdCU3VCCkJBQWlBMklBQktvU1I1Q1lHL3Z2dzBBSGd5Qk84VENDb2diUjhwS0dZZkwySVdqS0FNVEg2a01BVkliYy9SL2ZBTGhCWWx6Y2NCWXkKM2grWjFNekZCOGdJSDJFV0IxRTlmVndIVStNMU9JemZ6Wi9aTGcxS3Roa3VXbkJhQnUyKzhLR3d5dEFKS2FOak1HRXdIUVlEVlIwTwpCQllFRkZ2S1h1WGUwb0dxemFndFpGRzIyWEtibCtaUE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXOHBlCjVkN1NnYXJOcUMxa1ViYlpjcHVYNWs4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyZ0FNR1VDTVFDSzVrQ0oKTit2cDFSUFp5dFJySlBPd1BZZEdXQnJzc2Q5disxYTZjR3ZIT016b3NZeFBEL2Z4WjNZT2c5QWVVWThDTUQzMkl5Z21UTVpnaDVNbQptN0kxSHJyVzl6elJITTc2SlR5bUdvRVZXL01TRDJ6dVpZckpoNmo1QitCaW1veGNTZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbFNpZ24gUm9vdCBDQSAtIFI2Cj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJT1JlYTdBNE16dzRWbFNPYi9SVkV3RFFZSktvWklodmNOQVFFTUJRQXdUREVnTUI0R0ExVUVDeE1YClIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVall4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHMKYjJKaGJGTnBaMjR3SGhjTk1UUXhNakV3TURBd01EQXdXaGNOTXpReE1qRXdNREF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aQpZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNOakVUTUJFR0ExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzClUybG5iakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFKVUg2SFBLWnZuc0ZNcDdQUGNOQ1BHMFJRc3MKZ3JSSXh1dGJQSzZEdUVHU014U2tiMy9wS3N6R3NJaHJ4YmFKMGNheS94VE9VUlFoN0VyZEcxckcxb2Z1VFRvVkJ1MWtaZ3VTZ01wRQozbk9VVHZPbmlYOVBlR01JeUJKUWJVSm1MMDI1ZVNoTlVocUtHb0MzR1lFT2ZzU0t2R1JNSVJ4RGFOYzlQSXJGc21iVmtKcTNNUWJGCnZ1SnRNZ2FtSHZtNTY2cWp1TCsrZ21OUTBQQVlpZC9rRDNuMTZxSWZLdEp3TG52bnZKTzdiVlBpU0h5TUVBYzQvMmF5ZDJGKzRPcU0KUEtxMHBQYnpsVW9TQjIzOWpMS0p6OUNnWVhmSVdIU3cxQ002OTEwNnlxTGJuUW5lWFVRdGtQR0J6VmVTK242OFVBUmpOTjlya3hpKwphemF5T2VTc0pEYTM4TysySEJOWGs3YmVzdmppaGJkem9yZzFxa1h5NEowMm9XOVVpdkZ5Vm00dWlNVlJRa1FWbE82anhUaVdtMDVPCldndEg4d1kyU1hjd3ZIRTM1YWJzSVFoMS9PWmhGajkzMWRtUmw0UUtiTlFDVFhUQUZPMzlPZnVEOGw0VW9RU3dDK24rN28vaGJndXkKQ0xOaFpnbHFzUVk2WlpaWndQQTEvY25hS0kwYUVZZHdnUXFvbW5VZG5qcUdCUUNlMjREV0pmbmNCWjRuV1V4Mk9WdnErYVdoMklNUAowZi9mTUJINWhjOHpTUFhLYldRVUxIcFlUOU5MQ0VuRmxXUWFZdzU1UGZXempNcFlyWnhDUlhsdURvY1pYRlN4WmJhL2pKdmNFK2tOCmI3Z3UzR2R1eVlzUnRZUVVpZ0FaY0lONWtaZVIxQm9udnpjZU1nZllGR004S0V5dkFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUUKQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU3ViQVdqa3hQaW91ZmkxeHpXeC9CL3lHZFRvREFmQmdOVgpIU01FR0RBV2dCU3ViQVdqa3hQaW91ZmkxeHpXeC9CL3lHZFRvREFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBZ3lYdDZOSDlsVkxOCm5zQUVvSkZwNWx6UWhON2NyYUpQNkVkNDFtV1lxVnVvUElkOEFvclJicmNXYytaZndGU1kxWFMrd2MzaUVaR3RJeGc5M2VGeVJKYTAKbFY3QWU0NlplQlpERTFaWHM2S3pPN1YzM0VCeXJLUHJtelUrc1FnaG9lZkVRemQ1TXI2MTU1d3NUTHhES1ptT01OT3NJZURqSGZyWQpCek4yVkFBaUtybE5JQzV3YU5ybFUveURYTk9kOHY5RURFUm04dExqdlVZQUdtMEN1aVZkamFFeFVkMVVSaHhOMjVtVzd4b2NCRnltCkZlOTQ0SG4rWGRzK3FreFYvWm9WcVcvaHB2dmZjRERwdys1Q1J1M0Nrd1dKK24xamV6L1FjWUY4QU9pWXJnNTROTU1sKzY4S255QnIKM1RzVGp4S000a0VhU0hwem9IZHB4N1pjZjRMSUh2NVlHeWdycUd5dFhtM0FCZEo3dCt1QS9pVTMvZ0tiYUt4Q1hjUHU5Y3pjOEZCMQowalpwbk9aN0JOOXVCbW0yM2dvSlNGbUg2M3NVWUhwa3FtbEQ3NUhIVE93WTNXenZVeTJNbWVGZThuSSt6MVRJdldmc3BBOU1SZi9UCnVUQWpCMHlQRUwrR2x0bVpXclNaVnh5a3pMc1ZpVk82TEFVUDVNU2VHYkVZTk5WTW5icnQ5eCt2SkpVRWVLZ0R1KzZCNWRwZmZJdEsKb1pCMEphZXpQa3ZJTEZhOXg4anZPT0pja3ZCNTk1eUV1blF0WVFFZ2ZuN1I4azhIV1YrTExVTlM2MFlNbE9IMVprZDVkOVZVV3grdApKRGZMUlZwT29FUkl5Tml3bWNVVmhBbjIxa2xKd0dXNDVocHhicUNvOFlMb1JUNXMxZ0xYQ21lREJWckpwQkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0MgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2FUQ0NBZStnQXdJQkFnSVFJU3BXREs3YURLdEFSYjhyb2kwNjZqQUtCZ2dxaGtqT1BRUURBekJ0TVFzd0NRWURWUVFHRXdKRApTREVRTUE0R0ExVUVDaE1IVjBsVFpVdGxlVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWdSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmxaREVvCk1DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aVlXd2dVbTl2ZENCSFF5QkRRVEFlRncweE56QTFNRGt3T1RRNE16UmEKRncwME1qQTFNRGt3T1RVNE16TmFNRzB4Q3pBSkJnTlZCQVlUQWtOSU1SQXdEZ1lEVlFRS0V3ZFhTVk5sUzJWNU1TSXdJQVlEVlFRTApFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNUlFZHNiMkpoCmJDQlNiMjkwSUVkRElFTkJNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVRPbFF3TVlQY2hpODJQRzZzNG5pZVVxakZxZHIKVkNUYlVmL3E5QWtrd3dzaW44dHFKNEtCRGRMQXJ6SGtkSUp1eWlYWmpIV2Q4ZHZRbXFKTElYNFdwMk9RMGpuVXNZZDRYeGlXRDFBYgpOVGNQYXNiYzJSTk5wSTZRTithOVd6R1JvMVF3VWpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkCkJnTlZIUTRFRmdRVVNJY1VyT1BEbnBCZ090ZktpZTdUcll5MFVHWXdFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdDZ1lJS29aSXpqMEUKQXdNRGFBQXdaUUl3SnNkcFc5elY1N0xueUF5TWpNUGRlWXdiWTlYSlVwUk9UWUpLY3g2eWdJU3BKY0JNV20xSktXQjRFK0orU090awpBakVBMnpRZ01nai9ta2tDdG9qZUZLOWRiSmx4alJvL2k5ZmdvamFHSEFlQ09uWlQvY0tpN2U5N3NJQlBXQTlMVXptOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVQ0EgR2xvYmFsIEcyIFJvb3QKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUmpDQ0F5NmdBd0lCQWdJUVhkK3gybHFqN1YyK1dtVWdaUU9RN3pBTkJna3Foa2lHOXcwQkFRc0ZBREE5TVFzd0NRWURWUVFHCkV3SkRUakVSTUE4R0ExVUVDZ3dJVlc1cFZISjFjM1F4R3pBWkJnTlZCQU1NRWxWRFFTQkhiRzlpWVd3Z1J6SWdVbTl2ZERBZUZ3MHgKTmpBek1URXdNREF3TURCYUZ3MDBNREV5TXpFd01EQXdNREJhTUQweEN6QUpCZ05WQkFZVEFrTk9NUkV3RHdZRFZRUUtEQWhWYm1sVQpjblZ6ZERFYk1Ca0dBMVVFQXd3U1ZVTkJJRWRzYjJKaGJDQkhNaUJTYjI5ME1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXhlWXJiM3p2SmdVbm80RWsybS9MQWZtWm1xa3l3aUtIWVVHUk84dkRhQnNHeFV5cEs4Rm5GeUlkSyszNUtZbVQKb25pOWttdWdvdzJpZnNxVHM2YlJqRFhWZGZrWDlzOUZ4ZVY2N0hlVG9JOGpyZzRhQTMrKzFORHRMbnVyUmlOYi95em1WSHFVd0NvVgo4TW1Oc0hvN0pPSFhhT0l4UEFZelJyWlVFYWFsTHlKVUtsZ05BUUx4K2hWUloyekErdGUyRzMvUlZvZ3ZHanFOTzd1Q0VlQkhBTkJTCmg2djdobjRQSkd0QW5UUm52STNITFladmVUNk9xVHdYUzMrd21lT3djV0RjQy9Wa3c4NUR2RzF4dWRMZUoxdUs2TmpHcnVGWmZjOG8KTFRXNGxWWWE4YkpZUzdjU044aDhzKzFMZ09HTitqSWp0bSszU0pVSXNVUk9oWXc2QWxRZ0w5Ky9WMDg3T3BBaDE4RW1OVlFnN01jLwpSK3p2V3I5TGVzR3RPeGRRWEdMWUQwdEszQ3Y2YnJ4emtzM3N4MURvUVpiWHFYNXQyT2tkajRxMXVWaVN1a3FTS3d4Vy9ZRHJDUEJlCktXNGJIQXl2ajVPSnJkdTlvNTRoeW9rWjdOKzF3eHJyRnY1NE5reldidEErRnh5UUYyc211dnQ2TDc4UkhCZ09MWE1EajZEbE5hQmEKNGt4MUhYSGhPVGhUZUVETWc1UFhDcDZkVzQrSzVPWGdTT1JJc2tmTlRpcDFLbnZ5SXZiSnZnbVJsbGQ2aUlpczduQ3MrZHdwNHd3YwpPeEpPUk5hblRyQW15UFBaR3BlUmFPcnZqVVlHMGxaRldKbzhEQStEdUFVbHd6blBPNlEwaWJkNUVpOUh4ZWVwbDJuOHBuZG50ZDk3CjhYcGxGZVJoVm1VQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME8KQkJZRUZJSEVqTXoxNUREL3BRd0lYNHdWWnlGMEFkL2ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFUWlNMMWppdXRST1RMLzdsbwo1c09BU0QwRWUvb2pMM3J0TnRxeXptMzI1cDdsWDFpUHl6Y3lvY2hsdHE0NFBUVWJQcnc3dGdUUXZQbEo5WnYzaGNVMnRzdTgrTWc1CjFlUmZCNzBWVkpkMHlzcnRUN3E2WkhhZmdiaUVSVWxNalcraTY3SE0wY09VMmtUQzV1THFHT2lpSHljRnV0ZmwxcW5OM2U5Mm1JMEEKRHMwYitnTzNqb0JZRGljL1V2dVVvc3BlWmNuV2hOcTVOWEh6SnNCUGQrYUJKOUozTzVvVWIzbjA5dERoMDVTNjBGZFJ2U2NGRGNIOQp5Qkl3N20rTkVTc0luZFRVdjRCRkZKcUlSTm93NnJTbjQrN3ZXNExWUHRhdGVKTGJYRHp6MkszNnVHdC94RFlvdGdJVmlsUXNuTEFYCmM0N1FONk1VUEppVkFBd3BCVnVlU1VteFg4Zmp5ODhuWlk0MUY3ZFh5RERaUVZ1NUZMYm93ZytVTWFlVW1NeHE2N1hoSi9VUXFBSG8KamhKaTZJak10WDlHbDhDYkVHWTRHalpHWHlKb1BkL0p4aE1ucTFNR3JLSThoZ1psYjdGK3NTbEVtcU82U1drb2FZL1g1Vit0QklaawpieHFnRE1VSVlzNkFvOUR6N0dqZXZqUEhGMXQvZ01STVRMR21oSXJETzdnSnpSU0J1aGpqVkZjMi90c3ZmRWVoT2pQSStWZzdSRSt4CnlnS0pCSllvYU1WTHVDYUp1OVl6TDFEVi9wcUp1aGd5a2xUR1crQ2QrVjdsRFNLYjl0cml5Q0d5WWlHcWhrQ3lMbVRUWDhqamZoRm4KUlI4Ri91T2k3N09vcy9OOWovZ01IeUlmTFhDMHVBRTBkakFBNVNONHAxYlhVQitLK3diMXdobncwQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldqQ0NBMEtnQXdJQkFnSVFUOUlyai9Wa3lET2VUelJZWmlOd1lEQU5CZ2txaGtpRzl3MEJBUXNGQURCSE1Rc3dDUVlEVlFRRwpFd0pEVGpFUk1BOEdBMVVFQ2d3SVZXNXBWSEoxYzNReEpUQWpCZ05WQkFNTUhGVkRRU0JGZUhSbGJtUmxaQ0JXWVd4cFpHRjBhVzl1CklGSnZiM1F3SGhjTk1UVXdNekV6TURBd01EQXdXaGNOTXpneE1qTXhNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pEVGpFUk1BOEcKQTFVRUNnd0lWVzVwVkhKMWMzUXhKVEFqQmdOVkJBTU1IRlZEUVNCRmVIUmxibVJsWkNCV1lXeHBaR0YwYVc5dUlGSnZiM1F3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNwQ1Fjb0V3S3dtZUJrcWg1REZucHpzWkdnZFQ2byt1TTRBSHJzCmlXb2dENHZGc0pzekExcUd4bGlHMWNHRnUwL0duRUJOeXI3dWFaYTRyWUV3bW55U0Jlc0ZLNXBJMExoMlBwYklJTHZTc1BHUDJLeEYKUnYrcVoyQzBkMzVxSHp3YVVub0VQUWM4aFEyRTBCOTJDdmRxRk45eTR6UjhWMDVXQVQ1NThhb3BPMno2K0k5dFRjZzEzNjdyM0NUdQplVVduaGJZRmlONklYU1Y4bDJSbkNkbS9XaFVGaHZNSkh1eFlNak1SODNka3NIWWY1QkExRnh2eURyRnNwQ3FqYy93Skh4NHlHVk1SCjU5bXpMQzUyTHFHajNuNXFpQW5vOGdlSytMTE5FT2ZpYzBDVHV3alJQK0g4QzVTekplOThwdGZScjUvL2xwcjFrWHVZQzNmVWZ1Z0gKMG1LMWxUbmo4L0Z0RHc1bGhJcGpWTVdBdHVDZVMzMUhKcWNCQ0YzUmlKN1h3ekpFK29KS0NtaFVmemhUQTh5a0FETmtVVmtMbzRLUgplbDdzRnNMekt1WmkyaXJiV1dJUUpVb3FnUXRIQjBNR2NJZlMrcE1SS1hwSVRldVV4M0JOcjJmVlViR0FJQUVCdEhvSXBwQi9UdUR2CkIwR0hyMnFsWG92N3oxQ3ltbFN2dzRtNldDMzFNSml4Tm5JNWZra0UvU21uVEhua0JWZmJsTGtXVTQxR3N4MlZZVmRXZjYvd0ZsdGgKV0c4MlVCRUwyS3dybFJZYURoOEl6VFkwWlJCaVp0V0FYeFFnWHkwTW9IZ0thTllzMStsdks5SktCWlA4bm05clovK0k4VTZsYVVwUwpOd1hxeGhhTjBzU1owWUlyTzdvMWRmZFJVVmp6eUFmZDVMUURmd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVMlhRNjVEQTlEZmNTCjNINWFCWjhlTkpyMzRSUXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnSUJBRGFObDh4Q0ZXUXBONXNtTE5iN3JoVnBMR3NhR3ZkZnR2a0hURm5xODhuSXVhN011aTU2M01EMXNDM0FPNitmY0FVUgphcDhsVHdFcGNPUGxET0hxV256Y1NidkJIaXFCOVJaTGNwSElvakc1cXRyOG5SL3pYVUFDRS94T0hBYktzeFNRVkJjWkVocnhIOWNNCmFWcjJjWGowbEgyUkM0N3NrRlNPdkcraFRLdjhkR1Q5Y1pyNFFRZWh6WkhrUEpyZ216STVjNnNxMVduSWVKRW1NWDNpeHpEeC9CUjQKZHhJT0UvVGRGcFMvUzJkN2NGT0Z5ckM3OHpoTkxKQTV3QTNDWFd2cDR1WFZpSTNXTEwrckc3NjFLSWNTRjNSdS9IMzhqOUNISnJBYgorN2xzcStLZVBSWEJPeTVuQWxpUm4rLzRRaDhzdDJqMWRhM1B0ZmIvRVgzQzhDU2xyZFA2b0R5cCtsM2NwYUR2UktTKzF1amw1Qk9XCkYzc0dQakx0eDdkQ3ZIYWoyR1U0S3pnMVVTRU9EbTh1TkJOQTRTdG5ERzFLUVRBWUkxb3lWWm5KRitBODN2YnNlYTByV0JtaXJTd2kKR3BXT3ZwYVFYVUpYeFBrVUF6VXJIQzFSVndpbk90NC81TWkwQTNQQ3dTYUF1d3RDSDYwTnJ5Wnkyc3krczZPRFdBMkN4UjlHVWVPYwpHTXlObTQzc1NldDFVTldNS0ZuS2REVGFqQXNocXg3cUcrWEgvUlUrd0JlcSt5TnVKa2JMK3ZteGNtdHB6eUtFQzJJUHJOa1pBSlNpCmRqelVMWnJ0Qko0dEJtSVFOMUljaFhJYkorWE14akhzTit4aldac0xIWGJNZmpLYWlKVUlObEs3M25aZmRrbEpyWCs5WlNDeXljRXIKZGhoMm4xYXgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGlnbmEgUm9vdCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHV3pDQ0JFT2dBd0lCQWdJUkFNcnBHNG54VlFNTm8rWkJiY1RqcHVFd0RRWUpLb1pJaHZjTkFRRUxCUUF3V2pFTE1Ba0dBMVVFCkJoTUNSbEl4RWpBUUJnTlZCQW9NQ1VSb2FXMTViM1JwY3pFY01Cb0dBMVVFQ3d3VE1EQXdNaUEwT0RFME5qTXdPREV3TURBek5qRVoKTUJjR0ExVUVBd3dRUTJWeWRHbG5ibUVnVW05dmRDQkRRVEFlRncweE16RXdNREV3T0RNeU1qZGFGdzB6TXpFd01ERXdPRE15TWpkYQpNRm94Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhIREFhQmdOVkJBc01FekF3TURJZ05EZ3hORFl6Ck1EZ3hNREF3TXpZeEdUQVhCZ05WQkFNTUVFTmxjblJwWjI1aElGSnZiM1FnUTBFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETkdEbGxHbG14Nm1RV0RveVVKSlY4ZzlQRk9TYmNETzhXVjQzWDJLeWpRbitDeXUzTlc5c090eTN0UlFnWApzdG16eTlZWFVuSW8yNDVPbm9xMkMvbWVoSnBOZHQ0aUtWelNzOUlHUGpBNXFYU2prbFljb1c5TUNpQnRueU42dE1iYUxPUWRMTnl6CktOQVQ4a3hPQWttaFZFQ2U1dVVGb0MyRXlQK1liTkRyaWhxRUNCNjNhQ1B1STlWd3ptMVJhUkR1b1hyQzBTSXh3b0tGMHZKVmRsQjgKSlhySmhGd0xyTjFDVGl2bmdxSWtpY3VRc3REdUk3cG1UTHRpcFBsVFdtUjdmSmo2bzBpZUQ1V3VweGowYXV3dUEwV3Y4SFQ0S3MxNgpYZEcrUkNZeUtmSHg5V3pNZmdJaEM1OXZwRCsrblZQaXozMnBMSHhZR3BmaFBUYzNHR1lvMGtERlVZcU13eTNPVTRna1dHUXdGc1dxCjROWUtwa0RmZVBiMUJIeHBFNFM4MGRHbkJzOEI5MmpBcUZlN09tR3RCSXlUNDYzODhOdEViVm5jU1ZtdXJKcVpOakJCZTNZeklvZWoKd3BLR2J2bHc3cTZIaDVVYnhIcTlNZlBVMHVXWi83NUk3SFgxZUJZZHBuREJmendib1pMN3o4Zzgxc1dUQ28vMVZUcDJsYzVabUlvSgpsWGN5bW9PNkxBUTZsNzNVTDc3WGJKdWl5bjF0SnNsVjFjL0RlVklJQ1prSEpDMWtKV3VtSVdtYmF0MTBUV3VYZWtHOXF4ZjVrQmRJCmp6YjVMZFhGMis2cWhVVkIrczA2UmJGbzVqWk1tNUJYN0NPNWh3akN4QW54bDRZcUtFM2lkTURheEl6YjMrS2hGMW5PSkZsME1kcC8KL1RCdDJkemhhdUg4WHdJREFRQUJvNElCR2pDQ0FSWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpIUVlEVlIwT0JCWUVGQmlIVnVCdWQrNGtOVHhPYzVvZjF1SGllWDRyTUI4R0ExVWRJd1FZTUJhQUZCaUhWdUJ1ZCs0a05UeE9jNW9mCjF1SGllWDRyTUVRR0ExVWRJQVE5TURzd09RWUVWUjBnQURBeE1DOEdDQ3NHQVFVRkJ3SUJGaU5vZEhSd2N6b3ZMM2QzZDNjdVkyVnkKZEdsbmJtRXVabkl2WVhWMGIzSnBkR1Z6THpCdEJnTlZIUjhFWmpCa01DK2dMYUFyaGlsb2RIUndPaTh2WTNKc0xtTmxjblJwWjI1aApMbVp5TDJObGNuUnBaMjVoY205dmRHTmhMbU55YkRBeG9DK2dMWVlyYUhSMGNEb3ZMMk55YkM1a2FHbHRlVzkwYVhNdVkyOXRMMk5sCmNuUnBaMjVoY205dmRHTmhMbU55YkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQWxMaWVUL0RqbFFnaTU4MW9RZmNjVmRWOEFPSXQKT29sZGFEZ3ZVU0lMU28zTDZidGRQcnRjUGJFby91UlRWUlBQb1pBYkFoMWZaa1lKTXlqaERTU1hjTk1RSCtwa1Y1YTdYZHJueEl4UApUR1JHSFZ5SDQxbmVRdEdicUg2bWlkMlBITWt3Z3UwN25NM0E2Um5nYXRnQ2RUZXI5elFvS0pIeUJBcFBOZU5nSmdINjBCR00rUkZxCjdxODl3MURUajE4emVUeUdxSE5Ga0l3Z3RuSnpGeU8rQjJYbGVKSU51Z0hBNjR3Y1pyK3NobmNCbEEyYzV1azVqUittVVl5WkREbDMKNGJTYitoeG5WMjlxYW82cEsweFhlWHBYSXMvTlgyTkdqVnhaT29iNE1rZGlvMmNOR0pIYys2WnI5VWhoY3lOWmpnS252RVRxOUVtZAo4VlJZK1dDdjJoaWtMeWhGM0hxZ2lJWmQ4enZuL3lrMWdQeGtRNVRtNHh4dnZxME9LbU9aSzhsK2hmWng2QVlEbGY3ZWowZ2NXdFNTCjZDdnU1ekhidWdScWg1am54Vi92ZmFjaTl3SFlUZm1KMEE2YUJWbWtucGpaYnl2S2NMNWt3bFdqOU9tdnc1SXAzSWdXSkprOGpTYVkKdGx1M3pNNjNOd2Y5SnRtWWhTVC9XU01EbXUyZG5hamtYampPMTFJTmI5SS9iYkVGYTBuT2lwRkdjL1QyTC9Db2MzY09aYXloaldaUwphWDVMYUF6SEhqY25nNldNeHdMa0ZNMUpBYkJ6cy8zR2tEcHYwbXp0Tys3c2tiNmlRMTJMQUVwbUpVUncza0FQK0h3Vjk2TE9QTmRlCkU0eUJGeGdYMGIzeGR4QTYxR1U1d1Nlc1Z5d2xWUCtpMmsrS1lUbGVyajFLakwwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplbVNpZ24gUm9vdCBDQSAtIEcxCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsRENDQW55Z0F3SUJBZ0lLTWZYa1lneHNXTzNXMkRBTkJna3Foa2lHOXcwQkFRc0ZBREJuTVFzd0NRWURWUVFHRXdKSlRqRVQKTUJFR0ExVUVDeE1LWlcxVGFXZHVJRkJMU1RFbE1DTUdBMVVFQ2hNY1pVMTFaR2h5WVNCVVpXTm9ibTlzYjJkcFpYTWdUR2x0YVhSbApaREVjTUJvR0ExVUVBeE1UWlcxVGFXZHVJRkp2YjNRZ1EwRWdMU0JITVRBZUZ3MHhPREF5TVRneE9ETXdNREJhRncwME16QXlNVGd4Ck9ETXdNREJhTUdjeEN6QUpCZ05WQkFZVEFrbE9NUk13RVFZRFZRUUxFd3BsYlZOcFoyNGdVRXRKTVNVd0l3WURWUVFLRXh4bFRYVmsKYUhKaElGUmxZMmh1YjJ4dloybGxjeUJNYVcxcGRHVmtNUnd3R2dZRFZRUURFeE5sYlZOcFoyNGdVbTl2ZENCRFFTQXRJRWN4TUlJQgpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBazB1NzZXYUs3cDFiMVRTVDBCc2V3K2VldUdRemYyTjRhTFROCkxuRjExNXNneGswcHZMWm9ZSXIzSVpwV05WcnpkcjNZelpyL2sxWkxwVmtHb1pNMEtkMFdOSFZPOG9HMHg1Wk9yUmtWVWtyK1BIQjEKY00ydks2c1Ztak04cXJPTHFzMUQvZlhxY1AvdHp4RTdsTTVPTWhiVEkwQXFkN092UEFFc2JPMlpMSXZaVG1tWXN2ZVBRYkF5ZUdIVwpEVi9EK3FKQWtoMWNGK1p3UGpYbm9yZkNZdUtycERoTXRUazFiK29EYWZvNlZHaUZiZGJ5TDBOVkhwRU5EdGpWYXFTVzBSTThMSGhRCjZEcVMwaGRXNVRVYVFCdytqU3p0T2Q5QzRJTkJkTitqemNLR1lFaG80MmtMVkFDTDVIWnBJUTE1VGpRSVhoVEN6TEczcmRkOGNJckgKaFFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVSsrOE5ocDZ3NDkycHVmRWhGMzgrL1BCM0t4b3dEZ1lEVlIwUEFRSC9CQVFEQWdFRwpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRm4vOG96MWgzMXhQYU9mRzF2UjJ2alRuR3MyCnZadXBZZXZlRml4MFBaN21kZHJYdXFlOFFoZm5QWkhyNVgzZFBwenh6NUtzYkVqTXdpSS9hVHZGdGhVdm96WEdhQ29jVjY4NTc0M1EKTmNNWURIc0FWaHpOaXhsMDNyNFBFdURRcXFFL0FqU3hjTTZkR05ZSUF3bEc3bURnZnJiRVNRUlJmWEJndktxeS8zbHllcVlkUFY4cQorTXJpL1RtM1I3bnJmdDhFSTYvNm5BWUg2ZnRqazRCQXRjWnNDakVvemd5Zno3TWpOWUJCald6RU4zdUJMNENoUUVLRjZkazRqZWloClU4MEJ2Mm5vV2dieVJRdVErcTdodjUzeXJsYzhwYTZ5VnZTTFpVRHAvVEdCTFBRNUNkanVhNmUwcGgwVnBaajNBWUhZaFgzelVWeHgKaU42NnpCK0Fma289Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVtU2lnbiBFQ0MgUm9vdCBDQSAtIEczCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDVGpDQ0FkT2dBd0lCQWdJS1BQWUhxV2h3RHRxTGhEQUtCZ2dxaGtqT1BRUURBekJyTVFzd0NRWURWUVFHRXdKSlRqRVRNQkVHCkExVUVDeE1LWlcxVGFXZHVJRkJMU1RFbE1DTUdBMVVFQ2hNY1pVMTFaR2h5WVNCVVpXTm9ibTlzYjJkcFpYTWdUR2x0YVhSbFpERWcKTUI0R0ExVUVBeE1YWlcxVGFXZHVJRVZEUXlCU2IyOTBJRU5CSUMwZ1J6TXdIaGNOTVRnd01qRTRNVGd6TURBd1doY05ORE13TWpFNApNVGd6TURBd1dqQnJNUXN3Q1FZRFZRUUdFd0pKVGpFVE1CRUdBMVVFQ3hNS1pXMVRhV2R1SUZCTFNURWxNQ01HQTFVRUNoTWNaVTExClpHaHlZU0JVWldOb2JtOXNiMmRwWlhNZ1RHbHRhWFJsWkRFZ01CNEdBMVVFQXhNWFpXMVRhV2R1SUVWRFF5QlNiMjkwSUVOQklDMGcKUnpNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFqcFF5NExSTDFLUE94c3QzaUFoS0FuamxmU1UyZnlTVTBXWFRzdXdZYwo1OEJ5citpdUwrRkJWSWNVcUVxeTZIeUM1bHRxdGR5emRjNkxCdENHSTc5RzFZNFBQd1QwMXh5U2Z2YWxZOEwxWDQ0dVQ2RVlHUUlyCk1ncUNaSDBXazlHalFqQkFNQjBHQTFVZERnUVdCQlI4WFFLRUU5VE1pcHVCemhjY0xpa2VuRWhqUWpBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3TnBBREJtQWpFQXZ2Tmh6d0lRSFdTVkI3Z1lib2lGQlMrRApDQmVReWgrS1RPZ05HM3F4cmRXQkNVZnZPNndJQkh4Y21iSHRSd2ZTQWpFQW5icFYvS2xLNk8zdDVuWUJRbnZJK0dEWmpWR0xWVHY3CmpIdnJaUW5EK0piTlI2aUM4aFpWZHlSK0VoQ1ZCQ3lqCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVtU2lnbiBSb290IENBIC0gQzEKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGN6Q0NBbHVnQXdJQkFnSUxBSzdQQUxyRXp6TDRRN0l3RFFZSktvWklodmNOQVFFTEJRQXdWakVMTUFrR0ExVUVCaE1DVlZNeApFekFSQmdOVkJBc1RDbVZ0VTJsbmJpQlFTMGt4RkRBU0JnTlZCQW9UQzJWTmRXUm9jbUVnU1c1ak1Sd3dHZ1lEVlFRREV4TmxiVk5wCloyNGdVbTl2ZENCRFFTQXRJRU14TUI0WERURTRNREl4T0RFNE16QXdNRm9YRFRRek1ESXhPREU0TXpBd01Gb3dWakVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBc1RDbVZ0VTJsbmJpQlFTMGt4RkRBU0JnTlZCQW9UQzJWTmRXUm9jbUVnU1c1ak1Sd3dHZ1lEVlFRRApFeE5sYlZOcFoyNGdVbTl2ZENCRFFTQXRJRU14TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF6K3VwCnVmR1pCY3pZS0NGSzgzTTBVWVJXRVBXZ1R5d1M0L29UbWlmUXovbDVHblJmSFhrNS9GdjRjSTdna2xMMzVDWDVWSVBaSGRQSVdvVS8KWHNlMkIrNCt3TTZhcjZ4V1FpbzVKWERXdjdWN05xMnM5blBjemRjZGlvT2wreXVRRlRkckhDWkgzRHNwVnBOcXM4RnFPcDA5OWNHWApPRmdGaXh3UjQrUzB1RjJGSFlQK2VGOExSV2dZU0tWR2N6UTcvZy9JZHJ2SEdQTUYwWWJ6aGUzbnVka3lyVldJenFhMmtiQlBySDRWCkk1YjJQL0FnTkJiZUNzYkVCRVY1ZjZmOXZ0S3BwYStjeFNNcTl6d2hiTDJ2ajA3Rk9yTHpOQkw4MzRBYVNhVFVxWlgzbm9sZW9vbXMKbE11b2FKdXZpbVVuelludTNZeTFheWx3UTZCcEMrUzVEd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVL3FIZ2NCNHFBemxTV2tLKwpYSkdGZWhpcVRiVXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnRUJBTUpLVnZvVklYc29vdW5sSGZ2NExjUTVsa0ZNT3ljc3hHd1lGWURHcks5SFdTOG1DK00yc084Ny9rT1hTVEtaRWhWYjN4RXAKLzZ0VCtMdkJlQStzbkZPdlY3MW9qRDFwTS9Dam9DTmpPMlJuSWtTdDFYSExWaXA0a3FOUEVqRTJOdUxlL2dERW8yQVBKNjJnc0lxMQpObnBTb2IwbjlDQW5ZdWhObENRVDVBb0U2VHlyTHNoRENVckdZUVRsU1RSKzA4VEk5US9BcXVtNlZGN3pZeXRQVDFEVS9ybDdtWXc5CndDNjhBaXZUeEVEa2lnY3hIcHZPSnBrVCt4SHFtaUlNRVJuSFhodUJVRERJbGhKdTU4dEJmNUU3b2tlM1ZJQWIzQURNbXBEcXc4TlEKQm1JTU1NQVZTS2VvV1h6aHJpS2k0Z3A2RC9waXExSk00ZkhmeXI2RERVST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZW1TaWduIEVDQyBSb290IENBIC0gQzMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNLekNDQWJHZ0F3SUJBZ0lLZTNHMmdsYTRFbnljcURBS0JnZ3Foa2pPUFFRREF6QmFNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUcKQTFVRUN4TUtaVzFUYVdkdUlGQkxTVEVVTUJJR0ExVUVDaE1MWlUxMVpHaHlZU0JKYm1NeElEQWVCZ05WQkFNVEYyVnRVMmxuYmlCRgpRME1nVW05dmRDQkRRU0F0SUVNek1CNFhEVEU0TURJeE9ERTRNekF3TUZvWERUUXpNREl4T0RFNE16QXdNRm93V2pFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQXNUQ21WdFUybG5iaUJRUzBreEZEQVNCZ05WQkFvVEMyVk5kV1JvY21FZ1NXNWpNU0F3SGdZRFZRUUQKRXhkbGJWTnBaMjRnUlVORElGSnZiM1FnUTBFZ0xTQkRNekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJQMmxZYTU3SmhBZAo2YmNpTUs0RzlJR3pzVUp4bFRtODAxTGpyNi81OHBjMWtqWkdEb2VWamJrNVd1bTczOUQreUFkQlBMdFZiNE9qYXZ0aXNJR0pBbkI5ClNNVks0K2tpVkNKTms3dENESzkzbkNPbWZkZGhFYzVseC9oLy92WHlxYU5DTUVBd0hRWURWUjBPQkJZRUZQdGFTTkNBSUVEeXFPa0EKQjJrWmQ2Zm13L1RQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQW9HQ0NxR1NNNDlCQU1EQTJnQQpNR1VDTVFDMDJDOENpZjIyVEdLNlEwNFRoSEsxcnQwYzN0YTEzRmFQV0VCYUxkNGdUQ0tEeXBPb2Z1NFNRTWZXaDAvNDM0VUNNQndVClpPUjhsb01SbkxEUldtRkxwZzlKMHdEOG9memtwZjkvcmRjdzBNZDNmNzZCQjFVd1VDQVU5VmM0Q3FneFVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSG9uZ2tvbmcgUG9zdCBSb290IENBIDMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ6ekNDQTdlZ0F3SUJBZ0lVQ0JaZmlreWw3QURKazBEZnhNYXVJN2djV3FRd0RRWUpLb1pJaHZjTkFRRUxCUUF3YnpFTE1Ba0cKQTFVRUJoTUNTRXN4RWpBUUJnTlZCQWdUQ1VodmJtY2dTMjl1WnpFU01CQUdBMVVFQnhNSlNHOXVaeUJMYjI1bk1SWXdGQVlEVlFRSwpFdzFJYjI1bmEyOXVaeUJRYjNOME1TQXdIZ1lEVlFRREV4ZEliMjVuYTI5dVp5QlFiM04wSUZKdmIzUWdRMEVnTXpBZUZ3MHhOekEyCk1ETXdNakk1TkRaYUZ3MDBNakEyTURNd01qSTVORFphTUc4eEN6QUpCZ05WQkFZVEFraExNUkl3RUFZRFZRUUlFd2xJYjI1bklFdHYKYm1jeEVqQVFCZ05WQkFjVENVaHZibWNnUzI5dVp6RVdNQlFHQTFVRUNoTU5TRzl1WjJ0dmJtY2dVRzl6ZERFZ01CNEdBMVVFQXhNWApTRzl1WjJ0dmJtY2dVRzl6ZENCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6CmlOZnF6ZzhnVHI3bTFnTnQ3bG44d2xmZktXaWhndzQrYU1kb1dKd2NZRXVKUXd5NTFCV3k3c0ZPZGVtMXArL2w2VFdaNU13YzUwdGYKalRNd0lETlQyYWE3MVQ0VGp1a2ZoMG10VUMxUXloaStBVmlpRTNDV3U0bUlWb0JjK0wwc1BPRk1WNGk3MDdtVjc4dkg5dG94ZENpbQo1bFNKOVVFeHl1VW1HczJDNEhEYU95bTcxUVAxbWJwVjlXVFJZQTZ6aVVtNGlpOEYwb1JGS0h5UGFGQVNlUHdMdFZQTHdwZ2NoS09lCnNMNGpwTnJjeUNzZTJtNUZIb21ZMnZrQUxnYnBERHR3MVZBbGlKbkx6WE5nOTlYL05XZkZvYnhlcTgxS3VFWHJ5R2dlRFEwVVJoTGoKMG1SaWlrS1l2TFRHQ0FqNC9haE1aSngyQWIwdnFXd3pEOWcvS0xnOGFRRkNobjVwd2NrR3l1VjZSbVhwd3RaUVFTNC90K1R0Yk5lLwpKZ0VSb2hZcFNtczBCcERzRTlLMisycDIwanp0OE5ZdDNlRVY3S09iTHl6SlBpdmthVHYvY2lXeE5vWmJ4MzlyaTFVYlNzVWdZVDJ1CnkxRGhDRHErc0k5alFWTXdDRms4bUIxM3VtT1Jlc29RVUdDLzhOZThsWWVQbDhYK2wyb0JsS044VzRVZEtqazYwRlNoMFRseG5mMGgKK2JWNzhPTGdBbzl1bGlRbExLQWVMS2pFaWFmdjdaa0dMN1lLVEUvYm9zdzNHcTlIaFMyS1g4UTBORXdBL1JpVFp4UFJOK1pJdElzRwp4VmQ3R1lZS2Vjc0F5Vkt2UXY4M2orR2pIbm85VUt0akJ1Y1Z0VCsyUlRlVU43Ris4a2pEZjhWMS9wZU5SWThhcHhweUtCcEFEd0lECkFRQUJvMk13WVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JRWG5jMGUKaTlZNUszRFRYTlNndUIrd0FQekZZVEFkQmdOVkhRNEVGZ1FVRjUzTkhvdldPU3R3MDF6VW9MZ2ZzQUQ4eFdFd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnSUJBRmJWZTI3bUlnSFNRcHNZMVE3WFppTmM0LzZneDVMUzZaU3RTNkxHN0JKOGROVkkwbGtVbWNEcnVkSHI5RWd3Clc2Mm5WM09acWRQbHQ5RXVXU1JZM0dndUxtTFlhdVJ3Q3kwZ1VDQ2tNcFhSQUppNzAvMzNNdkpKcnNaNjRFZSticzdMbzNJNkxXbGQKeThqb1JUblUra0xCRVV4M1haTDdhdjlZUk9YcmdaNnZvSm10dnFrQlpzczRIVHpmUXgvMFRXNjB1aGRHL0gzOWg0RjVhZzB6RC9vdgorQlM1Z0xOZFRhcVg0Zm5rR01YNDFUaU1Kano5OGlqaTdscEppQ3pmZVQyT25wQTh2VUZLT3QxYjlwcTB6ajhsTUg4eWZhSURsTkRjCmVxRlMzbTZUalJnbS9WV3N2WStiMHMrdjU0WXN5eDhKYjZOdnFZVFVjNzlOb1hRYlRpTmc4c3dPcW4ra25Fd2xxTEptT3pqLzJaUXcKOW5LRXZtaFZFQS9HY3l3V2FaTUgvckZGN2J1aVZXcXcyclZLQWlVbmhkZTN0NFpFRm9sc2dDcytsNm1jMVg1VlRNYmVSUkFjNnVrNwpud05UN3U1NkFRSVdlTlRvd3I1R2RvZ1RQeUs3U0JJZFVnQzBBbjRoR2g2Y0pmVHpQVjRlMGh6NXN5MjI5emRjeHNzaFRyRDNtVWNZCmhjRXJ1bFd1QnVyUUI3TGNxOUNDbG5YTzBsRCttZWZQTDUvbmR0RmhLdnNodXpIUXFwOUhwTElpeWhZNlVGZkVXME5ueFdWaUEwa0IKNjBQWjJQaWVyYyt4WXc1RjlLQmFMSnN0eGFiQXJhaEg5Q2RNT0EwdUcwazdVdlRvaUlNclZDalU4alZTdERLRFltbGtESkdjbjVmcQpkQmI5SHhFR21wdjAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdTekNDQkRPZ0F3SUJBZ0lSQU5tMVEzK3ZxVGtQQUFBQUFGVmxyVmd3RFFZSktvWklodmNOQVFFTEJRQXdnYjR4Q3pBSkJnTlYKQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OVRaV1VnZDNkM0xtVnVkSEoxYzNRdQpibVYwTDJ4bFoyRnNMWFJsY20xek1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBeE5TQkZiblJ5ZFhOMExDQkpibU11SUMwZ1ptOXlJR0YxCmRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE1qQXdCZ05WQkFNVEtVVnVkSEoxYzNRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjEKZEdodmNtbDBlU0F0SUVjME1CNFhEVEUxTURVeU56RXhNVEV4TmxvWERUTTNNVEl5TnpFeE5ERXhObG93Z2I0eEN6QUpCZ05WQkFZVApBbFZUTVJZd0ZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlUWldVZ2QzZDNMbVZ1ZEhKMWMzUXVibVYwCkwyeGxaMkZzTFhSbGNtMXpNVGt3TndZRFZRUUxFekFvWXlrZ01qQXhOU0JGYm5SeWRYTjBMQ0JKYm1NdUlDMGdabTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hNakF3QmdOVkJBTVRLVVZ1ZEhKMWMzUWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodgpjbWwwZVNBdElFYzBNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXNld3NRdTdpMFREL3BaSkg0aTNECnVtU1hiY3IzRGJWWndiUExxR2daMksrRWJUQndYWDd6THRKVG1lSCtIMTdaU0s5ZEU0M2IvMk16VGRNQUFyekUrTkVHQ0pSNVdJb1YKM2ltei9mM0VUK2lxNHFBN2VjMi9hME15M2RsMEVMbjM5R2pVdTlDSDFhcExpaXB2S2dTMXNxYkhvSHJtU0t2UzBWbk0xbjRqNXBkcwo4RUxsM0ZGTEZVSHRTVXJKM2hDWDFuYkI3NlcxTmhTWE5kaDRJalZTNzBPOTJ5ZmJZVmFDTk56TGlHQU1DMXJsTEFIR1ZLL1hxc0VRCmU5SUZXcmhBbm9hbnc1Q0dBbFpTQ1hxYzBpZUNVMHBsVW1yMVBPZW84cHl2aTczVER0VFVYbTZIbm1vOVJSM1JYUnYwNlFxc1lKbjcKaWJUL21DelBmQjNwQXFvRW1oNjQzSWh1SmJOc1p2YzhrUE5Yd2JNdjlXM3krOHFoK0NtZFJvdXphdmJtWndlK0xHY0tLaDlhc2o1WAp4Tk1oSVdObFVwRWJzWm1PZVg3bTY0MEEyVnFxNm5Qb3BJSUNSNWIrVzQ1VVlhUHJMMHN3c0lzamRYSjhJVHpJOXZGMDFCeDdvd1ZWCjdydE5PeksrbW5kbW5xeHBrQ0lISDJFNmxyN2xtay9NQlR3b1dkUEJERlNvV1dHOXlISk02TnlmaDMrOW5FZzJYcFdqRHJrNEpGWDgKZFdickF1TUlOQ2xLeHVNckx6T2cycU9HcFJLWC9ZQXIyaFJDNDVLOVB2SmRYbWQwTGh5SVJ5azBYK0l5cUp3bE40eTZtQUNYaTBtVwpIdjBsaXF6YzJ0aGRkRzVtc1A5RTM2RVl4cjVJTHplVWVQaVZTajkvRTE1ZFdmMTBoa05qYzBrQ0F3RUFBYU5DTUVBd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKODR4Rllqd3pub29IRnM2RlJNNU9nNnNiOW4KTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBUzVVS21lNHNQRE9SR3BiWmdRSWVNSlg2dHVHZ3VXOFpBZGp3RCtNbFo5UE9yWXM0UQpqYlJhWkl4b3dMQnlRelRTR3d2MkxGUFN5cEJMaG1iOHFvTWk5SXNhYnlaSXJIWjNDTC9GbUZ6MEpvbWVlOE81WkRJQmY5UEQzVmh0CjdMR3JoRlYwZDRRRUoxSnJoa3pPM2JsbC85YkdYcCthRUpsTGRXcithdW1YSU9Ua2RuckcwQ1Nxa00wZ2tMcEhaUHQvQjdOVGVMVUsKWXZKelE4NUJLNEZxTG9VV2xGUFVhMTl5SXF0UkxVTFZBSnladjk2N2xEdFgvWnIxaHN0V08xdUlBZVY4S0VzRCtVbURmTEovZk9QdApqcUYvWUZPT1ZaMVFOQklQdDVkN2JJZEtST2YxYmV5QU4vQllHVzVLYUhid0g1TGs2cldTMDJGUkVBdXRwOWxmeDEvY0g2TmNqS0YrCm03ZWUwMVp2Wmw0SGxpRHRDM1Q3Wms2TEVSWHBnVWwrYjdEVVVIOGkxMTlsQWcybTlJVWUySzRHUzBxbjBqRm13dmpPNVFpbXBBS1cKUkdoWHhOVXp6eGt2Rk1TVUhIdWsyZkNmRHJHQTR0R2VFV1NwaUJFNmRvTGxZc0tBMktTRDdaUHZmQytRc0RKTWxoVm9TRkxVbVFqQQpKT2djNDdPbElRNlN3SkFmenlCZnlqczR4N2R0T3ZQbVJMZ09NV3VJam5Ecm5CZFNxRUdVTG9lMjU2WVN4WFhmVzhBS2JudWs1RjZHCitUYVUzM2ZENlEzQU9mRjV1MGFPcTBOWko3Y2d1eVBwVmtBaDdERTlaYXBEOGozZmNFVGh1azBtRUR1WW4vUElqaHM0VmlGcVVaUFQKa2NwRzJvbTNQVk9ETEFnZmk0OVQzZitzSHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDV1RDQ0FkK2dBd0lCQWdJUVp2STlyNGZlaTdGSzZneFhNUUhDN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3Q1FZRFZRUUdFd0pWClV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1TVRZd05BWURWUVFERXkxTmFXTnliM052Wm5RZ1JVTkQKSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3dIaGNOTVRreE1qRTRNak13TmpRMVdoY05OREl3TnpFNApNak14TmpBMFdqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFZU1Cd0dBMVVFQ2hNVlRXbGpjbTl6YjJaMElFTnZjbkJ2Y21GMGFXOXVNVFl3Ck5BWURWUVFERXkxTmFXTnliM052Wm5RZ1JVTkRJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJREl3TVRjd2RqQVEKQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFUVXZEMENRblZCRXlQTmdBU0dBbEV2YXFpQllndGx6UGJLblI1dlNtWlJvZ1BablpINgp0aGF4akc3ZWZNM2JlYVl2enJ2T2NTL2xwYXNvN0dNRVpwbjQrdktURUFYaGdTaEM0OFpvOU9ZYmhHQktpYS90ZVE4N3p2SDJSUFVCCmVNQ2pWREJTTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRJeTVseWNGSU0KK09hK3NnUlhLU3JQUWhEdE5UQVFCZ2tyQmdFRUFZSTNGUUVFQXdJQkFEQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQlk4azNxRFBsZgpYdTVnS2NzNjh0dldNb1FaUDN6Vkw4S3h6Sk91VUxzSk1zYkc3WDdKTnBRUzVHaUZCcUliMEM4Q01RQ1o2UmEwRHZwV1NOU2tNQmFSCmVOdFVqR1VCaXVkUVpzSXh0em02dUJvaUIwNzhhMVFXSVA4cnRlZE1ERTJtVDNNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGcURDQ0E1Q2dBd0lCQWdJUUh0T1hDVi9ZdExOSGNCNnF2bjlGc3pBTkJna3Foa2lHOXcwQkFRd0ZBREJsTVFzd0NRWURWUVFHCkV3SlZVekVlTUJ3R0ExVUVDaE1WVFdsamNtOXpiMlowSUVOdmNuQnZjbUYwYVc5dU1UWXdOQVlEVlFRREV5MU5hV055YjNOdlpuUWcKVWxOQklGSnZiM1FnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNUlESXdNVGN3SGhjTk1Ua3hNakU0TWpJMU1USXlXaGNOTkRJdwpOekU0TWpNd01ESXpXakJsTVFzd0NRWURWUVFHRXdKVlV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1Ck1UWXdOQVlEVlFRREV5MU5hV055YjNOdlpuUWdVbE5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3cKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtXNzZVTTR3cGxaRVdDcFc5UjJMQmlmT1pOdDlHa01tbAo3WGhxYjBlUmFQZ25aMUF6SGFHbSsrRGxRNk9FQWxjQlhaeElRSUpURUx5L3h6dG9rTGFDTGVYMFpkRE1iUm5NbGZsN3JFcVVyUTdlClMwTWRod2VTRTVDQWcyUTFPUVQ4NWVsc3M3WWZVSlE0WlZCY0YwYTV0b1cxSExVWDZOWkZuZGl5SnJES3hIQktybUNrM2JQWjdQdzcKMVZkeXZEL0l5YkxlUzJ2NEkyd0R3QVc5bGNmTmN6dG1nR1RqR3F3dStVY0Y4Z2EybTNQMWVETmJ4Nkg3SnlxaHRKcVJqSkhUT29JKwpka0MwelZKaFVYQW9QOFhGV3ZMSmpFbTdGRnROeVA5blRVd1NscTMxL25pb2w0ZlgvVjRnZ055aFN5TDcxSW10dXM1SGwwZFZlNDlGCnlHY29oSlVjYUREdjcwbmdOWHRrNTVpd2xOcE5oVHMrVmNRb3IxZnpuaFBiUmllZkhxSmVSSU9rcGNyVkU3TkxQOFRqd3VhR1lhUlMKTUxsNklFOXZEemhUeXpNTUV5dVAxcHE5S3NndHNSeDlTMUhLUjlGSUozSmRoK3ZWUmVaSVpaMnZVcEM2VzZJWVpWY1NuMmk1MUJWcgpsTVJwSXBqME0rRHQrVkdPUVZESk5FOTJrS3o4T01IWTRYdTU0K09VNFVacHl3NEtVR3NUdXF3UE4xcTNFcldRZ1I1V3JsY2lodG5KCjB0SFhVZU9yTzhaVi9SNE8wM1FLMGRxcTZtbTRseWlQU01RSCtGSkRPdlRLVlRVc3NLWnF3Sno1OG9IaEVtckFSZGxuczg3L0k2S0oKQ2xUVUZMa3FxTmZzK2F2TkpWZ3llWStRVzVnNXhBZ0d3YXgvRGowQXBRSURBUUFCbzFRd1VqQU9CZ05WSFE4QkFmOEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVDY3RaZjRheWNJOGF3em5qd05ucHY3dE5zaU13RUFZSkt3WUJCQUdDCk54VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFLeXZQbDNDRVphSmpxUG5rdGFYRmJnVG9xWkNMZ0xORmdWWko4b2cKNkxxNDZCcnNUYWlYVnE1bFE3R1BBSnRTelZYTlV6bHRZa3lMRFZ0OExrUy9neENQODFPQ2dNTlBPc2R1RVQvbTR4YVJoUHR0aEg4MApkSzJKcDg2NTE5ZWZoR1NTdnBXaHJRbFRNOTN1Q3VwS1VZNXZWYXU2dFpSR3JveC8yS0pRSldWZ2dFYmJNd1N1YkxXWWRGUWwzSlBrCitPTlZGVDI0YmNNS3BCTEJhWVZ1MzJUeFU1bmhTblVnblpVUDVOYmNBL0ZaR09oSGliSlhXcFMycWRnWEt4ZEo1WGJMd1ZhWk9qZXgKLzJrc2taR1Q0ZDlNb3pkMlRhR2YrRzBlSGRQNjdQdjBSUjBUYmMvM1dlVWlKM0lyaHZOWHV6RHRKRTNjZlZhN283UDROSG1Kd2VEeQpBbUgzcHZ3UHV4d1hDNjVCMlh5OUo2UDlManJSazVTeGN4MGtpNjliSUltdHQyZG1lZlU2eHFhV00vNVRrc2hHc1JHUnhwbC9qOG5XClpqRWdRUkNITFF6V3dhODBtTXBrZy9zVFY5SEI4RHg2aktYQi9aVWhvSEhCazJkeEV1cVBpQXBwR1dTWkkxYjdyQ291Y0w1bXhBeUUKNytXTDg1TUIrR3FRazJkTHNtaWp0V0tQNlQrTWVqdGVEK2VNdU1aODd6ZjlkT0xJVHpOeTRaUTViYjBTcjc0TVRuQjhHMitOc3pLVApjMFFXYmVqMDkrQ1ZnSStXWFRpazlLdmVDakNIazloTkFIRmlSU2RMT2tLRVczOWx0MmMwVWkyY0ZtdXFxTmg3bzBKTWNjY015ajZECjVLYnZ0d0V3WGxHamVmVndhYVpCUkErR3NDeVJ4ajNxcmcrRQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplLVN6aWdubyBSb290IENBIDIwMTcKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUURDQ0FlV2dBd0lCQWdJTUFWUkk3eUg5bDFrTjlRUUtNQW9HQ0NxR1NNNDlCQU1DTUhFeEN6QUpCZ05WQkFZVEFraFZNUkV3CkR3WURWUVFIREFoQ2RXUmhjR1Z6ZERFV01CUUdBMVVFQ2d3TlRXbGpjbTl6WldNZ1RIUmtMakVYTUJVR0ExVUVZUXdPVmtGVVNGVXQKTWpNMU9EUTBPVGN4SGpBY0JnTlZCQU1NRldVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBeE56QWVGdzB4TnpBNE1qSXhNakEzTURaYQpGdzAwTWpBNE1qSXhNakEzTURaYU1IRXhDekFKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIREFoQ2RXUmhjR1Z6ZERFV01CUUdBMVVFCkNnd05UV2xqY205elpXTWdUSFJrTGpFWE1CVUdBMVVFWVF3T1ZrRlVTRlV0TWpNMU9EUTBPVGN4SGpBY0JnTlZCQU1NRldVdFUzcHAKWjI1dklGSnZiM1FnUTBFZ01qQXhOekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSmJjUFlyWXNIdHZ4aWUrUkpDeApzMVlWZTQ1REpIMGFoRm51WTJpeXhsNkgwQlZJSHFpUXJiMVRvdHJlT3BDbVlGOW9NcldHUWQrSFd5eDd4ZjU4ZXRxall6QmhNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlNIRVJVSTBhckJlQXl4cjg3R3laRHYKdnpBRXdEQWZCZ05WSFNNRUdEQVdnQlNIRVJVSTBhckJlQXl4cjg3R3laRHZ2ekFFd0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQQp0VmZkMTRwVkN6Ymhoa1Q2MU5sb2piamNJNHFLRGRRdmZlcHo3TDlOYktnQ0lRRExwYlFTK3VlMTZNOStrL3p6Tlk5dlRscDh0THhPCnN2eHlxbHRaK2VmY01RPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKY2VydFNJR04gUm9vdCBDQSBHMgo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUnpDQ0F5K2dBd0lCQWdJSkVRQTB0azdHTmkwMk1BMEdDU3FHU0liM0RRRUJDd1VBTUVFeEN6QUpCZ05WQkFZVEFsSlBNUlF3CkVnWURWUVFLRXd0RFJWSlVVMGxIVGlCVFFURWNNQm9HQTFVRUN4TVRZMlZ5ZEZOSlIwNGdVazlQVkNCRFFTQkhNakFlRncweE56QXkKTURZd09USTNNelZhRncwME1qQXlNRFl3T1RJM016VmFNRUV4Q3pBSkJnTlZCQVlUQWxKUE1SUXdFZ1lEVlFRS0V3dERSVkpVVTBsSApUaUJUUVRFY01Cb0dBMVVFQ3hNVFkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFNREZkUm1SZlVSMGRJZitEanVXM05nQkZzenVZNUhuQzIvT093cHBHbnpDNDYrQ2pvYlhYbzlYNjlNaFdmMDUKTjBJd3ZsRHF0ZytwaU5ndUxXa2g1OUUzR0U1OWtkVVdYMnRiQU1JNVF3MDJoVks1VTJVUEhVTGxqODhGMCs3Y0RCclp1SXQ0SW1mawphYkJveFR6a2JGcEc1ODNIK3UvRTdFdTlhcVNzL2N3b1VlK1N0Q21ycXpXYVRPVEVDTVltelBocG4rU2M4Q25UWFBuR0ZpV2VJOE1nCndUMFBQemhBc1A2Q1JEaXFXaHFLYTJOWU9MUVYwN1lSYVhzZVZPNk1HaUtzY3BjL0kxbWJ5U0tFd1FkUHpIL2lWOG9TY0x1bVpmTnAKZFdPOWxmc2JsODNrcUsvMjBVNm8yWXB4Sk0wMlBieVd4UEZzcWE3bHp3MXVLQTJ3RHJYS1VYdDRGTU1nTDMvN0ZGWGhFWm45MVFxaApuZ0xqWWwvck5Vc3N1SExvUGoxUHJDeTdMb2JpbzNhUDVaTXF6NldyeUZ5TlN3Yi9Fa2FzZU1zVUJ6WGdxZCtMNmE4VlR4YUpXNzMyCmpjWlpyb2lGRHNHSjZ4OW54VVdPLzIwM05pdDRab09SVVNzOS8xRjNkbUtoN0djK1BvR0Q0RmFwVUI4ZmVwbXJZNytFRjNmeERUdmYKOTV4aHN6V1lpanF5N0R3YU56OStqNUxQMlJJVVpOb1FBaFZCLzAvRTZ4eWp5ZnFaOTBicDRSalpzYmd5TGNzVURGRFlnMldEN3JsYwp6OHNGV2t6NkdaZHIxbDBUMDhKY1ZMd3ljNkI0OWZGdEhzdWZwYWFmSXR6UlVaNkNlV1JnS1JNK28vMVBjbXFyNHRUbHVDUlZMRVJMCmlvaEVuTXFFMHlvN0FnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWQKRGdRV0JCU0NJUzFteHRlZzRCWHJ6a3dKZDhSZ25sUnVBekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWU40YXVPZnlZSUxWQXpPQgp5d2FLOFNKSjZlanFrWC9HTTE1b0dRT0dPME1CendkdzVBZ2VaWVdSNWhFaXQvVUNJNDZ1dVI1OUgzNXM1cjBsMVpVYThnV21yNFVDCmI2NzQxakgvSmNsS3lNZUtxZG1mUzBtYkVWZVpra01SM3JZenBNelhqV1I5MU0wOEtDeTBtcGJxVGZYRVJNUWxxaUNBMkNsVjkrQkIKL0FZbS83azI5VU1VQTJaNDRSR3gyaUJmUmdCNEFDR2xIZ0FvWVhodnFBRUJqNTAwbXYvME9KRDd1Tkd6Y2diSmNlYUJ4WG50QzZaNQo4aE1MblBkZERuc2trN1JJMjRaZjNsQ0dlT2RBNWpHb2tIWndZYStjTnl3UnRZSzNxcTRrTkZ0eURHa056Vm1mOW5Hdm5BdlJDamo1CkJpS0RVeVVNL0ZIRTVyN2lPWlVMSksydjBaWGtsdGQwWkd0eFRnSThxb1h6SUtORE9YWmJiRkQrbXB3VUhtVVVpaFc5bzRKRldrbFcKYXRLY3NXTXk1V0hnVXlJT3B3cEo2c3QrSDZqaVlvRDJFRVZTbUFZWTNxWE5MMytxMU9rK0NITHNJd01DUEthcTJMeG5kRDBVRi90VQpTeGZqMDNrOWJXdEp5U2dPTG5SUXZ3elpSam9RaHNtblArbWc3SC9ycFhkWWFYSG1nd28zOG9aSmFyNTVDSkQyQWhaa1B1WGFUSDRNCk5NbjVYN2F6S0ZHbnB5dXFTZnFOWlNsTzQyc1RwNVNqTFZGdGVBeEV5OS9lQ0cvT28yU3IwNVdFMUxsU1ZISjdsaVhNdkdualNHNE4KME1lZEo1cXErQk9TM1I3Zlk1ODFxUlkyN0l5NGcvUTlpWS9OdEJkZTE3TVhRUkJkSjNOZ2hWZEpJZ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0d2F2ZSBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJqQ0NBOEtnQXdJQkFnSU1CZmNPaHRwSjgwWTFMcnF5TUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdJTVFzd0NRWURWUVFHRXdKVgpVekVSTUE4R0ExVUVDQXdJU1d4c2FXNXZhWE14RURBT0JnTlZCQWNNQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9NR0ZSeWRYTjBkMkYyClpTQkliMnhrYVc1bmN5d2dTVzVqTGpFeE1DOEdBMVVFQXd3b1ZISjFjM1IzWVhabElFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMGFXOXUKSUVGMWRHaHZjbWwwZVRBZUZ3MHhOekE0TWpNeE9UTTBNVEphRncwME1qQTRNak14T1RNME1USmFNSUdJTVFzd0NRWURWUVFHRXdKVgpVekVSTUE4R0ExVUVDQXdJU1d4c2FXNXZhWE14RURBT0JnTlZCQWNNQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9NR0ZSeWRYTjBkMkYyClpTQkliMnhrYVc1bmN5d2dTVzVqTGpFeE1DOEdBMVVFQXd3b1ZISjFjM1IzWVhabElFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMGFXOXUKSUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTGxkVVNoTFBEZVMwWUxPdlIyOQp6ZDI0cTg4S1B1RmQ1ZHlxQ2JsWEFqN21ZMkhmOGcrQ1k2Nmo5Nnh6MFh6bnN3dXZDQUFKV1gvTktTcUlrNGNYR0lEdGlMSzB0aEFmCkxkWmZWYUlUWGRIRzZ3WldpWWorckRLZC9WekRCY2R1N29hSnVvZ0RuWEloaHBDdWp3T2wzSitJS011amtra1A3TkFQNG0xRVQ0QnEKc3RUbm9BcFRBYnFPbDVGMmJyejgxV3MyNWtDSTFuc3ZYd1hvTEcwUjgrZXl2cEpFVE5LWHBQN1Njb0ZEQjV6cEVUNzFpeHBaZlI5bwpXTjBFQUN5VzgwT3pmcGdaZE5tY2M5a1l2a0hITkhuWjlHTENRN216SjdBaXkvazlVc2N3UjdQSlByaHE0dWZvZ1hCZVFvdFBKcVgrCk9zSWdicnY0Rm83TkRLbTBHMngyRU9GWWVVWStWTTZBcUZjSk55a2JtUk9QRE1qV0xCejdCZWdJbFQxbFJ0enV6V25pVFkrSEtFNDAKQ3o3UEZObTczYlpRbXExMzFCblcyaHFJeUU0YkozWFlzZ2p4cm9Nd3VSRU96WWZ3aEkwVmNueWg3OHp5aUdHNjlHbTdESXdMZFZjRQp1RTRxRkM0OUR4d2VNcVppTnU1bTRpSzRCVUJqRUNMek14MTBjb29zOVRrcG9OUG5HNENFTGNVOTQwMngvUnB2dW1VSE8xanNRa1VtCis5amFKWExFOWdDeElubTk0M3haWWtxY0JXODl6dWJXUjJPWnhpUnZjaExJckgrUXRBdVJjT2kzNWhZUWNSZk8zZ1pQU0VGOU5VcWoKaWZMSlMzdEJFVzFudHdpWVRPVVJHYTVDZ056N2tBWFUrRkRLdnVTdHg4S1UxeGFkNWhlUHJ6YjdBZ01CQUFHalFqQkFNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkpuZ0dXY05ZdHQyczlvOXVGdm8vVUxTTVE2SE1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFtSE53NHJEVDdUbnNUR0RacVJLR0Z4NlcwT2hVS0R0a0xTR20rSjFXRTJwSVBVL0gKUGluYmJWaURWRDJIZlNNRjFPUWMzT2c0WlliRmRhZGEyelVGdlhmZXV5azNRQVVIdzVSU244cGszZkViSzl4R0NoQUNNZjFLYUEwSApaSkRtSHZVcW9haTdQRjM1b3dnTEVRenhQeTBRbEcvKzRqU0hnOWJQNVJzMWJkSUQ0YkFOcUtDcVJpZUNOcWNWdGdpbVFsUlh0cGxhCjRndDVrTmRYRWxFMUdZaEJhQ1hVTnhlRUZmc0JjdHlWM2xJbUlKZ200bmIxSjIvNkFEdEtZZGtOeTFHVEt2MFdCcGFuSTVvalNQNVIKdmJiRXNMRlV6dDVzUWEwV1ozN2IvVGpOdVRoT3NzRmd5NTBYMzFpZWVtS3lKbzkwbFp2a1d4M1NEOTJZSEp0WnVTUFRNYUNtL3pqZAp6eUJQNlZoV09tZkQwZmFabVoyNk5yYUFMNGhIVDRhL1JEcUE1RGNjcHJycWw1Z1IwSVJpUjJRZXF1NUF2elN4bkk5TzRmS1NUeCtPCjg1Nlgzdk9tZVdxSmNVOUxKeGRJL3V6MFVBOVBTWDNNUmVPOWVrREZRZHhoVmljR2FlVnlRWUhUdGdHSm9DODZjbm4rT2pDL1FlekgKWWo2UlM4ZlpNWFpDK2ZjOFkrd21qSE1NZlJvZDZxaDhoNmpDSjN6aE0wRVB6OC84QUtBaWdKNUtwMjhBc0VGRnR5TEthRWpGUXFLdQozUjN5NEc1T0JWaXh3SkFXS3FROUVFQytqMkpqZzZtY2duMHRBdW1ETUh6TEo4bjlIbVlBc0M3VElTK09NeFpzbU8wUXFBZld6SlBQCjI5RnBIT1RLeWVDMm5Pbk9jWEhlYkQ4V3BIaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDWURDQ0FnZWdBd0lCQWdJTURXcGZDRDhvWEQ1UmxkOWRNQW9HQ0NxR1NNNDlCQU1DTUlHUk1Rc3dDUVlEVlFRR0V3SlZVekVSCk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnlkWE4wZDJGMlpTQkkKYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURJMU5pQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1qTXhPVE0xTVRCYUZ3MDBNakE0TWpNeE9UTTFNVEJhTUlHUk1Rc3dDUVlEClZRUUdFd0pWVXpFUk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnkKZFhOMGQyRjJaU0JJYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURJMQpOaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJINzdiT1lqCjQzTXlDTXBnNWxPY3VuU05HTEI0a0ZLQTNUakFTaDNScU15VHBKY0dPTW9ORldMR2pnRXFaWjJxM3pTUkxvSEI1RE9TTWNUOUNUcW0KUDYyalF6QkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEd1lEVlIwUEFRSC9CQVVEQXdjR0FEQWRCZ05WSFE0RUZnUVVvMEVHckpCdAowVXJyZGFWS0VKbXpzYUdMU3Zjd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0IrWlUyZzZnV3JLdUVaK0h4YmIvYWQ0bHZ2aWd0d2p6ClJNNHEzd2doRERjQ0lDMG1BNkFGdld2UjlsejRaY3lHYmJPY05FaGpoQW5GalhjYTRzeWM0WFI3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0d2F2ZSBHbG9iYWwgRUNDIFAzODQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ25UQ0NBaVNnQXdJQkFnSU1DTDJGbDJ5Wko2U0FhRWM3TUFvR0NDcUdTTTQ5QkFNRE1JR1JNUXN3Q1FZRFZRUUdFd0pWVXpFUgpNQThHQTFVRUNCTUlTV3hzYVc1dmFYTXhFREFPQmdOVkJBY1RCME5vYVdOaFoyOHhJVEFmQmdOVkJBb1RHRlJ5ZFhOMGQyRjJaU0JJCmIyeGthVzVuY3l3Z1NXNWpMakU2TURnR0ExVUVBeE14VkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JGUTBNZ1VETTROQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncweE56QTRNak14T1RNMk5ETmFGdzAwTWpBNE1qTXhPVE0yTkROYU1JR1JNUXN3Q1FZRApWUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlTV3hzYVc1dmFYTXhFREFPQmdOVkJBY1RCME5vYVdOaFoyOHhJVEFmQmdOVkJBb1RHRlJ5CmRYTjBkMkYyWlNCSWIyeGthVzVuY3l3Z1NXNWpMakU2TURnR0ExVUVBeE14VkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JGUTBNZ1VETTQKTkNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJHdmFEWFUxQ0RGSApCYTVGbVZYeEVSTXVTdmdRTVNPamZvUFRmeWdJT2lZYU9zK1hnaCtBdHljSmo5R09NTVFLbXc2c1dBU3I5elo5bENPa213cUtpNnZyCi9Ua2xadkZlL295dWpVRjVuUWxnemlpcDA0cHQ4OVpGMVBLWWhEaGxvS05ETUVFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBUEJnTlYKSFE4QkFmOEVCUU1EQndZQU1CMEdBMVVkRGdRV0JCUlZxWVNKMHNFeXZSakxiS1lIVHNqbm5iNkNrREFLQmdncWhrak9QUVFEQXdObgpBREJrQWpBM0FaS1hSUkorb1BNK3JSazZjdDMwVUpNREVyNUUwazlCcEl5Y25SK2o5c0tTNTBnVS9rNmJwWkZYcnNZM2Nyc0NNR2NsCkNyRU1YdTZwWTVKdjVaQUwvbVlpeWtmOWlqSDNnLzU2dnhDK0dDc2VqL1lwSHBSWjc0NGhOOHRSbUtWdVN3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZvakNDQTRxZ0F3SUJBZ0lVQVpRd0hxSUwzZlhGTXlxeFEwUngrTlpRVFEwd0RRWUpLb1pJaHZjTkFRRU1CUUF3YVRFTE1Ba0cKQTFVRUJoTUNTMUl4SmpBa0JnTlZCQW9NSFU1QlZrVlNJRUpWVTBsT1JWTlRJRkJNUVZSR1QxSk5JRU52Y25BdU1USXdNQVlEVlFRRApEQ2xPUVZaRlVpQkhiRzlpWVd3Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1UZ3dPRFU0Ck5ESmFGdzB6TnpBNE1UZ3lNelU1TlRsYU1Ha3hDekFKQmdOVkJBWVRBa3RTTVNZd0pBWURWUVFLREIxT1FWWkZVaUJDVlZOSlRrVlQKVXlCUVRFRlVSazlTVFNCRGIzSndMakV5TURBR0ExVUVBd3dwVGtGV1JWSWdSMnh2WW1Gc0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzIxUEdUWExWQWlRcXJEWkJiClVHT3VrSlIwRjBWeTFudGxXaWxMcDFhZ1M3Z3ZRblhwMlhza1dqRmxxeGNYMFRNNjJSSGNRRGFIMzhkcTZTWmVXWXAzNCtoSW5ERVcKK2o2UnNjckpvK0tmemlGVG93STJNTXRTQXVYYU1sM0R4ZWI1N2hISGk4bEVIb1NUR0VxMG4rVVNaR25RSm9WaUFiYkpBaDIrZzFHNwpYTnI0clJWcW1mZVNWUGMwVyttLzZpbUJFdFJUa1phemtWcmQvcEJ6S1Bzd1JyWEtDQWZIY1hMSlp0TTBsL2FNOUJoSzRkQTlXa1cyCmFhY3AreVBPaU5nU25BQklxS1lQc3p1U2pYRU9kTVdMeUV6NTlKdU91RHhwN1c4N1VDOVk3Y1N3MEJ3YmFneml2RVNxMk0wVVhaUjQKWWI4T2J0b3F2QzhNQzNHbXN4WS9uT2I1eko5VE5lSURvS0FZdjd2eHZ2VFdqSWNOUXZjR3VmRnQ3UVNVcVA2MjB3YkdRR0hmblozegpWSGJPVXpvQnBwSkI3QVNqancyaTFRbksxc3VhOGU5RFhjQ3JwVUhQWEZOd2NNbUlwaTNVYTJGelVDYUdZUTVmRzhJcjRvelZ1NTNCCkEwSzZsTnBmcWJES3pFMEs3MGRwQXk4aSsvRW96cjlkVUdXb2tHMnpkTEFJeDZ5bzBlcytuUHhkR29NdUs4dTE4MFNkT3FjWFlaYWkKY2ROd2xoVk50MHh6N2hsY3hWcytRZjZzZFdBN0cyUE9BTjNhQ0pCaXRPVXQ3a2luYXhlWlZMNkhTdU9wWGdSTTZ4QnRWTmJ2OGVqeQpZaGJMZ0d2dFBlMzFIekNscmt2SkUrMktBUUhKdUZGWXdHWTZzV1pMeE5VeEFtTHBkSVFNMjAxR0xRSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVMHArSTM2SE5MTDNzOVRzQkFaTXpKN0xyWUVzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFETEtnTE9kUFZRRzNkTFNMdkNrQVNFTFowaktiWTdneUtvTnFvMGhWNC9HUG5ySwoyMUhVVXJQVWxvU2xXR0IvNVF1T0gvWGNDaFdCNVR1MnR5SXZDWndURnJGc0REVUliYXRqY3UzY3Z1ekhWK1l3SUhIVzF4REJFMVVCCmpDcEQ1RUh4enpwNlU1TE9vZ01GRFRqZkFyc1FMdGs3MHB0NndLR20rTFV4NXZSMXlibFRtWFZISWxvVUZjZDRHN2FkNlF6NEczYngKaFlUZW9kb1M3NlRpRUpkNmVONE1VWmVvSVVDTGhyME44RjVPU3phN095QWZpa0pXNFFzYXYzdlFJa01zUkl6NzVTcTBiQndjdXBUZwpFMzRoNXByQ3k4VkNaTFFlbEhzSUpjaHh6SWRGVjRYVG55bGlJb05SbHdBWWwzZHFtSkxKZkdCczMyeDlTdVJ3VE1LZXVCMzMwRFRICkQ4ejdwLzhEdnExd2tOb0wzY2h0bDErYWZ3a3lRZjNOb3N4YWJVenlxa24rWnZqcDJEWHJEaWdlN2tndk90QjVDVGg4cGlLQ2s1WFEKQTc2K0FxQUYzU0FpNDI4ZGlEUmd4dVlLdVFsMUMvQUg2R21XTmNmN0k0R09PRG00UlN0RGVLTFJMQlQvRFNoeWNwV2JYZ25iaVVTWQpxcUZKdTNGUzhyLzIveWVoTnErNHRuZUkzVHFrYlpzMGtOd1VYVEMvdCtzWDVJZTNjZENoMTNjVjFFTFg4dk14bVYyYjNSWnRQK29HCkkvaEdvaUx0ay9iZG11WXFoN0dZVlBFaTkydEY0K0tPZGgyYWpjUUdqVGEzRlBPZFZHbTNqanpWcEcyVGdiZXQ5cjFrZThMSmFEbWcKa3B6Tk5JYVJrUHBrVVozKy91dWw5WFhlaWZkeQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2JqQ0NBZk9nQXdJQkFnSVFZdll5Yk9YRTQyaGNHMkxkbkM2ZGxUQUtCZ2dxaGtqT1BRUURBekI0TVFzd0NRWURWUVFHRXdKRgpVekVSTUE4R0ExVUVDZ3dJUms1TlZDMVNRMDB4RGpBTUJnTlZCQXNNQlVObGNtVnpNUmd3RmdZRFZRUmhEQTlXUVZSRlV5MVJNamd5Ck5qQXdORW94TERBcUJnTlZCQU1NSTBGRElGSkJTVm9nUms1TlZDMVNRMDBnVTBWU1ZrbEVUMUpGVXlCVFJVZFZVazlUTUI0WERURTQKTVRJeU1EQTVNemN6TTFvWERUUXpNVEl5TURBNU16Y3pNMW93ZURFTE1Ba0dBMVVFQmhNQ1JWTXhFVEFQQmdOVkJBb01DRVpPVFZRdApVa05OTVE0d0RBWURWUVFMREFWRFpYSmxjekVZTUJZR0ExVUVZUXdQVmtGVVJWTXRVVEk0TWpZd01EUktNU3d3S2dZRFZRUUREQ05CClF5QlNRVWxhSUVaT1RWUXRVa05OSUZORlVsWkpSRTlTUlZNZ1UwVkhWVkpQVXpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUEKQlBhNlYxUEl5cXZmTmtwU0llU1gwb05ubnZCbFVkQmVoOGRIc1ZueVYwZWJBQUtUUkJkcDIwTEhzYkk2R0E2MFhZeXpabDJoTlBrMgpMRW5iODBiOHMwUnBSQk5tL2RmRi9hODJUYzREVFFkeHo2OXFCZEtpUTFvS1VtOEJBMDZPaTZOQ01FQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQUc1TCsrL0VZWmc4ay9RUVc2cmN4L24wbTVKTUFvR0NDcUcKU000OUJBTURBMmtBTUdZQ01RQ3VTdU1yUU1OMEVmS1ZyUllqM2s0TUd1WmRwU1JlYTBSNy9EamlUOHVjUlJjUlRCUW5KbFU1ZFVvRAp6Qk9RbjVJQ01RRDZTbXhnaUhQejdyaVlZcW5PSzhMWmlxWndNUjJ2c0pSTTYwL0c0OUh6WXFjOC81TXVCMXhKQVdkcEVnSnl2K2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbFNpZ24gUm9vdCBSNDYKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldqQ0NBMEtnQXdJQkFnSVNFZEs3dWRjakdKNUFYd3FkTGREZkpXZlJNQTBHQ1NxR1NJYjNEUUVCREFVQU1FWXhDekFKQmdOVgpCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1Sd3dHZ1lEVlFRREV4TkhiRzlpWVd4VGFXZHVJRkp2CmIzUWdValEyTUI0WERURTVNRE15TURBd01EQXdNRm9YRFRRMk1ETXlNREF3TURBd01Gb3dSakVMTUFrR0ExVUVCaE1DUWtVeEdUQVgKQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhIREFhQmdOVkJBTVRFMGRzYjJKaGJGTnBaMjRnVW05dmRDQlNORFl3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNzckhReTZMTmw1YnJ0UXlZZHBva05SYm9waUxLa0hXUGQwOEVzCkNWZUpPYUZWNldjMGR3eHU1RlVkVWlYU0UydGU0UjJwdDMySk1sOE5ucDhzZW1OZ1FCK21zTFo0ajVsVWxnaFlydVFHdkdJRkFoYS8KcjZnakE3YVVEN3h1Yk1MTDFhYTdET24yd1FMN0lkNW0zUmVyZEVMdjhIUXZKZlRxYTFWYmtOdWQzMTZIQ2tEN3JSbHIrL2ZLWUlqZQoyc0dQMXE3VmY5UThnKzdYRmt5RFJUTnJKOUNHMEJ3dGEvT3JmZkdGcWZVbzBxM3Y4NFJMSElmOEU2TTZjcUphRVN2V0ozRW43WUV0CmJXYUJrb2UwRzFoNnpEOEsra1pQVFhoYytDdEk0d1NFeTEzMnRHcXpaZnhDbmxFbUl5RExQUlQ1Z2UxbEZnQlBHbVNYWmdqUGpIdmoKSzhDZCtSVHlHL0ZXYWhhL0xJV0Z6WGc0bXV0Q2FnSTBHSU1YVHBSVytMYUN0Zk9XM1QzenZuOGdkejU3R1NOckxOUnljME5YZmVENAoxMmxQRnpZRStjQ1FZRGRGM3VZTTJIU05ycHlpYlhSZFFyNEc5ZGxrYmdJUXJJbXdURHNIVFVCK0pNV0ttSUo1anFTbmdpQ05JL29uCmNjbmZ4a0Ywb0UzMmtSYmNSb3hmS1dNeFdYRU0yRy9DdGpKOSsrWmRVNlorRmZ5N2RYeGQ3UGoyRnh6c3gyc1p5L043OENzSHBkbHMKZVZSMmJKMGNwbTRPNlhrTXFDTnFvOThiTURHZnNWUjcvbXJMWnFyY1pkQ2lua3FhQnlGcmdZL2J4Rm42M2lMQUJKempxbHMyaytnOQp2WHFoblF0MnNRdkhuZjNQbUtnR3d2Z3FvNkdEb0xjbGNxVUM0d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTF5cmM0R0hxTXl3cHRXVTRqYVdTZjhGbVN3d0RRWUpLb1pJaHZjTkFRRU0KQlFBRGdnSUJBSHg0N1BZQ0xMdGJmcElyWFRuY3Z0Z2Rva0l6VGZudnBDbzdSR2tlck5sRm8wNDhwOWdrVWJKVUhKTk94Tzk3azRWZwpKdW9KU09EMXU4ZnBhTks3YWpGeHpIbXVFYWp3bWYzbEg3d3ZxTXhYNjNiRUlhWkhVMVZOYUw4RnBPN1hKcXRpMmtNM1MrTEd0ZVd5Cmd4azZ4OVBiVFo0SWV2UHV6ejVpKzZ6b1lNelJ4NkZjZzBYRVJjenpGMnNVeVFRQ1B0SWtwbm5wSHM2aTU4RlpGWjhkNGt1YVBwOTIKQ0MxcjJMcFhGTnFENnY2TVZlblFUcW5NZHpHeFJCRjZYTEUrMHhSRkZSaGlKQlBTeTAzT1hJUEJOdklRdFE2SWJiamhWcCtKM3BabQpPVWRrTEc1TnJtSjd2MkIwR2JoV3JKS3NGakx0cldoVi9waTYwelRlOU1saHd3Nkc5a3VFWU80TmU3VXlXSG1SVlN5QlE3TjBIM3FxCkpaNGQxNkdMdWMxQ0xnU2tab05OaVRXMmJLZzJTbmtoZUNMUVFyelJRREdRb2I0RXo4cG43Zlh3Z05OZ3lZTXFJZ1hRQnp0U3Z3eWUKcWl2NXUrWWZqeVc2aFkwWEhnTCtYVkFFVjgvK0xienZYTUFhcTdhZkpNYmZjMmhJa0N3VTlEOVNHdVRTeXhURFlXblA0dmtZeGJvegpueFNqQkYyNWNmZTFsTmoyTThGYXdUU0xmSnZka3pybkU2SndZWit2ait2WXhYWDRNMmJVZEdjNk4zZWM1OTJrRDNaRFpvcEQ4cC83CkRFSjRZOUhpRDI5NzFLRTlkSmVGdDBnNVFkWWcvTkE2cy9yb2I4U0t1bkUzdm91WHNYZ3hUN1BudGdNVHpsU2RyaVZaekg4MVh3ajMKUUVVeGVDcDYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IEU0Ngo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDQ3pDQ0FaR2dBd0lCQWdJU0VkSzd1ak51MUx6bUpHakZEWVFkbU9oRE1Bb0dDQ3FHU000OUJBTURNRVl4Q3pBSkJnTlZCQVlUCkFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNUnd3R2dZRFZRUURFeE5IYkc5aVlXeFRhV2R1SUZKdmIzUWcKUlRRMk1CNFhEVEU1TURNeU1EQXdNREF3TUZvWERUUTJNRE15TURBd01EQXdNRm93UmpFTE1Ba0dBMVVFQmhNQ1FrVXhHVEFYQmdOVgpCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4SERBYUJnTlZCQU1URTBkc2IySmhiRk5wWjI0Z1VtOXZkQ0JGTkRZd2RqQVFCZ2NxCmhrak9QUUlCQmdVcmdRUUFJZ05pQUFTY0RySFB0K2llVW5kMU5QcWxScWV0TWhreXRBZXBKOHFVdXd6U0NoREgyb213bHd4d0V3a0IKanRqcVIrcStzb0FyemZ3b0RkdXN2S1NHTisxd0NBQjE2cE1MZXk1U25DTm9Jd1pEN0pJdlU0VGIrMGNVQitoZmxHZGR5WHFCUENDagpRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlF4Q3BDUHRzYWQwa1JMCmdMV2k1aCt4RWs4YmxUQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUEzMVNRN1p2dmk1UUNreGVDbWI2em5pejJDNUdNbjBvVXNmWmsKdkx0b1VSTU1BL2NWaTRSZ3VZdi9Vbzduakx3Y0FqQTgrUkhVakU3QXdXSENGVXlxcXgwTE1WODdIT0lBbDBReDV2NXpsaS9hbHRQKwpDQWV6TkltOEJaLzNIb2J1aTNBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHTE9CQUxUUlVTVCAyMDIwCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnakNDQTJxZ0F3SUJBZ0lMV2t1OVd2dFBpbHY2WmVVd0RRWUpLb1pJaHZjTkFRRUxCUUF3VFRFTE1Ba0dBMVVFQmhNQ1FWUXgKSXpBaEJnTlZCQW9UR21VdFkyOXRiV1Z5WTJVZ2JXOXVhWFJ2Y21sdVp5QkhiV0pJTVJrd0Z3WURWUVFERXhCSFRFOUNRVXhVVWxWVApWQ0F5TURJd01CNFhEVEl3TURJeE1EQXdNREF3TUZvWERUUXdNRFl4TURBd01EQXdNRm93VFRFTE1Ba0dBMVVFQmhNQ1FWUXhJekFoCkJnTlZCQW9UR21VdFkyOXRiV1Z5WTJVZ2JXOXVhWFJ2Y21sdVp5QkhiV0pJTVJrd0Z3WURWUVFERXhCSFRFOUNRVXhVVWxWVFZDQXkKTURJd01JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcmk1V3JSc2M3L2FWajZCM0d5dlRZNCtFVFVXaQpENTliUmF0WmUxRTArZXlMaW5qRjNXdXZ2Y1RmazBVZXY1RTRDNjRPRnVkQmMvamJ1OUc0VWVETGd6dHpPRzUzaWc5Wll5Yk5weXJPClZQdTQ0c0I4Ujg1Z2ZEK3ljL0xBR2JhS2tvYzFEWkFvb3VRVkJHTSt1cS91ZkY3TXBvdFFzamozUVdQS3p2OXBqMmdPbFRibHpMbU0KQ2NwTDNUR1Fsc2pNSC8xV2xqVGJqaHpxTEw2RkxtUGRxcW1WMC8wcGxSUHd5SmlUMlMwV1I1QVJnNkk2SXFJb1Y2THIvc0NNS0tDbQpmZWNxUWp1Q2dHT2xZeDhaekh5eVpxakMwMjAzYitKK0JsSFpSWVFmRXM0a1VtU0ZDMGlBVG9leElpSXdxdXV1dnVBQzRFRG9zRUtBCkExR3F0SDZxUk5kRFlmT2lheGFKU2FTanBDdUtBc1I0OUdpS3dlUjZOckZ2RzVZYmQwbU4xTWtHY28vUFUrUGNGNFVnU3R5WUo5T1IKSml0SEhta0hyOTZpNU9UVWF3dXpYbnpVSklCSEtXazdidWlzL1VEcjJPMXhjU3Z5NkZnZDYwR1hJc1VmMURuUUo0K0g0eGowNEtsRwpEZlYwT29JdTBHNHNrYU14WER0RzZuc0VFRlplZ0IzMXBXWG9ndnppQjR4aVJmVWcza1p3aHFHOGs5TWVkS1pzc0N6M0F3eUlETXZVCmNsT0d2R0JHODVocXd2Ry9RL2x3SUhmS04wRjVWVkpqalZzU244Vm94SWlkclBJd3E3ZWpNWmRuclk4WEQyekhjKzBrbEd2SWc1clEKbWpkSkJLdXhGc2hzU1VrdHE2SFFqSkx5UVVwNUlTWGJZOWUybktkK1FtbjdPbU1DQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk53dUg5RmhOM25rcTlYVnN4SnhhRDFxYUp3aU1COEdBMVVkCkl3UVlNQmFBRk53dUg5RmhOM25rcTlYVnN4SnhhRDFxYUp3aU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQ1I4RUlDYUVEdXcyakEKVkMvZjdHTER3NTZLb0RFb3FvT09wRmFXRWhDR1ZycVhjdEpVTUh5dEdkVWRhRy83RkVMWWpRN3p0ZEdsNHdKQ1h0em9SbGdITlFJdwo0THgwU3NGREt2L2JHdEN3cjJ6RC9jdXo5WDl0QXk1WlZwMHRMVFdNc3RaREZ5eVNDc3RkNkl3UFMzQkQwSUwvcU15L3BKVEF2b2U5Cml1T1RlOGFQbXhhZEoyVzhlc1ZDZ214Y0I5Q3B3WWhnUk9tWWhSWmYrSS9LQVJET0pjUDVZQnVneFpmRDB5eUlNYUs5TU96UTBNQVMKOGNFNTQrWDErTlpLM1RUTisyL0JUK01BaTFiaWt2Y29za0ozY2lObnh6OFJGYkxFQXdXK3V4RjdDcitvYnVmL1dFUFBtMmVnZ0FlMgpIY3F0YmVwQkVYNHRkSlA3d3J5K1VVVEY3MmdsSjREanlLRFVFdXpacFRjZE4zeTBrY3JhMUxHV2dlOW9YSFlRU2E5K3BUZUFzUnhTCnZUT0JUSS81M1dYWkZNMktKVmowNHNXRHBRbVExR3dVWTdWQTMrdkEvTVJZZmcwVUZvZFVKMjVXNUhDRXVHd3lFbjZDTVVPKzE5MTgKb2EydTFxc2dFdThLd3hDTVNaWTEzQXQxWHJGUDFVODBEaEVnQjNWRFJlbWpFZHFzbzVuQ3Rua240cm52eU9MMk5TbDZkUHJGZjRJRgpZcVlLNm1peWVVY0didkpYcUJVenh2ZDRTajFDZTJ0Ky92ZEc2dEhyanUrSWFGdm93ZGx4ZnYxazcvOW5SNGhZSlM4K2hnZTkrNmpsCmdxaXNwZE5wUTgweGlFbUVVNUxBc1RrYk9ZTUJNTVR5cWZyUUE3MXlOMkJXSHpaOHZUbVI5VzBOdjN2WGtnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGN3pDQ0E5ZWdBd0lCQWdJSURkUGp2R3o1YTdFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lReEVqQVFCZ05WQkFVVENVYzJNekk0Ck56VXhNREVMTUFrR0ExVUVCaE1DUlZNeEp6QWxCZ05WQkFvVEhrRk9SaUJCZFhSdmNtbGtZV1FnWkdVZ1EyVnlkR2xtYVdOaFkybHYKYmpFVU1CSUdBMVVFQ3hNTFFVNUdJRU5CSUZKaGFYb3hJakFnQmdOVkJBTVRHVUZPUmlCVFpXTjFjbVVnVTJWeWRtVnlJRkp2YjNRZwpRMEV3SGhjTk1Ua3dPVEEwTVRBd01ETTRXaGNOTXprd09ETXdNVEF3TURNNFdqQ0JoREVTTUJBR0ExVUVCUk1KUnpZek1qZzNOVEV3Ck1Rc3dDUVlEVlFRR0V3SkZVekVuTUNVR0ExVUVDaE1lUVU1R0lFRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dU1SUXcKRWdZRFZRUUxFd3RCVGtZZ1EwRWdVbUZwZWpFaU1DQUdBMVVFQXhNWlFVNUdJRk5sWTNWeVpTQlRaWEoyWlhJZ1VtOXZkQ0JEUVRDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU52cmF5dm1aRlNWZ3BDamNxUVpBWjJjQzRGZmMwbTZwNnp6CkJFNTdsZ3ZzRWVCYnBoek9HOUlOZ3h3cnVKNGRma1V5WUE4SDZYZFlmcDlxeUdGT3RpYkJUSTMvVE84MHNoOWwyTGw0OWEycGNibnYKVDFnZHBkNTBJSmVoN1doTTNwSVhTN3lyLzJXYW52dEgyVmR5OHdtaHJuWkVFMjZjTFVRNXZQbkhPNlJZUFVHOXRNSkpvOGdOMHBjdgpCMlZTQUtkdXlLOW83UFFVbHJaWEgxYkRPWjhyYmVUelB2WTFaTm9NSEtHRVN5OUxTK0lzSkoxdGswRHJ0U09PTXNwdlJkT29pWHNlCnp4NzZXME9MemMyb0QycktERjY1bmtlUDhObTJDZ3RZWlJjenVTUGtkeGw5eTBvdWtudFBMeEIzc1kwdmFKeGl6T0JRK095UnAxUk0KVnduVmRtUEY2R1VlN20xcXp3bWQrbnhQcldBSS9WYVpEeFVzZTZtQXE0eGhqMG9IZGtMZVBmVGRzaVF6VzdpMW8wVEpySDkzUEIwago3SUtwcHVMSUJrd0MvcXhjbVprTEx4Q0twdlIvMVlkMERWbEpSZmJ3Y1Z3NUtkYS9TaU9MOVY4Qlk5S0hjeWkxU3dyMStLdUNMSDV6CkpUSWRDMk1LRjRFQS83WjJYdWUwc1VES0lidlZnRkhsU0ZKbkxOSmhpUWNORDg1Q2Q4QkVjNXhFVUtEYkVBb3RsUnlCcitRYzVSUWUKOFRaQkFRSXZmWE9uM2tMTVRPbUpEVmIzbjVIVUE4WnN5WS9iMkJ6Z1FKaGRacG1ZZ0c0dC93SEZ6c3RHSDZ3Q3hrUG1ycUtFUE1WTwpIajF0eVJSTTR5NUJ1OG81dnpZOEtobXFRWWRPcGM1TE1ubmRrRWwvQWdNQkFBR2pZekJoTUI4R0ExVWRJd1FZTUJhQUZKeGYwR3hqCm8xK1R5cE9ZQ0syTWg2VXNYTUUzTUIwR0ExVWREZ1FXQkJTY1g5QnNZNk5mazhxVG1BaXRqSWVsTEZ6Qk56QU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFUaDY1aXNhZ21EOXV3Mm5BYWx4SgpVcXpMSzExNE9NSFZWSVNmay9DSEdUMHNab25yRFVMOHpQQjFoVCtMOUlCZGVlVVhaNzAxZ3VMeVBJNTlXemJMV29BQUtmTE9LeXp4Cmo2cHRCWk5zY3NkVzY5OVFJeWpsUlJBOTZHZWpydzVWRDVBSll1OUxXYUwyVS9IQU5lUXZ3U1M5ZVM5T0lDSTcvUm9nc0tRT0xIRHQKZEQrNEU1VUdVY2pvaHliS3BGdHFGaUdTM1hOZ25oQVkzanlCNnVnWXczeUo4b3RRUHIwUjRoVURxRFo5TXdGc1NCWFhpSkNaQk1YTQo1Z2YwdlBTUTdSUGk2b3ZEajZNekQ4RXBUQk5PMmhWV2NYTnlnbEQybWpOOG9yR29HalIwWlZ6TzBldXJVK0FhZ05qcU9rbmtKakNiCjVSeUtxS2tWTW9hWmtnb1FJMVlTNFBiT1RPSzd2dHVOa25NQlppOWlQckp5SjBVMjdVMVc0NWVaL3pvMVBxVlVTbEpaUzJEYjd2NTQKRVg5SzNCUjVZTFpyWkFQYkZZUGhvcjcySTVkUThBa3pOcWR4bGlYenVVSjkyemcvTEZpczZFTGhEdGpUTzB3dWd1bURMbXN4MmQxSApoazl0bDVFdVQrSW9jVFVXMGZKei9pVXJCMGNrWXlmSStQYlphL3dTTVZZSXdGTkNyNXpRTTM3OEJ2QXhSQU1VOFZqcThtb05xUkd5Cmc3N0ZHcjhINmxuY280ZzE3NXgyTWp4TkJpTE9GZVhkbnRpUDJ0N1N4RG5sRjRIUE9FZnJmNGh0V1J2Zm4wSVVybjdQcUxCbVpkbzMKcjUrcVBlb290dDdWTVZnV2dsdnF1eGwxQW5NYXlrZ2FJWk9RQ282VGhLZDlPeU1Za29tZ2phdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIEVDLTM4NCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDWlRDQ0FldWdBd0lCQWdJUWVJOG5YSUVTVWlDbEJOQXQzYnB6OURBS0JnZ3Foa2pPUFFRREF6QjBNUXN3Q1FZRFZRUUdFd0pRClRERWhNQjhHQTFVRUNoTVlRWE56WldOdklFUmhkR0VnVTNsemRHVnRjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreEdUQVhCZ05WQkFNVEVFTmxjblIxYlNCRlF5MHpPRFFnUTBFd0hoY05NVGd3TXpJMgpNRGN5TkRVMFdoY05ORE13TXpJMk1EY3lORFUwV2pCME1Rc3dDUVlEVlFRR0V3SlFUREVoTUI4R0ExVUVDaE1ZUVhOelpXTnZJRVJoCmRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3gKR1RBWEJnTlZCQU1URUVObGNuUjFiU0JGUXkwek9EUWdRMEV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVEVLSTZyR0Z0cQp2bTVrTjJQa3pleXJPdmZNb2JnT2drblhoaW1mb1pUeTQyQjRtSUY0QmszeTdKb09WMkNEbjdUbUZ5OGFzMTBDVzRralBNSVJCU3FuCmlCTVk4MUNFMTcwMExDZUpWZi9PVE9mZnBoOG94UEJVdzdsOHQxT3Q2OEtqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKVlIwT0JCWUVGSTBHWm5Ra2RqcnppZmU4MXIxSGZTKzhFRjlMTUE0R0ExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObwpBREJsQWpBRFZTMm01aGpFZk8vSlVHN0JKdytjaDY5dTFSc0lHTDJTS2NIdmxKRjQwam9jVllsaTVSc0pIcnBrYS9GMnROUUNNUUMwClFvU1ovNnZubnZ1Umx5ZGQzTEJiTUhIT1hqZ2FhdGtsNStyM1laSlcrT3JhTnNLSFpaWXVjaVV2ZjkvREU4az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGd0RDQ0E2aWdBd0lCQWdJUUhyOVpVTGpKZ0RkTUJ2ZnJWVSsxN1RBTkJna3Foa2lHOXcwQkFRMEZBREI2TVFzd0NRWURWUVFHCkV3SlFUREVoTUI4R0ExVUVDaE1ZUVhOelpXTnZJRVJoZEdFZ1UzbHpkR1Z0Y3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEWlhKMGRXMGcKUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTVRGa05sY25SMWJTQlVjblZ6ZEdWa0lGSnZiM1FnUTBFdwpIaGNOTVRnd016RTJNVEl4TURFeldoY05ORE13TXpFMk1USXhNREV6V2pCNk1Rc3dDUVlEVlFRR0V3SlFUREVoTUI4R0ExVUVDaE1ZClFYTnpaV052SUVSaGRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1URmtObGNuUjFiU0JVY25WemRHVmtJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFJMWTY3dHpicWJUZVJuMDZUcHdYa0tRTWx6aHlDOTN5Wm4wRUd6ZTJqdXNEYkNTekJmTjhwCmZrdGxMNU9uMUFGckF5Z1lvOWlkQmNFcTJFWHhrZDdmTzlDQUFvelBPQS9xcDF4NEVhVEJ5SVZjSmRQVHN1Y2x6eEZVbDZzMXdCNTIKSE84QVU1ODUzQlNsTENJbHMzSnkvSTJ6NVQ0SUhoUXFOd3VJUE1xdzlNakNvYTY4d2I0cFoxWGkvSzFaWFA2OVZ5eXdrSTNDN1RlMgpmSm1JdGRVRG1qMFZEVDA2cUtoRjhKVk9KVmtkelpocHU5UE1Nc21ONzRIK3JYMkp1N3BnRThwbGxXZWc4eG4yQTFiVWF0TW40cUd0CmcvQktFaUozSEFWejRobHhRc0RzZFVhYWtGamdhbzRycFVZd0JJNFpzaGZqdnFtNmYxYnhKQVBYc2lFb2RnNDJNRXg1MVVHYW1xaTQKTmJvTU92SkVHeUNJOThVbDF6M0c0ejVEM1lmK3hPcjFVejVNWmY4N1NzdDRXbXNYWHczSHcwOU9taXFpN1ZkTkl1SkdtajhQa1RRawpmVlhqakpVMzB4cndDU3NzMHNtTnRBMEFxMmNwS05nQjlSa0V0aDIrZHY1eVhNU0Z5dEtBUWQ4RnFLUFZoSkJQQy9QZ1A1c1owamVKClAvSjdVaHlNOXVIM1BBZVhqQTZpV1lFTXNwQTkwK05aUnUwUHFhZmVnR3RhcWdlMkdjdThWL09YSVhvTXNTdDBQdXZhcDJjdFRNU1kKbmpZSmRtWm0vQm8vNmtoVUhMNHd2WUJRdjN5MXpnRDJER0haNXlRRDRPTUJnUTY5MklVMGlMMnlOcWg3WEFqbFJJQ01iL2d2MVNISwpIUnpRKzhTMWg5RTZUc2QydFRWSXRRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU00reHgxCnZBTFRuMDR1U05uNVlGU3F4TE5QK2pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUVpaTFRQUwKTHRBL3ZCelZ0VlJKSGxwcjlPVHk0RUEzNE13VWU3bkoralcxZFJlVGFnVnBoWnpOVHhsNFd4bUI4Mk0rdzg1YmovVXZYZ0YyRXo4cwpBTG5ObGxJNVNXMEVUc1hwRDRZTjRmcXpYNElTOFRyT1pnWWtOQ3Zvek1ybmFkeUhuY0kwMTNuUjAzZTRxbGxZL3AwbStqaUdQcDJLCmgyUlg1UmM2NHZtTnVlTXplTUdRMkxqZHQ0TlI1TVRNSTlVR2ZPWlIwODAwTWNEMlJyc0xyZnc5RUFVcU8wcVJKZTZNMUlTSGdDcTgKQ1l5cU9oTmY2RFI1VU1FUUdmblRLQjdVMFZFd0tiT3VrR2ZXSHdwanNjV3B4a0l4WXhlVTcybkxML3FNRkgzRVF4aUoyZkF5UU9hQQo0a1pmNWVQQkFGbW8rZWdndklrc0RrYzBDK3BYd2xNMi9LZlVyekhOL2dMbGRmcTVKd241OC9VN3luMmZxU0xMaU1tcTBVYzlObmVvCldXUnJKOC92SjhIakpMV0c5NjUrTWsyd2VXalJPZWlRV01PRHZBOHMxcGZyemd6aElNZmF0ejdEUDc4djNEU2sreXNoeldlUFMvVGoKNnRRLzUwKzZ1YVdUUlJ4bUh5SDZaRjV2NEhhVU1zdDE5VzdsOW8vSHVLVE1xSlo5WlBza1drb0RiR3M0eHVnRFE1cjNWN216S1dtVApPUFFEOHJ2N2dtc0hJTkZTSDVwa0FudVladHRjVFZvUDBJU1ZvRHdVUXdiS3l0dTRRVGJhYWtSbmg2K3Y0MFVSRldrSXNyNFdPWmNrCmJ4SkYwV2RkQ2FqSkZkcjYwcVpmRTJFZnY0V3N0SzJ0QlpRSWd4NTFGOU54TzVOUUkxbWc3VHlSVkoxMkFNWER1RGpiCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClR1blRydXN0IFJvb3QgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnN6Q0NBNXVnQXdJQkFnSVVFd0xWNGtCTWtrYUdGbWRkdEx1N3NtcysvQk13RFFZSktvWklodmNOQVFFTEJRQXdZVEVMTUFrRwpBMVVFQmhNQ1ZFNHhOekExQmdOVkJBb01Ma0ZuWlc1alpTQk9ZWFJwYjI1aGJHVWdaR1VnUTJWeWRHbG1hV05oZEdsdmJpQkZiR1ZqCmRISnZibWx4ZFdVeEdUQVhCZ05WQkFNTUVGUjFibFJ5ZFhOMElGSnZiM1FnUTBFd0hoY05NVGt3TkRJMk1EZzFOelUyV2hjTk5EUXcKTkRJMk1EZzFOelUyV2pCaE1Rc3dDUVlEVlFRR0V3SlVUakUzTURVR0ExVUVDZ3d1UVdkbGJtTmxJRTVoZEdsdmJtRnNaU0JrWlNCRApaWEowYVdacFkyRjBhVzl1SUVWc1pXTjBjbTl1YVhGMVpURVpNQmNHQTFVRUF3d1FWSFZ1VkhKMWMzUWdVbTl2ZENCRFFUQ0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNUE4wL3k5QkZQZERDQTYxWWd1QlV0QjlZT0NmdmRabjU2ZVkraHoKMnZZR3FVOGZ0UGtMSHptTW1pRFFmZ2JVN0RUWmhyeDFXNGVJOE5MWjFLTUtzbXdiNjBrc1BxeGQySlFEb093MDVUREVOWDM3SmswYgpiakJVMlBXQVJadzVyWnpKSlFSTm1wQStUa0J1aW12TktXZkd6QzNnZE9nRlZ3cElVUHA2UTlwKzdGdWFEbUoyL3VxZEhZVnk3Qkc3Ck5lZ2ZKNy9Cb2NlN1NCYmRWdGZNVHFEaHVhemIxWU1aR29YUmxKZlh5cU5sQy9NNCtRS3UzZlpuejhrLzlZb3NSeHFaYndVTi9kQWQKZ2pIOEtjd0FXSmVSVElBQUhET0ZsaS9MUWNLTEVJVERDU1NKSDdVUDJkbDNSeGlTbEdCY3g1a0RQUDczbGFkOVVLR0F3cW1EclZpVwpWU0hiaGxuVXI4YTgzWUZ1Qjl0Z1l2N3NFRzdhYUFIMGd4dXBQcUpiSTlka3h0L2NvbjNZUzdxQzBsSDRacjhHUnVSNUtpWTJlWThmClRwa2RzbzhNRGh6L3lWM0EvWkFRcHJFMzg4MDZKRzYwaFpDL2dMa01qTldiMXNqeFZqOGFnSWw2cWVJYk1sRXNQdkxmZS9aZGVpa1oKanVYSXZUWnhpMTFNd2gwL3JWaWl6ejF3VGFaUW1DWGNJL200V0VFSWNiOVB1SVNnandCVUZmeVJiVmlubGp2clM1WW56V3Vpb1lhcwpEWHhVNW1aTVpsK1F2aUdhQWtZdDVJUENnTG5QU3o3b2Z6d0I3STllelgvU0tFSUJsWXJpbHowUUlYMzJuUnpGTktIc0xBNEtVaXdTClZYQWtQY3ZDRkRWRFhTZE92c0M5cW55VzUveWVZYTFFMHdDWEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUUdtcHNmVTMzeDlhVEkKMDRZK29YTlp0UGRFSVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZBYWFteDlUZmZIMXBNalRoajZoYzFtMAo5MFFoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBcWdWdXR0MFZ5Yit6eGlEMkJrZXdocE1sCjA0MjV5QUEvbC9WU0o0aHh5WFQ5NjhwazIxdnZIbDI2djlIcjdseHB1aGJJODdtUDB6WXVRRWtIRFZuZWl4Q3dTUVhpLzVFL1M3ZmQKQW83NGdTaGN6Tnh0cjE4VW5IMVllQTMyZ0FtNTZRNlhLUm00dCt2NEZzdFZFdVRHZmJ2RTdQaTFIRTQrWjcvRlh4dHRiVWNvcWdSWQpZZFoydnlKLzBBZHFwMlJUOEplTm5ZQS91OEVIMjJXdjVwc3ltc05VazhRY0NNTkUrM3RqRVVQUmFocGhhbmx0a0U4cGprY0Z3UkpwCmFkYkdOakhoL1BxQXVseFB4T3UzTXF6NGRXRVgxeEFadWZIU0NlOTZRcDFiV2d2VXhwVk9LczcvQjlkUGZoZ0dpUEVadGRtWXU2NXgKeEJ6bmRGbFk3d3lKejRzZmRaTWFCQlNTU0ZDcDYxY3BBQmJqTmh6SStML3dNOVZCRDhUTVBOM3BNME1Ca1JBckh0RzVYYzB5R1l1UApqQ0IzMXlMRVF0eUVGcHNsYmVpMFZYRi9zSHl6MDNGSnVjOVNwQVEvM0QyZ3U2OHpuZ293WUk3Ym5WMlVxTDFnNTJLQWRvR0RESXpNCk1FWko0Z3pTcUsvcllYSHY1eUppcWZkY1pHeWZGb3huTmlkRjlRbDd2L1lRQ3ZHd2pWUkRqQVM2b3ovdjRqWEgrWFRnYnpSQjBMOXoKWlZjZytadG5lbVpvSkU2QVpiMFFtUVpaOG1XdnVNWkh1LzJRZUl0QmN5NnZWUi9jTzVKeWJvVFQwR0ZNRGN4MlYrSXRoU0lWTmczcgpBWjNyMk92RWhKbjd3QXpNTXVqamQ5cURSSXVlVlNqQWkxalRrRDVPR3dEeEZhMkRLNW89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhBUklDQSBUTFMgUlNBIFJvb3QgQ0EgMjAyMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwRENDQTR5Z0F3SUJBZ0lRT2NxVEhPOUQ4OGFPazhmMFpJazRmakFOQmdrcWhraUc5dzBCQVFzRkFEQnNNUXN3Q1FZRFZRUUcKRXdKSFVqRTNNRFVHQTFVRUNnd3VTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dQpjeUJEUVRFa01DSUdBMVVFQXd3YlNFRlNTVU5CSUZSTVV5QlNVMEVnVW05dmRDQkRRU0F5TURJeE1CNFhEVEl4TURJeE9URXdOVFV6Ck9Gb1hEVFExTURJeE16RXdOVFV6TjFvd2JERUxNQWtHQTFVRUJoTUNSMUl4TnpBMUJnTlZCQW9NTGtobGJHeGxibWxqSUVGallXUmwKYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EwRXhKREFpQmdOVkJBTU1HMGhCVWtsRFFTQlVURk1nVWxOQgpJRkp2YjNRZ1EwRWdNakF5TVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSXZDNTY5bG13Vm5sc2tOCkpMblFEbVQ4enVJa0dDeUVmM2RSeXdRUk5yaGU3V2x4cDU3a0pRbVhaOEZId3MrUkZqWmlQVGdFNFZHQy82elN0R25kTHV3Um8wWHUKYTJzN1RMK01qYVFlblJHNTZUajVlZzRNbU9JakhkRk9ZOVRudUVGRSsydXZhOW9mMDhXUmlGdWtpWkxSZ2VhTU9WaWcxbWxEcWEyWQpVbGh1MndyN2E4OW8rdU9rWGpwRmM1Z0g2bDhDY3Q0TXBiT2ZycWtkdHgyei9JcFo1MjV5WmEzMU1KUWpCL09DRmtzMW1KeFR1eS9LCjVGclp4NDBkL0ppWit5eWtnbXZ3S2grT0MxOXhYRnl1UW5zcGlZSExBNk9aeW9pZUMwQUpRVFBiNWxoNi9hNlpjTUJhRDlZVGhuRXYKZG1uOGtOM2JMVzdSOHB2MUdtdWVieFdNZXZCTEtLQWlPSUFrYkRha08vSXdrZk40RTgvQlB6V3I4UjBSSTdWRElwNEJrcmNZQXVVUgowWUxiRlFETVlUZkJLbnlhNGRDNnMxQkc3b0tzblRINCt5UGlBd0JJY0tNSkpua1ZVMkR6T0Z5dE9PcUJBR01VdVROZTNRdmJvRVVICkdqTUorRTIwcHdLbWFmVENXUVdJWllWV3Jrdkw0TjQ4ZlMwYXlPbjdINk5oU3RZcUU2MTNUQm9ZbTVFUFdOZ0dWTVdYK0tvL0lJcW0KaGFaMzlxYjhIT0x1YnBRektvTlFoQXJsVDRiNFVFVjRBSUhyVzJqakpvM01lMXhSOUJRc1FMNGFZQjE2Y21FZEgyTXRpS3JPb2tXUQpDUHhydnJOUUtscjlxRWdZUnRhUVFKS1FDb1JlYURINDYrME4weDNHZlprWVZWWW5aUzZOUmNVazdNN2pBZ01CQUFHalFqQkFNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkFwSUk2WmdwSklLTStxVFc4Vlg2aVZOdlJMdU1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFQcEJJcW01aUZTVm1ld3pWakl1Sm5kZnRUZ2Z2bk5BVVgxNVF2V2lXa0tRVQpFYXBvYlFrMU9VQUoydlFKTERTbGUxbUVTU21YZE1nSEhrZHQ4czRjVUNiam5qMUFVei8zZjVaMkVNVkdwZEFnUzFEME5Uc1k5RlZxClFSdEhCbWc4dXdrSVl0bGZWVUtxckZPRnJKVldObGFyNUFXTXhhamFINk5wdlZNUHhQL2N5dU4rOGt5SWhrZEdHdk1BOVlDUm90eEQKUXBTYklQRFJ6YkxyTEZQQ1UzaEtUd1NVUVpxUEp6TEI1VWtadi9IeXdvdW9Damt4S0xSOVlqWXNUZXdmTTdaK2QyMStVUENmRHRjUgpqODhZeGVNbi9pYnZCWjNQenpmRjBIdmFPN0FXaEF3Nms5YStGOXNQUGc0WmVBbkhxUUp5SWt2M04zYTZkY1NGQTFwajFiRjFCY0s1CnZaU3RqQldacDVOOTlzWHpxblRQQklXVW1BRDA0dm5LSkdXLzRHS3Z5TVg2c3NtZVZramFlZjJXZGhXK280NVd4TE0wL0w1SDlNRzAKcVB6Vk1JaG83c3V1eVdQRWRyNnNPQmpoWGx6UHJqb2lVZXZSaTdQekt6TUhWSWY2dExJVGU3cFRCR0lCbmZIQVQrN2hPdFNMSUJENgpBbGZtNzhFTHQ1QkduQmtwak54dm9FcHBhWlMzSkdXZy82dy96Z0g3SVM3OWFQaWI4cVhQTVRoY0Zhcm1sd0RCMzFxbHB6bXE2WVIvClBGR29PdG1VVzR5L1R3aHg1ZHVvWE5UU3B2NEFvOFlXeHcvb2dNNGNLR1IwR1FqVFF1UE9BRjEvc2R3VHNPRUZ5OUVncW9aMG5qbm4Ka2YzL1c5YjNyYVl2QXd0dDQxZFU2M1pUR0kwUm1Mbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1ZEQ0NBZHVnQXdJQkFnSVFaM1NkalhmWU8ycmJJdlQvV2VLL3pqQUtCZ2dxaGtqT1BRUURBekJzTVFzd0NRWURWUVFHRXdKSApVakUzTURVR0ExVUVDZ3d1U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEClFURWtNQ0lHQTFVRUF3d2JTRUZTU1VOQklGUk1VeUJGUTBNZ1VtOXZkQ0JEUVNBeU1ESXhNQjRYRFRJeE1ESXhPVEV4TURFeE1Gb1gKRFRRMU1ESXhNekV4TURFd09Wb3diREVMTUFrR0ExVUVCaE1DUjFJeE56QTFCZ05WQkFvTUxraGxiR3hsYm1saklFRmpZV1JsYldsagpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMEV4SkRBaUJnTlZCQU1NRzBoQlVrbERRU0JVVEZNZ1JVTkRJRkp2CmIzUWdRMEVnTWpBeU1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkRnSS9yR2dsdEo2cks5Sk90REE0TU03S0tyeGNtMWwKQUVlSWhQeWFKbXVxUzdwc0JBcUlYaGZ5VllmOE1MQTA0alJZVnhxRVUra3cyYW55bG5URFVSOVlTVEhNbUU1Z0VZZDEwM0tVa0UrYgpFQ1VxcUhndHZwQkJXSkFWY3FlaHQ2TkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVeVJ0VGdSTCtCTlVXCjBhcThtbSszb0pVWmJzb3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01CSGVydmpjVG9pd3FmQWkKcmNKUlFPOWdjUzN1andMRVhRTndTYVNTNnNVVWlIQ20wdzJ3cXNvc1FKejc2WUp1bWdJd0swZWFCOGJSd29GOHlndVdHRUViby9RdwpDWjYxSXlnTm54UzJQRk9pVEFacGZmcHNrY1lxU1VYbTdMY1Q0VHBzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJRzNEcDB2K3ViSEV3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DUlZNeFFqQkEKQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMgpNall6TkRBMk9EQWVGdzB4TkRBNU1qTXhOVEl5TURkYUZ3MHpOakExTURVeE5USXlNRGRhTUZFeEN6QUpCZ05WQkFZVEFrVlRNVUl3ClFBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2YmlCR2FYSnRZWEJ5YjJabGMybHZibUZzSUVOSlJpQkIKTmpJMk16UXdOamd3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERApVdGQ5dGhESUFsNnpReXJFVDJxeXloeGRLSnA0RVJwcFdWZXZ0U0JDNUlzUDV0OWJwZ09TTC9VUjVHTFhNbkU0MlFRTWNhczlVWDRQCkI5OWpCVnpwdjVSdndTbUN3TFRhVWJEQlBMdXROMHBjeXZGTE5nNGtxNy9EaEhmOXFGRDBzZWZHTDlJdFdZMTZDazZXYVZJQ3FqYVkKN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWlOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSApFQ05aWHlBRkdVZnRhSTZTRXNwZC9OWXJzcEk4SU0vaFg2OGd2cUIyZjNibDdCcUdZVE0rNTN1MFA2QVBqcUs1YW0rNWh5WnZRV3lJCnBsRDlhbU1MOVpNV0d4bVBzdTJibThtUTlRRU0zeGs5RHo0NEk4a3Zqd3pSQXY0YlZkWk8wSTA4cjArazgvNnZLdE1GblhrSW9jdFgKTWJTY3lKQ3laL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphRWJzWApMWm1kRXlSRzk4WGkySitPZjhlUGRHMWFzdWh5OWF6dUpCQ3RMeFRhL3kyYVJuRkh2a0xmdXdIYjlIL1RLSTh4V1Z2VHlRS210RkxLCmJwZjdROFVJSm0rSzlMdjlueWlxRGRWRjh4TTZIZGpBZUk5Qlp6d2VsR1N1ZXd2RjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1UKdnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQjBHQTFVZApEZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUJNSUdtQmdOVkhTQUVnWjR3Cmdac3dnWmdHQkZVZElBQXdnWTh3THdZSUt3WUJCUVVIQWdFV0kyaDBkSEE2THk5M2QzY3VabWx5YldGd2NtOW1aWE5wYjI1aGJDNWoKYjIwdlkzQnpNRndHQ0NzR0FRVUZCd0lDTUZBZVRnQlFBR0VBY3dCbEFHOEFJQUJrQUdVQUlBQnNBR0VBSUFCQ0FHOEFiZ0JoQUc0QQpid0IyQUdFQUlBQTBBRGNBSUFCQ0FHRUFjZ0JqQUdVQWJBQnZBRzRBWVFBZ0FEQUFPQUF3QURFQU56QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFNIS0FJcmR4OW1pV1R0ajNRdVJoeTdxUGo0Q3gyRHRqcW42RVdLQjdmZ1BpREwKNFFqYkV3ajRLS0Uxc29DekMxSEEwMWFhalRORlNhOUo4T0E5QjNwRkUxci95SmZZMHhnc2ZaYjQzYUpsUTNDVGtCVzZrTi9vR2JEYgpMSXBnRDdkdmxBY2VIYWJKaGZhOU5QaEFlR0lRY0RxK2ZVczVnYWtRMUpaQnUvaGZIQXNkQ1BLeHNJbDY4dmVnNE1TUGkzaTFPMWlsCkk0NVBWZjQyTytBTXQ4b3FNRUVndElETnJ2eDJabk9vcm03aGZOb0Q2SlFnNWlLajBCK1FYU0JURkNaWDJsU1gzeFpFRUFFZWlHYVAKY2ppVDNTQzNOTDdYOGU1amprZDVLQWI4ODFsRkpXQWlNeHVqWDZpNkt0b2FQYzFBNm96dUJSV1YxYVVzSUMrbm1DanVSZnp4dUlnQQpMSTlDMmxIVm5PVVRhSEZGUTR1ZUN5RThTMXdGM0JxZm1JN2F2U0tlY3MydENzdk1vMmViS0hURW05Y2FQQVJZcG9LZHJjZDdiLytBCmx1bjRqV3E5R0pBZC8wa2FrRkkza3k4OEFsMkNkZ3RSNXhiSFYvZzQrYWZObXlKVTcyT3dGVzFUWlFOS1hrcWdzcWVPU1FCWk9OWEgKOUlCazlXNlZVTGdSZmhWd09FcXdmOURFTW5EQUdmL0pPQzBVTEdiMFFrVG1WWFliZ0JWWC84Q25wNm81cXRqVGNOQXV1dXVVYXZwZgpOSWJuWXJYOWl2QXdoWlRKcnlRQ0wyL1czV2YrNDdCVlR3U1lUNlJCVnVLVDBHcm8xdlA3WmVET2RjUXhXUXp1Z3NnTVlETktHYnFFClp5Y1B2RUpkdlNSVURld2RjQVpmcEx6NklIeFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdlRydXMgRUNDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNEekNDQVpXZ0F3SUJBZ0lVYm1xOFdhcFR2cGc1WjZMU2E2UTc1bTBjMXRvd0NnWUlLb1pJemowRUF3TXdSekVMTUFrR0ExVUUKQmhNQ1EwNHhIREFhQmdOVkJBb1RFMmxVY25WelEyaHBibUVnUTI4dUxFeDBaQzR4R2pBWUJnTlZCQU1URVhaVWNuVnpJRVZEUXlCUwpiMjkwSUVOQk1CNFhEVEU0TURjek1UQTNNalkwTkZvWERUUXpNRGN6TVRBM01qWTBORm93UnpFTE1Ba0dBMVVFQmhNQ1EwNHhIREFhCkJnTlZCQW9URTJsVWNuVnpRMmhwYm1FZ1EyOHVMRXgwWkM0eEdqQVlCZ05WQkFNVEVYWlVjblZ6SUVWRFF5QlNiMjkwSUVOQk1IWXcKRUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVpWQktyb3g1bGtxcUhBakRvNkxOL2xsV1FYZjlKcFJDdXgzTkNOdHpzbHQxODgrYwpUb0wwdi9oaEpvVnMxb1ZiY25EUy9kdGl0TjlUaTcyeFJGaGlRZ25IK245YkVPZitRUDNBMk1Nck11ZHdwcmVtSUZVZGU0QmRTNDluClRQRVFvMEl3UURBZEJnTlZIUTRFRmdRVW1Ebk52dGl5alBleXErR3RKSzk3ZktIYkg4OHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdWNTNkVnZISDQrbTRTVkJybTJuRGIrekRmU1hrVjVVVApRSnRTMHp2elFCbThKc2N0QnA2MWV6YWY5U1hVWTJzQUFqRUE2ZFBHbmxhYUtzeWgyai9JWml2VFdKd2doZnFya1lwd2NCRTRZR1FMCllnbVJXQUQ1VGZzMGFOb0pyU0VHR0pUTwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgp2VHJ1cyBSb290IENBCj09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWakNDQXo2Z0F3SUJBZ0lVUStOeEU5aXpXUlJkdDg2TS9UWDliN3dGalVVd0RRWUpLb1pJaHZjTkFRRUxCUUF3UXpFTE1Ba0cKQTFVRUJoTUNRMDR4SERBYUJnTlZCQW9URTJsVWNuVnpRMmhwYm1FZ1EyOHVMRXgwWkM0eEZqQVVCZ05WQkFNVERYWlVjblZ6SUZKdgpiM1FnUTBFd0hoY05NVGd3TnpNeE1EY3lOREExV2hjTk5ETXdOek14TURjeU5EQTFXakJETVFzd0NRWURWUVFHRXdKRFRqRWNNQm9HCkExVUVDaE1UYVZSeWRYTkRhR2x1WVNCRGJ5NHNUSFJrTGpFV01CUUdBMVVFQXhNTmRsUnlkWE1nVW05dmRDQkRRVENDQWlJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDFWZkdIVHVCMEVZZ1dncm15M2NMUkI2a3NEWGhBL2tGb2NpenV3Wm90cwpTS1ljSXJyVlFKTHVNN0lqV2NtT3ZGamFpNTdRR2ZJdldjYU1ZMXE2bjZNTHNMT2FYTG9SdUJMcERMdlBibXlBaHlrVUF5eU5KSnJJClpJTzFhcXdUTERQeG45d3NZVHdhUDNCVm02MEFVbi9QQkxuK052cWN3QmF1WXY2V1RFTitWUlMrR3JQU2JjS3ZkbWFWYXlxd2xIZUYKWGdRUFloMWpkZmRyNTh0Ym1uRHNQbWNGOFA0SENJRFBLTnNGeGhRbkw0Wjk4Q2ZlLytaK00wam5DeDVZMFNjclV3NVhTbVhYKzZLQQpZUHhNdkRWVEFXcVhjb0t2OFIxdzZKejE3MTdDYk1kSGZscVVoU1pOTzdyclRPaXdDY0psd3AyZENadE90WmNGclBVR29QYzJCWDcwCmtMSnJ4TFQ1Wk9ycEdncklEYWp0SjhuVTU3TzVxNElpa0NjOUt1aDhrTys4VC8zaUNpU24zbVVrcEYzcXdIWXcwM2RRK0EwRW01UTIKQVhQS0JsaW0wenZjK2dSR0UxV0t5VVJIdUZFNUdpN29OT0o1eTFsS0NuKzhwdThmQTJkcVdTc2xZcFBaVXhsbVBDZGlLWVpOcEd2dQovOVJPdXRXMDRvNUlXZ0FaQ2ZFRjJjNlJzZmZyNlRsUDltOEVRNXBWOVQ0RkZMMi9zMW0wMkk0emhLT1FVcXF6QXBWZytReE1hUG51CjFSY04rSEZYdFNYa0tlNWxYYS9SN2p3WEMxcER4YVdHNmlTZTRnVUgzRFJDRXBIV09YU3VURUdDMi9LbVNOR3ptL016cXZPbXdNVk8KOWZTZGRtUG1Bc1lpUzhHVlAxQmtMRlRsdHZBOEtjOVhBZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlJVWW5CajhYV0VRMWlPMFJZZwpzY2FzR3J6MmlUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DCkFnRUFLYnFTU2FldDhQRnd3K1NYOEorcEpkVnJualQrNWhwazlqcHJVcklRZUJxZlROcUsydXdjTjFMZ1FrdjdiSGJLSkFzNUVoV2QKbnhFdC9IbGszT0RnOWQzZ1Y4bWxzblp3VUtUK3R3cHcxYUEwOFhYWFRVbTZFZEd6Mk95Qy8rc094TDlrTFgxamJoZDQ3RjE4aU1qcgpqbGQyMlZrRStyeFNIMFdzOEhxQTdPeHZkcTZSMnhDT0JOeVMzNkQyNXE1SjA4RnNFaHZNS2FyNUNLWGlOeFRLc2JobTd4cUM1UEQ0CjhhY1dhYmZicVdFOG4vVXh5K1FBUnNJdmRMR3gxNEh1cUNhVnZJaXZURFVIS2dMS2VCUnRSeXRBVnVuTEttQ2had09nem95OHNISm4KeERITzJ6VGxKUU5nSlh0eG1PVEFHeXRmZEVMU1M4VlpDQWVIdnNYRGYrZVcyZUhjS0pmV2p3WGo5WnRPeWgxUVJ3VlRzTW81NTRXZwppY0VGT3dFMzB6OUo0bmZySThpSVpqczlPWFloUnZIc1h5TzQ2NkptZFhUQlFQZllhSnFUNGkycExyMGNveDdJZE1ha0xYb2dxenU0CnNFYjliOTFmVWxWMVl2Q1hvSHpYT1AwbDM4MmdteERQaTdnNFhsN0Z0S1lDTnFFZVh4elA0cGFkS2FyOW1LNVM0Zk5CVXZ1cExuS1cKbnlmanFuTjkrQm9qWm5zN3EyV3dNZ0ZMRlQ0OW9rOE1LeldpeHRsbkVqVXd6WFl1RnJPWm5rMVBUaTA3TkVQaG1nNE5wR2FYdXRJYwpTa3dzS291TGdVOXhHcW5kWEh0N0NNVUFEVGRBNDN4N1ZGOHZoVjkyOXZlbnNCeFhWc0Z5NksyaXI0MHpTYm9maXR6bWRIeGdobStICmwzcz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSVNSRyBSb290IFgyCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0d6Q0NBYUdnQXdJQkFnSVFRZEtkMFhMcTdxZUF3U3hzNlMrSFVqQUtCZ2dxaGtqT1BRUURBekJQTVFzd0NRWURWUVFHRXdKVgpVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnVaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUClVrY2dVbTl2ZENCWU1qQWVGdzB5TURBNU1EUXdNREF3TURCYUZ3MDBNREE1TVRjeE5qQXdNREJhTUU4eEN6QUpCZ05WQkFZVEFsVlQKTVNrd0p3WURWUVFLRXlCSmJuUmxjbTVsZENCVFpXTjFjbWwwZVNCU1pYTmxZWEpqYUNCSGNtOTFjREVWTUJNR0ExVUVBeE1NU1ZOUwpSeUJTYjI5MElGZ3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRXpadlZuNENEQ3V3SlN2TVdTajVjejNlczNtY0ZEUjBICnR0d1crMXFMRk52aWNXREV1a1dWRVltTzZnYmY5eW9XSEtTNXhjVXk0QVBnSG9JWU9JdlhSZGdLYW03bUFIZjdBbEY5SXRnS2JwcGIKZDkvdytrSHNPZHgxeW1nSERCL3FvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVgpIUTRFRmdRVWZFS1dydDVMU0R2Nmt2aWVqTTl0aTZseU41VXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdlM2xPUmxDRXdrU0hSaHRGCmNQOVltZDcwL2FUU1ZhWWdMWFRXTkx4Qm8xQmZBU2RXdEw0bmRRYXZFaTUxbUkzOEFqRUFpL1YzYk5USVphcmdDeXp1Rkowbk42VDUKVTZWUjVDbUQxL2lRTVZ0Q253cjEvcTRBYU9lTVNRKzJiMXRiRmZMbgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIaVBLSSBSb290IENBIC0gRzEKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYWpDQ0ExS2dBd0lCQWdJUUxkMnN6bUtYbEtGRDZMRE5kbXBlWURBTkJna3Foa2lHOXcwQkFRc0ZBREJQTVFzd0NRWURWUVFHCkV3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDBaQzR4R3pBWkJnTlZCQU1NRWtocFVFdEoKSUZKdmIzUWdRMEVnTFNCSE1UQWVGdzB4T1RBeU1qSXdPVFEyTURSYUZ3MHpOekV5TXpFeE5UVTVOVGxhTUU4eEN6QUpCZ05WQkFZVApBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFYk1Ca0dBMVVFQXd3U1NHbFFTMGtnClVtOXZkQ0JEUVNBdElFY3hNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTlCNS9Vbk15REhQa3ZSTjAKbzlRd3FOQ3VTOWkyMzNWSFp2Ujg1emtFSG1wd0lOSmFSM0puVmZTbDZKM1ZIaUdoOEdlNnpDRm92a1JUdjQzNTR0d3ZWY2czUHgrawp3Snl6NUhkY29FYitkL29hb0RqcTdacHkzaXU5bEZjNnV1eDU1MTk5UW1RNWVpWTI5eVR3MVMrNmxaZ1JacTJYTmRaMUFZRGdyL1NFCllZd05IbDk4aDVaZVFhL3JoK3I0WGZFdWlBVStUQ0s3Mmg4cTNWSkdaRG56UXM3Wm5neXpzSGVYWkp6QTlLTXVINVVIc0JmZk1Oc0EKR0paTW9ZRkwzUVJ0VTZNOS9BZXMxTVUzZ3V2a2xRZ1pLSUxTUWpxajJGUHNlWWxnU0dESWNwSlEzQU9QZ3oreVFsZGEyMnJwRVpmZApoU2k4TUV5cjQ4S3hSVVJISCtDS0ZnZVcwaUVQVThEdHFYN1VUdXliQ2V5dlFxd3cxci9SRUVYZ3BoYXlwY1hUVDNPVU0zRUNvV3FqCjFqT1hUeUZqSGx1UDJjRmVSWEYzRDRGZFh5R2FyWVBNK2w3V2pTTmZHejFCcnlCMVpscEs5cC83cXhqM2NjQzJIVEhzT3lEcnkrSzQKOWE2U3N2ZmhoRXZ5b3ZLVG1pS2UweFJ2TmxTOUgxNVpGYmx6cU1GOGIzdGk2UlpzUjFwbDh3NFJtMGJaL1czYzFwekF0SDJsc04wLwpWbStoK2Zia0VrajlCbjhTVjdhcEkwOWJBOFBnY1NvanQvZXdzVHU4bUwzV21LZ01hL2FPRW1lbThySlk1QUlKRXp5cHV4QzAwakJGCjhlejNBQkhmWmZqY0swTlZ2eGFYeEEvVkxHR0VxbktHL3VZNmZzSS9mZTc4THhRKzVvWGRVRyszU2UwQ0F3RUFBYU5DTUVBd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU4bmNYK2w2by92WTljZFZvdXNsR0REallyN0F3RGdZRFZSMFBBUUgvQkFRRApBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCUVVmQjEzSEFFNC8rcWRkUnhvc3VlajZpcDA2OTF4MVRQT2h3RW1TS3N4QkhpCjd6TktwaU1kRGcxSDJEZkhiNjgwZjArQmF6VlA2WEtsTWVKNDUvZE9sQmhiUUgzUGF5RlVodWFWZXZ2R3l1cWNTRTVYQ1YwdnJQU2wKdEpjeldOV3NlYW5NWC9tRitsTEZqZmlSRk9zNkRSZlFVc0o3NDhKemprWjRCamdzNkZ6YVpzVDBwUEJXR1RNcFdtV1NCVWRHU3F1RQp3eDRub1I4Umtwa25kWk1QdkRZN2wxZVBKbHNNdTV3UDFHNHdCOVRjWHpab1pqbURsaWNtaXNqRU9mNmFJVy9WY29icGYyTGxsMDdRCkpOQkFzTkIxQ0k2OWFPNEkxMjU4RUhCR0czemdpTEtlY29hWkFlTy9uMGtadENXK1ZtV3VGMlBsSHQvby8wZWx2K0VtQllUa3NNQ3YKNXdpWnFBeGVKb0JGMVBob0w1YVBydUpLSEp3V0RCTnZPSWYydThnMFg1SURVWGx3cHQvTDlabE5lYzFPdkZlZlEwNXJMaXNZK0dwegpqTHJGTmU4NWFrRWV6M0dvb3JLR0IxczZ5ZUh2UDJVRWdFY3lSSENWVGpGbmFuUmJFRVYxNnJDZjBPWTEvazZmaTh3cmtrVmJiaVZnCmhVYk4wYXF3ZG1hVGQ1YStnNzQ0dGlST0pndk03WHBXR3VEcFdzWmtyVXg2QUVoRUw3bEF1eE0rdmhWNG5ZV0JTaXBYM3RVWlE5cmIKeWx0SGhvTUxQN1lOZG5oemVTSmVzWUFmejc3UlAxWVFtQ3VWaDZFZm5XUVVZRGtzc3dCVkx1VDFzdzVYeEpGQkFKdy82S1hmNnZiLwp5UEN0YlZLb0Y2dWJZZndTVVRYa0pmMnZxbXFHT1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCM0RDQ0FZT2dBd0lCQWdJTkFnUGxmdlUvay8ybENTR3lwakFLQmdncWhrak9QUVFEQWpCUU1TUXdJZ1lEVlFRTEV4dEhiRzlpCllXeFRhV2R1SUVWRFF5QlNiMjkwSUVOQklDMGdValF4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHMKYjJKaGJGTnBaMjR3SGhjTk1USXhNVEV6TURBd01EQXdXaGNOTXpnd01URTVNRE14TkRBM1dqQlFNU1F3SWdZRFZRUUxFeHRIYkc5aQpZV3hUYVdkdUlFVkRReUJTYjI5MElFTkJJQzBnVWpReEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzCmIySmhiRk5wWjI0d1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTNHhublRqMndsRHA4dU9Sa2NBNlN1bXVVNUJ3a1cKeW1PeHVZYjRpbGZCVjg1QytuT2g5MlZDL3g3QkFMSnVjdzcveHlIbEdLU3EyWEUvcU5TNXpvd2RvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVZMQjdyVVc0NGtCLyt3cHUrNzR6eVR5amhOVXdDZ1lJCktvWkl6ajBFQXdJRFJ3QXdSQUlnSWs5MGNybGdyL0htbktBV0JWQmZ3MTQ3Ym1GMDc3NEJ4TDRZU0ZsaGdqSUNJQ2FkVkdOQTNqZGcKVU0vSTJPMmRncTQzbUx5amoweE1xVFFyYk8vN2xac20KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjEKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWekNDQXorZ0F3SUJBZ0lOQWdQbGsyOHhzQk5KaUd1aUZ6QU5CZ2txaGtpRzl3MEJBUXdGQURCSE1Rc3dDUVlEVlFRR0V3SlYKVXpFaU1DQUdBMVVFQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZwpVakV3SGhjTk1UWXdOakl5TURBd01EQXdXaGNOTXpZd05qSXlNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFaU1DQUdBMVVFCkNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVakV3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMyRVFLTEh1T2hkNXM3M0wrVVByZVZwMEE4b2YyQytYMHlCb0p4OXZhTQpmL3ZvMjd4cUxwZVhvNHhMK1N2MnNmbk9oQjJ4K2NXWDN1KzU4cVBwdkJLSlhxZXFVcXY0SXlmTHBMR2NZOXZYbVg3d0NsN3JhS2IwCnhscEhEVTBRTStOT3NST2p5QmhzUyt6OENaRGZuV1FwSlNNSG9iVFNQUzVnNE0vU0NZZTd6VWp3VGNMQ2VvaUt1N3JQV1JuV3I0K3cKQjdDZU1mR0N3Y0RmTHFadGJCa090ZGgrSmhwRkF6MndlYVNVS0swUGZ5YmxxQWorbHVnOGFKUlQ3b002aUNzVmxnbXk0SHFNTG5YVwpuT3VuVm1TUGxrOW9yajJYd29TUHdMeEF3QXRjdmZhSHN6VnNyQmhRZjRUZ1RNMlMweURwTTd4U21hOHl0U216SlNxMFNQbHk0Y3BrCjkrYUNFSTNvbmNLS2lQbzRab3I4WS9rQitYajllMXgzK25hSCt1emZzUTU1bFZlMHZTYnYxZ0hSNnhZS3U0NEx0Y1hGaWxXcjA2enEKa1VzcHpCbWtNaVZPS3ZGbFJOQUN6cXJPU2JUcW4zeURzRUI3NTBPcnAyeWpqMzJKZ2ZwTXBmL1Zqc1BPUytDMTJMT09SYzkyd08xQQpLLzFURDdDbjFUc05zWXFpQTk0eHJjeDM2bTk3UHRiZmtTSVM1cjc2MkRMOEVHTVVVWExlWGRZV2s3MHBhRFB2T21ic0I0b20zeFBYClYyVjRKOTVlU1JRQW9nQi9tcWdodHFteGxiQ2x1UTBXRWRySGJFZzhRT0IrRFZyTlZqelJsd1c1eTB2dE9VdWN4RC9TVlJOdUpMRFcKY2ZyMHdick03UnYxL29GQjJBQ1lQVHJJcm5xWU54Z0ZsUUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNUs4ckpuRWFLMGduaFM5U1ppenY4SWtUY1Q0d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBSitxUWliYkM1dSsveDZXa2k0K29tVkthcGk2SXN0OXdUcllnZ29HeHZhbDNzQk9oMlo1b2ZtbVdKeXErYlhtWU9mZzZMRWUKUWtFekN6Yzl6b2x3RmNxMUpLalBhN1hTUUNHWXp5STB6enZGSW9UZ3hRNktmRjJJNURVa3pwcytHbFFlYnR1eWg2Zjg4L3FCVlJSaQpDbG1wSWdVeFBvTFc3dHRYTkx3emxkTVhHK2dub290N1RpWWFlbHBrdHRHc04vSDlvUE00N0hMd0VYV2R5elJTamVaMmF4ZkczNGFyCko0NUpLM1ZtZ1JBaHB1bys5SzRsLzN3VjNzNk1KVC9LWW5BSzl5OEpaZ2ZJUHh6ODhOdEZNTjlpaU1HMUQ1M0RuMHJlV1ZsSHhZY2kKTnVhQ3ArMEt1ZUlIb0kxN2VrbzhjZExpQTZFZk1nZmRHK1JDemd3QVJXR0F0UXNnV1NsNHZmbFZ5MlBGUEV6MHR2L2JhbDh4YTVtZQpMTUZyVUtUWDVoZ1V2WVUvWjZ0R242RC9RcWM2ZjF6TFhiQndIU3MwOWRSMkNRenJlRXhaQmZNelFzTmhGUkFiZDAzT0lvelVoZkpGCmZiZFQ2dTlBV3BRS1hDQmZUa0JkWWlKMjMvL09ZYjJNSTNqU053TGdqdDdSRVRlSjlyL3RTUWRpcnBMc1FCcXZGQW5aMEU2eW92ZSsKN3U3WS85d2FMZDY0Tm5IaS9IbTNsQ1hSU0hOYm9UWG5zNWxuZGNFWk9pdEhUdE5DanYweHlCWm0ydElNUE51empzbWhEWUFQZXhaMwpGTC8vMndtVXNwTzhJRmdWNmR0eFEvUGVFTU1BM0tncWxiYkMxaitRYTNiYmJQNk12UEp3TlF6Y21SazEzTmZJUm1QVk5uR3VWL3UzCmdtM2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjIKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWekNDQXorZ0F3SUJBZ0lOQWdQbHJzV05CQ1VhcXhFbHFqQU5CZ2txaGtpRzl3MEJBUXdGQURCSE1Rc3dDUVlEVlFRR0V3SlYKVXpFaU1DQUdBMVVFQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZwpVakl3SGhjTk1UWXdOakl5TURBd01EQXdXaGNOTXpZd05qSXlNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFaU1DQUdBMVVFCkNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVakl3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURPM3YybSsrenNGRFE4QndaYWJGbjNHVFhkOThHZFZhclR6VHVrazNMdgpDdnB0bmZid2hZQmJvVWhTbnpuRnQrNG9yTy9MZG1nVXVkK3RBV3laSDhRaUhaLytjbmZnTEZ1djVBUy9UM0tnR2pTWTZEbG83SlVsCmUzYWg1bW01aFJtOWlZeityZTAyNm5POC80UGl5MzNCMHM1S3M0MEZub3RKazkvQlc5QnVYdkF1TUM2Qy9QcTh0QmNLU09XSW04V2IKYTk2d3lyUUQ4TnIwa0xobFpQZGNUSzNvZm1aZW1kZTR3ajdJMEJPZHJlN2tSWHVKVmZlS0gySlNoQkt6d2tDWDQ0b2ZSNUdtZEZyUworTEZqS0JDNHN3bTRWbmRBb2lhWWVjYiszeVh1UHVXZ2Y5UmhEMUZMUEQrTTJ1RndkTmpDYUtINXdRenBvZUovdTFVOGRnYnVhazdNCmtvZ3dUWnE5VHd0SW1vUzFtS1BWKzNQQlYySGRLRloxRTY2SGp1Y01VUWtRZFloTXZJMzVlenpVSWtnZkt0enJhN3RFc2NzemNUSkcKcjYxSzhZem9kRHFzNXhvaWM0RFNNUGNsUXNjaU96c1NyWll1eHNOMkI2b2d0elZKVittU1NlaDJGbkl4Wnl1V2ZvcWp4NVJXSXI5cQpTMzRCSWJJak10L2tta1J0V1Z0ZDlRQ2dISnZHZUplTmtQK2J5S3EwcnhGUk9WN1orMmV0MVZzUm5US2FHNzNWdWx1bHljc2xhVk5WCkoxemd5amJMaUdIN0hyZlF5KzRXKzlPbVRONlNwZFRpMy9VR1ZONHVuVXUwa3pDcWdjN2RHdHhSY3cxUGNPbmx0aFloR1hteTVva0wKZFdUSzFhdThDY0VZb2YvVVZLR0ZQUDBVSkFPeWg5T2t0d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVdS8vS2ppT2ZUNW5LMitKb3BxVVZKeGNlMlE0d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBQi9LenQzSHZxR2YyU2RNQzl3WG1CRnFpTjQ5NW5GV2NyS2VHazZjMVN1WUpGMmJhM3V3TTRJSnZkOGxSdXFZbnJZYi9vTTgKMG1KaHdRVHR6dURGeWNnVEUxWG5xR090akhzQi9uY3c0YzVvbXdYNEV1NTVNYUJCUlRVb0NuR2tKRStNM0R5Q0IxOW0zSDBRL2d4aApzd1dWN3VHdWdRK28rTWVQVGFnakFpWnJIWU5TVmM2MUx3REtnRURnNFhTc1lQV0hnSjJ1Tm1TUlhiQm9HT3FLWWNsM3FKZkV5Y2VsCi9GVkw4L0IvdVdVOUoyalF6R3Y2VTUzaGtSckpYUnFXYlRLSDdRTWd5QUxPV3I3WjZ2MnlUY1F2Rzk5ZmV2WDRpOGJ1TVRvbFVWVm4KaldReWUrbWV3NEs2S2kzcEhyVGdTQWFpL0dldkh5SUNjL3NnQ3ErZFZFdWh6ZjlnUjdBL1hlOGJWcjJYSVpZdEN0RmVuVGdDUjJ5NQo5UFlqSmJpZ2Fwb3Jkd2o2eExFb2tDWllDRHppZnFyWFBXKzZNWWdLQmVzbnRhRko3cUJGVkh2bUoyV1pJQ0dvbzd6N0dKYTdVbThNCjdZTlJUT2xaNGlCZ3hjSmxrb0tNOHhBZkRvcVh2bmVDYlQrUEhWMjhTU2U5ekU4UDRjNTJoZ1FqeGNDTUVsdjkyNFNnSlBGSS8yUjgKMEw1Y0Z0SHZtYTNBSC92THJydzRJZ1ltWk5yYWx3NC9LQlZFcUU4QXl2Q2F6TTkwYXJRK1BPdVY3TFhUV3RpQm1lbERHRGZyczd2UgpXR0pCODJiU2o2cDRsVlFndzFvdWRDdlYwYjRZYWNDczFhVFBPYnBSaEFObDZXTEFZdjdZVFZXVzR0QVIra2cwRWV5ZTdRVWQ1TWpXCkhZYkwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjMKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDVENDQVk2Z0F3SUJBZ0lOQWdQbHVJTHJJUGdsSjIwOVpqQUtCZ2dxaGtqT1BRUURBekJITVFzd0NRWURWUVFHRXdKVlV6RWkKTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpNdwpIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUVDaE1aClIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqTXdkakFRQmdjcWhrak8KUFFJQkJnVXJnUVFBSWdOaUFBUWZUek9ITXltS29ZVGV5OGNoV0VHSjZsYWRLMHVGeGgxTUo3eC9KbEZ5YitLZjFxUEt6RVVVUm91dAo3MzZHak95eGZpLy9xWEdkR0lSRkJFRlZiaXZxSm4rN2tBSGpTeG02NUZTV1JRbXgxV3lSUksyRUU0NmFqQTJBRERMMjRDZWpRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQjhTYTZvQzJ1aFlIUDAvRXEKRXIyNENtZjl2REFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBOXVFZ2xSUjdWS09RRmhHL2hNanFiMnNYbmg1R21DQ2JuOU1OMmF6VApMODE4K0ZzdVZidS8zWkwzcEF6Y01lR2lBakVBL0pkbVp1VkRGaE9EM2NmZkw3NFVPTzBCenJFWEdoRjE2YjBEanlaK2hPWEpZS2FWCjExUlp0K2NSTEluVXVlNFgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjQKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDVENDQVk2Z0F3SUJBZ0lOQWdQbHdHanZZeHFjY3BCUVVqQUtCZ2dxaGtqT1BRUURBekJITVFzd0NRWURWUVFHRXdKVlV6RWkKTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpRdwpIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUVDaE1aClIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqUXdkakFRQmdjcWhrak8KUFFJQkJnVXJnUVFBSWdOaUFBVHpkSE9uYUl0Z3JrTzROY1dCTUh0TFNaMzd3V0hPNXQ1R3ZXdlZZUmcxcmtEZGMvZUprVEJhNnp6dQpoWHlpUUhZN3FjYTRSOWdxNTVLUmFuUHBzWEk1bnltZm9walRYMTVZaG1VUG9ZUmxCdEhjaThuSGM4aU1haS9seEt2UkhZcWpRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTQVROYnJkUDlKTnFQVjJQeTEKUHNWcThKUWRqREFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBNkVEL2c5NEQ5Sit1SFhxbkxybXZUL2FESFE0dGhRRWQwZGxxN0EvQwpyOGRlVmw1YzFSeFlJaWdMOXpDMkw3RjhBakVBOEdFOHAvU2dndU1oMVlRZGM0YWNMYS9LTkp2eG43a2pOdUs4WUFPZGdMT2FWc2poCjRyc1VlY3JOSWRTVXRVbEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGVsaWEgUm9vdCBDQSB2Mgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJUEFXZGZKOWIrZXVQa3JMNEpXd1dlTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVF4Q3pBSkJnTlZCQVlUCkFrWkpNUm93R0FZRFZRUUtEQkZVWld4cFlTQkdhVzVzWVc1a0lFOTVhakVaTUJjR0ExVUVBd3dRVkdWc2FXRWdVbTl2ZENCRFFTQjIKTWpBZUZ3MHhPREV4TWpreE1UVTFOVFJhRncwME16RXhNamt4TVRVMU5UUmFNRVF4Q3pBSkJnTlZCQVlUQWtaSk1Sb3dHQVlEVlFRSwpEQkZVWld4cFlTQkdhVzVzWVc1a0lFOTVhakVaTUJjR0ExVUVBd3dRVkdWc2FXRWdVbTl2ZENCRFFTQjJNakNDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTExRUHdlODRudlFhNW40NG5kcDU4NmRwQU84Z20yaC9vRmxIMHduckk0QXVoWjcKNnpCcUFNQ3pkR2grc3EvSDFXS3plajlReW93MlJDUmowamJwRElYMlEzYlZUS0ZnY21maUtET2x5ekc0T2lJak5MaDl2VllpUUozcQo5SHNEcldqOHNvRlBtTkIwNm8zbGZjMWp3NlAyM3BMQ1dCbmdscnZGeEtrOXBYU1cvcS81aWFxOWxSZFUySGhFOFF4M0ZaTGdtRUtuCnBOYXFJSkxOd2FDemxySTZoRUtOZmRXVjVOYmI2V0xFV0xONXhZelROVE9EbjNXaFVpZGhPUEZaUFk1UTRMMTVQT2RzbHY1ZTJRSmwKdEk1YzBCRTAzMTIvVXFlQkFNTi9tVVdaRmRVWHlBcFQ3R1B6bVgzTWFSS0d3aGZ3QVo2L2hMelJVc3Nia21iT3BGUGxvYi9FMnduVwo1b2xXSzhqamZON2ovNG5sTlc0bzZHd0xJMUdwSlFYclNQamRzY3I2YkFoUjc3Y1liRVRLSnVGenhva0dnZVdLckxEaUtjYTVKTE5yClJCSDBwVVBDVEVQbGNEYU10ak5YZXBVdWdxRDBYQkN6WVlQMkFnV0dMbnd0Yk53RFJtNDFrOVY2bFMvZUlOaGJmcFNRQkdxNldUMEUKQlhXZE42SU9MajNyd2FSU2cvN1FhOVJtanR6RzZSSk9IU3BYcWhDOGZGNkNmYWFteWZJdHVmVVhKNjNSRG9sVUs1WDZ3SzBkbUJSNApNMEtHQ3FsenRmdDBEYmNiTUJuRVdnNGNKN2ZhR05EL2lzZ0Z1dkdxSEtJM3QrWklwRVlzbE9xb2RtSkhpeEJUQjBoWGJPS1NUYmF1CkJjdmN3VXBlajZ3OUdVN0M3V0IxSzl2QnlrTFZBZ01CQUFHall6QmhNQjhHQTFVZEl3UVlNQmFBRkhLczVETjVxa1dIOXYyc0haN1cKeHkrRzJDUTVNQjBHQTFVZERnUVdCQlJ5ck9RemVhcEZoL2I5ckIyZTFzY3ZodGdrT1RBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQW9EdFpwd21VUGphRTBuNHZPYVdXbC9vUnJmeG44M0VKCjhyS0poR2RFcjdudjdaYnNuR1RiTWpCdlo1cXNmbCt5cXdFMmZvSDY1SVJlMHF3MjRHdGl4WDFMRG9KdDBuWmkwZjZYK0o4d2ZCajUKdEZKM2doMTIyOU1kcWZEQm1nQzliWFhZZmVmNnh6aWpuSERvUm5rRHJ5NTAyM1g0YmxNTUE4aVpHb2sxR1R6VHlWUjhxUEFzNW00SAplVzlxNGVicWtZSnBDaDNEZmxtaW5tdEdGWmhiMDY5R0hXTEl6b0JTU1JFL3lRUVN3eE44UHp1S2x0czhvQjRLdEl0VXNpUm5EZStDCnk3NDhmZEhpZjY0VzFsWll1ZG9nc1lNVm9lK0tUVEp2UVM4VFVvS1UxeHJCZUtKUjNTdHdiYmNhK2ZldzRHZVhWdHQ4WVZNSkF5Z0MKUU1lejJQMmNjR3JHS01PRjZlTHRHcE9nM2t1WW9vUStCWGNCbGozN3RDQVBuSElDZWhJdjFhTzZVWGl2S2l0RVpVNjEvUXJvd2MxNQpoMkVyM29CWFJiOW44WnVSWHFXazdGbElFQTA0eDdENncwUnRCUFY0VUJ5U2xsdmE5Ymd1dWx2UDVmQnFuVXN2V0hNdFR5M0VIRDcwCnN6K3JGUTQ3R1VHS3BNRlhFbVp4VFBwVDQxZnJZcFVKbmxUZDBjSThWenk5T0syWVpMZTRBNXBUVm1CZHM5aENHMXhMRW9vYzYrdDkKeG5wcHh5ZC9wUGlMOHVTVVpvZEw2WlFIQ1JKNWlyTHJkQVRjenZSRVdlQVd5c1VzV05jOGU4OWlobXBRZlRVMlpxZjdOK2NveDlqUQpyYVZwbEkvb3dkOGsrQnNITVllQjJGMzI2Q2pZU2xLQXJCUHVVQlFlbU1jPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIEJSIFJvb3QgQ0EgMSAyMDIwCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMyekNDQW1DZ0F3SUJBZ0lRZk1tUEs0VFgzK29QeVdXYTAwdE5sakFLQmdncWhrak9QUVFEQXpCSU1Rc3dDUVlEVlFRR0V3SkUKUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRUpTSUZKdmIzUWdRMEVnTVNBeQpNREl3TUI0WERUSXdNREl4TVRBNU5EVXdNRm9YRFRNMU1ESXhNVEE1TkRRMU9Wb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVRCZ05WCkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCQ1VpQlNiMjkwSUVOQklERWdNakF5TURCMk1CQUcKQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk1iTHh5alIrNFQxbXU5Q0ZDRGhRMnR1ZGEzOEt3T0UxSGFUSmRkWk8wRmxheDdtTkNxNwpkUFlTenVodDU2dmtQRTQvUkFpTHpSWnh5NytTbWZTazF6eFFWRktRaFlONGxHZG5veHdKR1QxMU5JWGU3V0I5eHd5MFFWSzVidVh1ClFxT0NBUTB3Z2dFSk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZIT1JFS3YvVmJOYWZBa2wxYks2Q0tCcnF4OXQKTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCeGdZRFZSMGZCSUcrTUlHN01ENmdQS0E2aGpob2RIUndPaTh2WTNKc0xtUXRkSEoxYzNRdQpibVYwTDJOeWJDOWtMWFJ5ZFhOMFgySnlYM0p2YjNSZlkyRmZNVjh5TURJd0xtTnliREI1b0hlZ2RZWnpiR1JoY0RvdkwyUnBjbVZqCmRHOXllUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdRbElsTWpCU2IyOTBKVEl3UTBFbE1qQXhKVEl3TWpBeU1DeFAKUFVRdFZISjFjM1FsTWpCSGJXSklMRU05UkVVL1kyVnlkR2xtYVdOaGRHVnlaWFp2WTJGMGFXOXViR2x6ZERBS0JnZ3Foa2pPUFFRRApBd05wQURCbUFqRUFsSkF0RS9yaFkvaGhZK2l0aFhoVWtaeTRremcrR2tIYVFCWlRRZ2pLTDQ3eFBvRld3S3JZN1JqRXNLNzBQdm9tCkFqRUE4eWppeHRzcm1mdTNVYmdrbzZTVWVoby81amJpQTFjemlqRExnc2ZXRkJIVmRXTmJGSldjSHdIUDJOVnlwdzg3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgRVYgUm9vdCBDQSAxIDIwMjAKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzJ6Q0NBbUNnQXdJQkFnSVFYd0pCMTNxSGZFd0RvNnlXamZ2LzBEQUtCZ2dxaGtqT1BRUURBekJJTVFzd0NRWURWUVFHRXdKRQpSVEVWTUJNR0ExVUVDaE1NUkMxVWNuVnpkQ0JIYldKSU1TSXdJQVlEVlFRREV4bEVMVlJTVlZOVUlFVldJRkp2YjNRZ1EwRWdNU0F5Ck1ESXdNQjRYRFRJd01ESXhNVEV3TURBd01Gb1hEVE0xTURJeE1UQTVOVGsxT1Zvd1NERUxNQWtHQTFVRUJoTUNSRVV4RlRBVEJnTlYKQkFvVERFUXRWSEoxYzNRZ1IyMWlTREVpTUNBR0ExVUVBeE1aUkMxVVVsVlRWQ0JGVmlCU2IyOTBJRU5CSURFZ01qQXlNREIyTUJBRwpCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCUEVMM1laRElCbmZsNFhvSWtxYno1Mll2N1FGSnNuTDQ2YlNqOFdlZUhzeGlhbUpyU2M4ClpSQ0MvTi9EblU3d015UEUwakwxSExEZk14ZGR4ZkN4aXZudnViY1V5aWxLd2crcGYzVmxTU293Wi9Sazk5WWFkOXJEd3BkaFFudEoKcmFPQ0FRMHdnZ0VKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkg4UUFSWTNPcVFvNUZENHBQZnNheksyL3VtTApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0J4Z1lEVlIwZkJJRytNSUc3TUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1RdGRISjFjM1F1CmJtVjBMMk55YkM5a0xYUnlkWE4wWDJWMlgzSnZiM1JmWTJGZk1WOHlNREl3TG1OeWJEQjVvSGVnZFlaemJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1JWWWxNakJTYjI5MEpUSXdRMEVsTWpBeEpUSXdNakF5TUN4UApQVVF0VkhKMWMzUWxNakJIYldKSUxFTTlSRVUvWTJWeWRHbG1hV05oZEdWeVpYWnZZMkYwYVc5dWJHbHpkREFLQmdncWhrak9QUVFECkF3TnBBREJtQWpFQXlqekdLblhDWG5WaU9UWUFZRnFMd1pPWnpObmJRVHM3aDVrWE85WE1UOG9pOTZDQXkvbTBzUnRXOVhMUy9CblIKQWpFQWtmY3drejhRUml0eHBOQTdSSnZBS1FJRnNrRjNVZk41V3A2T0ZLQk9RdEpiZ2ZNMGFnUG5JamhRVyswWlQwTVcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVExTIEVDQyBQMzg0IFJvb3QgRzUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHVENDQVorZ0F3SUJBZ0lRQ2VDVFphejMyY2k1UGh3TEJDb3U4ekFLQmdncWhrak9QUVFEQXpCT01Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1JHbG5hVU5sY25Rc0lFbHVZeTR4SmpBa0JnTlZCQU1USFVScFoybERaWEowSUZSTVV5QkZRME1nVURNNApOQ0JTYjI5MElFYzFNQjRYRFRJeE1ERXhOVEF3TURBd01Gb1hEVFEyTURFeE5ESXpOVGsxT1Zvd1RqRUxNQWtHQTFVRUJoTUNWVk14CkZ6QVZCZ05WQkFvVERrUnBaMmxEWlhKMExDQkpibU11TVNZd0pBWURWUVFERXgxRWFXZHBRMlZ5ZENCVVRGTWdSVU5ESUZBek9EUWcKVW05dmRDQkhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNRkVvYzhSbDFDYTNpT0NOUWZOME1zWW5kTHhmM2MxVHp2ZApsSEpTN2NJNytPejZlMnRZSU95WnJzbjhhTE4xdWRzSjdNZ1Q5VTdHQ2gxbU1FeTdIMGNLUEdFUVFpbDhwUWdPNENMcDB6Vm96cHRqCm40UzFtVTFZb0k3MVZPZVZ5YU5DTUVBd0hRWURWUjBPQkJZRUZNRlJSVkJacXo3bkxGcjZJQ0lTQjRDSWZCRnFNQTRHQTFVZER3RUIKL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNUUNKYW8xSDUrejhibFVEMldkcwpKazZEeHYzSit5c1R2TGQ2akxSbDBtbHBZeE5qT3laUUxnR2hlUWFSblVpL3dyNENNRWZERlh1eG9KR1pTWk9vUEh6b1JnYUxMUEl4CkFKU2RZc2lKdlJtRUZPbWwrd0c0RFhaRGpDNVR5M3pmREJlV1VBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVExTIFJTQTQwOTYgUm9vdCBHNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNQbTBlS2o2ZnRwcU16ZUozbnpQaWpBTkJna3Foa2lHOXcwQkFRd0ZBREJOTVFzd0NRWURWUVFHCkV3SlZVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKVEFqQmdOVkJBTVRIRVJwWjJsRFpYSjBJRlJNVXlCU1UwRTAKTURrMklGSnZiM1FnUnpVd0hoY05NakV3TVRFMU1EQXdNREF3V2hjTk5EWXdNVEUwTWpNMU9UVTVXakJOTVFzd0NRWURWUVFHRXdKVgpVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKVEFqQmdOVkJBTVRIRVJwWjJsRFpYSjBJRlJNVXlCU1UwRTBNRGsyCklGSnZiM1FnUnpVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6MFBUSmVSR2QvZnhtZ2VmTTFlUzgKN0lFK2FqV09McmZuM3EvNUIwM1BNSjNxQ1F1WnZXeFgyaGhLdUhpc09qbW9wa2lzTG5MbHZldnhHczNucEFPcFB4RzAyQytKRnZ1VQpBVDI3TC9nVEJhRjRISTRvNEVYZ2cvUlpHNVd6cm40RFJlVyt3a0wrN3ZJOHRvVVRtREtkRnFncHdnc2NPTnlmTVhkY3Z5ZWovQ2VzCnR5dTlkSnNYTGZLQjJsMnc0U01YUG9oS0VpUFE2cytkM2dNWHNVSktvQlpNcEcyVDZUODY3anA4blZpZDlFNlAvRHNqeUcyNDRnWGEKek92c3d6SDAxNmNwVklEUFJGdE1iekNlODh6ZEg1UkRuVTEvY0hBTjFEclJOL0Jzblp2QUZKTlk3ODFCT0hXOEV3T1ZmSC9qWE9uVgpEZFhpZkJCaXFtdndQWGJ6UDZQb3NNSDk3NnBYVGF5R3B4aTBLY0VzRHI5a3ZpbU0yQUl0elZ3djhuL3ZGZlFNRmF3S3NQSFREVTlxClRYZVhBYUR4WnJlM3p1L083T3lsZGNxczQrRmo5N2loQk1pOGV6OWRMUllpVnUxSVNmNm5MM2t3Slp1NmF5MC9uVHZFRitjZEx2dnkKejZiODR4UXNscGdoakxTUjZSbGdnL0l3S3daelVOV1lPd2JweDRvTVlJd28rRktiYnVIMlRic0dKSnZYS3lZLy9Tb3ZjZlhXSkw1LwpNWjRQYmVpUFQwMmpQLzgxNnQ5SlhrR1Bodm54ZDNsTEc3U2pYaS83UmdMUVpoTmVYb1ZQenRod2lIdk9BYldXbDlmTmZmMkMrTUlrCndjb0JPVStOb3NFVVFCK2NadFVNQ1ViVzh0RFJTSFpXT2tQTHRnb1JPYnFNRTJ3R3RaN1A2d0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVVVUTWM3VFpBcnhmVEpjMXBhUEt2VGlNK3MwRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBR0NtcjF0ZlY5cUoyMHRRcWNRak5TSC8wR0V3aEpHM1B4RFBKWTdKdjBZMDJjRWhKaHh3CkdYSWVvOG1IL3FsRFpKWTZ5Rk1FQ3JaQnU4UkhBTm1mR0JnN3NnN3pOT29rOTkydklHQ3VraWhmTnVkZDVON0hQTnRRT2EyN1BTaE4KbG54MnhsdjB3ZHNVcGFzWllnY1lRRitYa2R5Y3g2dTFVUTNtYVZOVnpEbDkyc1VSVlhMRk80dUorRFF0cEJmbEYrYVpmVENJSVRmTgpNQmM5dVBLOHFIV2dROXcraVV1UXJtMEQ0Qnlqb0pZSnUzMmp0eW9RUkV0R0J6Umo3VEc1Qk82am01cXU1akY0OU9va1lUdXJXR1QvCnU0Y25ZaVdCMzl5aEwvYnRwLzk2ajFFdU1QaWtBZEtGT1Y4Qm1aWnZXbHR3R1ViK2htQStyWUFRQ2QwNUpTOVlmN3ZTZFBEM1JoOUcKT1VyWVU5RHpManR4cGRSdi9QTm41QWVQM1NZWjRZMWIrcU9URVp2cHlEckRWV2lha3VGU2Rqam80YnE5KzAvVjc3UG5TSU14OElJaAo0N2ErcDZ0djc1L2ZUTThCdUdKcUl6M25DVTJBRzNzd3BNUGRCMzgwdnFRbXN2WkI2QWtkNHlDWXFqZFAvL2Z4NGlsd01VYy9kTkFVCkZ2b2hpZ0xWaWdtVWR5N3lXU2lMZkZDU0NtWjRPSU4xeExWYXFCSEc1Y0dkWmxYUFU4U3YxM1dGcVVJVFZ1d2hkNEdUV2d6cWx0bEoKeXFFSThwYzdiWnNFR0NSRWpud0I4dHdsMkY2R21yRTUyL1dSTW1yUnBuQ0tvdmZlcEVXRkpxZ2VqRjBwVzhoTDJKcHFBMTV3OG9WUApiRXRvTDhwVTlvemFNdjdEYTRNL09NWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGFpbmx5IFJvb3QgUjEKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSekNDQXkrZ0F3SUJBZ0lSQUk0UCtVdVFjV2hsTTFUMDFFUTV0K0F3RFFZSktvWklodmNOQVFFTEJRQXdQVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFakFRQmdOVkJBb1RDVU5sY25SaGFXNXNlVEVhTUJnR0ExVUVBeE1SUTJWeWRHRnBibXg1SUZKdmIzUWdVakV3SGhjTgpNakV3TkRBeE1EQXdNREF3V2hjTk5EWXdOREF4TURBd01EQXdXakE5TVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpRMlZ5CmRHRnBibXg1TVJvd0dBWURWUVFERXhGRFpYSjBZV2x1YkhrZ1VtOXZkQ0JTTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVAKQURDQ0Fnb0NnZ0lCQU5BMjFCL3EzYXZrMGJibSt5TEEzUk1OYW5zaUV4eVhQR2hqWmpLY0E3V05wSUdEMm5nd0VjL2NzaXUra3IrTwo1TVFUdnFSb1ROb0NhQlowdnJMZEJPUnJLdDAzSDJBczIvWDNvWHlWdHd4d2hpN3hPdTlTOTh6VG0vbUx2ZzdmTWJlZGFGeVNwdlhsCjh3bzB0Zjk3b3VTSG9jYXZGd0R2QTVIdHFSeE9jVDNTaTJ5SjlIaUc1bXBKb002MTByQ3JtL2IwMUM3amN2azJ4dXNWdHlXTU92d2wKRGJNaWN5RjB5RXFXWVpMMUx3c1lwZlN0NHU1QnZRRjUrcGFNalJjQ01MVDVyM2dhakxRMkVCQUhCWERROURHUWlsSEZoaVo1c2hHSQpYc1h3Q2xUTlNhYS9BcHpTUktmdDQzanZSbDV0Y2RGNWNCeEdYMUhweVRmY1gzNXBlMEhmTkVYZ080VDBvWW9LTnA0M3pHSlM0WWtOCktQbDZJN0VOUFQyYS9aMkI3eXlRd0h0RVRydEo0QTVLVnBLOHk3WGRlUmVKa2Q1aGlYU1NxT015aGI1T2hhUkxXY3NyeFhpT2NWVFEKQWplWmpPVko2dUJVY3FRUkJpOExqTUZidnJXaHNGTnVuTGhna1I5WmEva3Q5SlFLbDdYc3hYWURWQnRsVXJwTWtsWlJOYUJBMkNuYgpybEoyT3kwd1FKdUswRUpXdExlSUFhU0hPMU9XemFNV2ovTm1xaGV4eDJEZ3dVTUZETzZiVzJCdkJseUhXeWY1UUJHZW5EUEJ0K1UxClZ3Vi9KODRYSUl3Yy9QSDcyakVwU2UzMUM0U25UOEgyVHNJb25QcnU0SzhIK3pNUmVpRlBDeUVRdGtBNnF5STZCSnlMbTRTR2NwclMKcDZYRXRIV1JxU3NqQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZApEZ1FXQkJUZ3FqOGxqWjlFWE1FNjZDNnVkMHlFUG1jTTlEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUF1VmV2dUJMYVY0T1BhQXN6CkhRTlRWZlNWY09RclBiQTU2L3FKWXYzMzFoZ0VMeUUwM2ZGbzhOV1dXdDdDZ0tQQmpjWnE5MWwzcmhWa3oxdDVCWGRtNm96VGF3M2QKOFZrc3dUT2xNSUFWUlFkRkdqRWl0cElBcTVsTk9vOTNyNmtpeWk5anloWFd4OGJ3UFd6OEhBMllFR0dlRWFJaTF3cnlrWHByT1E0dgpNTU0yU1ovZzZROENSRkEzbEZWOTZwLzJPN3FVcFV6cHZENVJ0T2pLa2paVWJWd2xLTnJkclJUOTArN2lJZ1hyMFBLM2FCTFhXb3BCCkdzYVNwVm83WTBWUHYrRTZkeUl2WEw5RytWb0RoUk5DWDhyZVU5ZGl0YVkxQk1KSC81bjloTjljenVsZWdDaEI4bjNuSHBEWVQzWSsKZ2p3Ti9LVUQrbnNhMlVVZVlOckVqdm44SzhsN2xjVXEvNnFKMzRJeEQzTC9EQ2ZYQ2g1V0FGQWVESkRCbHJYWUZJVzdwdzBXd2ZnSApKQnU2aGFFYUJRbUF1cFZqeVRyc0paOS9uYnFrUnhXYlJIRHhha3ZXT0Y1RDh4aCtVRzdwV2lqbVplWjNHenI5SGI0REpxUGIxT0c3CmZwWW5LeDN1cFB2YUpWUVRBOTQ1eHNNZlRaRHNqeHRLMGh6dGhaVTRVSGxHMXNHUVVER3BYSnB1SGZVelZvdW5tZEx5eUN3ems1SXcKeDA2TVpUTVFaQmY5SkJlVzBZM0NPbW9yNnhPTFJQSWg4MG9hdDNkZjErMklwSExsT1IrVm5iNW53WEFSUGJ2MCtFbTM0eWFYT3AvUwpYM3o3d0psOE9TbmdleDIvRGFlUDBpazBiaVFWeTk2UVhyOGF4R2Jxd3VhNk9WK0ttYWxCV1Fld0xLOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGFpbmx5IFJvb3QgRTEKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI5ekNDQVgyZ0F3SUJBZ0lRQmlVenNVY0RNeWRjK1kyYXViL00rREFLQmdncWhrak9QUVFEQXpBOU1Rc3dDUVlEVlFRR0V3SlYKVXpFU01CQUdBMVVFQ2hNSlEyVnlkR0ZwYm14NU1Sb3dHQVlEVlFRREV4RkRaWEowWVdsdWJIa2dVbTl2ZENCRk1UQWVGdzB5TVRBMApNREV3TURBd01EQmFGdzAwTmpBME1ERXdNREF3TURCYU1EMHhDekFKQmdOVkJBWVRBbFZUTVJJd0VBWURWUVFLRXdsRFpYSjBZV2x1CmJIa3hHakFZQmdOVkJBTVRFVU5sY25SaGFXNXNlU0JTYjI5MElFVXhNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRTNtLzQKZnh6ZjdmbEhoNGF4cE1DSytJS1hnT3FQeUVwZUtuMklhS2NCWWhTUkpIcGNucU1YZllxR0lUUVlVQnNRM3RBM1N5YkhHV0NBNlRTOQpZQmsyUU5ZcGh3azhrWHIydkJNajNWbE9CRjdQeUFJY0dGUEJNZGphSU9sRWplUjJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTh5Z1l5MlIxN2lrcTYrMnVJMWc0aGV2SUlnY3dDZ1lJS29aSXpqMEUKQXdNRGFBQXdaUUl4QUxHT1dpRERzaGxpVGQ2d1Q5OXUwbkNLOFo5K2Fvem11dDZEYWNwcHM2a0Z0WmFTRjRmQzB1clFlODdZUVZ0OApyZ0l3UnQ3cXkxMmE3RExDWlJhd1REQmNNUFBhVG5PR0J0ak9pUVJJTnpmNDNUTlJuWEN2ZTFYWUFTNTlCV1FPaHJpUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZnpDQ0EyZWdBd0lCQWdJSkFPRjhOMEQ5Ry81bk1BMEdDU3FHU0liM0RRRUJEQVVBTUYweEN6QUpCZ05WQkFZVEFrcFFNU1V3Ckl3WURWUVFLRXh4VFJVTlBUU0JVY25WemRDQlRlWE4wWlcxeklFTlBMaXhNVkVRdU1TY3dKUVlEVlFRREV4NVRaV04xY21sMGVTQkQKYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRNd0hoY05NVFl3TmpFMk1EWXhOekUyV2hjTk16Z3dNVEU0TURZeE56RTJXakJkTVFzdwpDUVlEVlFRR0V3SktVREVsTUNNR0ExVUVDaE1jVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFCkF4TWVVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmhkR2x2YmlCU2IyOTBRMEV6TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBNDhseVNmY3czZ2w4cVVDQldOTzBPdDI2WVErVFVHNXBQRFhDN2x0emtCdG5UQ0hzWHpXN09UNHJDbUR2dTIwcgpodnR4b3NpczVGYVUrY212c1hMVUlLeDAwcmdWclZIK2hYU2h1UkQrQllENVVwT3pRRDExRUt6QWxyZW5mbmE4NHh0U0djNFJId3NFCk5QWFk5V2s4ZC9OazlBMnFoZDdnQ1ZBRUY1YUV0OGlLdkUxeS9CeTd6L01HVGZtZlpQZCtwbWFHTlhISUVZQk13WEZBV0I2K29IUDIKL0Q1UTRlQXZKajErWENPMWVYRGUrdURScGRZTVFYRjc5K3FNSElqSDdJdjEwUzlWbGtaOFdqdFlPL3U2MkMyMUpkcDZUczlFcmlHbQpucGpLSUc1OHU0aUZXL3ZBRUdLNzh2a25SKy9SaVRsRHhOL2U0VUcvVkhNZ2x5MXMydlBVQjZQbXVkaHZydnlNR1M3VFoyY3JsZHRZClhMVnFBdk80ZzE2MGE3NUJmbGNKZFVSUVZjMWFFV0VoQ21IQ3FZajlFN3d0aVMvTlllQ1Z2c3ExZStGN05HY0xIN1lNeDN3ZUdWUEsKcDdGS0ZTQldGSEE5SzRJc0Q1MFZIVWVBUi85NG1RNHhyMjgraisyR2FSNTdHSWdVc3NMOGdqTXVuRXN0KzNBN2Nhb3JleVluOHhyQwozUHNYdUtIcXk2QzBydE9VZm5yUXE4UHNPQzBSTG9pLzFEK3RFanRDckk4Q2JuM00wVjlodnFHOE9tcEk2aVpWSWhaZFh3My9Kek9mCkdBTjBpbHRTSUVkclJVMGlkNHhWSi9DdkhvekpneUpVdDVyUVQ5bk8vTmt1SEpZb3NRTFRBNzBsVWh3MFprOGpxL1IzZ3BZZDBWY3cKQ0JFRi9WZlIyY2NDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkdRVWZQeFljaGFtQ2lrMEZXOHF5N3o4cjZpck1BNEdBMVVkRHdFQgovd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJEQVVBQTRJQ0FRRGNBaU1JNHU4aE9zY050eWJTCllwT25wU055QnlDQ1lOOFkxMVN0YVNXU250a1V6NW01VW9IUHJteUtPMW81eUd3QlE4SWliUUx3WXMxT1kwUEFGTnIwWS9EcTlISHUKVG9mamNhbjB5VmZsTGw4Y2Vic2pxb2RFVittOU5VMUJ1MHNvbzVpeUc5a0xGd2ZsOStxZDlYYlh2OFMyZ1ZqL3lQOWthV0o1clc0TwpIMy91SFdubHQzSnhzLzZsQVRXVVZDdkFVbTJQVmNUSjByakx5alFJVVlXZzlieTBGMWpxQ2x4NnZXUEdPaS8vbGtrWmhPcG4yQVN4CllmUUFXMHEzbkhFM0dZVjV2NEd3eHhNT2RuRStPb0FHcmdZV3A0MjF3c1RMLzBDbFhJMmx5VHJ0Y29IS1hKZzgwalFEZHdqOThDbFoKWFNFSXgyQy9wSEY3dU5rZWdyNEpyMlZ2S0t1L1M3WHVQZ2hISjZBUGJ3K0xQNnlWR1BPNUR0eG5WVzVpbmtZTzBRUjR5bkt1ZHRtbAorTExmaUFsaGkrOGtUdEZaUDFyVVBjbVRQQ3RrOVlFTkZwYjNrc1ArTVcvb0tqSjBEdlJNbUVvWURqQlUxY1hydk1VVm51aVpJZXNuCkt3a0syL0htY0JoV3V3emt2dm5vRUtRVGtyZ2M0TnRuSFZNRHBDS24zRjJTRUR6cS8vd2JFQnJEMk5DY25XWEwwQ3NuTVFNZU51RTkKZG5VTS8wVW11ZDFSdkNQSFg5alloeEJBRWcwOU9EZm5SRHdZd0ZNSlpJLy8xWnFtZkhBdWMxVWg2Ti8vZzdrZFBqSWUxcVo5TFBGbQo2VndkcDZQT1hpVXlLK09WckNvSHpyUW9lSVk4TGFhZFRkSjBNTjFrVVJYYmc0TlIxNi85TTUxTlpnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFQ0MgUm9vdENBMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDT0RDQ0FiNmdBd0lCQWdJSkFOWmRtN040Z1M3ck1Bb0dDQ3FHU000OUJBTURNR0V4Q3pBSkJnTlZCQVlUQWtwUU1TVXdJd1lEClZRUUtFeHhUUlVOUFRTQlVjblZ6ZENCVGVYTjBaVzF6SUVOUExpeE1WRVF1TVNzd0tRWURWUVFERXlKVFpXTjFjbWwwZVNCRGIyMXQKZFc1cFkyRjBhVzl1SUVWRFF5QlNiMjkwUTBFeE1CNFhEVEUyTURZeE5qQTFNVFV5T0ZvWERUTTRNREV4T0RBMU1UVXlPRm93WVRFTApNQWtHQTFVRUJoTUNTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5ZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEt6QXBCZ05WCkJBTVRJbE5sWTNWeWFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1JVTkRJRkp2YjNSRFFURXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUEKSWdOaUFBU2twVzlnQXdQRHZUSDAweGVjSzRSMXJPWDlQVmR1MTJPLzVnU0prbzZCbk9QcFIyN0trQkxJRStDbm5mZGxkQjlzRUxMbwo1T252YllVeW1VU3hYdjNNZGhEWVc3Mml4dm5XUXVSWGR0eVF3aldwUzRnOEVrZHRYUDlKVHhwS1VMR2pRakJBTUIwR0ExVWREZ1FXCkJCU0dIT2YrTGFWS2l3aitLQkg2dnFObStHQlpMekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUsKQmdncWhrak9QUVFEQXdOb0FEQmxBakFWWFVJOS9MYnU5enV4TnVpZTlzUkdLRWt6MEZoREttTXB6RTJ4dEhxaXVRMDRwVjFJS3YzTApzbk5kbzRnSXh3d0NNUURBcXkwT2JlMFlvdHRUNlNYYlZRamdVTXpmUkdFV2dxdEpzTEtCN0hPSGVMUk1zbUliRXZvV1RTVkxZNzBlCk45az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQkpDQSBHbG9iYWwgUm9vdCBDQTEKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZkRENDQTF5Z0F3SUJBZ0lRVlc5bDQ3VFprR29iQ2RGc1BzQnNJREFOQmdrcWhraUc5dzBCQVFzRkFEQlVNUXN3Q1FZRFZRUUcKRXdKRFRqRW1NQ1FHQTFVRUNnd2RRa1ZKU2tsT1J5QkRSVkpVU1VaSlEwRlVSU0JCVlZSSVQxSkpWRmt4SFRBYkJnTlZCQU1NRkVKSwpRMEVnUjJ4dlltRnNJRkp2YjNRZ1EwRXhNQjRYRFRFNU1USXhPVEF6TVRZeE4xb1hEVFEwTVRJeE1qQXpNVFl4TjFvd1ZERUxNQWtHCkExVUVCaE1DUTA0eEpqQWtCZ05WQkFvTUhVSkZTVXBKVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpNUjB3R3dZRFZRUUQKREJSQ1NrTkJJRWRzYjJKaGJDQlNiMjkwSUVOQk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQVBGbQpDTDNaeFJWaHk0UUVRYVZwTjNjZHdiQjcrc04zU0pBVGNtVFJ1SHlRTlowWWVZampsd0U4UjRIeURxS1lEWjQvTitBWnNwRHlSaHlTCnNUcGh6dnEzUnA0RGh0Y3pidTMzUll4Mk45NXVscEgzMTM0cmh4ZlZpelh1aEpGeVY5eGd3OE81NThkbkpDTlBZd3BqOW1aOVMxV24KUDNoa1NXa1NsK0JNRGRNSm9ESXdPdnFmd1BLY3hSSXFMaHkxQkRQYXBEZ1JhdDdHR1BaSE9pSkJoeUw4eElrb1ZOaU1wVEFLK0JjVwp5cXczL1htbmtSZDRPSm10V08yeTNzeUpmUU9jczRsbDUrTTdzU0tHandadGVBZjlrUkovc0dzY2lRMzV1TXQwV3dmQ3lQUTEwV1JqCmV1bHVtaWpXTUwzbUc5MFZyNFRxbk1mSzlRN3E4bDBwaDQ5cGN6bStMaVJ2UlNHc3hkUnBKUWFEclhwSWhSTXNEUWE0YkhsVy9LTm4KTW9IMVY2WEtWMEpwNlZ3a1llL2lNQmhPUkpoVmIzckNrOWdadHQ1OFI0b1JUa2xIMnlpVUFndVVTaXo1RXRCUDZERitiSHEvcGorYgpPVDBDRnFNWXMyZXNXejhzZ3l0bk9ZRmN1WDZVMVdUZG5vOXVydWg4VzdUWGFrZEkxMzZ6MUMyT1ZuWk96Mm54YmtSczFDVHFqU1NoCkdMKzlWLzZwbVRXMTJ4QjN1RDFJdXRiQjUvRWpQdGZmaFowblBOUkF2UW9NdmZYbmpTWFdnWFNIUnRRcGRhSkNiUGR6aWVkOXYzcEsKSDlNaXlSVlZ6OTl2ZkZYUXBJc0hFVGRmZzZZbVY2WUJXMzcrV0dnSHFlbDYyYm5vLzFBZnE4SzB3TTdvNnYwUHZZMU51THh4QWdNQgpBQUdqUWpCQU1CMEdBMVVkRGdRV0JCVEY3KzNNMkkwaHhrams0OWNVTHFjV2srV1lBVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBVW9Lc0lUUWZJL0tpMlBtNHJ6YzJJSW5STndQV2FaKzQKWVJDNm9qR1lXVWZvMFEwbEhoVkJET0FxVmRWWFVzdjQ1TWRwb3gxTmNRSmVYeUZGWUVoY0NZNUpFTUVFM0tsaWF3THdROGhPblRoSgpkTWt5Y0ZSdHdVZjhqclEybnRTY3ZkMGcxbFBKR0ttMVZybDJpNVZuWnU2OW1QNnU3NzV1KzJEMi9WbkdLaHMvSTBxVUpEQW55SW04CjYwUWttc3M5dmsvVmVzNk9GOHRpd2RuZUhnNTYvME9HTkZLOFlUODhYN3ZaZHJSVHZKZXovb3BNRWk0cjg5Zk80YUwvM1h0dyt6dWgKVGFSakF2MDRsNVUvQlhDZ2E5OWlnVU9MdEZrTlNveFVuTVc3Z1ovTmZhWHZDeVVlT2lEYkhQd2ZtR2NDQ3RSelJCUGJVWVFhVlFOVwo0QUIrZEFiL09NUnlIZE9vUDJneFhkTUp4eTZNVzJQZzZOd2UwdXhoSHZMZTVlLzJtWFpnTFI2VWNuSEdDeW95eDVKTzFVYlhIZm1wCkdRckkrcFhPYlNPWXFnczRyWnBXRFcrTjhURUFpTUVYbk0wWk5qWCtWVk9nNER3elg1WmU0akxwM3pPN0JrcXAySVJ6em5mU3hxeHgKNFZ5akhReTdDdDlmNHFOeDJObzNXcUI0Sy9UVWZldDI3ZkpoY0tWbG10T0pOQmlyKzNJKzE3UTllVnpZSDZFemU5bUNVQXlURjZwcwozTUtDdXdKWE5xK1lKeW81VU9Hd2lmVWxsMzVIYUJDMDdIUEtzNWZSSk56MllxQW8wN1dqdUdTM2lHSkN6NTFUelptK1pHaVBUeDRTClNQZlNLY09ZS01yeU1ndVRqQ2xQUEdBeXpRV1dZZXp5ci82emNDd3Vwdkk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJKQ0EgR2xvYmFsIFJvb3QgQ0EyCj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSlRDQ0FhdWdBd0lCQWdJUUxCY0lmV1Fxd1A2RkdGa0d6N1JLNnpBS0JnZ3Foa2pPUFFRREF6QlVNUXN3Q1FZRFZRUUdFd0pEClRqRW1NQ1FHQTFVRUNnd2RRa1ZKU2tsT1J5QkRSVkpVU1VaSlEwRlVSU0JCVlZSSVQxSkpWRmt4SFRBYkJnTlZCQU1NRkVKS1EwRWcKUjJ4dlltRnNJRkp2YjNRZ1EwRXlNQjRYRFRFNU1USXhPVEF6TVRneU1Wb1hEVFEwTVRJeE1qQXpNVGd5TVZvd1ZERUxNQWtHQTFVRQpCaE1DUTA0eEpqQWtCZ05WQkFvTUhVSkZTVXBKVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpNUjB3R3dZRFZRUUREQlJDClNrTkJJRWRzYjJKaGJDQlNiMjkwSUVOQk1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkozTGdKR05VMmUxdVZDeEEvamwKU1I5QklnbXdVVkpZMWlzMGo4VVNSaFRGaXk4c2hQOHNicWpWOFFuakF5RVV4RU05Zk1Fc3hFdHFTczNwaCtCOTlpSysra3BSdURDSwovZUhlR0JJSzlrZTM1eGUvSjRyVVFVeVdQR0NXd2YwVkhLTkNNRUF3SFFZRFZSME9CQllFRk5KS3NWRi9CdkRSZ2g5T2JsK3JnL3hJCjFMQ1JNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01CcTgKVzlmK3FkSlVEa3BkMG0yeFFOejBROVhTU3BrWkVsYUE5NE0wNFRWT1NHMEVEMWN4TURBdHNhcWRBempiQmdJeEFNdk1oMVBMZXQ4ZwpVWE9Rd0toYllkREZVRG45aGY3QjQzajRwdFpMdlp1SGp3L2wxbE9XcXp6SVFOcGg5MU9qOXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDT2pDQ0FjR2dBd0lCQWdJUVF2TE0yaHRwTjBSZkZmNTFLQkM0OURBS0JnZ3Foa2pPUFFRREF6QmZNUXN3Q1FZRFZRUUdFd0pIClFqRVlNQllHQTFVRUNoTVBVMlZqZEdsbmJ5Qk1hVzFwZEdWa01UWXdOQVlEVlFRREV5MVRaV04wYVdkdklGQjFZbXhwWXlCVFpYSjIKWlhJZ1FYVjBhR1Z1ZEdsallYUnBiMjRnVW05dmRDQkZORFl3SGhjTk1qRXdNekl5TURBd01EQXdXaGNOTkRZd016SXhNak0xT1RVNQpXakJmTVFzd0NRWURWUVFHRXdKSFFqRVlNQllHQTFVRUNoTVBVMlZqZEdsbmJ5Qk1hVzFwZEdWa01UWXdOQVlEVlFRREV5MVRaV04wCmFXZHZJRkIxWW14cFl5QlRaWEoyWlhJZ1FYVjBhR1Z1ZEdsallYUnBiMjRnVW05dmRDQkZORFl3ZGpBUUJnY3Foa2pPUFFJQkJnVXIKZ1FRQUlnTmlBQVIyK3BtcGJpRHQrZGQzNHdjN3FOczlYempvcTFXbVZrL1dTT3JzZnkycXc3TEZlZXlaWVg4UWVjY0NXdmtFTi9VMApOU3Qzem44Z2oxS2pBSW5zMWFlaWJWdmpTNUtUb0lEMUFaVGM4R2dISHMzdS9pVlN0U0JESEJ2KzZ4bk9RNk9qUWpCQU1CMEdBMVVkCkRnUVdCQlRSSXRwTVdmRkxYeVk0cXAzVzd1c053L3VwWVRBT0JnTlZIUThCQWY4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpBbjdxUmFxQ0c3NlVlWGxJbWxkQ0J0ZVUvSXZaTmVXQmo3TFJvQWFzbTRQZENrVDBSSApsQUZXb3ZnekpReEMzNm9DTUIzcTRTNklMdUg1cHgwQ01rN3luMnhWZE9PdXJ2dWxHdTd0MHZ6Q0F4SHJSVnhnRUQxY2Y1a0RXMjFVClNBR0tjdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3RpZ28gUHVibGljIFNlcnZlciBBdXRoZW50aWNhdGlvbiBSb290IFI0Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZpakNDQTNLZ0F3SUJBZ0lRZFkzOWk2NThCd0Q2cVNXbjRjZXRGREFOQmdrcWhraUc5dzBCQVF3RkFEQmZNUXN3Q1FZRFZRUUcKRXdKSFFqRVlNQllHQTFVRUNoTVBVMlZqZEdsbmJ5Qk1hVzFwZEdWa01UWXdOQVlEVlFRREV5MVRaV04wYVdkdklGQjFZbXhwWXlCVApaWEoyWlhJZ1FYVjBhR1Z1ZEdsallYUnBiMjRnVW05dmRDQlNORFl3SGhjTk1qRXdNekl5TURBd01EQXdXaGNOTkRZd016SXhNak0xCk9UVTVXakJmTVFzd0NRWURWUVFHRXdKSFFqRVlNQllHQTFVRUNoTVBVMlZqZEdsbmJ5Qk1hVzFwZEdWa01UWXdOQVlEVlFRREV5MVQKWldOMGFXZHZJRkIxWW14cFl5QlRaWEoyWlhJZ1FYVjBhR1Z1ZEdsallYUnBiMjRnVW05dmRDQlNORFl3Z2dJaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNUdnRVMlVuWFlBU09nSEVkQ1NlNWp0cmNoL2NTVjFVZ3JKbndVVXhEYWVmMHJ0eTJrCjFDejY2akxkU2NLNXZROUlQWHRhbUZTdm5sMHhkRThIL0ZBaDNhVFBhRThiRW1OdEpabE1LcG56U0RCaCtvRjhIcWNJU3R3K0t4d2YKR0V4eHFqV01yZmh1NkR0SzJlV1VBdGFKaEJPcWJjaFBNOHhRbGplU005eGZpT2VmVk5sSThKaEQxbWI5bnhjNFE4VUJVUXZYNHlNUApGRjFiRk9kTHZ0MzB5Tm9ETjlIV09hRWhVVENEc0czWE1FNldXNUh3Y0NTcnYwV0JaRU1OdlNFNkx6enBuZzNMSUxWQ0o4emFiNXZ1ClpEQ1FPYzJUWllFaE1iVWpVRE0zSXVNNDdmZ3hNTXhGL21MNTBWMHllVUtIMzJyTVZobEFUYzZxdS9tMWRrbVU4U2Y0a2FXRDVRYXoKWXc2QTNPQVNWWUNtTzJhME9ZY3R5UERRMFJUcDVBMU5EdlpkVjNMRk94eEhWcDNpMWZ1QllZek1UWUNRTkZ1MzF4UjEzTmdFU0ovQQp3U2lJdE9rY3lxZXg4VmEzZTBsTVdlVWdGYWlFQWluNk9KUnBta2tHajgwZmVSUVhFZ3lEZXQ0ZnNaZnUrWmQ0S0tUSVJKTHBmU1lGCnBsaHltM2tUMkJGZnJzVTRZalJvc29Zd2p2aVFZWjR5YlBVSE5zMmlURzdzaWpidDh1YVpGVVJ3dzN5OG5EbkF0T0ZyOTRNbEkxZloKRW9EbFNmQjFEKytONnh5YlZDaTBJVHo4ZkFyLzczdHJkZitMSGFBWkJhdjYrQ3VCUXVnNHVydjdxdjA5NFBQSzMwNlhseW50OHhoVwo2YVdXckwzRGtKaXk0UG1pMUtaSFEzeHR6d0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVm5OWVpKWDVraHF3RWlvRVlubWhRQldJCklVa3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFDOWMKbVR6OEJsNk1sQzV3NnRJeU1ZMjA4RkhWdkFyelpKOEhYdFhCYzJoa2VxSzVEdWo1WFlVdHFEZEZxaWowbGdWUVlLbEpmcC9pbVRZcApFMFJIYXAxVklEelltL0VETXJyYVFLRno2b09odDBTbURwa0JtK1M4Zjc0VGxIN0twaDUyZ0RZOWhBYUxNeVpsYmNwK252NGZqRmc0CmV4cURzUSs4RnhHNzVnYk1ZL3FCOG9GTTJnc1FhNkg2MVNpbHp3WkFGdjk3ZlJoZU9SS2tVNTUrTWtJUXBpR1JxUnhPRjN5RXZKK00KMGVqZjVsRzVOa2Mva0xuSHZBTGNXeHhQRGtqQkpZT2NDaitlc1FNekVob25yUGNpYkNUUkFVSDRXQVArSldnaUg1cGFQSHhzbm5WSQo4NEh4Wm1kdVRJTEE3cnBYRGhqdkxwcjNFdGlnYStrRnBhSHBhUGk4VEQ4U0hrWG9Vc0NqdnhJbmVibk1NVHpEOWpvaUZnT2d5WTltCnBGdWlUZGFCSlFicGRxUUFDajdMelRXYjRPRTR5MkJUaGloQ1FSeEVWK2lvcmF0RjR5VVF2TnMrWlVIN0c2YVhEK3U1ZEhuNUhyd2QKVncxSHI4TXZuNGRHcCtzbVdnOVdZN1ZpWUc0QSsrTW5FU0xuL3BtUE5QVzU2TU9SY3IzWXd4NjVMdktSUkZIUVY4ME1OTlZJSWIvYgpFL0ZtSlVOUzBuQWlOczJmeEJ4MUlLMWpjbU1HRHc0bnp0SnFEYnkxT1JycDBYWjYwVnprNTBsSkxWVTNhUEFhT3BnK1ZCZUhWT21tCkoxQ0pleUF2UC8rL29ZdEtSNWovSzN0SlBzTXBSbUFZUXFzektickFLYmtUaWRPSWlqbEJPOG45cHUwZjlHQmozOUl0VlFHTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZpVENDQTNHZ0F3SUJBZ0lRYjc3YXJYTzlDRURpaTAyKzFQZGJrVEFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUcKRXdKVlV6RVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1TVXdJd1lEVlFRRERCeFRVMHd1WTI5dElGUk1VeUJTVTBFZwpVbTl2ZENCRFFTQXlNREl5TUI0WERUSXlNRGd5TlRFMk16UXlNbG9YRFRRMk1EZ3hPVEUyTXpReU1Wb3dUakVMTUFrR0ExVUVCaE1DClZWTXhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRWxNQ01HQTFVRUF3d2NVMU5NTG1OdmJTQlVURk1nVWxOQklGSnYKYjNRZ1EwRWdNakF5TWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTkNrQ1hKUFFJZ1NZVDQxSTU3dQo5blRQTDN0WVBjNDhEUkFva0MrWDk0eEkyS0RZSmJGTXNCRk1GM05RMENKS1k3dUIweWx1MWJVSlBpWVlmN0lTZjVPWXQ2L3dOci95CjdoaWVuRHRTeFVjWlhYVHpaR2JWWGNkb3RMOGJIQWFqdkk5QUk3WWV4b1M5VWNRYk9jR1YwaW5zUzY1N0xiODUvYlJpM3BaN1FjYWMKb09BR2N2dndCNWNKT1lGMHIvYzBXUkZYQ3NKYndTVDBNWE13Z3NhZHVnTDNQbnhFWDRNTjgvSGRJR2tXQ1ZEaTFGVzI0SUJ5ZG01TQpSN2QxVlZtMFUzVFpsTVpCclZpS01XWVBIcUliS1VCT0w5OTc1aFlzTGZ5LzdQTzArcjRZOXB0SjFPNEZidGswODV6eDdBR0wwU0RHCkQ2QzF2QmRPU0h0Und2enBYR2szUjJhemFQZ1ZLUEM1MDZRVnpGcFB1bEp3b3hKRjNjYTZUdnZDMFBlb1VpZHRibm0xalB4N2pNRVcKVE82QWY3N3dkcjVCVXhJenJsbzRRcXZYRHo1QmpYWUhNdFdyaWZaT1o5bXhRblVqYnZQTlFyTDhWZlZUaHhjN3dETlk4VkxTK1lDawo4T2p3TzRzNHpLVEdrSDhQblAyTDBhUFAyb09uYWNsUU50VmNCZElLUVhUYll4RTN3YVdnbGtzZWpCWVNkNjZVTkhzZWY4Sm1BT1NxCmcrcUtrSzNPTmtSTjBWSHB2Qi96YWdYOXdIUWZKUmxBVVc3cWdsRkEzNXU1Q0NvR0F0VWpIQlBXNmR2YnhyQjZ5M3NubS92ZzFVWWsKN1JCTFkwdWxCWSs2dUIwcnB2cVI0cEpTdmV6clo1ZHRtaTJmZ1RJRlp6TDdTQWcvMlNXNEJDVXZBZ01CQUFHall6QmhNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVSt5NDM3dU9FZWljdXpSazFzVE44LzlSRVFya3dIUVlEVlIwT0JCWUVGUHN1Ck4rN2poSG9uTHMwWk5iRXpmUC9VUkVLNU1BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQWpZbHQKaEVVWThVK3pvTzlvcE1BZHJEQzhaMmF3bXMyMnF5SVpadE03UWJVUW5SQzZjbTRwSkNBY0FabGkwNWJnNHZzTVF0ZmhXc1NXVFZUTgpqOHBEVS8wcXVPcjRaY29Cd3ExZ2FBYWZPUnBSMmVDTkp2a0xUcVZUSlhvanBCek9DQnZmUjRpeXJUN2dKNGVMU1l3ZnFVZFllNWJ5CmlCMFlyclBScGdxVSt0dlQ1VGdLYTNrU00vdEtXVGNXUUE2NzN2V0pEUEZzMC9kUmExNDE5ZHZBSnVvU2MwNnBrWkNtRjhOc0x6alUKbzNLVVF5eGk0VTVjTWoyOVRIMFpSNkxEU2VlV1A0K2EwenZrRWRpTEE5ejJ0bUJWR0thQlVmUGhxQlZxNitBTDhCUXgxcm1NUlRxbwpFTmp3dVNmcjk4dDY3d1Z5bHJYRWo1Wnp4T2hXYzV5OGFWRmp2TzluSEVNYVgzY1pIeGo0SENVcCtVbVpLYmFTUGFLRE43RWdrYWliCk1PbHFiTFFqazJVRXF4SHpEaDFUSkVsVEhhRS9uVWlTRWVKOURVLzExNzJpV0Q1NG5SNGZLLzRodXhvVHRyRW9aUDJ3QWdESGJJQ2kKdlJaUUlBOXlnVi9NbFArN21lYTZrTXZxK2NZTXdxN0ZHYzR6b1d0Y3UzNThORmNYcmZBL3JzM3FyNW5zTEZSK2pNNHVFbFpJN3hjNwpQMHBlWU5MY2REYThwVU5qeXc5Ym93SldDWjRrTE9HR2dZeitxeGNzK3NqaU1obzYvNFVJeVlPZjhrcElFRlIzTisyaXZFQys1QkIwCjkrUmJ1N256aWZtUFFkakg1RkNRTllBK0hMaE5rTlBVOThPd29YNkV5bmVTTVN5NGtMR0NlblJPbXhNbXROVlFabFI0cm1BPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNPakNDQWNDZ0F3SUJBZ0lRRkFQMXEvczNpeGRBVytKRHNxWFJ4REFLQmdncWhrak9QUVFEQXpCT01Rc3dDUVlEVlFRR0V3SlYKVXpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVNVd0l3WURWUVFEREJ4VFUwd3VZMjl0SUZSTVV5QkZRME1nVW05dgpkQ0JEUVNBeU1ESXlNQjRYRFRJeU1EZ3lOVEUyTXpNME9Gb1hEVFEyTURneE9URTJNek0wTjFvd1RqRUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFbE1DTUdBMVVFQXd3Y1UxTk1MbU52YlNCVVRGTWdSVU5ESUZKdmIzUWcKUTBFZ01qQXlNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJFVXBOWFA2d3JnanpoUjlxTEZOb0ZzMjdpb3NVOE5nQ1RXeQpKR1ltYWNDemxkWmRra0FaRHNhbEUzRDA3eEpSS0YzbnpMMzVQSVhCejVTUXlTdk9ra0pZV1dmOWxDY1FaSXhQQkxGTlNlUjdUNXYxCjV3ajRBNGozcDhPU1N4bFVnYU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCU0pqeStqNkN1Z0ZGUjcKODFhNEpsOW5PQXVjMERBZEJnTlZIUTRFRmdRVWlZOHZvK2dyb0JSVWUvTld1Q1pmWnpnTG5OQXdEZ1lEVlIwUEFRSC9CQVFEQWdHRwpNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRlhqSWxicDE1SWtXRThlbERJUERBSTJ3djJzZERKTzRmc2NnSWlqelB2WDZ5di9OMzN3CjdkZWVkV28xZGxKRjRBSXhBTWVOYjBJZ2o3NjJUVm50ZDAwcHhDQWdSV1NHT2xER3hLMHRrL1VZZlhMdHFjL0VyRmMyS0FobDN6eDUKWm42ZzZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQXRvcyBUcnVzdGVkUm9vdCBSb290IENBIEVDQyBUTFMgMjAyMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDRlRDQ0FadWdBd0lCQWdJUVBaZzdwbVk5a0dQM2ZpWlhPQVR2QURBS0JnZ3Foa2pPUFFRREF6Qk1NUzR3TEFZRFZRUUREQ1ZCCmRHOXpJRlJ5ZFhOMFpXUlNiMjkwSUZKdmIzUWdRMEVnUlVORElGUk1VeUF5TURJeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzd0NRWUQKVlFRR0V3SkVSVEFlRncweU1UQTBNakl3T1RJMk1qTmFGdzAwTVRBME1UY3dPVEkyTWpKYU1Fd3hMakFzQmdOVkJBTU1KVUYwYjNNZwpWSEoxYzNSbFpGSnZiM1FnVW05dmRDQkRRU0JGUTBNZ1ZFeFRJREl3TWpFeERUQUxCZ05WQkFvTUJFRjBiM014Q3pBSkJnTlZCQVlUCkFrUkZNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWxvWllLRGNLWjlDZzNpUVpHZUhrQlFjZmwrM29aSUs1OXNSeFVNNksKRFAvWHRYYTdvV3lUYklPaWFHNmwyYjRzaUpWQnpWM2RzY3FEWTRQTXdMNTAyZUNkcE81S1RsYmdtQ2xCazFJUTFTUTRBakpuOFpRUwpiKy9YeGQ0dS9SbUFvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSMktDWFdmZUJtbW5vSnNtbzdqalBYCk50TlBvakFPQmdOVkhROEJBZjhFQkFNQ0FZWXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdXNWtwODV3eHRvbHJiTmE5ZCtGODUxRisKdURyTm96WmZmUGM4ZHo3a1VLMm81OUpaRENhT01EdHVDQ3JDcDFySUFqRUFtZU1NNTZQRHI5TkpMa2FDSTJaZHlRQVVFdjA0OU9HWQphM2NwZXRza3oyVkF2OUxjakJIbzlIMS9JSVNwUXVRbwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaRENDQTB5Z0F3SUJBZ0lRVTlYUDVobVRDL3NyQlJMWXdpcWlwREFOQmdrcWhraUc5dzBCQVF3RkFEQk1NUzR3TEFZRFZRUUQKRENWQmRHOXpJRlJ5ZFhOMFpXUlNiMjkwSUZKdmIzUWdRMEVnVWxOQklGUk1VeUF5TURJeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzdwpDUVlEVlFRR0V3SkVSVEFlRncweU1UQTBNakl3T1RJeE1UQmFGdzAwTVRBME1UY3dPVEl4TURsYU1Fd3hMakFzQmdOVkJBTU1KVUYwCmIzTWdWSEoxYzNSbFpGSnZiM1FnVW05dmRDQkRRU0JTVTBFZ1ZFeFRJREl3TWpFeERUQUxCZ05WQkFvTUJFRjBiM014Q3pBSkJnTlYKQkFZVEFrUkZNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXRvQU94SG05Qll4OXNLT2RUU0pOeS9CQgpsMDFaNE5IK1ZveVg4dGU5ajJ5M0k0OWYxY1RZUWN2eUFoNXg1ZW4yWHNzSUtsNHc4aTFteDRRYlpGYzRuWFV0VnNZdlllK1cvQ0JHCnZldlVlejgvZkVjNEJLa2JxbExmRXpmVEZSVk92Vjk4cjYxangzbmNDSHZWb09YM1czV3NnRldaa21HYnpTb1hmZHVQOUxWcTZoZEsKWkNobUZTbHNBdkZyMWJxak05eGFaNmNGNHI5bHRoYXdFTzNOVURQSmNGRHNHWTZ3eC9KMFcydEV4bjJXdVpnSVdXYmVLUUdiOUNwdAoweFU2a0dwbjhiUnJadGtoNjhyWllueEdFRnplZFVsbm5rTDUvbldwbzYzL2RncG5RT1BGOTQzSGhacFpubUthYXUxRmg1aG5zdFZLClBOZTBPd0FOd0k4ZjRVREVybXdoM0VsK2ZzcXlqVzIydjVNdm9WdytqOHJ0Z0k1WTRkdFh6NFUyT0xKeHBBbU1rb2tJaUVqeFFHTVkKc2x1TVd1UEQweGVxcXhtakxCdmsxY2JpWm5yWGdobW1PeFlzTDNHSFgwV2VsWE9Ud2tLQklST1cxNTI3azJnVitwMmtIWXp5Z2VCWQpCcjNKdHVQMmlWMkorYXhFb2N0citoYnh4MUE5Sk5yM3crU0gxVmJ4VDVBdytrVUpXZG8wenVBVEhBUjhBTlNiaHFSQXZObmNURmQrCnJyY3p0bDUyNFdXTFp0K055dGVZcjg0Mm1JeWNnNWtEY1BPdmRPM0dEamJudmV6QmM2ZVVXc3VTWklLbUFNRndvVzRzS2VGWVYreGEKZkpsckphU1FPb0QwSUoyYXpzY3QrYkpMS1pXRDZUV05wMGxJcHc5TUdaSFE5YjhRNEhFQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVkRW1aMGYrMGVtaEZkY04rdE56TXpqa3oyZ2d3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHCkNTcUdTSWIzRFFFQkRBVUFBNElDQVFBalExTWtZbHh0L1Q3Q3oxVUFiTVZXaUxrTzNUcmlKUTJWU3BmS2dJbnVLczFsK05zVzRBbVMKNEJqSGVKaTc4K3hDVXZ1cHBJTFhUZGlLL09STy9hdVF4RGgxTW9TZi83T3dLd0l6TnNBUWtHOGRuSy9oYVpQc28wVXZGSi8xVENwbApRM0lNOThQNGxZc1U4NFVnWXQxVVU5MHMzQmlWYVUrRFIzQkFNMWgzRWd5aTYxSXhIa3pKcU03Rjc4UFJyZUJyQXdBMEpyUlVJVFdYCkFkeGZHL0Y4NTFYNkxXaDNlOU5wek5NT2E3cE5ka1RXd2hXYUp1eXd4Zlc3MFhwMHdtek54YlZlOWt6bVd5MkIyN08zT3BlZTdjOUcKc2xBOWhHQ1pjYlV6dFZkRjVrSkhkV29Pc0FnTXJyM2U5N3NQV0QyUEF6SG9QWUpReWk5ZURGMjBsNzRnTkFmMHhCTGg3dGV3MlZrdAphZmN4QlBUeSthdjVFekg0QVhjT1BVSWpKc3lhY21kUklYck1QSVdvNmlGcU85dGFQS1UwbnByQUxOK0FuQ25nMzNlVTBhS0FRdjlxClRGc1IwUFhOb3I2dXpGRmN3OVZVZXd5dTFya0dkNERpN3djYWFNeFpVYTErWEdkcnVkdmlCMEpidUFFRldEbE41THVZbzdFeTdObWoKMW0rVUkvODd0eWxsNWdmcDc3WVo2dWZDT0IweWlKQThFeXR1ek8rcmR3WTBkNFJQY3VTQmhQbTVkRFRlZGsrU0tsT3hKVG5iUFAvbApQcVlPNVd1ZS85dnNMM1NEMzQ2MHM2bmVGRTMvTWFORmN5VDZsU25NRXBjRW9qaTJqYkR3Ti96SUlYOC9zeVFiUFl0dXpFMndGZzJXCkhZTWZSc0NidlVPWjU4U1dMczVmeVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2FCdW5kbGU7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBocFByb2Nlc3M7CgoKCgoKY2xhc3MgQ2FCdW5kbGUKewoKcHJpdmF0ZSBzdGF0aWMgJGNhUGF0aDsKCnByaXZhdGUgc3RhdGljICRjYUZpbGVWYWxpZGl0eSA9IGFycmF5KCk7Cgpwcml2YXRlIHN0YXRpYyAkdXNlT3BlbnNzbFBhcnNlOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3lzdGVtQ2FSb290QnVuZGxlUGF0aChMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKaWYgKHNlbGY6OiRjYVBhdGggIT09IG51bGwpIHsKcmV0dXJuIHNlbGY6OiRjYVBhdGg7Cn0KJGNhQnVuZGxlUGF0aHMgPSBhcnJheSgpOwoKCgokY2FCdW5kbGVQYXRoc1tdID0gc2VsZjo6Z2V0RW52VmFyaWFibGUoJ1NTTF9DRVJUX0ZJTEUnKTsKCgoKJGNhQnVuZGxlUGF0aHNbXSA9IHNlbGY6OmdldEVudlZhcmlhYmxlKCdTU0xfQ0VSVF9ESVInKTsKCiRjYUJ1bmRsZVBhdGhzW10gPSBpbmlfZ2V0KCdvcGVuc3NsLmNhZmlsZScpOwokY2FCdW5kbGVQYXRoc1tdID0gaW5pX2dldCgnb3BlbnNzbC5jYXBhdGgnKTsKCiRvdGhlckxvY2F0aW9ucyA9IGFycmF5KAonL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQnLCAKJy9ldGMvc3NsL2NhLWJ1bmRsZS5wZW0nLCAKJy91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC1uc3MuY3J0JywgCicvdXNyL3NzbC9jZXJ0cy9jYS1idW5kbGUuY3J0JywgCicvb3B0L2xvY2FsL3NoYXJlL2N1cmwvY3VybC1jYS1idW5kbGUuY3J0JywgCicvdXNyL2xvY2FsL3NoYXJlL2N1cmwvY3VybC1jYS1idW5kbGUuY3J0JywgCicvdXNyL3NoYXJlL3NzbC9jZXJ0cy9jYS1idW5kbGUuY3J0JywgCicvZXRjL3NzbC9jZXJ0LnBlbScsIAonL3Vzci9sb2NhbC9ldGMvc3NsL2NlcnQucGVtJywgCicvdXNyL2xvY2FsL2V0Yy9vcGVuc3NsL2NlcnQucGVtJywgCicvdXNyL2xvY2FsL2V0Yy9vcGVuc3NsQDEuMS9jZXJ0LnBlbScsIAopOwoKZm9yZWFjaCgkb3RoZXJMb2NhdGlvbnMgYXMgJGxvY2F0aW9uKSB7CiRvdGhlckxvY2F0aW9uc1tdID0gZGlybmFtZSgkbG9jYXRpb24pOwp9CgokY2FCdW5kbGVQYXRocyA9IGFycmF5X21lcmdlKCRjYUJ1bmRsZVBhdGhzLCAkb3RoZXJMb2NhdGlvbnMpOwoKZm9yZWFjaCAoJGNhQnVuZGxlUGF0aHMgYXMgJGNhQnVuZGxlKSB7CmlmICgkY2FCdW5kbGUgJiYgc2VsZjo6Y2FGaWxlVXNhYmxlKCRjYUJ1bmRsZSwgJGxvZ2dlcikpIHsKcmV0dXJuIHNlbGY6OiRjYVBhdGggPSAkY2FCdW5kbGU7Cn0KCmlmICgkY2FCdW5kbGUgJiYgc2VsZjo6Y2FEaXJVc2FibGUoJGNhQnVuZGxlLCAkbG9nZ2VyKSkgewpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9ICRjYUJ1bmRsZTsKfQp9CgpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9IHN0YXRpYzo6Z2V0QnVuZGxlZENhQnVuZGxlUGF0aCgpOyAKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QnVuZGxlZENhQnVuZGxlUGF0aCgpCnsKJGNhQnVuZGxlRmlsZSA9IF9fRElSX18uJy8uLi9yZXMvY2FjZXJ0LnBlbSc7CgoKCmlmICgwID09PSBzdHJwb3MoJGNhQnVuZGxlRmlsZSwgJ3BoYXI6Ly8nKSkgewokdGVtcENhQnVuZGxlRmlsZSA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnb3BlbnNzbC1jYS1idW5kbGUtJyk7CmlmIChmYWxzZSA9PT0gJHRlbXBDYUJ1bmRsZUZpbGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgdGhlIGJ1bmRsZWQgQ0EgZmlsZScpOwp9CgpmaWxlX3B1dF9jb250ZW50cygKJHRlbXBDYUJ1bmRsZUZpbGUsCmZpbGVfZ2V0X2NvbnRlbnRzKCRjYUJ1bmRsZUZpbGUpCik7CgpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihmdW5jdGlvbigpIHVzZSAoJHRlbXBDYUJ1bmRsZUZpbGUpIHsKQHVubGluaygkdGVtcENhQnVuZGxlRmlsZSk7Cn0pOwoKJGNhQnVuZGxlRmlsZSA9ICR0ZW1wQ2FCdW5kbGVGaWxlOwp9CgpyZXR1cm4gJGNhQnVuZGxlRmlsZTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlQ2FGaWxlKCRmaWxlbmFtZSwgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CnN0YXRpYyAkd2FybmVkID0gZmFsc2U7CgppZiAoaXNzZXQoc2VsZjo6JGNhRmlsZVZhbGlkaXR5WyRmaWxlbmFtZV0pKSB7CnJldHVybiBzZWxmOjokY2FGaWxlVmFsaWRpdHlbJGZpbGVuYW1lXTsKfQoKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsKCgoKaWYgKCFzdGF0aWM6OmlzT3BlbnNzbFBhcnNlU2FmZSgpKSB7CmlmICghJHdhcm5lZCAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPndhcm5pbmcoc3ByaW50ZigKJ1lvdXIgdmVyc2lvbiBvZiBQSFAsICVzLCBpcyBhZmZlY3RlZCBieSBDVkUtMjAxMy02NDIwIGFuZCBjYW5ub3Qgc2FmZWx5IHBlcmZvcm0gY2VydGlmaWNhdGUgdmFsaWRhdGlvbiwgd2Ugc3Ryb25nbHkgc3VnZ2VzdCB5b3UgdXBncmFkZS4nLApQSFBfVkVSU0lPTgopKTsKJHdhcm5lZCA9IHRydWU7Cn0KCiRpc1ZhbGlkID0gIWVtcHR5KCRjb250ZW50cyk7Cn0gZWxzZWlmIChpc19zdHJpbmcoJGNvbnRlbnRzKSAmJiBzdHJsZW4oJGNvbnRlbnRzKSA+IDApIHsKJGNvbnRlbnRzID0gcHJlZ19yZXBsYWNlKCIvXihcXC0rKD86QkVHSU58RU5EKSlcXHMrVFJVU1RFRFxccysoQ0VSVElGSUNBVEVcXC0rKVwkL20iLCAnJDEgJDInLCAkY29udGVudHMpOwppZiAobnVsbCA9PT0gJGNvbnRlbnRzKSB7CgokaXNWYWxpZCA9IGZhbHNlOwp9IGVsc2UgewokaXNWYWxpZCA9IChib29sKSBvcGVuc3NsX3g1MDlfcGFyc2UoJGNvbnRlbnRzKTsKfQp9IGVsc2UgewokaXNWYWxpZCA9IGZhbHNlOwp9CgppZiAoJGxvZ2dlcikgewokbG9nZ2VyLT5kZWJ1ZygnQ2hlY2tlZCBDQSBmaWxlICcucmVhbHBhdGgoJGZpbGVuYW1lKS4nOiAnLigkaXNWYWxpZCA/ICd2YWxpZCcgOiAnaW52YWxpZCcpKTsKfQoKcmV0dXJuIHNlbGY6OiRjYUZpbGVWYWxpZGl0eVskZmlsZW5hbWVdID0gJGlzVmFsaWQ7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc09wZW5zc2xQYXJzZVNhZmUoKQp7CmlmIChudWxsICE9PSBzZWxmOjokdXNlT3BlbnNzbFBhcnNlKSB7CnJldHVybiBzZWxmOjokdXNlT3BlbnNzbFBhcnNlOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNTA2MDApIHsKcmV0dXJuIHNlbGY6OiR1c2VPcGVuc3NsUGFyc2UgPSB0cnVlOwp9CgoKCgoKaWYgKAooUEhQX1ZFUlNJT05fSUQgPCA1MDQwMCAmJiBQSFBfVkVSU0lPTl9JRCA+PSA1MDMyOCkKfHwgKFBIUF9WRVJTSU9OX0lEIDwgNTA1MDAgJiYgUEhQX1ZFUlNJT05fSUQgPj0gNTA0MjMpCnx8IFBIUF9WRVJTSU9OX0lEID49IDUwNTA3CikgewoKcmV0dXJuIHNlbGY6OiR1c2VPcGVuc3NsUGFyc2UgPSB0cnVlOwp9CgppZiAoZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CgpyZXR1cm4gc2VsZjo6JHVzZU9wZW5zc2xQYXJzZSA9IGZhbHNlOwp9CgokY29tcGFyZURpc3Ryb1ZlcnNpb25QcmVmaXggPSBmdW5jdGlvbiAoJHByZWZpeCwgJGZpeGVkVmVyc2lvbikgewokcmVnZXggPSAne14nLnByZWdfcXVvdGUoJHByZWZpeCkuJyhbMC05XSspJH0nOwoKaWYgKHByZWdfbWF0Y2goJHJlZ2V4LCBQSFBfVkVSU0lPTiwgJG0pKSB7CnJldHVybiAoKGludCkgJG1bMV0pID49ICRmaXhlZFZlcnNpb247Cn0KCnJldHVybiBmYWxzZTsKfTsKCgppZiAoCiRjb21wYXJlRGlzdHJvVmVyc2lvblByZWZpeCgnNS4zLjMtNytzcXVlZXplJywgMTgpIAp8fCAkY29tcGFyZURpc3Ryb1ZlcnNpb25QcmVmaXgoJzUuNC40LTE0K2RlYjd1JywgNykgCnx8ICRjb21wYXJlRGlzdHJvVmVyc2lvblByZWZpeCgnNS4zLjEwLTF1YnVudHUzLicsIDkpIAopIHsKcmV0dXJuIHNlbGY6OiR1c2VPcGVuc3NsUGFyc2UgPSB0cnVlOwp9CgoKaWYgKCFjbGFzc19leGlzdHMoJ1N5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGhwUHJvY2VzcycpKSB7CnJldHVybiBzZWxmOjokdXNlT3BlbnNzbFBhcnNlID0gZmFsc2U7Cn0KCgoKCgoKCgoKCiRjZXJ0ID0gJ0xTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVZ3UkVORFFUUjVaMEYzU1VKQlowbEtRVXA2ZFRoeU5uVTJaVUpqVFVFd1IwTlRjVWRUU1dJelJGRkZRa0pSVlVGTlNVaEVUVkZ6ZDBOUldVUUtWbEZSUjBWM1NrVlNWRVZqVFVKdlIwRXhWVVZEUVhkVVZHMDVlVnBJU205YVYyeDFURlprYkdNelVtMVpWM2hzWW1wRlVVMUJORWRCTVZWRlFuZDNTQXBUT0U5RWQzSmFjMkpxUlZWTlFrbEhRVEZWUlVObmQweFZNbFp5WkVkc2RtSnJWbkJpYmsxNFNIcEJaRUpuVGxaQ1FYTk5SbXN4YUdKSGJHcGhWemt4Q21ONVFrUmFXRW93U1VaT2JGa3pVbkJpTWpSNFNWUkJaa0puVGxaQ1FVMU5SMGN4YUdKSGJHcGhWemt4WTNrMWVscFhkREJoVnpsMVdsZHNkV041TldzS1dsUkZjVTFEWjBkRFUzRkhVMGxpTTBSUlJVcEJVbGxpWXpOU2JGcHRSblZNYlZaNll6SldlVkZJVG14aE0xSndZakkxYkdGWE5YcE1iVkpzVFVoVldRcGFSRVUxVG5wQmQwMVVRWGhOUkVGM1RVUkJkMWRuUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJDa0ZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUVLUVVGQlFVRkJRVmhFVkVVd1RWUkZlVTlFUlhoTmVtdDZUbFp2ZDJkalRYaERla0ZLUW1kT1ZrSkJXVlJCYTFKR1RWSjNkMGRuV1VSV1VWRkpSRUpPVHdwaU0wcHJZMjFvYkdGWE5IUldNbFo2WkVkYWFHSkhWblZOVWtGM1JHZFpSRlpSVVVoRVFXUk1kelJRUTNSdGVIVk5VbEYzUldkWlJGWlJVVXRFUVhSVUNscFhkREJoVnpsMVVsZHNkV042UldaTlFqQkhRVEZWUlVOM2QxZFVWMFp6WVZkT2NHSXpWbnBKUlU1c1kyNVJaMVV5Vm1wa1IyeDJZbXBGYUUxQ09FY0tRVEZWUlVGM2QxbGlWMFp6WVZkT2NHSXpWbnBNYms1c1lUTlNjR0l5Tld4aFZ6VjZURzFTYkUxVGIzZExRVmxLUzI5YVNXaDJZMDVCVVd0Q1JtaDBlZ3BrUjFadFdWYzBkVnBZVG5wYVdFcEJZekpXY21SSGJIWmliVlp3WW01TmRWcEhWWGRuWjBWcFRVRXdSME5UY1VkVFNXSXpSRkZGUWtGUlZVRkJORWxDQ2tSM1FYZG5aMFZMUVc5SlFrRlJSRVJCWmpOb2JEZEtXVEJZWTBadWFYbEZTbkJUVTBSeGJqQlBjVUp5TmxGUU5qVjFjMHBRVW5Rdk9GQmhSRzl4UW5VS2QwVlpWQzlPWVNzMlpuTm5VR3BETUhWTE9VUmFaMWRuTW5SSVYxZHZZVzVUWW14QlRXOTZOVkJJTmxvclV6UlRTRkphTjJVeVpFUkphbEJxWkdocWFBb3diVXhuTWxWTlR6VjVjREJXTnprM1IyZHpPV3hPZERaS1VtWklPREZOVGpKdllsaFhjelJPZEhwMFRFMTFSRFpsWjNGd2NqaGtSR0p5TXpSaFQzTTRDbkJyWkhWcE5WVmhkMVJhYTNONU5YQk1VRWh4TldOTmFFWkhiVEEyZGpZMVEweHZNRll5VUdRNUswdEJiMnRRY2xCalRqVkxURXRsWW5vM2JVeHdhellLVTAxbFJWaFBTMUEwYVdSRmNYaDVVVGRQTjJaQ2RVaE5aV1J6VVdoMUszQnlXVE56YVROQ1ZYbExabEYwVURWRFdtNVlNbUp3TUhkTFNIaFlNVEpFV0FveGJtWkdTWFE1UkdKSGRraFVZM2xQZFU0cmJscE1VRUp0TTNaWGVHNTBlVWxKZGxaQlowMUNRVUZIYWxGcVFrRk5RV3RIUVRGVlpFVjNVVU5OUVVGM0NrVlJXVXBaU1ZwSlFWbGlORkZuUlVKQ1FWRkVRV2RsUVUxQmMwZEJNVlZrUkhkUlJVRjNTVVp2UkVGVVFtZE9Wa2hUVlVWRVJFRkxRbWRuY2tKblJVWUtRbEZqUkVGcVFVNUNaMnR4YUd0cFJ6bDNNRUpCVVZWR1FVRlBRMEZSUlVGSE1HWmFXVmxEVkdKa2FqRllXV01yTVZOdWIyRlFVaXQyU1RoRE9FTmhSQW80S3pCVldXaGtibmxWTkdkbllUQkNRV05FY2xrNVpUazBaVVZCZFRaYWNYbGpSalpHYWt4eFdGaGtRV0p2Y0hCWGIyTnlObFEyUjBReGVETXpRMnRzQ2xaQmNucEhMMHQ0VVc5b1IwUXlTbVZ4YTJoSlRXeEViMjE0U0U4M2EyRXpPU3RQWVRocE1uWlhURlo1YWxVNFFWcDJWMDFCY25WSVlUUkZSVTU1UnpjS2JGY3lRV0ZuWVVaTFJrTnlPVlJ1V0ZSbWNtUjRSMVpGWW5ZM1MxWlJObUprYUdjMWNEVlRhbkJYU0RFclRYRXdNM1ZTTTFwWVVFSlpaSGxXT0RNeE9RcHZNR3hXYWpGTFJra3lSRU5NTDJ4cFYybHpTbEp2YjJZck1XTlNNelZEZEdRd2QxbENZM0JDTmxSYWMyeE5ZMDlRYkRjMlpIZExkMHBuWlVwdk1sRm5DbHB6Wm0xak1uWkRNUzl4VDJ4T2RVNXhMekJVZW5wclZrZDJPRVZVVkRORFoyRlZLMVZZWlRSWVQxWjJhMk5qWldKS2JqSmtaejA5Q2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLJzsKJHNjcmlwdCA9IDw8PCdFT1QnCgplcnJvcl9yZXBvcnRpbmcoLTEpOwokaW5mbyA9IG9wZW5zc2xfeDUwOV9wYXJzZShiYXNlNjRfZGVjb2RlKCclcycpKTsKdmFyX2R1bXAoUEhQX1ZFUlNJT04sICRpbmZvWydpc3N1ZXInXVsnZW1haWxBZGRyZXNzJ10sICRpbmZvWyd2YWxpZEZyb21fdGltZV90J10pOwoKRU9UOwokc2NyaXB0ID0gJzwnLiI/cGhwXG4iLnNwcmludGYoJHNjcmlwdCwgJGNlcnQpOwoKdHJ5IHsKJHByb2Nlc3MgPSBuZXcgUGhwUHJvY2Vzcygkc2NyaXB0KTsKJHByb2Nlc3MtPm11c3RSdW4oKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKCnJldHVybiBzZWxmOjokdXNlT3BlbnNzbFBhcnNlID0gZmFsc2U7Cn0KCiRvdXRwdXQgPSBwcmVnX3NwbGl0KCd7XHI/XG59JywgdHJpbSgkcHJvY2Vzcy0+Z2V0T3V0cHV0KCkpKTsKJGVycm9yT3V0cHV0ID0gdHJpbSgkcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7CgppZiAoCmlzX2FycmF5KCRvdXRwdXQpCiYmIGNvdW50KCRvdXRwdXQpID09PSAzCiYmICRvdXRwdXRbMF0gPT09IHNwcmludGYoJ3N0cmluZyglZCkgIiVzIicsIHN0cmxlbihQSFBfVkVSU0lPTiksIFBIUF9WRVJTSU9OKQomJiAkb3V0cHV0WzFdID09PSAnc3RyaW5nKDI3KSAic3RlZmFuLmVzc2VyQHNla3Rpb25laW5zLmRlIicKJiYgJG91dHB1dFsyXSA9PT0gJ2ludCgtMSknCiYmIHByZWdfbWF0Y2goJ3tvcGVuc3NsX3g1MDlfcGFyc2VcKFwpOiBpbGxlZ2FsICg/OkFTTjEgZGF0YSB0eXBlIGZvcnxsZW5ndGggaW4pIHRpbWVzdGFtcCBpbiAtIG9uIGxpbmUgXGQrfScsICRlcnJvck91dHB1dCkKKSB7CgpyZXR1cm4gc2VsZjo6JHVzZU9wZW5zc2xQYXJzZSA9IHRydWU7Cn0KCnJldHVybiBzZWxmOjokdXNlT3BlbnNzbFBhcnNlID0gZmFsc2U7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc2V0KCkKewpzZWxmOjokY2FGaWxlVmFsaWRpdHkgPSBhcnJheSgpOwpzZWxmOjokY2FQYXRoID0gbnVsbDsKc2VsZjo6JHVzZU9wZW5zc2xQYXJzZSA9IG51bGw7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRFbnZWYXJpYWJsZSgkbmFtZSkKewppZiAoaXNzZXQoJF9TRVJWRVJbJG5hbWVdKSkgewpyZXR1cm4gKHN0cmluZykgJF9TRVJWRVJbJG5hbWVdOwp9CgppZiAoUEhQX1NBUEkgPT09ICdjbGknICYmICgkdmFsdWUgPSBnZXRlbnYoJG5hbWUpKSAhPT0gZmFsc2UgJiYgJHZhbHVlICE9PSBudWxsKSB7CnJldHVybiAoc3RyaW5nKSAkdmFsdWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYUZpbGVVc2FibGUoJGNlcnRGaWxlLCBMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKcmV0dXJuICRjZXJ0RmlsZQomJiBzdGF0aWM6OmlzRmlsZSgkY2VydEZpbGUsICRsb2dnZXIpCiYmIHN0YXRpYzo6aXNSZWFkYWJsZSgkY2VydEZpbGUsICRsb2dnZXIpCiYmIHN0YXRpYzo6dmFsaWRhdGVDYUZpbGUoJGNlcnRGaWxlLCAkbG9nZ2VyKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYURpclVzYWJsZSgkY2VydERpciwgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CnJldHVybiAkY2VydERpcgomJiBzdGF0aWM6OmlzRGlyKCRjZXJ0RGlyLCAkbG9nZ2VyKQomJiBzdGF0aWM6OmlzUmVhZGFibGUoJGNlcnREaXIsICRsb2dnZXIpCiYmIHN0YXRpYzo6Z2xvYigkY2VydERpciAuICcvKicsICRsb2dnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzRmlsZSgkY2VydEZpbGUsIExvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewokaXNGaWxlID0gQGlzX2ZpbGUoJGNlcnRGaWxlKTsKaWYgKCEkaXNGaWxlICYmICRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoc3ByaW50ZignQ2hlY2tlZCBDQSBmaWxlICVzIGRvZXMgbm90IGV4aXN0IG9yIGl0IGlzIG5vdCBhIGZpbGUuJywgJGNlcnRGaWxlKSk7Cn0KCnJldHVybiAkaXNGaWxlOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzRGlyKCRjZXJ0RGlyLCBMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJGlzRGlyID0gQGlzX2RpcigkY2VydERpcik7CmlmICghJGlzRGlyICYmICRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoc3ByaW50ZignQ2hlY2tlZCBkaXJlY3RvcnkgJXMgZG9lcyBub3QgZXhpc3Qgb3IgaXQgaXMgbm90IGEgZGlyZWN0b3J5LicsICRjZXJ0RGlyKSk7Cn0KCnJldHVybiAkaXNEaXI7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNSZWFkYWJsZSgkY2VydEZpbGVPckRpciwgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiRpc1JlYWRhYmxlID0gQGlzX3JlYWRhYmxlKCRjZXJ0RmlsZU9yRGlyKTsKaWYgKCEkaXNSZWFkYWJsZSAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoJ0NoZWNrZWQgZmlsZSBvciBkaXJlY3RvcnkgJXMgaXMgbm90IHJlYWRhYmxlLicsICRjZXJ0RmlsZU9yRGlyKSk7Cn0KCnJldHVybiAkaXNSZWFkYWJsZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnbG9iKCRwYXR0ZXJuLCBMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJGNlcnRzID0gZ2xvYigkcGF0dGVybik7CmlmICgkY2VydHMgPT09IGZhbHNlKSB7CmlmICgkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBmaW5kIGNlcnRpZmljYXRlcyBmb3IgcGF0dGVybjogJXMiLCAkcGF0dGVybikpOwp9CnJldHVybiBmYWxzZTsKfQoKaWYgKGNvdW50KCRjZXJ0cykgPT09IDApIHsKaWYgKCRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoc3ByaW50ZigiTm8gQ0EgZmlsZXMgZm91bmQgZm9yIHBhdHRlcm46ICVzIiwgJHBhdHRlcm4pKTsKfQpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KCkNvcHlyaWdodCAoQykgMjAyMiBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvcjsKCgoKCmNsYXNzIENsYXNzTWFwIGltcGxlbWVudHMgXENvdW50YWJsZQp7CgoKCnB1YmxpYyAkbWFwID0gW107CgoKCgpwcml2YXRlICRhbWJpZ3VvdXNDbGFzc2VzID0gW107CgoKCgpwcml2YXRlICRwc3JWaW9sYXRpb25zID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXAoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPm1hcDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHNyVmlvbGF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHNyVmlvbGF0aW9uczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFtYmlndW91c0NsYXNzZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFtYmlndW91c0NsYXNzZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0KCk6IHZvaWQKewprc29ydCgkdGhpcy0+bWFwKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5tYXBbJGNsYXNzTmFtZV0gPSAkcGF0aDsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc1BhdGgoc3RyaW5nICRjbGFzc05hbWUpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT5tYXBbJGNsYXNzTmFtZV0pKSB7CnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ0NsYXNzICcuJGNsYXNzTmFtZS4nIGlzIG5vdCBwcmVzZW50IGluIHRoZSBtYXAnKTsKfQoKcmV0dXJuICR0aGlzLT5tYXBbJGNsYXNzTmFtZV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPm1hcFskY2xhc3NOYW1lXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhZGRQc3JWaW9sYXRpb24oc3RyaW5nICR3YXJuaW5nKTogdm9pZAp7CiR0aGlzLT5wc3JWaW9sYXRpb25zW10gPSAkd2FybmluZzsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBbWJpZ3VvdXNDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5hbWJpZ3VvdXNDbGFzc2VzWyRjbGFzc05hbWVdW10gPSAkcGF0aDsKfQoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiBcY291bnQoJHRoaXMtPm1hcCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKCgoKY2xhc3MgQ2xhc3NNYXBHZW5lcmF0b3IKewoKCgpwcml2YXRlICRleHRlbnNpb25zOwoKCgoKcHJpdmF0ZSAkc2Nhbm5lZEZpbGVzID0gbnVsbDsKCgoKCnByaXZhdGUgJGNsYXNzTWFwOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRleHRlbnNpb25zID0gWydwaHAnLCAnaW5jJ10pCnsKJHRoaXMtPmV4dGVuc2lvbnMgPSAkZXh0ZW5zaW9uczsKJHRoaXMtPmNsYXNzTWFwID0gbmV3IENsYXNzTWFwOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF2b2lkRHVwbGljYXRlU2NhbnMoRmlsZUxpc3QgJHNjYW5uZWRGaWxlcyA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPnNjYW5uZWRGaWxlcyA9ICRzY2FubmVkRmlsZXMgPz8gbmV3IEZpbGVMaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlTWFwKCRwYXRoKTogYXJyYXkKewokZ2VuZXJhdG9yID0gbmV3IHNlbGYoKTsKCiRnZW5lcmF0b3ItPnNjYW5QYXRocygkcGF0aCk7CgpyZXR1cm4gJGdlbmVyYXRvci0+Z2V0Q2xhc3NNYXAoKS0+Z2V0TWFwKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc01hcCgpOiBDbGFzc01hcAp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXA7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2NhblBhdGhzKCRwYXRoLCBzdHJpbmcgJGV4Y2x1ZGVkID0gbnVsbCwgc3RyaW5nICRhdXRvbG9hZFR5cGUgPSAnY2xhc3NtYXAnLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsKTogdm9pZAp7CmlmICghaW5fYXJyYXkoJGF1dG9sb2FkVHlwZSwgWydwc3ItMCcsICdwc3ItNCcsICdjbGFzc21hcCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGF1dG9sb2FkVHlwZSBtdXN0IGJlIG9uZSBvZjogInBzci0wIiwgInBzci00IiBvciAiY2xhc3NtYXAiJyk7Cn0KCmlmICgnY2xhc3NtYXAnICE9PSAkYXV0b2xvYWRUeXBlKSB7CmlmICghaXNfc3RyaW5nKCRwYXRoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHBhdGggbXVzdCBiZSBhIHN0cmluZyB3aGVuIHNwZWNpZnlpbmcgYSBwc3ItMCBvciBwc3ItNCBhdXRvbG9hZCB0eXBlJyk7Cn0KaWYgKCFpc19zdHJpbmcoJG5hbWVzcGFjZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRuYW1lc3BhY2UgbXVzdCBiZSBnaXZlbiAoZXZlbiBpZiBpdCBpcyBhbiBlbXB0eSBzdHJpbmcgaWYgeW91IGRvIG5vdCB3YW50IHRvIGZpbHRlcikgd2hlbiBzcGVjaWZ5aW5nIGEgcHNyLTAgb3IgcHNyLTQgYXV0b2xvYWQgdHlwZScpOwp9CiRiYXNlUGF0aCA9ICRwYXRoOwp9CgppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewppZiAoaXNfZmlsZSgkcGF0aCkpIHsKJHBhdGggPSBbbmV3IFxTcGxGaWxlSW5mbygkcGF0aCldOwp9IGVsc2VpZiAoaXNfZGlyKCRwYXRoKSB8fCBzdHJwb3MoJHBhdGgsICcqJykgIT09IGZhbHNlKSB7CiRwYXRoID0gRmluZGVyOjpjcmVhdGUoKQotPmZpbGVzKCkKLT5mb2xsb3dMaW5rcygpCi0+bmFtZSgnL1wuKD86Jy5pbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgJHRoaXMtPmV4dGVuc2lvbnMpKS4nKSQvJykKLT5pbigkcGF0aCk7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ0NvdWxkIG5vdCBzY2FuIGZvciBjbGFzc2VzIGluc2lkZSAiJy4kcGF0aC4nIiB3aGljaCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBmaWxlIG5vciBhIGZvbGRlcicKKTsKfQp9CgokY3dkID0gcmVhbHBhdGgoc2VsZjo6Z2V0Q3dkKCkpOwoKZm9yZWFjaCAoJHBhdGggYXMgJGZpbGUpIHsKJGZpbGVQYXRoID0gJGZpbGUtPmdldFBhdGhuYW1lKCk7CmlmICghaW5fYXJyYXkocGF0aGluZm8oJGZpbGVQYXRoLCBQQVRISU5GT19FWFRFTlNJT04pLCAkdGhpcy0+ZXh0ZW5zaW9ucywgdHJ1ZSkpIHsKY29udGludWU7Cn0KCmlmICghc2VsZjo6aXNBYnNvbHV0ZVBhdGgoJGZpbGVQYXRoKSkgewokZmlsZVBhdGggPSAkY3dkIC4gJy8nIC4gJGZpbGVQYXRoOwokZmlsZVBhdGggPSBzZWxmOjpub3JtYWxpemVQYXRoKCRmaWxlUGF0aCk7Cn0gZWxzZSB7CiRmaWxlUGF0aCA9IFByZWc6OnJlcGxhY2UoJ3tbXFxcXC9dezIsfX0nLCAnLycsICRmaWxlUGF0aCk7Cn0KCmlmICgnJyA9PT0gJGZpbGVQYXRoKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0dvdCBhbiBlbXB0eSAkZmlsZVBhdGggZm9yICcuJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9CgokcmVhbFBhdGggPSByZWFscGF0aCgkZmlsZVBhdGgpOwoKCmlmIChmYWxzZSA9PT0gJHJlYWxQYXRoKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigncmVhbHBhdGggb2YgJy4kZmlsZVBhdGguJyBmYWlsZWQgdG8gcmVzb2x2ZSwgZ290IGZhbHNlJyk7Cn0KCgoKaWYgKCR0aGlzLT5zY2FubmVkRmlsZXMgIT09IG51bGwgJiYgJHRoaXMtPnNjYW5uZWRGaWxlcy0+Y29udGFpbnMoJHJlYWxQYXRoKSkgewpjb250aW51ZTsKfQoKCmlmIChudWxsICE9PSAkZXhjbHVkZWQgJiYgUHJlZzo6aXNNYXRjaCgkZXhjbHVkZWQsIHN0cnRyKCRyZWFsUGF0aCwgJ1xcJywgJy8nKSkpIHsKY29udGludWU7Cn0KCmlmIChudWxsICE9PSAkZXhjbHVkZWQgJiYgUHJlZzo6aXNNYXRjaCgkZXhjbHVkZWQsIHN0cnRyKCRmaWxlUGF0aCwgJ1xcJywgJy8nKSkpIHsKY29udGludWU7Cn0KCiRjbGFzc2VzID0gUGhwRmlsZVBhcnNlcjo6ZmluZENsYXNzZXMoJGZpbGVQYXRoKTsKaWYgKCdjbGFzc21hcCcgIT09ICRhdXRvbG9hZFR5cGUgJiYgaXNzZXQoJG5hbWVzcGFjZSkpIHsKJGNsYXNzZXMgPSAkdGhpcy0+ZmlsdGVyQnlOYW1lc3BhY2UoJGNsYXNzZXMsICRmaWxlUGF0aCwgJG5hbWVzcGFjZSwgJGF1dG9sb2FkVHlwZSwgJGJhc2VQYXRoKTsKCgppZiAoXGNvdW50KCRjbGFzc2VzKSA+IDAgJiYgJHRoaXMtPnNjYW5uZWRGaWxlcyAhPT0gbnVsbCkgewokdGhpcy0+c2Nhbm5lZEZpbGVzLT5hZGQoJHJlYWxQYXRoKTsKfQp9IGVsc2VpZiAoJHRoaXMtPnNjYW5uZWRGaWxlcyAhPT0gbnVsbCkgewoKJHRoaXMtPnNjYW5uZWRGaWxlcy0+YWRkKCRyZWFsUGF0aCk7Cn0KCmZvcmVhY2ggKCRjbGFzc2VzIGFzICRjbGFzcykgewppZiAoISR0aGlzLT5jbGFzc01hcC0+aGFzQ2xhc3MoJGNsYXNzKSkgewokdGhpcy0+Y2xhc3NNYXAtPmFkZENsYXNzKCRjbGFzcywgJGZpbGVQYXRoKTsKfSBlbHNlaWYgKCRmaWxlUGF0aCAhPT0gJHRoaXMtPmNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzKSAmJiAhUHJlZzo6aXNNYXRjaCgney8odGVzdHxmaXh0dXJlfGV4YW1wbGV8c3R1YilzPy99aScsIHN0cnRyKCR0aGlzLT5jbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzcykuJyAnLiRmaWxlUGF0aCwgJ1xcJywgJy8nKSkpIHsKJHRoaXMtPmNsYXNzTWFwLT5hZGRBbWJpZ3VvdXNDbGFzcygkY2xhc3MsICRmaWxlUGF0aCk7Cn0KfQp9Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbHRlckJ5TmFtZXNwYWNlKGFycmF5ICRjbGFzc2VzLCBzdHJpbmcgJGZpbGVQYXRoLCBzdHJpbmcgJGJhc2VOYW1lc3BhY2UsIHN0cmluZyAkbmFtZXNwYWNlVHlwZSwgc3RyaW5nICRiYXNlUGF0aCk6IGFycmF5CnsKJHZhbGlkQ2xhc3NlcyA9IFtdOwokcmVqZWN0ZWRDbGFzc2VzID0gW107CgokcmVhbFN1YlBhdGggPSBzdWJzdHIoJGZpbGVQYXRoLCBzdHJsZW4oJGJhc2VQYXRoKSArIDEpOwokZG90UG9zaXRpb24gPSBzdHJycG9zKCRyZWFsU3ViUGF0aCwgJy4nKTsKJHJlYWxTdWJQYXRoID0gc3Vic3RyKCRyZWFsU3ViUGF0aCwgMCwgJGRvdFBvc2l0aW9uID09PSBmYWxzZSA/IFBIUF9JTlRfTUFYIDogJGRvdFBvc2l0aW9uKTsKCmZvcmVhY2ggKCRjbGFzc2VzIGFzICRjbGFzcykgewoKaWYgKCcnICE9PSAkYmFzZU5hbWVzcGFjZSAmJiAwICE9PSBzdHJwb3MoJGNsYXNzLCAkYmFzZU5hbWVzcGFjZSkpIHsKY29udGludWU7Cn0KCmlmICgncHNyLTAnID09PSAkbmFtZXNwYWNlVHlwZSkgewokbmFtZXNwYWNlTGVuZ3RoID0gc3RycnBvcygkY2xhc3MsICdcXCcpOwppZiAoZmFsc2UgIT09ICRuYW1lc3BhY2VMZW5ndGgpIHsKJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRuYW1lc3BhY2VMZW5ndGggKyAxKTsKJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRuYW1lc3BhY2VMZW5ndGggKyAxKTsKJHN1YlBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKQouIHN0cl9yZXBsYWNlKCdfJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJGNsYXNzTmFtZSk7Cn0gZWxzZSB7CiRzdWJQYXRoID0gc3RyX3JlcGxhY2UoJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkY2xhc3MpOwp9Cn0gZWxzZWlmICgncHNyLTQnID09PSAkbmFtZXNwYWNlVHlwZSkgewokc3ViTmFtZXNwYWNlID0gKCcnICE9PSAkYmFzZU5hbWVzcGFjZSkgPyBzdWJzdHIoJGNsYXNzLCBzdHJsZW4oJGJhc2VOYW1lc3BhY2UpKSA6ICRjbGFzczsKJHN1YlBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkc3ViTmFtZXNwYWNlKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRuYW1lc3BhY2VUeXBlIG11c3QgYmUgInBzci0wIiBvciAicHNyLTQiJyk7Cn0KaWYgKCRzdWJQYXRoID09PSAkcmVhbFN1YlBhdGgpIHsKJHZhbGlkQ2xhc3Nlc1tdID0gJGNsYXNzOwp9IGVsc2UgewokcmVqZWN0ZWRDbGFzc2VzW10gPSAkY2xhc3M7Cn0KfQoKaWYgKFxjb3VudCgkdmFsaWRDbGFzc2VzKSA9PT0gMCkgewpmb3JlYWNoICgkcmVqZWN0ZWRDbGFzc2VzIGFzICRjbGFzcykgewokdGhpcy0+Y2xhc3NNYXAtPmFkZFBzclZpb2xhdGlvbigiQ2xhc3MgJGNsYXNzIGxvY2F0ZWQgaW4gIi5QcmVnOjpyZXBsYWNlKCd7XicucHJlZ19xdW90ZShzZWxmOjpnZXRDd2QoKSkuJ30nLCAnLicsICRmaWxlUGF0aCwgMSkuIiBkb2VzIG5vdCBjb21wbHkgd2l0aCAkbmFtZXNwYWNlVHlwZSBhdXRvbG9hZGluZyBzdGFuZGFyZC4gU2tpcHBpbmcuIik7Cn0KCnJldHVybiBbXTsKfQoKcmV0dXJuICR2YWxpZENsYXNzZXM7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBYnNvbHV0ZVBhdGgoc3RyaW5nICRwYXRoKQp7CnJldHVybiBzdHJwb3MoJHBhdGgsICcvJykgPT09IDAgfHwgc3Vic3RyKCRwYXRoLCAxLCAxKSA9PT0gJzonIHx8IHN0cnBvcygkcGF0aCwgJ1xcXFwnKSA9PT0gMDsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpCnsKJHBhcnRzID0gW107CiRwYXRoID0gc3RydHIoJHBhdGgsICdcXCcsICcvJyk7CiRwcmVmaXggPSAnJzsKJGFic29sdXRlID0gJyc7CgoKaWYgKHN0cnBvcygkcGF0aCwgJy8vJykgPT09IDAgJiYgXHN0cmxlbigkcGF0aCkgPiAyKSB7CiRhYnNvbHV0ZSA9ICcvLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAyKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiggWzAtOWEtel17Mix9KzogKD86IC8vICg/OiBbYS16XTogKT8gKT8gfCBbYS16XTogKX1peCcsICRwYXRoLCAkbWF0Y2gpKSB7CiRwcmVmaXggPSAkbWF0Y2hbMV07CiRwYXRoID0gc3Vic3RyKCRwYXRoLCBcc3RybGVuKCRwcmVmaXgpKTsKfQoKaWYgKHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCkgewokYWJzb2x1dGUgPSAnLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHVwID0gZmFsc2U7CmZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJGNodW5rKSB7CmlmICgnLi4nID09PSAkY2h1bmsgJiYgKFxzdHJsZW4oJGFic29sdXRlKSA+IDAgfHwgJHVwKSkgewphcnJheV9wb3AoJHBhcnRzKTsKJHVwID0gIShcY291bnQoJHBhcnRzKSA9PT0gMCB8fCAnLi4nID09PSBlbmQoJHBhcnRzKSk7Cn0gZWxzZWlmICgnLicgIT09ICRjaHVuayAmJiAnJyAhPT0gJGNodW5rKSB7CiRwYXJ0c1tdID0gJGNodW5rOwokdXAgPSAnLi4nICE9PSAkY2h1bms7Cn0KfQoKCiRwcmVmaXggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3soPzpefDovLylbYS16XTokfWknLCBmdW5jdGlvbiAoYXJyYXkgJG0pIHsgcmV0dXJuIHN0cnRvdXBwZXIoKHN0cmluZykgJG1bMF0pOyB9LCAkcHJlZml4KTsKCnJldHVybiAkcHJlZml4LiRhYnNvbHV0ZS5pbXBsb2RlKCcvJywgJHBhcnRzKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Q3dkKCk6IHN0cmluZwp7CiRjd2QgPSBnZXRjd2QoKTsKCmlmIChmYWxzZSA9PT0gJGN3ZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnknKTsKfQoKcmV0dXJuICRjd2Q7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7CgoKCgoKCmNsYXNzIEZpbGVMaXN0CnsKCgoKcHVibGljICRmaWxlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZChzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHRoaXMtPmZpbGVzWyRwYXRoXSA9IHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5maWxlc1skcGF0aF0pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgpjbGFzcyBQaHBGaWxlQ2xlYW5lcgp7Cgpwcml2YXRlIHN0YXRpYyAkdHlwZUNvbmZpZzsKCgpwcml2YXRlIHN0YXRpYyAkcmVzdFBhdHRlcm47CgoKCgoKcHJpdmF0ZSAkY29udGVudHM7CgoKCgoKcHJpdmF0ZSAkbGVuOwoKCgoKCnByaXZhdGUgJG1heE1hdGNoZXM7CgoKcHJpdmF0ZSAkaW5kZXggPSAwOwoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRUeXBlQ29uZmlnKGFycmF5ICR0eXBlcyk6IHZvaWQKewpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKc2VsZjo6JHR5cGVDb25maWdbJHR5cGVbMF1dID0gYXJyYXkoCiduYW1lJyA9PiAkdHlwZSwKJ2xlbmd0aCcgPT4gXHN0cmxlbigkdHlwZSksCidwYXR0ZXJuJyA9PiAney5cYig/PCFbXCQ6Pl0pJy4kdHlwZS4nXHMrK1thLXpBLVpfXHg3Zi1ceGZmOl1bYS16QS1aMC05X1x4N2YtXHhmZjpcLV0qK31BaXMnLAopOwp9CgpzZWxmOjokcmVzdFBhdHRlcm4gPSAne1tePyJcJzwvJy5pbXBsb2RlKCcnLCBhcnJheV9rZXlzKHNlbGY6OiR0eXBlQ29uZmlnKSkuJ10rfUEnOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRjb250ZW50cywgaW50ICRtYXhNYXRjaGVzKQp7CiR0aGlzLT5jb250ZW50cyA9ICRjb250ZW50czsKJHRoaXMtPmxlbiA9IFxzdHJsZW4oJHRoaXMtPmNvbnRlbnRzKTsKJHRoaXMtPm1heE1hdGNoZXMgPSAkbWF4TWF0Y2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFuKCk6IHN0cmluZwp7CiRjbGVhbiA9ICcnOwoKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKJHRoaXMtPnNraXBUb1BocCgpOwokY2xlYW4gLj0gJzw/JzsKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CiRjaGFyID0gJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF07CmlmICgkY2hhciA9PT0gJz8nICYmICR0aGlzLT5wZWVrKCc+JykpIHsKJGNsZWFuIC49ICc/Pic7CiR0aGlzLT5pbmRleCArPSAyOwpjb250aW51ZSAyOwp9CgppZiAoJGNoYXIgPT09ICciJykgewokdGhpcy0+c2tpcFN0cmluZygnIicpOwokY2xlYW4gLj0gJ251bGwnOwpjb250aW51ZTsKfQoKaWYgKCRjaGFyID09PSAiJyIpIHsKJHRoaXMtPnNraXBTdHJpbmcoIiciKTsKJGNsZWFuIC49ICdudWxsJzsKY29udGludWU7Cn0KCmlmICgkY2hhciA9PT0gIjwiICYmICR0aGlzLT5wZWVrKCc8JykgJiYgJHRoaXMtPm1hdGNoKCd7PDw8WyBcdF0qKyhbXCciXT8pKFthLXpBLVpfXHg4MC1ceGZmXVthLXpBLVowLTlfXHg4MC1ceGZmXSorKVxcMSg/OlxyXG58XG58XHIpfUEnLCAkbWF0Y2gpKSB7CiR0aGlzLT5pbmRleCArPSBcc3RybGVuKCRtYXRjaFswXSk7CiR0aGlzLT5za2lwSGVyZWRvYygkbWF0Y2hbMl0pOwokY2xlYW4gLj0gJ251bGwnOwpjb250aW51ZTsKfQoKaWYgKCRjaGFyID09PSAnLycpIHsKaWYgKCR0aGlzLT5wZWVrKCcvJykpIHsKJHRoaXMtPnNraXBUb05ld2xpbmUoKTsKY29udGludWU7Cn0KaWYgKCR0aGlzLT5wZWVrKCcqJykpIHsKJHRoaXMtPnNraXBDb21tZW50KCk7CmNvbnRpbnVlOwp9Cn0KCmlmICgkdGhpcy0+bWF4TWF0Y2hlcyA9PT0gMSAmJiBpc3NldChzZWxmOjokdHlwZUNvbmZpZ1skY2hhcl0pKSB7CiR0eXBlID0gc2VsZjo6JHR5cGVDb25maWdbJGNoYXJdOwppZiAoClxzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAkdGhpcy0+aW5kZXgsICR0eXBlWydsZW5ndGgnXSkgPT09ICR0eXBlWyduYW1lJ10KJiYgUHJlZzo6aXNNYXRjaCgkdHlwZVsncGF0dGVybiddLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgMCwgJHRoaXMtPmluZGV4IC0gMSkKKSB7CiRjbGVhbiAuPSAkbWF0Y2hbMF07CgpyZXR1cm4gJGNsZWFuOwp9Cn0KCiR0aGlzLT5pbmRleCArPSAxOwppZiAoJHRoaXMtPm1hdGNoKHNlbGY6OiRyZXN0UGF0dGVybiwgJG1hdGNoKSkgewokY2xlYW4gLj0gJGNoYXIgLiAkbWF0Y2hbMF07CiR0aGlzLT5pbmRleCArPSBcc3RybGVuKCRtYXRjaFswXSk7Cn0gZWxzZSB7CiRjbGVhbiAuPSAkY2hhcjsKfQp9Cn0KCnJldHVybiAkY2xlYW47Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcFRvUGhwKCk6IHZvaWQKewp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewppZiAoJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF0gPT09ICc8JyAmJiAkdGhpcy0+cGVlaygnPycpKSB7CiR0aGlzLT5pbmRleCArPSAyOwpicmVhazsKfQoKJHRoaXMtPmluZGV4ICs9IDE7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBza2lwU3RyaW5nKHN0cmluZyAkZGVsaW1pdGVyKTogdm9pZAp7CiR0aGlzLT5pbmRleCArPSAxOwp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewppZiAoJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF0gPT09ICdcXCcgJiYgKCR0aGlzLT5wZWVrKCdcXCcpIHx8ICR0aGlzLT5wZWVrKCRkZWxpbWl0ZXIpKSkgewokdGhpcy0+aW5kZXggKz0gMjsKY29udGludWU7Cn0KaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAkZGVsaW1pdGVyKSB7CiR0aGlzLT5pbmRleCArPSAxOwpicmVhazsKfQokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBDb21tZW50KCk6IHZvaWQKewokdGhpcy0+aW5kZXggKz0gMjsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAnKicgJiYgJHRoaXMtPnBlZWsoJy8nKSkgewokdGhpcy0+aW5kZXggKz0gMjsKYnJlYWs7Cn0KCiR0aGlzLT5pbmRleCArPSAxOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcFRvTmV3bGluZSgpOiB2b2lkCnsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXHIiIHx8ICR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXG4iKSB7CnJldHVybjsKfQokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBIZXJlZG9jKHN0cmluZyAkZGVsaW1pdGVyKTogdm9pZAp7CiRmaXJzdERlbGltaXRlckNoYXIgPSAkZGVsaW1pdGVyWzBdOwokZGVsaW1pdGVyTGVuZ3RoID0gXHN0cmxlbigkZGVsaW1pdGVyKTsKJGRlbGltaXRlclBhdHRlcm4gPSAneycucHJlZ19xdW90ZSgkZGVsaW1pdGVyKS4nKD8hW2EtekEtWjAtOV9ceDgwLVx4ZmZdKX1BJzsKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7Cgpzd2l0Y2ggKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdKSB7CmNhc2UgIlx0IjoKY2FzZSAiICI6CiR0aGlzLT5pbmRleCArPSAxOwpjb250aW51ZSAyOwpjYXNlICRmaXJzdERlbGltaXRlckNoYXI6CmlmICgKXHN1YnN0cigkdGhpcy0+Y29udGVudHMsICR0aGlzLT5pbmRleCwgJGRlbGltaXRlckxlbmd0aCkgPT09ICRkZWxpbWl0ZXIKJiYgJHRoaXMtPm1hdGNoKCRkZWxpbWl0ZXJQYXR0ZXJuKQopIHsKJHRoaXMtPmluZGV4ICs9ICRkZWxpbWl0ZXJMZW5ndGg7CgpyZXR1cm47Cn0KYnJlYWs7Cn0KCgp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewokdGhpcy0+c2tpcFRvTmV3bGluZSgpOwoKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuICYmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxyIiB8fCAkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxuIikpIHsKJHRoaXMtPmluZGV4ICs9IDE7Cn0KCmJyZWFrOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBwZWVrKHN0cmluZyAkY2hhcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmluZGV4ICsgMSA8ICR0aGlzLT5sZW4gJiYgJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleCArIDFdID09PSAkY2hhcjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRyZWdleCwgYXJyYXkgJiRtYXRjaCA9IG51bGwpOiBib29sCnsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJHJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgMCwgJHRoaXMtPmluZGV4KTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBQaHBGaWxlUGFyc2VyCnsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmluZENsYXNzZXMoc3RyaW5nICRwYXRoKTogYXJyYXkKewokZXh0cmFUeXBlcyA9IHNlbGY6OmdldEV4dHJhVHlwZXMoKTsKCgoKJGNvbnRlbnRzID0gQHBocF9zdHJpcF93aGl0ZXNwYWNlKCRwYXRoKTsKaWYgKCcnID09PSAkY29udGVudHMpIHsKaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKJG1lc3NhZ2UgPSAnRmlsZSBhdCAiJXMiIGRvZXMgbm90IGV4aXN0LCBjaGVjayB5b3VyIGNsYXNzbWFwIGRlZmluaXRpb25zJzsKfSBlbHNlaWYgKCFzZWxmOjppc1JlYWRhYmxlKCRwYXRoKSkgewokbWVzc2FnZSA9ICdGaWxlIGF0ICIlcyIgaXMgbm90IHJlYWRhYmxlLCBjaGVjayBpdHMgcGVybWlzc2lvbnMnOwp9IGVsc2VpZiAoJycgPT09IHRyaW0oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJHBhdGgpKSkgewoKcmV0dXJuIGFycmF5KCk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJ0ZpbGUgYXQgIiVzIiBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIFBIUCwgaXQgbWF5IGJlIGJpbmFyeSBvciBjb3JydXB0ZWQnOwp9CiRlcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CmlmIChpc3NldCgkZXJyb3JbJ21lc3NhZ2UnXSkpIHsKJG1lc3NhZ2UgLj0gUEhQX0VPTCAuICdUaGUgZm9sbG93aW5nIG1lc3NhZ2UgbWF5IGJlIGhlbHBmdWw6JyAuIFBIUF9FT0wgLiAkZXJyb3JbJ21lc3NhZ2UnXTsKfQp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigkbWVzc2FnZSwgJHBhdGgpKTsKfQoKClByZWc6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XGIoPzpjbGFzc3xpbnRlcmZhY2V8dHJhaXQnLiRleHRyYVR5cGVzLicpXHN9aScsICRjb250ZW50cywgJG1hdGNoZXMpOwppZiAoMCA9PT0gXGNvdW50KCRtYXRjaGVzKSkgewpyZXR1cm4gYXJyYXkoKTsKfQoKJHAgPSBuZXcgUGhwRmlsZUNsZWFuZXIoJGNvbnRlbnRzLCBjb3VudCgkbWF0Y2hlc1swXSkpOwokY29udGVudHMgPSAkcC0+Y2xlYW4oKTsKdW5zZXQoJHApOwoKUHJlZzo6bWF0Y2hBbGwoJ3sKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgXGIoPzwhW1wkOj5dKSg/UDx0eXBlPmNsYXNzfGludGVyZmFjZXx0cmFpdCcuJGV4dHJhVHlwZXMuJykgXHMrKyAoP1A8bmFtZT5bYS16QS1aX1x4N2YtXHhmZjpdW2EtekEtWjAtOV9ceDdmLVx4ZmY6XC1dKispCiAgICAgICAgICAgICAgIHwgXGIoPzwhW1wkOj5dKSg/UDxucz5uYW1lc3BhY2UpICg/UDxuc25hbWU+XHMrK1thLXpBLVpfXHg3Zi1ceGZmXVthLXpBLVowLTlfXHg3Zi1ceGZmXSorKD86XHMqK1xcXFxccyorW2EtekEtWl9ceDdmLVx4ZmZdW2EtekEtWjAtOV9ceDdmLVx4ZmZdKispKispPyBccyorIFtceztdCiAgICAgICAgICAgICkKICAgICAgICB9aXgnLCAkY29udGVudHMsICRtYXRjaGVzKTsKCiRjbGFzc2VzID0gYXJyYXkoKTsKJG5hbWVzcGFjZSA9ICcnOwoKZm9yICgkaSA9IDAsICRsZW4gPSBjb3VudCgkbWF0Y2hlc1sndHlwZSddKTsgJGkgPCAkbGVuOyAkaSsrKSB7CmlmIChpc3NldCgkbWF0Y2hlc1snbnMnXVskaV0pICYmICRtYXRjaGVzWyducyddWyRpXSAhPT0gJycpIHsKJG5hbWVzcGFjZSA9IHN0cl9yZXBsYWNlKGFycmF5KCcgJywgIlx0IiwgIlxyIiwgIlxuIiksICcnLCAoc3RyaW5nKSAkbWF0Y2hlc1snbnNuYW1lJ11bJGldKSAuICdcXCc7Cn0gZWxzZSB7CiRuYW1lID0gJG1hdGNoZXNbJ25hbWUnXVskaV07CmFzc2VydChpc19zdHJpbmcoJG5hbWUpKTsKCmlmICgkbmFtZSA9PT0gJ2V4dGVuZHMnIHx8ICRuYW1lID09PSAnaW1wbGVtZW50cycpIHsKY29udGludWU7Cn0KaWYgKCRuYW1lWzBdID09PSAnOicpIHsKCiRuYW1lID0gJ3hocCcuc3Vic3RyKHN0cl9yZXBsYWNlKGFycmF5KCctJywgJzonKSwgYXJyYXkoJ18nLCAnX18nKSwgJG5hbWUpLCAxKTsKfSBlbHNlaWYgKHN0cnRvbG93ZXIoKHN0cmluZykgJG1hdGNoZXNbJ3R5cGUnXVskaV0pID09PSAnZW51bScpIHsKCgoKCgoKCgokY29sb25Qb3MgPSBzdHJycG9zKCRuYW1lLCAnOicpOwppZiAoZmFsc2UgIT09ICRjb2xvblBvcykgewokbmFtZSA9IHN1YnN0cigkbmFtZSwgMCwgJGNvbG9uUG9zKTsKfQp9CiRjbGFzc2VzW10gPSBsdHJpbSgkbmFtZXNwYWNlIC4gJG5hbWUsICdcXCcpOwp9Cn0KCnJldHVybiAkY2xhc3NlczsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RXh0cmFUeXBlcygpOiBzdHJpbmcKewpzdGF0aWMgJGV4dHJhVHlwZXMgPSBudWxsOwoKaWYgKG51bGwgPT09ICRleHRyYVR5cGVzKSB7CiRleHRyYVR5cGVzID0gJyc7CmlmIChQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCB8fCAoZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgJiYgdmVyc2lvbl9jb21wYXJlKEhIVk1fVkVSU0lPTiwgJzMuMycsICc+PScpKSkgewokZXh0cmFUeXBlcyAuPSAnfGVudW0nOwp9CgpQaHBGaWxlQ2xlYW5lcjo6c2V0VHlwZUNvbmZpZyhhcnJheV9tZXJnZShbJ2NsYXNzJywgJ2ludGVyZmFjZScsICd0cmFpdCddLCBhcnJheV9maWx0ZXIoZXhwbG9kZSgnfCcsICRleHRyYVR5cGVzKSkpKTsKfQoKcmV0dXJuICRleHRyYVR5cGVzOwp9CgoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRwYXRoKQp7CmlmIChpc19yZWFkYWJsZSgkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19maWxlKCRwYXRoKSkgewpyZXR1cm4gZmFsc2UgIT09IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCwgZmFsc2UsIG51bGwsIDAsIDEpOwp9CgoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgcmV0dXJuIGFycmF5KAoncm9vdCcgPT4gYXJyYXkoCiduYW1lJyA9PiAnY29tcG9zZXIvY29tcG9zZXInLAoncHJldHR5X3ZlcnNpb24nID0+ICcyLjYuNScsCid2ZXJzaW9uJyA9PiAnMi42LjUuMCcsCidyZWZlcmVuY2UnID0+ICc0YjBmZTg5ZGI5ZTY1YjFlNjRkZjYzM2E5OTJlNzBhN2EyMTVhYjMzJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vLi4vJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXYnID0+IGZhbHNlLAopLAondmVyc2lvbnMnID0+IGFycmF5KAonY29tcG9zZXIvY2EtYnVuZGxlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS4zLjcnLAondmVyc2lvbicgPT4gJzEuMy43LjAnLAoncmVmZXJlbmNlJyA9PiAnNzZlNDYzMzUwMTQ4NjBlZWMxYWE1YTcyNDc5OWEwMGEyZTQ3Y2M4NScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vY2EtYnVuZGxlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMS4wJywKJ3ZlcnNpb24nID0+ICcxLjEuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzk1M2NjNGVhMzJlMGMzMWYyMTg1NTQ5YzdkMjE2ZDc5MjFmMDNkYTknLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL2NsYXNzLW1hcC1nZW5lcmF0b3InLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9jb21wb3NlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzIuNi41JywKJ3ZlcnNpb24nID0+ICcyLjYuNS4wJywKJ3JlZmVyZW5jZScgPT4gJzRiMGZlODlkYjllNjViMWU2NGRmNjMzYTk5MmU3MGE3YTIxNWFiMzMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi8uLi8nLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9tZXRhZGF0YS1taW5pZmllcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMC4wJywKJ3ZlcnNpb24nID0+ICcxLjAuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2M1NDlkMjM4Mjk1MzZmMGQwZTk4NGFhYWJiZjAyYWY5MWY0NDMyMDcnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL21ldGFkYXRhLW1pbmlmaWVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonY29tcG9zZXIvcGNyZScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzIuMS4wJywKJ3ZlcnNpb24nID0+ICcyLjEuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzNmZGIyODA3YjMxYTc4YTQwYWQ4OTU3MGUzMGVjNzc0NjZjOTg3MTcnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL3BjcmUnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9zZW12ZXInID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICczLjQuMCcsCid2ZXJzaW9uJyA9PiAnMy40LjAuMCcsCidyZWZlcmVuY2UnID0+ICczNWU4ZDBhZjQ0ODYxNDFiYzc0NWYyM2EyOWNjMjA5MWViNjI0YTMyJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi9zZW12ZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9zcGR4LWxpY2Vuc2VzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS41LjcnLAondmVyc2lvbicgPT4gJzEuNS43LjAnLAoncmVmZXJlbmNlJyA9PiAnYzg0ODI0MTc5NmRhMmFiZjY1ODM3ZDUxZGNlMWZhZTU1YTk2MDE0OScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vc3BkeC1saWNlbnNlcycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMy4wLjMnLAondmVyc2lvbicgPT4gJzMuMC4zLjAnLAoncmVmZXJlbmNlJyA9PiAnY2VkMjk5Njg2ZjQxZGNlODkwZGViYWM2OTI3M2I0N2ZmZTk4YTQwYycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4veGRlYnVnLWhhbmRsZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidqdXN0aW5yYWluYm93L2pzb24tc2NoZW1hJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnNS4yLjEyJywKJ3ZlcnNpb24nID0+ICc1LjIuMTIuMCcsCidyZWZlcmVuY2UnID0+ICdhZDg3ZDVhNWNhOTgxMjI4ZTBlMjA1YzJiYzdkZmI4ZTI0NTU5YjYwJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3Bzci9jb250YWluZXInID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjEuMScsCid2ZXJzaW9uJyA9PiAnMS4xLjEuMCcsCidyZWZlcmVuY2UnID0+ICc4NjIyNTY3NDA5MDEwMjgyYjdhZWViZTRiYjg0MWZlOThiNThkY2FmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vcHNyL2NvbnRhaW5lcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3Bzci9sb2cnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjEuNCcsCid2ZXJzaW9uJyA9PiAnMS4xLjQuMCcsCidyZWZlcmVuY2UnID0+ICdkNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vcHNyL2xvZycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3Bzci9sb2ctaW1wbGVtZW50YXRpb24nID0+IGFycmF5KAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKJ3Byb3ZpZGVkJyA9PiBhcnJheSgKMCA9PiAnMS4wfDIuMCcsCiksCiksCidyZWFjdC9wcm9taXNlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjMuMC4wJywKJ3ZlcnNpb24nID0+ICczLjAuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2M4Njc1M2M3NmZkM2JlNDY1ZDkzYjMwOGYxOGQxODlmMDFhMjJiZTQnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9yZWFjdC9wcm9taXNlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc2VsZC9qc29ubGludCcgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMTAuMCcsCid2ZXJzaW9uJyA9PiAnMS4xMC4wLjAnLAoncmVmZXJlbmNlJyA9PiAnNTk0ZmQ2NDYyYWFkOGVjZWUwYjQ1Y2E1MDQ1YWNlYTQ3NzY2NjdmMScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3NlbGQvanNvbmxpbnQnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzZWxkL3BoYXItdXRpbHMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjIuMScsCid2ZXJzaW9uJyA9PiAnMS4yLjEuMCcsCidyZWZlcmVuY2UnID0+ICdlYTJmNDAxNGYxNjNjMWJlNGM2MDFiOWI3YmQ2YWY4MWJhOGQ3MDFjJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc2VsZC9waGFyLXV0aWxzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc2VsZC9zaWduYWwtaGFuZGxlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzIuMC4yJywKJ3ZlcnNpb24nID0+ICcyLjAuMi4wJywKJ3JlZmVyZW5jZScgPT4gJzA0YTYxMTJlODgzYWQ3NmMwYWRhOGU0YTlmNzUyMGJiZmRiNmJiOTgnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zZWxkL3NpZ25hbC1oYW5kbGVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9jb25zb2xlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC4yOCcsCid2ZXJzaW9uJyA9PiAnNS40LjI4LjAnLAoncmVmZXJlbmNlJyA9PiAnZjRmNzE4NDJmMjRjMjAyM2I5MTIzN2M3MmEzNjUzMDZmM2M1ODgyNycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvY29uc29sZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjIuNS4yJywKJ3ZlcnNpb24nID0+ICcyLjUuMi4wJywKJ3JlZmVyZW5jZScgPT4gJ2U4YjQ5NWVhMjhjMWQ5N2I1ZTBjMTIxNzQ4ZDZmOWI1M2QwNzVjNjYnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvZmlsZXN5c3RlbScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuMjUnLAondmVyc2lvbicgPT4gJzUuNC4yNS4wJywKJ3JlZmVyZW5jZScgPT4gJzBjZTNhNjJjOTU3OWE1MzM1OGQzYTdlYjZiM2RmYjc5Nzg5YTYzNjQnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L2ZpbGVzeXN0ZW0nLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L2ZpbmRlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuMjcnLAondmVyc2lvbicgPT4gJzUuNC4yNy4wJywKJ3JlZmVyZW5jZScgPT4gJ2ZmNGJjZTNjMzM0NTFlN2VjNzc4MDcwZTQ1YmQyM2Y3NDIxNGNkNWQnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L2ZpbmRlcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtY3R5cGUnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4yOC4wJywKJ3ZlcnNpb24nID0+ICcxLjI4LjAuMCcsCidyZWZlcmVuY2UnID0+ICdlYTIwOGNlNDNjYmIwNGFmNjg2N2I0ZmRkZGIxYmRiZjg0Y2MyOGNiJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjI4LjAnLAondmVyc2lvbicgPT4gJzEuMjguMC4wJywKJ3JlZmVyZW5jZScgPT4gJzg3NWU5MGFlZWEyNzc3YjZmMTM1Njc3ZjYxODUyOTQ0OTMzNGE2MTInLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjI4LjAnLAondmVyc2lvbicgPT4gJzEuMjguMC4wJywKJ3JlZmVyZW5jZScgPT4gJzhjNGFkMDVkZDAxMjBiNmE1M2MxY2EzNzRkY2EyYWQwYTFjNGVkOTInLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4yOC4wJywKJ3ZlcnNpb24nID0+ICcxLjI4LjAuMCcsCidyZWZlcmVuY2UnID0+ICc0MjI5MmQ5OWM1NWFiZTYxNzc5OTY2N2Y0NTQyMjJjNTRjNjBlMjI5JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtcGhwNzMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4yOC4wJywKJ3ZlcnNpb24nID0+ICcxLjI4LjAuMCcsCidyZWZlcmVuY2UnID0+ICdmZTJmMzA2ZDFkOWQzNDZhN2ZlZTM1M2QwZDUwMTJlNDAxZTk4NGI1JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA3MycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtcGhwODAnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4yOC4wJywKJ3ZlcnNpb24nID0+ICcxLjI4LjAuMCcsCidyZWZlcmVuY2UnID0+ICc2Y2FhNTczNzljNGFlYzE5YzBhMTJhMzhiNTliMjY0ODdkY2ZlNGI1JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MCcsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtcGhwODEnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2MS4yOC4wJywKJ3ZlcnNpb24nID0+ICcxLjI4LjAuMCcsCidyZWZlcmVuY2UnID0+ICc3NTgxY2Q2MDBmYTlmZDY4MWI3OTdkMDBiMDJmMDY4ZTJmMTMyNjNiJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcHJvY2VzcycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuMjgnLAondmVyc2lvbicgPT4gJzUuNC4yOC4wJywKJ3JlZmVyZW5jZScgPT4gJzQ1MjYxZTFmY2NhZDFiNTQ0N2E4ZDdhOGU2N2FhN2I0YTk3OThiN2InLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3Byb2Nlc3MnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L3NlcnZpY2UtY29udHJhY3RzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjIuNS4yJywKJ3ZlcnNpb24nID0+ICcyLjUuMi4wJywKJ3JlZmVyZW5jZScgPT4gJzRiNDI2YWFjNDdkNjQyN2NjMWExZDBmN2UyYWM3MjQ2MjdmNTk2NmMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9zdHJpbmcnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2NS40LjI2JywKJ3ZlcnNpb24nID0+ICc1LjQuMjYuMCcsCidyZWZlcmVuY2UnID0+ICcxMTgxZmU5MjcwZTM3MzUzNzQ3NWU4MjY4NzNiNTg2N2I4NjM4ODNjJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9zdHJpbmcnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCiksCik7CgpDb3B5cmlnaHQgKEMpIDIwMjEgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXE1ldGFkYXRhTWluaWZpZXI7CgpjbGFzcyBNZXRhZGF0YU1pbmlmaWVyCnsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHBhbmQoYXJyYXkgJHZlcnNpb25zKQp7CiRleHBhbmRlZCA9IGFycmF5KCk7CiRleHBhbmRlZFZlcnNpb24gPSBudWxsOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb25EYXRhKSB7CmlmICghJGV4cGFuZGVkVmVyc2lvbikgewokZXhwYW5kZWRWZXJzaW9uID0gJHZlcnNpb25EYXRhOwokZXhwYW5kZWRbXSA9ICRleHBhbmRlZFZlcnNpb247CmNvbnRpbnVlOwp9CgoKZm9yZWFjaCAoJHZlcnNpb25EYXRhIGFzICRrZXkgPT4gJHZhbCkgewppZiAoJHZhbCA9PT0gJ19fdW5zZXQnKSB7CnVuc2V0KCRleHBhbmRlZFZlcnNpb25bJGtleV0pOwp9IGVsc2UgewokZXhwYW5kZWRWZXJzaW9uWyRrZXldID0gJHZhbDsKfQp9CgokZXhwYW5kZWRbXSA9ICRleHBhbmRlZFZlcnNpb247Cn0KCnJldHVybiAkZXhwYW5kZWQ7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWluaWZ5KGFycmF5ICR2ZXJzaW9ucykKewokbWluaWZpZWRWZXJzaW9ucyA9IGFycmF5KCk7CgokbGFzdEtub3duVmVyc2lvbkRhdGEgPSBudWxsOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKaWYgKCEkbGFzdEtub3duVmVyc2lvbkRhdGEpIHsKJGxhc3RLbm93blZlcnNpb25EYXRhID0gJHZlcnNpb247CiRtaW5pZmllZFZlcnNpb25zW10gPSAkdmVyc2lvbjsKY29udGludWU7Cn0KCiRtaW5pZmllZFZlcnNpb24gPSBhcnJheSgpOwoKCmZvcmVhY2ggKCR2ZXJzaW9uIGFzICRrZXkgPT4gJHZhbCkgewppZiAoIWlzc2V0KCRsYXN0S25vd25WZXJzaW9uRGF0YVska2V5XSkgfHwgJGxhc3RLbm93blZlcnNpb25EYXRhWyRrZXldICE9PSAkdmFsKSB7CiRtaW5pZmllZFZlcnNpb25bJGtleV0gPSAkdmFsOwokbGFzdEtub3duVmVyc2lvbkRhdGFbJGtleV0gPSAkdmFsOwp9Cn0KCgpmb3JlYWNoICgkbGFzdEtub3duVmVyc2lvbkRhdGEgYXMgJGtleSA9PiAkdmFsKSB7CmlmICghaXNzZXQoJHZlcnNpb25bJGtleV0pKSB7CiRtaW5pZmllZFZlcnNpb25bJGtleV0gPSAiX191bnNldCI7CnVuc2V0KCRsYXN0S25vd25WZXJzaW9uRGF0YVska2V5XSk7Cn0KfQoKJG1pbmlmaWVkVmVyc2lvbnNbXSA9ICRtaW5pZmllZFZlcnNpb247Cn0KCnJldHVybiAkbWluaWZpZWRWZXJzaW9uczsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMjEgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaEFsbFJlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJGNvdW50OwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+Y291bnQgPSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJGNvdW50OwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+Y291bnQgPSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaEFsbFdpdGhPZmZzZXRzUmVzdWx0CnsKCgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJGNvdW50OwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKJHRoaXMtPmNvdW50ID0gJGNvdW50Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKZmluYWwgY2xhc3MgTWF0Y2hSZXN1bHQKewoKCgoKCgpwdWJsaWMgJG1hdGNoZXM7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGNvdW50LCBhcnJheSAkbWF0Y2hlcykKewokdGhpcy0+bWF0Y2hlcyA9ICRtYXRjaGVzOwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaFN0cmljdEdyb3Vwc1Jlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJG1hdGNoZWQ7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoV2l0aE9mZnNldHNSZXN1bHQKewoKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmNsYXNzIFBjcmVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRnVuY3Rpb24oJGZ1bmN0aW9uLCAkcGF0dGVybikKewokY29kZSA9IHByZWdfbGFzdF9lcnJvcigpOwoKaWYgKGlzX2FycmF5KCRwYXR0ZXJuKSkgewokcGF0dGVybiA9IGltcGxvZGUoJywgJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gbmV3IFBjcmVFeGNlcHRpb24oJGZ1bmN0aW9uLicoKTogZmFpbGVkIGV4ZWN1dGluZyAiJy4kcGF0dGVybi4nIjogJy5zZWxmOjpwY3JlTGFzdEVycm9yTWVzc2FnZSgkY29kZSksICRjb2RlKTsKfQoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHBjcmVMYXN0RXJyb3JNZXNzYWdlKCRjb2RlKQp7CmlmIChmdW5jdGlvbl9leGlzdHMoJ3ByZWdfbGFzdF9lcnJvcl9tc2cnKSkgewpyZXR1cm4gcHJlZ19sYXN0X2Vycm9yX21zZygpOwp9CgoKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAyMDEgJiYgJGNvZGUgPT09IDApIHsKcmV0dXJuICdVTkRFRklORURfRVJST1InOwp9CgokY29uc3RhbnRzID0gZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpOwppZiAoIWlzc2V0KCRjb25zdGFudHNbJ3BjcmUnXSkpIHsKcmV0dXJuICdVTkRFRklORURfRVJST1InOwp9Cgpmb3JlYWNoICgkY29uc3RhbnRzWydwY3JlJ10gYXMgJGNvbnN0ID0+ICR2YWwpIHsKaWYgKCR2YWwgPT09ICRjb2RlICYmIHN1YnN0cigkY29uc3QsIC02KSA9PT0gJ19FUlJPUicpIHsKcmV0dXJuICRjb25zdDsKfQp9CgpyZXR1cm4gJ1VOREVGSU5FRF9FUlJPUic7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpjbGFzcyBQcmVnCnsKCnB1YmxpYyBjb25zdCBBUlJBWV9NU0cgPSAnJHN1YmplY3QgYXMgYW4gYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gWW91IGNhbiB1c2UgXCdmb3JlYWNoXCcgaW5zdGVhZC4nOwoKcHVibGljIGNvbnN0IElOVkFMSURfVFlQRV9NU0cgPSAnJHN1YmplY3QgbXVzdCBiZSBhIHN0cmluZywgJXMgZ2l2ZW4uJzsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hXaXRoT2Zmc2V0cycpOwoKJHJlc3VsdCA9IHNlbGY6OnByZWdNYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMLCAkb2Zmc2V0KTsKaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewokcmVzdWx0ID0gc2VsZjo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlc0ludGVybmFsLCAkZmxhZ3MsICRvZmZzZXQpOwokbWF0Y2hlcyA9IHNlbGY6OmVuZm9yY2VOb25OdWxsTWF0Y2hlcygkcGF0dGVybiwgJG1hdGNoZXNJbnRlcm5hbCwgJ21hdGNoJyk7CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcywgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CiRyZXN1bHQgPSBzZWxmOjpwcmVnTWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzIHwgUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFBSRUdfT0ZGU0VUX0NBUFRVUkUsICRvZmZzZXQpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaEFsbFdpdGhPZmZzZXRzJyk7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCiRyZXN1bHQgPSBwcmVnX21hdGNoX2FsbCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMLCAkb2Zmc2V0KTsKaWYgKCFpc19pbnQoJHJlc3VsdCkpIHsgCnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaF9hbGwnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGxTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKJHJlc3VsdCA9IHNlbGY6Om1hdGNoQWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXNJbnRlcm5hbCwgJGZsYWdzLCAkb2Zmc2V0KTsKJG1hdGNoZXMgPSBzZWxmOjplbmZvcmNlTm9uTnVsbE1hdGNoQWxsKCRwYXR0ZXJuLCAkbWF0Y2hlc0ludGVybmFsLCAnbWF0Y2hBbGwnKTsKCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKc2VsZjo6Y2hlY2tTZXRPcmRlcigkZmxhZ3MpOwoKJHJlc3VsdCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncyB8IFBSRUdfVU5NQVRDSEVEX0FTX05VTEwgfCBQUkVHX09GRlNFVF9DQVBUVVJFLCAkb2Zmc2V0KTsKaWYgKCFpc19pbnQoJHJlc3VsdCkpIHsgCnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaF9hbGwnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJiRjb3VudCA9IG51bGwpOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgokcmVzdWx0ID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7CmlmICgkcmVzdWx0ID09PSBudWxsKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19yZXBsYWNlJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sIGNhbGxhYmxlICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICYkY291bnQgPSBudWxsLCBpbnQgJGZsYWdzID0gMCk6IHN0cmluZwp7CmlmICghaXNfc2NhbGFyKCRzdWJqZWN0KSkgewppZiAoaXNfYXJyYXkoJHN1YmplY3QpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHN0YXRpYzo6QVJSQVlfTVNHKTsKfQoKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZihzdGF0aWM6OklOVkFMSURfVFlQRV9NU0csIGdldHR5cGUoJHN1YmplY3QpKSk7Cn0KCmlmIChQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCkgewokcmVzdWx0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCwgJGZsYWdzKTsKfSBlbHNlIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQpOwp9CmlmICgkcmVzdWx0ID09PSBudWxsKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19yZXBsYWNlX2NhbGxiYWNrJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2VDYWxsYmFja0FycmF5KGFycmF5ICRwYXR0ZXJuLCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJiRjb3VudCA9IG51bGwsIGludCAkZmxhZ3MgPSAwKTogc3RyaW5nCnsKaWYgKCFpc19zY2FsYXIoJHN1YmplY3QpKSB7CmlmIChpc19hcnJheSgkc3ViamVjdCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3RhdGljOjpBUlJBWV9NU0cpOwp9Cgp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKHN0YXRpYzo6SU5WQUxJRF9UWVBFX01TRywgZ2V0dHlwZSgkc3ViamVjdCkpKTsKfQoKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwNDAwKSB7CiRyZXN1bHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2tfYXJyYXkoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCwgJGZsYWdzKTsKfSBlbHNlIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFja19hcnJheSgkcGF0dGVybiwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50KTsKfQppZiAoJHJlc3VsdCA9PT0gbnVsbCkgewokcGF0dGVybiA9IGFycmF5X2tleXMoJHBhdHRlcm4pOwp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfcmVwbGFjZV9jYWxsYmFja19hcnJheScsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsIGludCAkZmxhZ3MgPSAwKTogYXJyYXkKewppZiAoKCRmbGFncyAmIFBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFIGlzIG5vdCBzdXBwb3J0ZWQgYXMgaXQgY2hhbmdlcyB0aGUgdHlwZSBvZiAkbWF0Y2hlcywgdXNlIHNwbGl0V2l0aE9mZnNldHMoKSBpbnN0ZWFkJyk7Cn0KCiRyZXN1bHQgPSBwcmVnX3NwbGl0KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkZmxhZ3MpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX3NwbGl0JywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNwbGl0V2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRyZXN1bHQgPSBwcmVnX3NwbGl0KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkZmxhZ3MgfCBQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFKTsKaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19zcGxpdCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyZXAoc3RyaW5nICRwYXR0ZXJuLCBhcnJheSAkYXJyYXksIGludCAkZmxhZ3MgPSAwKTogYXJyYXkKewokcmVzdWx0ID0gcHJlZ19ncmVwKCRwYXR0ZXJuLCAkYXJyYXksICRmbGFncyk7CmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfZ3JlcCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBzdGF0aWM6Om1hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc2VsZjo6bWF0Y2hTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoQWxsKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2hBbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoQWxsU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHNlbGY6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoV2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBzdGF0aWM6Om1hdGNoV2l0aE9mZnNldHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hBbGxXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcywgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2hBbGxXaXRoT2Zmc2V0cygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja09mZnNldENhcHR1cmUoaW50ICRmbGFncywgc3RyaW5nICR1c2VGdW5jdGlvbk5hbWUpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX09GRlNFVF9DQVBUVVJFKSAhPT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUFJFR19PRkZTRVRfQ0FQVFVSRSBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHR5cGUgb2YgJG1hdGNoZXMsIHVzZSAnIC4gJHVzZUZ1bmN0aW9uTmFtZSAuICcoKSBpbnN0ZWFkJyk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTZXRPcmRlcihpbnQgJGZsYWdzKTogdm9pZAp7CmlmICgoJGZsYWdzICYgUFJFR19TRVRfT1JERVIpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NFVF9PUkRFUiBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHR5cGUgb2YgJG1hdGNoZXMnKTsKfQp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVuZm9yY2VOb25OdWxsTWF0Y2hlcyhzdHJpbmcgJHBhdHRlcm4sIGFycmF5ICRtYXRjaGVzLCBzdHJpbmcgJHZhcmlhbnRNZXRob2QpCnsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJGdyb3VwID0+ICRtYXRjaCkgewppZiAobnVsbCA9PT0gJG1hdGNoKSB7CnRocm93IG5ldyBVbmV4cGVjdGVkTnVsbE1hdGNoRXhjZXB0aW9uKCdQYXR0ZXJuICInLiRwYXR0ZXJuLiciIGhhZCBhbiB1bmV4cGVjdGVkIHVubWF0Y2hlZCBncm91cCAiJy4kZ3JvdXAuJyIsIG1ha2Ugc3VyZSB0aGUgcGF0dGVybiBhbHdheXMgbWF0Y2hlcyBvciB1c2UgJy4kdmFyaWFudE1ldGhvZC4nKCkgaW5zdGVhZC4nKTsKfQp9CgoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVuZm9yY2VOb25OdWxsTWF0Y2hBbGwoc3RyaW5nICRwYXR0ZXJuLCBhcnJheSAkbWF0Y2hlcywgc3RyaW5nICR2YXJpYW50TWV0aG9kKQp7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRncm91cCA9PiAkZ3JvdXBNYXRjaGVzKSB7CmZvcmVhY2ggKCRncm91cE1hdGNoZXMgYXMgJG1hdGNoKSB7CmlmIChudWxsID09PSAkbWF0Y2gpIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsTWF0Y2hFeGNlcHRpb24oJ1BhdHRlcm4gIicuJHBhdHRlcm4uJyIgaGFkIGFuIHVuZXhwZWN0ZWQgdW5tYXRjaGVkIGdyb3VwICInLiRncm91cC4nIiwgbWFrZSBzdXJlIHRoZSBwYXR0ZXJuIGFsd2F5cyBtYXRjaGVzIG9yIHVzZSAnLiR2YXJpYW50TWV0aG9kLicoKSBpbnN0ZWFkLicpOwp9Cn0KfQoKCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBwcmVnTWF0Y2goc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKQp7CmlmIChQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCkgewpyZXR1cm4gcHJlZ19tYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKJHJlc3VsdCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXNJbnRlcm5hbCwgJGZsYWdzLCAkb2Zmc2V0KTsKaWYgKCFpc19pbnQoJHJlc3VsdCkpIHsgCnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19tYXRjaCcsICRwYXR0ZXJuKTsKfQoKaWYgKCRyZXN1bHQgPT09IDApIHsKJG1hdGNoZXMgPSBbXTsKfSBlbHNlIHsKJG1hdGNoZXMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRtKSB7IHJldHVybiByZXNldCgkbSk7IH0sICRtYXRjaGVzSW50ZXJuYWwpOwokcmVzdWx0ID0gbWluKCRyZXN1bHQsIDEpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmNsYXNzIFJlZ2V4CnsKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBQcmVnOjptYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAwLCAkb2Zmc2V0KTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBNYXRjaFJlc3VsdAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaFdpdGhPZmZzZXRzJyk7CgokY291bnQgPSBQcmVnOjptYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaFJlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBNYXRjaFN0cmljdEdyb3Vwc1Jlc3VsdAp7CiRjb3VudCA9IFByZWc6Om1hdGNoU3RyaWN0R3JvdXBzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7CgpyZXR1cm4gbmV3IE1hdGNoU3RyaWN0R3JvdXBzUmVzdWx0KCRjb3VudCwgJG1hdGNoZXMpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoV2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBNYXRjaFdpdGhPZmZzZXRzUmVzdWx0CnsKJGNvdW50ID0gUHJlZzo6bWF0Y2hXaXRoT2Zmc2V0cygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaFdpdGhPZmZzZXRzUmVzdWx0KCRjb3VudCwgJG1hdGNoZXMpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoQWxsUmVzdWx0CnsKc2VsZjo6Y2hlY2tPZmZzZXRDYXB0dXJlKCRmbGFncywgJ21hdGNoQWxsV2l0aE9mZnNldHMnKTsKc2VsZjo6Y2hlY2tTZXRPcmRlcigkZmxhZ3MpOwoKJGNvdW50ID0gUHJlZzo6bWF0Y2hBbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hBbGxSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxTdHJpY3RHcm91cHNSZXN1bHQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hBbGxXaXRoT2Zmc2V0cycpOwpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgokY291bnQgPSBQcmVnOjptYXRjaEFsbFN0cmljdEdyb3VwcygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdAp7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCiRjb3VudCA9IFByZWc6Om1hdGNoQWxsV2l0aE9mZnNldHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xKTogUmVwbGFjZVJlc3VsdAp7CiRyZXN1bHQgPSBQcmVnOjpyZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sIGNhbGxhYmxlICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBSZXBsYWNlUmVzdWx0CnsKJHJlc3VsdCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQsICRmbGFncyk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2VDYWxsYmFja0FycmF5KGFycmF5ICRwYXR0ZXJuLCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJGZsYWdzID0gMCk6IFJlcGxhY2VSZXN1bHQKewokcmVzdWx0ID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrQXJyYXkoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCwgJGZsYWdzKTsKCnJldHVybiBuZXcgUmVwbGFjZVJlc3VsdCgkY291bnQsICRyZXN1bHQpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja09mZnNldENhcHR1cmUoaW50ICRmbGFncywgc3RyaW5nICR1c2VGdW5jdGlvbk5hbWUpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX09GRlNFVF9DQVBUVVJFKSAhPT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUFJFR19PRkZTRVRfQ0FQVFVSRSBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlLCB1c2UgJy4kdXNlRnVuY3Rpb25OYW1lLicoKSBpbnN0ZWFkJyk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTZXRPcmRlcihpbnQgJGZsYWdzKTogdm9pZAp7CmlmICgoJGZsYWdzICYgUFJFR19TRVRfT1JERVIpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NFVF9PUkRFUiBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlJyk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIFJlcGxhY2VSZXN1bHQKewoKCgoKcHVibGljICRyZXN1bHQ7CgoKCgoKcHVibGljICRjb3VudDsKCgoKCgpwdWJsaWMgJG1hdGNoZWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgc3RyaW5nICRyZXN1bHQpCnsKJHRoaXMtPmNvdW50ID0gJGNvdW50OwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7CiR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKY2xhc3MgVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFBjcmVFeGNlcHRpb24KewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21GdW5jdGlvbigkZnVuY3Rpb24sICRwYXR0ZXJuKQp7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2Zyb21GdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiAnLnNlbGY6OmNsYXNzLicsIHVzZSAnLlBjcmVFeGNlcHRpb246OmNsYXNzKTsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMTUgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKY2xhc3MgQ29tcGFyYXRvcgp7CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmVhdGVyVGhhbigkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICc+JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJz49JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlc3NUaGFuKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJzwnLCAkdmVyc2lvbjIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsVG8oJHZlcnNpb24xLCAkdmVyc2lvbjIpCnsKcmV0dXJuIHNlbGY6OmNvbXBhcmUoJHZlcnNpb24xLCAnPD0nLCAkdmVyc2lvbjIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXF1YWxUbygkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICc9PScsICR2ZXJzaW9uMik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3RFcXVhbFRvKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJyE9JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBhcmUoJHZlcnNpb24xLCAkb3BlcmF0b3IsICR2ZXJzaW9uMikKewokY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCRvcGVyYXRvciwgJHZlcnNpb24yKTsKCnJldHVybiAkY29uc3RyYWludC0+bWF0Y2hTcGVjaWZpYyhuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvbjEpLCB0cnVlKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyOwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwoKCgoKY2xhc3MgQ29tcGlsaW5nTWF0Y2hlcgp7CgoKCgpwcml2YXRlIHN0YXRpYyAkY29tcGlsZWRDaGVja2VyQ2FjaGUgPSBhcnJheSgpOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJHJlc3VsdENhY2hlID0gYXJyYXkoKTsKCgpwcml2YXRlIHN0YXRpYyAkZW5hYmxlZDsKCgoKCnByaXZhdGUgc3RhdGljICR0cmFuc09wSW50ID0gYXJyYXkoCkNvbnN0cmFpbnQ6Ok9QX0VRID0+IENvbnN0cmFpbnQ6OlNUUl9PUF9FUSwKQ29uc3RyYWludDo6T1BfTFQgPT4gQ29uc3RyYWludDo6U1RSX09QX0xULApDb25zdHJhaW50OjpPUF9MRSA9PiBDb25zdHJhaW50OjpTVFJfT1BfTEUsCkNvbnN0cmFpbnQ6Ok9QX0dUID0+IENvbnN0cmFpbnQ6OlNUUl9PUF9HVCwKQ29uc3RyYWludDo6T1BfR0UgPT4gQ29uc3RyYWludDo6U1RSX09QX0dFLApDb25zdHJhaW50OjpPUF9ORSA9PiBDb25zdHJhaW50OjpTVFJfT1BfTkUsCik7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXIoKQp7CnNlbGY6OiRyZXN1bHRDYWNoZSA9IGFycmF5KCk7CnNlbGY6OiRjb21waWxlZENoZWNrZXJDYWNoZSA9IGFycmF5KCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsICRvcGVyYXRvciwgJHZlcnNpb24pCnsKJHJlc3VsdENhY2hlS2V5ID0gJG9wZXJhdG9yLiRjb25zdHJhaW50Lic7Jy4kdmVyc2lvbjsKCmlmIChpc3NldChzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XSkpIHsKcmV0dXJuIHNlbGY6OiRyZXN1bHRDYWNoZVskcmVzdWx0Q2FjaGVLZXldOwp9CgppZiAoc2VsZjo6JGVuYWJsZWQgPT09IG51bGwpIHsKc2VsZjo6JGVuYWJsZWQgPSAhXGluX2FycmF5KCdldmFsJywgZXhwbG9kZSgnLCcsIChzdHJpbmcpIGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpLCB0cnVlKTsKfQppZiAoIXNlbGY6OiRlbmFibGVkKSB7CnJldHVybiBzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XSA9ICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KHNlbGY6OiR0cmFuc09wSW50WyRvcGVyYXRvcl0sICR2ZXJzaW9uKSk7Cn0KCiRjYWNoZUtleSA9ICRvcGVyYXRvci4kY29uc3RyYWludDsKaWYgKCFpc3NldChzZWxmOjokY29tcGlsZWRDaGVja2VyQ2FjaGVbJGNhY2hlS2V5XSkpIHsKJGNvZGUgPSAkY29uc3RyYWludC0+Y29tcGlsZSgkb3BlcmF0b3IpOwpzZWxmOjokY29tcGlsZWRDaGVja2VyQ2FjaGVbJGNhY2hlS2V5XSA9ICRmdW5jdGlvbiA9IGV2YWwoJ3JldHVybiBmdW5jdGlvbigkdiwgJGIpe3JldHVybiAnLiRjb2RlLic7fTsnKTsKfSBlbHNlIHsKJGZ1bmN0aW9uID0gc2VsZjo6JGNvbXBpbGVkQ2hlY2tlckNhY2hlWyRjYWNoZUtleV07Cn0KCnJldHVybiBzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XSA9ICRmdW5jdGlvbigkdmVyc2lvbiwgc3RycG9zKCR2ZXJzaW9uLCAnZGV2LScpID09PSAwKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnQ7CgpjbGFzcyBCb3VuZAp7CgoKCnByaXZhdGUgJHZlcnNpb247CgoKCgpwcml2YXRlICRpc0luY2x1c2l2ZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZlcnNpb24sICRpc0luY2x1c2l2ZSkKewokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+aXNJbmNsdXNpdmUgPSAkaXNJbmNsdXNpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCkKewpyZXR1cm4gJHRoaXMtPnZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0luY2x1c2l2ZSgpCnsKcmV0dXJuICR0aGlzLT5pc0luY2x1c2l2ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzWmVybygpCnsKcmV0dXJuICR0aGlzLT5nZXRWZXJzaW9uKCkgPT09ICcwLjAuMC4wLWRldicgJiYgJHRoaXMtPmlzSW5jbHVzaXZlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Bvc2l0aXZlSW5maW5pdHkoKQp7CnJldHVybiAkdGhpcy0+Z2V0VmVyc2lvbigpID09PSBQSFBfSU5UX01BWC4nLjAuMC4wJyAmJiAhJHRoaXMtPmlzSW5jbHVzaXZlKCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhCb3VuZCAkb3RoZXIsICRvcGVyYXRvcikKewppZiAoIVxpbl9hcnJheSgkb3BlcmF0b3IsIGFycmF5KCc8JywgJz4nKSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0RvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIG9wZXJhdG9yIG90aGVyIHRoYW4gPiBvciA8LicpOwp9CgoKaWYgKCR0aGlzID09ICRvdGhlcikgewpyZXR1cm4gZmFsc2U7Cn0KCiRjb21wYXJlUmVzdWx0ID0gdmVyc2lvbl9jb21wYXJlKCR0aGlzLT5nZXRWZXJzaW9uKCksICRvdGhlci0+Z2V0VmVyc2lvbigpKTsKCgppZiAoMCAhPT0gJGNvbXBhcmVSZXN1bHQpIHsKcmV0dXJuICgoJz4nID09PSAkb3BlcmF0b3IpID8gMSA6IC0xKSA9PT0gJGNvbXBhcmVSZXN1bHQ7Cn0KCgpyZXR1cm4gJz4nID09PSAkb3BlcmF0b3IgPyAkb3RoZXItPmlzSW5jbHVzaXZlKCkgOiAhJG90aGVyLT5pc0luY2x1c2l2ZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuIHNwcmludGYoCiclcyBbJXNdJywKJHRoaXMtPmdldFZlcnNpb24oKSwKJHRoaXMtPmlzSW5jbHVzaXZlKCkgPyAnaW5jbHVzaXZlJyA6ICdleGNsdXNpdmUnCik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gemVybygpCnsKcmV0dXJuIG5ldyBCb3VuZCgnMC4wLjAuMC1kZXYnLCB0cnVlKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3NpdGl2ZUluZmluaXR5KCkKewpyZXR1cm4gbmV3IEJvdW5kKFBIUF9JTlRfTUFYLicuMC4wLjAnLCBmYWxzZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50OwoKCgoKY2xhc3MgQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewoKY29uc3QgT1BfRVEgPSAwOwpjb25zdCBPUF9MVCA9IDE7CmNvbnN0IE9QX0xFID0gMjsKY29uc3QgT1BfR1QgPSAzOwpjb25zdCBPUF9HRSA9IDQ7CmNvbnN0IE9QX05FID0gNTsKCgpjb25zdCBTVFJfT1BfRVEgPSAnPT0nOwpjb25zdCBTVFJfT1BfRVFfQUxUID0gJz0nOwpjb25zdCBTVFJfT1BfTFQgPSAnPCc7CmNvbnN0IFNUUl9PUF9MRSA9ICc8PSc7CmNvbnN0IFNUUl9PUF9HVCA9ICc+JzsKY29uc3QgU1RSX09QX0dFID0gJz49JzsKY29uc3QgU1RSX09QX05FID0gJyE9JzsKY29uc3QgU1RSX09QX05FX0FMVCA9ICc8Pic7CgoKCgoKCgpwcml2YXRlIHN0YXRpYyAkdHJhbnNPcFN0ciA9IGFycmF5KAonPScgPT4gc2VsZjo6T1BfRVEsCic9PScgPT4gc2VsZjo6T1BfRVEsCic8JyA9PiBzZWxmOjpPUF9MVCwKJzw9JyA9PiBzZWxmOjpPUF9MRSwKJz4nID0+IHNlbGY6Ok9QX0dULAonPj0nID0+IHNlbGY6Ok9QX0dFLAonPD4nID0+IHNlbGY6Ok9QX05FLAonIT0nID0+IHNlbGY6Ok9QX05FLAopOwoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJHRyYW5zT3BJbnQgPSBhcnJheSgKc2VsZjo6T1BfRVEgPT4gJz09JywKc2VsZjo6T1BfTFQgPT4gJzwnLApzZWxmOjpPUF9MRSA9PiAnPD0nLApzZWxmOjpPUF9HVCA9PiAnPicsCnNlbGY6Ok9QX0dFID0+ICc+PScsCnNlbGY6Ok9QX05FID0+ICchPScsCik7CgoKCgoKcHJvdGVjdGVkICRvcGVyYXRvcjsKCgpwcm90ZWN0ZWQgJHZlcnNpb247CgoKcHJvdGVjdGVkICRwcmV0dHlTdHJpbmc7CgoKcHJvdGVjdGVkICRsb3dlckJvdW5kOwoKCnByb3RlY3RlZCAkdXBwZXJCb3VuZDsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wZXJhdG9yLCAkdmVyc2lvbikKewppZiAoIWlzc2V0KHNlbGY6OiR0cmFuc09wU3RyWyRvcGVyYXRvcl0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidJbnZhbGlkIG9wZXJhdG9yICIlcyIgZ2l2ZW4sIGV4cGVjdGVkIG9uZSBvZjogJXMnLAokb3BlcmF0b3IsCmltcGxvZGUoJywgJywgc2VsZjo6Z2V0U3VwcG9ydGVkT3BlcmF0b3JzKCkpCikpOwp9CgokdGhpcy0+b3BlcmF0b3IgPSBzZWxmOjokdHJhbnNPcFN0clskb3BlcmF0b3JdOwokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRvcigpCnsKcmV0dXJuIHNlbGY6OiR0cmFuc09wSW50WyR0aGlzLT5vcGVyYXRvcl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKaWYgKCRwcm92aWRlciBpbnN0YW5jZW9mIHNlbGYpIHsKcmV0dXJuICR0aGlzLT5tYXRjaFNwZWNpZmljKCRwcm92aWRlcik7Cn0KCgpyZXR1cm4gJHByb3ZpZGVyLT5tYXRjaGVzKCR0aGlzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZXR0eVN0cmluZygkcHJldHR5U3RyaW5nKQp7CiR0aGlzLT5wcmV0dHlTdHJpbmcgPSAkcHJldHR5U3RyaW5nOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKCkKewppZiAoJHRoaXMtPnByZXR0eVN0cmluZykgewpyZXR1cm4gJHRoaXMtPnByZXR0eVN0cmluZzsKfQoKcmV0dXJuICR0aGlzLT5fX3RvU3RyaW5nKCk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1cHBvcnRlZE9wZXJhdG9ycygpCnsKcmV0dXJuIGFycmF5X2tleXMoc2VsZjo6JHRyYW5zT3BTdHIpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPcGVyYXRvckNvbnN0YW50KCRvcGVyYXRvcikKewpyZXR1cm4gc2VsZjo6JHRyYW5zT3BTdHJbJG9wZXJhdG9yXTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZlcnNpb25Db21wYXJlKCRhLCAkYiwgJG9wZXJhdG9yLCAkY29tcGFyZUJyYW5jaGVzID0gZmFsc2UpCnsKaWYgKCFpc3NldChzZWxmOjokdHJhbnNPcFN0clskb3BlcmF0b3JdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonSW52YWxpZCBvcGVyYXRvciAiJXMiIGdpdmVuLCBleHBlY3RlZCBvbmUgb2Y6ICVzJywKJG9wZXJhdG9yLAppbXBsb2RlKCcsICcsIHNlbGY6OmdldFN1cHBvcnRlZE9wZXJhdG9ycygpKQopKTsKfQoKJGFJc0JyYW5jaCA9IHN0cnBvcygkYSwgJ2Rldi0nKSA9PT0gMDsKJGJJc0JyYW5jaCA9IHN0cnBvcygkYiwgJ2Rldi0nKSA9PT0gMDsKCmlmICgkb3BlcmF0b3IgPT09ICchPScgJiYgKCRhSXNCcmFuY2ggfHwgJGJJc0JyYW5jaCkpIHsKcmV0dXJuICRhICE9PSAkYjsKfQoKaWYgKCRhSXNCcmFuY2ggJiYgJGJJc0JyYW5jaCkgewpyZXR1cm4gJG9wZXJhdG9yID09PSAnPT0nICYmICRhID09PSAkYjsKfQoKCmlmICghJGNvbXBhcmVCcmFuY2hlcyAmJiAoJGFJc0JyYW5jaCB8fCAkYklzQnJhbmNoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBcdmVyc2lvbl9jb21wYXJlKCRhLCAkYiwgJG9wZXJhdG9yKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJG90aGVyT3BlcmF0b3IpCnsKaWYgKHN0cnBvcygkdGhpcy0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCkgewppZiAoc2VsZjo6T1BfRVEgPT09ICR0aGlzLT5vcGVyYXRvcikgewppZiAoc2VsZjo6T1BfRVEgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCckYiAmJiAkdiA9PT0gJXMnLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CmlmIChzZWxmOjpPUF9ORSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJyEkYiB8fCAkdiAhPT0gJXMnLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CnJldHVybiAnZmFsc2UnOwp9CgppZiAoc2VsZjo6T1BfTkUgPT09ICR0aGlzLT5vcGVyYXRvcikgewppZiAoc2VsZjo6T1BfRVEgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCchJGIgfHwgJHYgIT09ICVzJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAndHJ1ZSc7Cn0KcmV0dXJuICchJGInOwp9CgpyZXR1cm4gJ2ZhbHNlJzsKfQoKaWYgKHNlbGY6Ok9QX0VRID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gc3ByaW50ZignXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnPT1cJyknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CmlmIChzZWxmOjpPUF9ORSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJyRiIHx8IFx2ZXJzaW9uX2NvbXBhcmUoJHYsICVzLCBcJyE9XCcpJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQoKcmV0dXJuIHNwcmludGYoJyEkYiAmJiBcdmVyc2lvbl9jb21wYXJlKCVzLCAkdiwgXCclc1wnKScsIFx2YXJfZXhwb3J0KCR0aGlzLT52ZXJzaW9uLCB0cnVlKSwgc2VsZjo6JHRyYW5zT3BJbnRbJG90aGVyT3BlcmF0b3JdKTsKfQoKaWYgKHNlbGY6Ok9QX05FID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gc3ByaW50ZignJGIgfHwgKCEkYiAmJiBcdmVyc2lvbl9jb21wYXJlKCR2LCAlcywgXCchPVwnKSknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CgppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAndHJ1ZSc7Cn0KcmV0dXJuICchJGInOwp9CgppZiAoc2VsZjo6T1BfTFQgPT09ICR0aGlzLT5vcGVyYXRvciB8fCBzZWxmOjpPUF9MRSA9PT0gJHRoaXMtPm9wZXJhdG9yKSB7CmlmIChzZWxmOjpPUF9MVCA9PT0gJG90aGVyT3BlcmF0b3IgfHwgc2VsZjo6T1BfTEUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAnISRiJzsKfQp9IGVsc2UgeyAKaWYgKHNlbGY6Ok9QX0dUID09PSAkb3RoZXJPcGVyYXRvciB8fCBzZWxmOjpPUF9HRSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuICchJGInOwp9Cn0KCmlmIChzZWxmOjpPUF9ORSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuICd0cnVlJzsKfQoKJGNvZGVDb21wYXJpc29uID0gc3ByaW50ZignXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnJXNcJyknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSksIHNlbGY6OiR0cmFuc09wSW50WyR0aGlzLT5vcGVyYXRvcl0pOwppZiAoJHRoaXMtPm9wZXJhdG9yID09PSBzZWxmOjpPUF9MRSkgewppZiAoJG90aGVyT3BlcmF0b3IgPT09IHNlbGY6Ok9QX0dUKSB7CnJldHVybiBzcHJpbnRmKCchJGIgJiYgXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnIT1cJykgJiYgJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKSAuICRjb2RlQ29tcGFyaXNvbjsKfQp9IGVsc2VpZiAoJHRoaXMtPm9wZXJhdG9yID09PSBzZWxmOjpPUF9HRSkgewppZiAoJG90aGVyT3BlcmF0b3IgPT09IHNlbGY6Ok9QX0xUKSB7CnJldHVybiBzcHJpbnRmKCchJGIgJiYgXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnIT1cJykgJiYgJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKSAuICRjb2RlQ29tcGFyaXNvbjsKfQp9CgpyZXR1cm4gc3ByaW50ZignISRiICYmICVzJywgJGNvZGVDb21wYXJpc29uKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoU3BlY2lmaWMoQ29uc3RyYWludCAkcHJvdmlkZXIsICRjb21wYXJlQnJhbmNoZXMgPSBmYWxzZSkKewokbm9FcXVhbE9wID0gc3RyX3JlcGxhY2UoJz0nLCAnJywgc2VsZjo6JHRyYW5zT3BJbnRbJHRoaXMtPm9wZXJhdG9yXSk7CiRwcm92aWRlck5vRXF1YWxPcCA9IHN0cl9yZXBsYWNlKCc9JywgJycsIHNlbGY6OiR0cmFuc09wSW50WyRwcm92aWRlci0+b3BlcmF0b3JdKTsKCiRpc0VxdWFsT3AgPSBzZWxmOjpPUF9FUSA9PT0gJHRoaXMtPm9wZXJhdG9yOwokaXNOb25FcXVhbE9wID0gc2VsZjo6T1BfTkUgPT09ICR0aGlzLT5vcGVyYXRvcjsKJGlzUHJvdmlkZXJFcXVhbE9wID0gc2VsZjo6T1BfRVEgPT09ICRwcm92aWRlci0+b3BlcmF0b3I7CiRpc1Byb3ZpZGVyTm9uRXF1YWxPcCA9IHNlbGY6Ok9QX05FID09PSAkcHJvdmlkZXItPm9wZXJhdG9yOwoKCgppZiAoJGlzTm9uRXF1YWxPcCB8fCAkaXNQcm92aWRlck5vbkVxdWFsT3ApIHsKaWYgKCRpc05vbkVxdWFsT3AgJiYgISRpc1Byb3ZpZGVyTm9uRXF1YWxPcCAmJiAhJGlzUHJvdmlkZXJFcXVhbE9wICYmIHN0cnBvcygkcHJvdmlkZXItPnZlcnNpb24sICdkZXYtJykgPT09IDApIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJGlzUHJvdmlkZXJOb25FcXVhbE9wICYmICEkaXNOb25FcXVhbE9wICYmICEkaXNFcXVhbE9wICYmIHN0cnBvcygkdGhpcy0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJGlzRXF1YWxPcCAmJiAhJGlzUHJvdmlkZXJFcXVhbE9wKSB7CnJldHVybiB0cnVlOwp9CnJldHVybiAkdGhpcy0+dmVyc2lvbkNvbXBhcmUoJHByb3ZpZGVyLT52ZXJzaW9uLCAkdGhpcy0+dmVyc2lvbiwgJyE9JywgJGNvbXBhcmVCcmFuY2hlcyk7Cn0KCgoKaWYgKCR0aGlzLT5vcGVyYXRvciAhPT0gc2VsZjo6T1BfRVEgJiYgJG5vRXF1YWxPcCA9PT0gJHByb3ZpZGVyTm9FcXVhbE9wKSB7CnJldHVybiAhKHN0cnBvcygkdGhpcy0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCB8fCBzdHJwb3MoJHByb3ZpZGVyLT52ZXJzaW9uLCAnZGV2LScpID09PSAwKTsKfQoKJHZlcnNpb24xID0gJGlzRXF1YWxPcCA/ICR0aGlzLT52ZXJzaW9uIDogJHByb3ZpZGVyLT52ZXJzaW9uOwokdmVyc2lvbjIgPSAkaXNFcXVhbE9wID8gJHByb3ZpZGVyLT52ZXJzaW9uIDogJHRoaXMtPnZlcnNpb247CiRvcGVyYXRvciA9ICRpc0VxdWFsT3AgPyAkcHJvdmlkZXItPm9wZXJhdG9yIDogJHRoaXMtPm9wZXJhdG9yOwoKaWYgKCR0aGlzLT52ZXJzaW9uQ29tcGFyZSgkdmVyc2lvbjEsICR2ZXJzaW9uMiwgc2VsZjo6JHRyYW5zT3BJbnRbJG9wZXJhdG9yXSwgJGNvbXBhcmVCcmFuY2hlcykpIHsKCgoKcmV0dXJuICEoc2VsZjo6JHRyYW5zT3BJbnRbJHByb3ZpZGVyLT5vcGVyYXRvcl0gPT09ICRwcm92aWRlck5vRXF1YWxPcAomJiBzZWxmOjokdHJhbnNPcEludFskdGhpcy0+b3BlcmF0b3JdICE9PSAkbm9FcXVhbE9wCiYmIFx2ZXJzaW9uX2NvbXBhcmUoJHByb3ZpZGVyLT52ZXJzaW9uLCAkdGhpcy0+dmVyc2lvbiwgJz09JykpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gc2VsZjo6JHRyYW5zT3BJbnRbJHRoaXMtPm9wZXJhdG9yXSAuICcgJyAuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG93ZXJCb3VuZCgpCnsKJHRoaXMtPmV4dHJhY3RCb3VuZHMoKTsKCnJldHVybiAkdGhpcy0+bG93ZXJCb3VuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwcGVyQm91bmQoKQp7CiR0aGlzLT5leHRyYWN0Qm91bmRzKCk7CgpyZXR1cm4gJHRoaXMtPnVwcGVyQm91bmQ7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEJvdW5kcygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5sb3dlckJvdW5kKSB7CnJldHVybjsKfQoKCmlmIChzdHJwb3MoJHRoaXMtPnZlcnNpb24sICdkZXYtJykgPT09IDApIHsKJHRoaXMtPmxvd2VyQm91bmQgPSBCb3VuZDo6emVybygpOwokdGhpcy0+dXBwZXJCb3VuZCA9IEJvdW5kOjpwb3NpdGl2ZUluZmluaXR5KCk7CgpyZXR1cm47Cn0KCnN3aXRjaCAoJHRoaXMtPm9wZXJhdG9yKSB7CmNhc2Ugc2VsZjo6T1BfRVE6CiR0aGlzLT5sb3dlckJvdW5kID0gbmV3IEJvdW5kKCR0aGlzLT52ZXJzaW9uLCB0cnVlKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBuZXcgQm91bmQoJHRoaXMtPnZlcnNpb24sIHRydWUpOwpicmVhazsKY2FzZSBzZWxmOjpPUF9MVDoKJHRoaXMtPmxvd2VyQm91bmQgPSBCb3VuZDo6emVybygpOwokdGhpcy0+dXBwZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgZmFsc2UpOwpicmVhazsKY2FzZSBzZWxmOjpPUF9MRToKJHRoaXMtPmxvd2VyQm91bmQgPSBCb3VuZDo6emVybygpOwokdGhpcy0+dXBwZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSk7CmJyZWFrOwpjYXNlIHNlbGY6Ok9QX0dUOgokdGhpcy0+bG93ZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgZmFsc2UpOwokdGhpcy0+dXBwZXJCb3VuZCA9IEJvdW5kOjpwb3NpdGl2ZUluZmluaXR5KCk7CmJyZWFrOwpjYXNlIHNlbGY6Ok9QX0dFOgokdGhpcy0+bG93ZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSk7CiR0aGlzLT51cHBlckJvdW5kID0gQm91bmQ6OnBvc2l0aXZlSW5maW5pdHkoKTsKYnJlYWs7CmNhc2Ugc2VsZjo6T1BfTkU6CiR0aGlzLT5sb3dlckJvdW5kID0gQm91bmQ6Onplcm8oKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBCb3VuZDo6cG9zaXRpdmVJbmZpbml0eSgpOwpicmVhazsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCgoKCmludGVyZmFjZSBDb25zdHJhaW50SW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaGVzKENvbnN0cmFpbnRJbnRlcmZhY2UgJHByb3ZpZGVyKTsKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkb3RoZXJPcGVyYXRvcik7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBwZXJCb3VuZCgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZXR0eVN0cmluZygkcHJldHR5U3RyaW5nKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgTWF0Y2hBbGxDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHByZXR0eVN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CnJldHVybiAndHJ1ZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmV0dHlTdHJpbmcoJHByZXR0eVN0cmluZykKewokdGhpcy0+cHJldHR5U3RyaW5nID0gJHByZXR0eVN0cmluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpCnsKaWYgKCR0aGlzLT5wcmV0dHlTdHJpbmcpIHsKcmV0dXJuICR0aGlzLT5wcmV0dHlTdHJpbmc7Cn0KCnJldHVybiAoc3RyaW5nKSAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAnKic7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcHBlckJvdW5kKCkKewpyZXR1cm4gQm91bmQ6OnBvc2l0aXZlSW5maW5pdHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKQp7CnJldHVybiBCb3VuZDo6emVybygpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCmNsYXNzIE1hdGNoTm9uZUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkcHJldHR5U3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWF0Y2hlcyhDb25zdHJhaW50SW50ZXJmYWNlICRwcm92aWRlcikKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CnJldHVybiAnZmFsc2UnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJldHR5U3RyaW5nKCRwcmV0dHlTdHJpbmcpCnsKJHRoaXMtPnByZXR0eVN0cmluZyA9ICRwcmV0dHlTdHJpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKQp7CmlmICgkdGhpcy0+cHJldHR5U3RyaW5nKSB7CnJldHVybiAkdGhpcy0+cHJldHR5U3RyaW5nOwp9CgpyZXR1cm4gKHN0cmluZykgJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJ1tdJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwcGVyQm91bmQoKQp7CnJldHVybiBuZXcgQm91bmQoJzAuMC4wLjAtZGV2JywgZmFsc2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG93ZXJCb3VuZCgpCnsKcmV0dXJuIG5ldyBCb3VuZCgnMC4wLjAuMC1kZXYnLCBmYWxzZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50OwoKCgoKY2xhc3MgTXVsdGlDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CgoKCgpwcm90ZWN0ZWQgJGNvbnN0cmFpbnRzOwoKCnByb3RlY3RlZCAkcHJldHR5U3RyaW5nOwoKCnByb3RlY3RlZCAkc3RyaW5nOwoKCnByb3RlY3RlZCAkY29uanVuY3RpdmU7CgoKcHJvdGVjdGVkICRsb3dlckJvdW5kOwoKCnByb3RlY3RlZCAkdXBwZXJCb3VuZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29uc3RyYWludHMsICRjb25qdW5jdGl2ZSA9IHRydWUpCnsKaWYgKFxjb3VudCgkY29uc3RyYWludHMpIDwgMikgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ011c3QgcHJvdmlkZSBhdCBsZWFzdCB0d28gY29uc3RyYWludHMgZm9yIGEgTXVsdGlDb25zdHJhaW50LiBVc2UgJy4KJ3RoZSByZWd1bGFyIENvbnN0cmFpbnQgY2xhc3MgZm9yIG9uZSBjb25zdHJhaW50IG9ubHkgb3IgTWF0Y2hBbGxDb25zdHJhaW50IGZvciBub25lLiBZb3UgbWF5IHVzZSAnLgonTXVsdGlDb25zdHJhaW50OjpjcmVhdGUoKSB3aGljaCBvcHRpbWl6ZXMgYW5kIGhhbmRsZXMgdGhvc2UgY2FzZXMgYXV0b21hdGljYWxseS4nCik7Cn0KCiR0aGlzLT5jb25zdHJhaW50cyA9ICRjb25zdHJhaW50czsKJHRoaXMtPmNvbmp1bmN0aXZlID0gJGNvbmp1bmN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uc3RyYWludHMoKQp7CnJldHVybiAkdGhpcy0+Y29uc3RyYWludHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Nvbmp1bmN0aXZlKCkKewpyZXR1cm4gJHRoaXMtPmNvbmp1bmN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEaXNqdW5jdGl2ZSgpCnsKcmV0dXJuICEkdGhpcy0+Y29uanVuY3RpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CiRwYXJ0cyA9IGFycmF5KCk7CmZvcmVhY2ggKCR0aGlzLT5jb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewokY29kZSA9ICRjb25zdHJhaW50LT5jb21waWxlKCRvdGhlck9wZXJhdG9yKTsKaWYgKCRjb2RlID09PSAndHJ1ZScpIHsKaWYgKCEkdGhpcy0+Y29uanVuY3RpdmUpIHsKcmV0dXJuICd0cnVlJzsKfQp9IGVsc2VpZiAoJGNvZGUgPT09ICdmYWxzZScpIHsKaWYgKCR0aGlzLT5jb25qdW5jdGl2ZSkgewpyZXR1cm4gJ2ZhbHNlJzsKfQp9IGVsc2UgewokcGFydHNbXSA9ICcoJy4kY29kZS4nKSc7Cn0KfQoKaWYgKCEkcGFydHMpIHsKcmV0dXJuICR0aGlzLT5jb25qdW5jdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZSc7Cn0KCnJldHVybiAkdGhpcy0+Y29uanVuY3RpdmUgPyBpbXBsb2RlKCcmJicsICRwYXJ0cykgOiBpbXBsb2RlKCd8fCcsICRwYXJ0cyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKaWYgKGZhbHNlID09PSAkdGhpcy0+Y29uanVuY3RpdmUpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CmlmICgkcHJvdmlkZXItPm1hdGNoZXMoJGNvbnN0cmFpbnQpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKaWYgKCRwcm92aWRlciBpbnN0YW5jZW9mIE11bHRpQ29uc3RyYWludCAmJiAkcHJvdmlkZXItPmlzRGlzanVuY3RpdmUoKSkgewpyZXR1cm4gJHByb3ZpZGVyLT5tYXRjaGVzKCR0aGlzKTsKfQoKZm9yZWFjaCAoJHRoaXMtPmNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CmlmICghJHByb3ZpZGVyLT5tYXRjaGVzKCRjb25zdHJhaW50KSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmV0dHlTdHJpbmcoJHByZXR0eVN0cmluZykKewokdGhpcy0+cHJldHR5U3RyaW5nID0gJHByZXR0eVN0cmluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpCnsKaWYgKCR0aGlzLT5wcmV0dHlTdHJpbmcpIHsKcmV0dXJuICR0aGlzLT5wcmV0dHlTdHJpbmc7Cn0KCnJldHVybiAoc3RyaW5nKSAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CmlmICgkdGhpcy0+c3RyaW5nICE9PSBudWxsKSB7CnJldHVybiAkdGhpcy0+c3RyaW5nOwp9CgokY29uc3RyYWludHMgPSBhcnJheSgpOwpmb3JlYWNoICgkdGhpcy0+Y29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKJGNvbnN0cmFpbnRzW10gPSAoc3RyaW5nKSAkY29uc3RyYWludDsKfQoKcmV0dXJuICR0aGlzLT5zdHJpbmcgPSAnWycgLiBpbXBsb2RlKCR0aGlzLT5jb25qdW5jdGl2ZSA/ICcgJyA6ICcgfHwgJywgJGNvbnN0cmFpbnRzKSAuICddJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKQp7CiR0aGlzLT5leHRyYWN0Qm91bmRzKCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPmxvd2VyQm91bmQpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignZXh0cmFjdEJvdW5kcyBzaG91bGQgaGF2ZSBwb3B1bGF0ZWQgdGhlIGxvd2VyQm91bmQgcHJvcGVydHknKTsKfQoKcmV0dXJuICR0aGlzLT5sb3dlckJvdW5kOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBwZXJCb3VuZCgpCnsKJHRoaXMtPmV4dHJhY3RCb3VuZHMoKTsKCmlmIChudWxsID09PSAkdGhpcy0+dXBwZXJCb3VuZCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdleHRyYWN0Qm91bmRzIHNob3VsZCBoYXZlIHBvcHVsYXRlZCB0aGUgdXBwZXJCb3VuZCBwcm9wZXJ0eScpOwp9CgpyZXR1cm4gJHRoaXMtPnVwcGVyQm91bmQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoYXJyYXkgJGNvbnN0cmFpbnRzLCAkY29uanVuY3RpdmUgPSB0cnVlKQp7CmlmICgwID09PSBcY291bnQoJGNvbnN0cmFpbnRzKSkgewpyZXR1cm4gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgppZiAoMSA9PT0gXGNvdW50KCRjb25zdHJhaW50cykpIHsKcmV0dXJuICRjb25zdHJhaW50c1swXTsKfQoKJG9wdGltaXplZCA9IHNlbGY6Om9wdGltaXplQ29uc3RyYWludHMoJGNvbnN0cmFpbnRzLCAkY29uanVuY3RpdmUpOwppZiAoJG9wdGltaXplZCAhPT0gbnVsbCkgewpsaXN0KCRjb25zdHJhaW50cywgJGNvbmp1bmN0aXZlKSA9ICRvcHRpbWl6ZWQ7CmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA9PT0gMSkgewpyZXR1cm4gJGNvbnN0cmFpbnRzWzBdOwp9Cn0KCnJldHVybiBuZXcgc2VsZigkY29uc3RyYWludHMsICRjb25qdW5jdGl2ZSk7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBvcHRpbWl6ZUNvbnN0cmFpbnRzKGFycmF5ICRjb25zdHJhaW50cywgJGNvbmp1bmN0aXZlKQp7CgoKCmlmICghJGNvbmp1bmN0aXZlKSB7CiRsZWZ0ID0gJGNvbnN0cmFpbnRzWzBdOwokbWVyZ2VkQ29uc3RyYWludHMgPSBhcnJheSgpOwokb3B0aW1pemVkID0gZmFsc2U7CmZvciAoJGkgPSAxLCAkbCA9IFxjb3VudCgkY29uc3RyYWludHMpOyAkaSA8ICRsOyAkaSsrKSB7CiRyaWdodCA9ICRjb25zdHJhaW50c1skaV07CmlmICgKJGxlZnQgaW5zdGFuY2VvZiBzZWxmCiYmICRsZWZ0LT5jb25qdW5jdGl2ZQomJiAkcmlnaHQgaW5zdGFuY2VvZiBzZWxmCiYmICRyaWdodC0+Y29uanVuY3RpdmUKJiYgXGNvdW50KCRsZWZ0LT5jb25zdHJhaW50cykgPT09IDIKJiYgXGNvdW50KCRyaWdodC0+Y29uc3RyYWludHMpID09PSAyCiYmICgkbGVmdDAgPSAoc3RyaW5nKSAkbGVmdC0+Y29uc3RyYWludHNbMF0pCiYmICRsZWZ0MFswXSA9PT0gJz4nICYmICRsZWZ0MFsxXSA9PT0gJz0nCiYmICgkbGVmdDEgPSAoc3RyaW5nKSAkbGVmdC0+Y29uc3RyYWludHNbMV0pCiYmICRsZWZ0MVswXSA9PT0gJzwnCiYmICgkcmlnaHQwID0gKHN0cmluZykgJHJpZ2h0LT5jb25zdHJhaW50c1swXSkKJiYgJHJpZ2h0MFswXSA9PT0gJz4nICYmICRyaWdodDBbMV0gPT09ICc9JwomJiAoJHJpZ2h0MSA9IChzdHJpbmcpICRyaWdodC0+Y29uc3RyYWludHNbMV0pCiYmICRyaWdodDFbMF0gPT09ICc8JwomJiBzdWJzdHIoJGxlZnQxLCAyKSA9PT0gc3Vic3RyKCRyaWdodDAsIDMpCikgewokb3B0aW1pemVkID0gdHJ1ZTsKJGxlZnQgPSBuZXcgTXVsdGlDb25zdHJhaW50KAphcnJheSgKJGxlZnQtPmNvbnN0cmFpbnRzWzBdLAokcmlnaHQtPmNvbnN0cmFpbnRzWzFdLAopLAp0cnVlKTsKfSBlbHNlIHsKJG1lcmdlZENvbnN0cmFpbnRzW10gPSAkbGVmdDsKJGxlZnQgPSAkcmlnaHQ7Cn0KfQppZiAoJG9wdGltaXplZCkgewokbWVyZ2VkQ29uc3RyYWludHNbXSA9ICRsZWZ0OwpyZXR1cm4gYXJyYXkoJG1lcmdlZENvbnN0cmFpbnRzLCBmYWxzZSk7Cn0KfQoKCgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0Qm91bmRzKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmxvd2VyQm91bmQpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdGhpcy0+Y29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKaWYgKG51bGwgPT09ICR0aGlzLT5sb3dlckJvdW5kIHx8IG51bGwgPT09ICR0aGlzLT51cHBlckJvdW5kKSB7CiR0aGlzLT5sb3dlckJvdW5kID0gJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKTsKJHRoaXMtPnVwcGVyQm91bmQgPSAkY29uc3RyYWludC0+Z2V0VXBwZXJCb3VuZCgpOwpjb250aW51ZTsKfQoKaWYgKCRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmNvbXBhcmVUbygkdGhpcy0+bG93ZXJCb3VuZCwgJHRoaXMtPmlzQ29uanVuY3RpdmUoKSA/ICc+JyA6ICc8JykpIHsKJHRoaXMtPmxvd2VyQm91bmQgPSAkY29uc3RyYWludC0+Z2V0TG93ZXJCb3VuZCgpOwp9CgppZiAoJGNvbnN0cmFpbnQtPmdldFVwcGVyQm91bmQoKS0+Y29tcGFyZVRvKCR0aGlzLT51cHBlckJvdW5kLCAkdGhpcy0+aXNDb25qdW5jdGl2ZSgpID8gJzwnIDogJz4nKSkgewokdGhpcy0+dXBwZXJCb3VuZCA9ICRjb25zdHJhaW50LT5nZXRVcHBlckJvdW5kKCk7Cn0KfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXI7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCmNsYXNzIEludGVydmFsCnsKCnByaXZhdGUgJHN0YXJ0OwoKcHJpdmF0ZSAkZW5kOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbnN0cmFpbnQgJHN0YXJ0LCBDb25zdHJhaW50ICRlbmQpCnsKJHRoaXMtPnN0YXJ0ID0gJHN0YXJ0OwokdGhpcy0+ZW5kID0gJGVuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0KCkKewpyZXR1cm4gJHRoaXMtPnN0YXJ0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW5kKCkKewpyZXR1cm4gJHRoaXMtPmVuZDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tWmVybygpCnsKc3RhdGljICR6ZXJvOwoKaWYgKG51bGwgPT09ICR6ZXJvKSB7CiR6ZXJvID0gbmV3IENvbnN0cmFpbnQoJz49JywgJzAuMC4wLjAtZGV2Jyk7Cn0KCnJldHVybiAkemVybzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnRpbFBvc2l0aXZlSW5maW5pdHkoKQp7CnN0YXRpYyAkcG9zaXRpdmVJbmZpbml0eTsKCmlmIChudWxsID09PSAkcG9zaXRpdmVJbmZpbml0eSkgewokcG9zaXRpdmVJbmZpbml0eSA9IG5ldyBDb25zdHJhaW50KCc8JywgUEhQX0lOVF9NQVguJy4wLjAuMCcpOwp9CgpyZXR1cm4gJHBvc2l0aXZlSW5maW5pdHk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYW55KCkKewpyZXR1cm4gbmV3IHNlbGYoc2VsZjo6ZnJvbVplcm8oKSwgc2VsZjo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFueURldigpCnsKCnJldHVybiBhcnJheSgnbmFtZXMnID0+IGFycmF5KCksICdleGNsdWRlJyA9PiB0cnVlKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub0RldigpCnsKCnJldHVybiBhcnJheSgnbmFtZXMnID0+IGFycmF5KCksICdleGNsdWRlJyA9PiBmYWxzZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoTm9uZUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CgoKCgoKCgoKCgoKCgpjbGFzcyBJbnRlcnZhbHMKewoKCgpwcml2YXRlIHN0YXRpYyAkaW50ZXJ2YWxzQ2FjaGUgPSBhcnJheSgpOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJG9wU29ydE9yZGVyID0gYXJyYXkoCic+PScgPT4gLTMsCic8JyA9PiAtMiwKJz4nID0+IDIsCic8PScgPT4gMywKKTsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGVhcigpCnsKc2VsZjo6JGludGVydmFsc0NhY2hlID0gYXJyYXkoKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzU3Vic2V0T2YoQ29uc3RyYWludEludGVyZmFjZSAkY2FuZGlkYXRlLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KQp7CmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIE1hdGNoQWxsQ29uc3RyYWludCkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50IHx8ICRjb25zdHJhaW50IGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbnRlcnNlY3Rpb25JbnRlcnZhbHMgPSBzZWxmOjpnZXQobmV3IE11bHRpQ29uc3RyYWludChhcnJheSgkY2FuZGlkYXRlLCAkY29uc3RyYWludCksIHRydWUpKTsKJGNhbmRpZGF0ZUludGVydmFscyA9IHNlbGY6OmdldCgkY2FuZGlkYXRlKTsKaWYgKFxjb3VudCgkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydudW1lcmljJ10pICE9PSBcY291bnQoJGNhbmRpZGF0ZUludGVydmFsc1snbnVtZXJpYyddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmZvcmVhY2ggKCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ251bWVyaWMnXSBhcyAkaW5kZXggPT4gJGludGVydmFsKSB7CmlmICghaXNzZXQoJGNhbmRpZGF0ZUludGVydmFsc1snbnVtZXJpYyddWyRpbmRleF0pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKChzdHJpbmcpICRjYW5kaWRhdGVJbnRlcnZhbHNbJ251bWVyaWMnXVskaW5kZXhdLT5nZXRTdGFydCgpICE9PSAoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldFN0YXJ0KCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoKHN0cmluZykgJGNhbmRpZGF0ZUludGVydmFsc1snbnVtZXJpYyddWyRpbmRleF0tPmdldEVuZCgpICE9PSAoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldEVuZCgpKSB7CnJldHVybiBmYWxzZTsKfQp9CgppZiAoJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddICE9PSAkY2FuZGlkYXRlSW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10pIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChcY291bnQoJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSkgIT09IFxjb3VudCgkY2FuZGlkYXRlSW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddKSkgewpyZXR1cm4gZmFsc2U7Cn0KZm9yZWFjaCAoJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSBhcyAkaW5kZXggPT4gJG5hbWUpIHsKaWYgKCRuYW1lICE9PSAkY2FuZGlkYXRlSW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddWyRpbmRleF0pIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGF2ZUludGVyc2VjdGlvbnMoQ29uc3RyYWludEludGVyZmFjZSAkYSwgQ29uc3RyYWludEludGVyZmFjZSAkYikKewppZiAoJGEgaW5zdGFuY2VvZiBNYXRjaEFsbENvbnN0cmFpbnQgfHwgJGIgaW5zdGFuY2VvZiBNYXRjaEFsbENvbnN0cmFpbnQpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgkYSBpbnN0YW5jZW9mIE1hdGNoTm9uZUNvbnN0cmFpbnQgfHwgJGIgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50KSB7CnJldHVybiBmYWxzZTsKfQoKJGludGVyc2VjdGlvbkludGVydmFscyA9IHNlbGY6OmdlbmVyYXRlSW50ZXJ2YWxzKG5ldyBNdWx0aUNvbnN0cmFpbnQoYXJyYXkoJGEsICRiKSwgdHJ1ZSksIHRydWUpOwoKcmV0dXJuIFxjb3VudCgkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydudW1lcmljJ10pID4gMCB8fCAkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10gfHwgXGNvdW50KCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pID4gMDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcGFjdENvbnN0cmFpbnQoQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgTXVsdGlDb25zdHJhaW50KSB7CnJldHVybiAkY29uc3RyYWludDsKfQoKJGludGVydmFscyA9IHNlbGY6OmdlbmVyYXRlSW50ZXJ2YWxzKCRjb25zdHJhaW50KTsKJGNvbnN0cmFpbnRzID0gYXJyYXkoKTsKJGhhc051bWVyaWNNYXRjaEFsbCA9IGZhbHNlOwoKaWYgKFxjb3VudCgkaW50ZXJ2YWxzWydudW1lcmljJ10pID09PSAxICYmIChzdHJpbmcpICRpbnRlcnZhbHNbJ251bWVyaWMnXVswXS0+Z2V0U3RhcnQoKSA9PT0gKHN0cmluZykgSW50ZXJ2YWw6OmZyb21aZXJvKCkgJiYgKHN0cmluZykgJGludGVydmFsc1snbnVtZXJpYyddWzBdLT5nZXRFbmQoKSA9PT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiRjb25zdHJhaW50c1tdID0gJGludGVydmFsc1snbnVtZXJpYyddWzBdLT5nZXRTdGFydCgpOwokaGFzTnVtZXJpY01hdGNoQWxsID0gdHJ1ZTsKfSBlbHNlIHsKJHVuRXF1YWxDb25zdHJhaW50cyA9IGFycmF5KCk7CmZvciAoJGkgPSAwLCAkY291bnQgPSBcY291bnQoJGludGVydmFsc1snbnVtZXJpYyddKTsgJGkgPCAkY291bnQ7ICRpKyspIHsKJGludGVydmFsID0gJGludGVydmFsc1snbnVtZXJpYyddWyRpXTsKCgoKCgppZiAoJGludGVydmFsLT5nZXRFbmQoKS0+Z2V0T3BlcmF0b3IoKSA9PT0gJzwnICYmICRpKzEgPCAkY291bnQpIHsKJG5leHRJbnRlcnZhbCA9ICRpbnRlcnZhbHNbJ251bWVyaWMnXVskaSsxXTsKaWYgKCRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSA9PT0gJG5leHRJbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0VmVyc2lvbigpICYmICRuZXh0SW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldE9wZXJhdG9yKCkgPT09ICc+JykgewoKCgppZiAoXGNvdW50KCR1bkVxdWFsQ29uc3RyYWludHMpID09PSAwICYmIChzdHJpbmcpICRpbnRlcnZhbC0+Z2V0U3RhcnQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OmZyb21aZXJvKCkpIHsKJHVuRXF1YWxDb25zdHJhaW50c1tdID0gJGludGVydmFsLT5nZXRTdGFydCgpOwp9CiR1bkVxdWFsQ29uc3RyYWludHNbXSA9IG5ldyBDb25zdHJhaW50KCchPScsICRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSk7CmNvbnRpbnVlOwp9Cn0KCmlmIChcY291bnQoJHVuRXF1YWxDb25zdHJhaW50cykgPiAwKSB7CgppZiAoKHN0cmluZykgJGludGVydmFsLT5nZXRFbmQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiR1bkVxdWFsQ29uc3RyYWludHNbXSA9ICRpbnRlcnZhbC0+Z2V0RW5kKCk7Cn0KCgppZiAoXGNvdW50KCR1bkVxdWFsQ29uc3RyYWludHMpID4gMSkgewokY29uc3RyYWludHNbXSA9IG5ldyBNdWx0aUNvbnN0cmFpbnQoJHVuRXF1YWxDb25zdHJhaW50cywgdHJ1ZSk7Cn0gZWxzZSB7CiRjb25zdHJhaW50c1tdID0gJHVuRXF1YWxDb25zdHJhaW50c1swXTsKfQoKJHVuRXF1YWxDb25zdHJhaW50cyA9IGFycmF5KCk7CmNvbnRpbnVlOwp9CgoKaWYgKCRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0VmVyc2lvbigpID09PSAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRWZXJzaW9uKCkgJiYgJGludGVydmFsLT5nZXRTdGFydCgpLT5nZXRPcGVyYXRvcigpID09PSAnPj0nICYmICRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldE9wZXJhdG9yKCkgPT09ICc8PScpIHsKJGNvbnN0cmFpbnRzW10gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkaW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldFZlcnNpb24oKSk7CmNvbnRpbnVlOwp9CgppZiAoKHN0cmluZykgJGludGVydmFsLT5nZXRTdGFydCgpID09PSAoc3RyaW5nKSBJbnRlcnZhbDo6ZnJvbVplcm8oKSkgewokY29uc3RyYWludHNbXSA9ICRpbnRlcnZhbC0+Z2V0RW5kKCk7Cn0gZWxzZWlmICgoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldEVuZCgpID09PSAoc3RyaW5nKSBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpIHsKJGNvbnN0cmFpbnRzW10gPSAkaW50ZXJ2YWwtPmdldFN0YXJ0KCk7Cn0gZWxzZSB7CiRjb25zdHJhaW50c1tdID0gbmV3IE11bHRpQ29uc3RyYWludChhcnJheSgkaW50ZXJ2YWwtPmdldFN0YXJ0KCksICRpbnRlcnZhbC0+Z2V0RW5kKCkpLCB0cnVlKTsKfQp9Cn0KCiRkZXZDb25zdHJhaW50cyA9IGFycmF5KCk7CgppZiAoMCA9PT0gXGNvdW50KCRpbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pKSB7CmlmICgkaW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10pIHsKaWYgKCRoYXNOdW1lcmljTWF0Y2hBbGwpIHsKcmV0dXJuIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQ7Cn0KCn0KfSBlbHNlIHsKZm9yZWFjaCAoJGludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSBhcyAkYnJhbmNoTmFtZSkgewppZiAoJGludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddKSB7CiRkZXZDb25zdHJhaW50c1tdID0gbmV3IENvbnN0cmFpbnQoJyE9JywgJGJyYW5jaE5hbWUpOwp9IGVsc2UgewokZGV2Q29uc3RyYWludHNbXSA9IG5ldyBDb25zdHJhaW50KCc9PScsICRicmFuY2hOYW1lKTsKfQp9CgoKCmlmICgkaW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10pIHsKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID4gMSkgewpyZXR1cm4gbmV3IE11bHRpQ29uc3RyYWludChhcnJheV9tZXJnZSgKYXJyYXkobmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludHMsIGZhbHNlKSksCiRkZXZDb25zdHJhaW50cwopLCB0cnVlKTsKfQoKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID09PSAxICYmIChzdHJpbmcpJGNvbnN0cmFpbnRzWzBdID09PSAoc3RyaW5nKUludGVydmFsOjpmcm9tWmVybygpKSB7CmlmIChcY291bnQoJGRldkNvbnN0cmFpbnRzKSA+IDEpIHsKcmV0dXJuIG5ldyBNdWx0aUNvbnN0cmFpbnQoJGRldkNvbnN0cmFpbnRzLCB0cnVlKTsKfQpyZXR1cm4gJGRldkNvbnN0cmFpbnRzWzBdOwp9CgpyZXR1cm4gbmV3IE11bHRpQ29uc3RyYWludChhcnJheV9tZXJnZSgkY29uc3RyYWludHMsICRkZXZDb25zdHJhaW50cyksIHRydWUpOwp9CgoKCiRjb25zdHJhaW50cyA9IGFycmF5X21lcmdlKCRjb25zdHJhaW50cywgJGRldkNvbnN0cmFpbnRzKTsKfQoKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID4gMSkgewpyZXR1cm4gbmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludHMsIGZhbHNlKTsKfQoKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID09PSAxKSB7CnJldHVybiAkY29uc3RyYWludHNbMF07Cn0KCnJldHVybiBuZXcgTWF0Y2hOb25lQ29uc3RyYWludDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKJGtleSA9IChzdHJpbmcpICRjb25zdHJhaW50OwoKaWYgKCFpc3NldChzZWxmOjokaW50ZXJ2YWxzQ2FjaGVbJGtleV0pKSB7CnNlbGY6OiRpbnRlcnZhbHNDYWNoZVska2V5XSA9IHNlbGY6OmdlbmVyYXRlSW50ZXJ2YWxzKCRjb25zdHJhaW50KTsKfQoKcmV0dXJuIHNlbGY6OiRpbnRlcnZhbHNDYWNoZVska2V5XTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZUludGVydmFscyhDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50LCAkc3RvcE9uRmlyc3RWYWxpZEludGVydmFsID0gZmFsc2UpCnsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgTWF0Y2hBbGxDb25zdHJhaW50KSB7CnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkobmV3IEludGVydmFsKEludGVydmFsOjpmcm9tWmVybygpLCBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpKSwgJ2JyYW5jaGVzJyA9PiBJbnRlcnZhbDo6YW55RGV2KCkpOwp9CgppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50KSB7CnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkoKSwgJ2JyYW5jaGVzJyA9PiBhcnJheSgnbmFtZXMnID0+IGFycmF5KCksICdleGNsdWRlJyA9PiBmYWxzZSkpOwp9CgppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50KSB7CnJldHVybiBzZWxmOjpnZW5lcmF0ZVNpbmdsZUNvbnN0cmFpbnRJbnRlcnZhbHMoJGNvbnN0cmFpbnQpOwp9CgppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgTXVsdGlDb25zdHJhaW50KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdUaGUgY29uc3RyYWludCBwYXNzZWQgaW4gc2hvdWxkIGJlIGFuIE1hdGNoQWxsQ29uc3RyYWludCwgQ29uc3RyYWludCBvciBNdWx0aUNvbnN0cmFpbnQgaW5zdGFuY2UsIGdvdCAnLlxnZXRfY2xhc3MoJGNvbnN0cmFpbnQpLicuJyk7Cn0KCiRjb25zdHJhaW50cyA9ICRjb25zdHJhaW50LT5nZXRDb25zdHJhaW50cygpOwoKJG51bWVyaWNHcm91cHMgPSBhcnJheSgpOwokY29uc3RyYWludEJyYW5jaGVzID0gYXJyYXkoKTsKZm9yZWFjaCAoJGNvbnN0cmFpbnRzIGFzICRjKSB7CiRyZXMgPSBzZWxmOjpnZXQoJGMpOwokbnVtZXJpY0dyb3Vwc1tdID0gJHJlc1snbnVtZXJpYyddOwokY29uc3RyYWludEJyYW5jaGVzW10gPSAkcmVzWydicmFuY2hlcyddOwp9CgppZiAoJGNvbnN0cmFpbnQtPmlzRGlzanVuY3RpdmUoKSkgewokYnJhbmNoZXMgPSBJbnRlcnZhbDo6bm9EZXYoKTsKZm9yZWFjaCAoJGNvbnN0cmFpbnRCcmFuY2hlcyBhcyAkYikgewppZiAoJGJbJ2V4Y2x1ZGUnXSkgewppZiAoJGJyYW5jaGVzWydleGNsdWRlJ10pIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9pbnRlcnNlY3QoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWydleGNsdWRlJ10gPSB0cnVlOwokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9kaWZmKCRiWyduYW1lcyddLCAkYnJhbmNoZXNbJ25hbWVzJ10pOwp9Cn0gZWxzZSB7CmlmICgkYnJhbmNoZXNbJ2V4Y2x1ZGUnXSkgewoKCiRicmFuY2hlc1snbmFtZXMnXSA9IGFycmF5X2RpZmYoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfbWVyZ2UoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0KfQp9Cn0gZWxzZSB7CiRicmFuY2hlcyA9IEludGVydmFsOjphbnlEZXYoKTsKZm9yZWFjaCAoJGNvbnN0cmFpbnRCcmFuY2hlcyBhcyAkYikgewppZiAoJGJbJ2V4Y2x1ZGUnXSkgewppZiAoJGJyYW5jaGVzWydleGNsdWRlJ10pIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9tZXJnZSgkYnJhbmNoZXNbJ25hbWVzJ10sICRiWyduYW1lcyddKTsKfSBlbHNlIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9kaWZmKCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9Cn0gZWxzZSB7CmlmICgkYnJhbmNoZXNbJ2V4Y2x1ZGUnXSkgewoKCiRicmFuY2hlc1snbmFtZXMnXSA9IGFycmF5X2RpZmYoJGJbJ25hbWVzJ10sICRicmFuY2hlc1snbmFtZXMnXSk7CiRicmFuY2hlc1snZXhjbHVkZSddID0gZmFsc2U7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfaW50ZXJzZWN0KCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9Cn0KfQp9CgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV91bmlxdWUoJGJyYW5jaGVzWyduYW1lcyddKTsKCmlmIChcY291bnQoJG51bWVyaWNHcm91cHMpID09PSAxKSB7CnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gJG51bWVyaWNHcm91cHNbMF0sICdicmFuY2hlcycgPT4gJGJyYW5jaGVzKTsKfQoKJGJvcmRlcnMgPSBhcnJheSgpOwpmb3JlYWNoICgkbnVtZXJpY0dyb3VwcyBhcyAkZ3JvdXApIHsKZm9yZWFjaCAoJGdyb3VwIGFzICRpbnRlcnZhbCkgewokYm9yZGVyc1tdID0gYXJyYXkoJ3ZlcnNpb24nID0+ICRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0VmVyc2lvbigpLCAnb3BlcmF0b3InID0+ICRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0T3BlcmF0b3IoKSwgJ3NpZGUnID0+ICdzdGFydCcpOwokYm9yZGVyc1tdID0gYXJyYXkoJ3ZlcnNpb24nID0+ICRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSwgJ29wZXJhdG9yJyA9PiAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRPcGVyYXRvcigpLCAnc2lkZScgPT4gJ2VuZCcpOwp9Cn0KCiRvcFNvcnRPcmRlciA9IHNlbGY6OiRvcFNvcnRPcmRlcjsKdXNvcnQoJGJvcmRlcnMsIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJG9wU29ydE9yZGVyKSB7CiRvcmRlciA9IHZlcnNpb25fY29tcGFyZSgkYVsndmVyc2lvbiddLCAkYlsndmVyc2lvbiddKTsKaWYgKCRvcmRlciA9PT0gMCkgewpyZXR1cm4gJG9wU29ydE9yZGVyWyRhWydvcGVyYXRvciddXSAtICRvcFNvcnRPcmRlclskYlsnb3BlcmF0b3InXV07Cn0KCnJldHVybiAkb3JkZXI7Cn0pOwoKJGFjdGl2ZUludGVydmFscyA9IDA7CiRpbnRlcnZhbHMgPSBhcnJheSgpOwokaW5kZXggPSAwOwokYWN0aXZhdGlvblRocmVzaG9sZCA9ICRjb25zdHJhaW50LT5pc0Nvbmp1bmN0aXZlKCkgPyBcY291bnQoJG51bWVyaWNHcm91cHMpIDogMTsKJHN0YXJ0ID0gbnVsbDsKZm9yZWFjaCAoJGJvcmRlcnMgYXMgJGJvcmRlcikgewppZiAoJGJvcmRlclsnc2lkZSddID09PSAnc3RhcnQnKSB7CiRhY3RpdmVJbnRlcnZhbHMrKzsKfSBlbHNlIHsKJGFjdGl2ZUludGVydmFscy0tOwp9CmlmICghJHN0YXJ0ICYmICRhY3RpdmVJbnRlcnZhbHMgPj0gJGFjdGl2YXRpb25UaHJlc2hvbGQpIHsKJHN0YXJ0ID0gbmV3IENvbnN0cmFpbnQoJGJvcmRlclsnb3BlcmF0b3InXSwgJGJvcmRlclsndmVyc2lvbiddKTsKfSBlbHNlaWYgKCRzdGFydCAmJiAkYWN0aXZlSW50ZXJ2YWxzIDwgJGFjdGl2YXRpb25UaHJlc2hvbGQpIHsKCmlmICgKdmVyc2lvbl9jb21wYXJlKCRzdGFydC0+Z2V0VmVyc2lvbigpLCAkYm9yZGVyWyd2ZXJzaW9uJ10sICc9JykKJiYgKAooJHN0YXJ0LT5nZXRPcGVyYXRvcigpID09PSAnPicgJiYgJGJvcmRlclsnb3BlcmF0b3InXSA9PT0gJzw9JykKfHwgKCRzdGFydC0+Z2V0T3BlcmF0b3IoKSA9PT0gJz49JyAmJiAkYm9yZGVyWydvcGVyYXRvciddID09PSAnPCcpCikKKSB7CnVuc2V0KCRpbnRlcnZhbHNbJGluZGV4XSk7Cn0gZWxzZSB7CiRpbnRlcnZhbHNbJGluZGV4XSA9IG5ldyBJbnRlcnZhbCgkc3RhcnQsIG5ldyBDb25zdHJhaW50KCRib3JkZXJbJ29wZXJhdG9yJ10sICRib3JkZXJbJ3ZlcnNpb24nXSkpOwokaW5kZXgrKzsKCmlmICgkc3RvcE9uRmlyc3RWYWxpZEludGVydmFsKSB7CmJyZWFrOwp9Cn0KCiRzdGFydCA9IG51bGw7Cn0KfQoKcmV0dXJuIGFycmF5KCdudW1lcmljJyA9PiAkaW50ZXJ2YWxzLCAnYnJhbmNoZXMnID0+ICRicmFuY2hlcyk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlQ29uc3RyYWludEludGVydmFscyhDb25zdHJhaW50ICRjb25zdHJhaW50KQp7CiRvcCA9ICRjb25zdHJhaW50LT5nZXRPcGVyYXRvcigpOwoKCmlmIChzdHJwb3MoJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSA9PT0gMCkgewokaW50ZXJ2YWxzID0gYXJyYXkoKTsKJGJyYW5jaGVzID0gYXJyYXkoJ25hbWVzJyA9PiBhcnJheSgpLCAnZXhjbHVkZScgPT4gZmFsc2UpOwoKCmlmICgkb3AgPT09ICchPScpIHsKJGludGVydmFsc1tdID0gbmV3IEludGVydmFsKEludGVydmFsOjpmcm9tWmVybygpLCBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpOwokYnJhbmNoZXMgPSBhcnJheSgnbmFtZXMnID0+IGFycmF5KCRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpLCAnZXhjbHVkZScgPT4gdHJ1ZSk7Cn0gZWxzZWlmICgkb3AgPT09ICc9PScpIHsKJGJyYW5jaGVzWyduYW1lcyddW10gPSAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpOwp9CgpyZXR1cm4gYXJyYXkoCidudW1lcmljJyA9PiAkaW50ZXJ2YWxzLAonYnJhbmNoZXMnID0+ICRicmFuY2hlcywKKTsKfQoKaWYgKCRvcFswXSA9PT0gJz4nKSB7IApyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KG5ldyBJbnRlcnZhbCgkY29uc3RyYWludCwgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSksICdicmFuY2hlcycgPT4gSW50ZXJ2YWw6Om5vRGV2KCkpOwp9CmlmICgkb3BbMF0gPT09ICc8JykgeyAKcmV0dXJuIGFycmF5KCdudW1lcmljJyA9PiBhcnJheShuZXcgSW50ZXJ2YWwoSW50ZXJ2YWw6OmZyb21aZXJvKCksICRjb25zdHJhaW50KSksICdicmFuY2hlcycgPT4gSW50ZXJ2YWw6Om5vRGV2KCkpOwp9CmlmICgkb3AgPT09ICchPScpIHsKCnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkoCm5ldyBJbnRlcnZhbChJbnRlcnZhbDo6ZnJvbVplcm8oKSwgbmV3IENvbnN0cmFpbnQoJzwnLCAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpKSksCm5ldyBJbnRlcnZhbChuZXcgQ29uc3RyYWludCgnPicsICRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpLCBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpLAopLCAnYnJhbmNoZXMnID0+IEludGVydmFsOjphbnlEZXYoKSk7Cn0KCgpyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KApuZXcgSW50ZXJ2YWwobmV3IENvbnN0cmFpbnQoJz49JywgJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSksIG5ldyBDb25zdHJhaW50KCc8PScsICRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpKSwKKSwgJ2JyYW5jaGVzJyA9PiBJbnRlcnZhbDo6bm9EZXYoKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKY2xhc3MgU2VtdmVyCnsKY29uc3QgU09SVF9BU0MgPSAxOwpjb25zdCBTT1JUX0RFU0MgPSAtMTsKCgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvblBhcnNlcjsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXRpc2ZpZXMoJHZlcnNpb24sICRjb25zdHJhaW50cykKewppZiAobnVsbCA9PT0gc2VsZjo6JHZlcnNpb25QYXJzZXIpIHsKc2VsZjo6JHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwp9CgokdmVyc2lvblBhcnNlciA9IHNlbGY6OiR2ZXJzaW9uUGFyc2VyOwokcHJvdmlkZXIgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uKSk7CiRwYXJzZWRDb25zdHJhaW50cyA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cyk7CgpyZXR1cm4gJHBhcnNlZENvbnN0cmFpbnRzLT5tYXRjaGVzKCRwcm92aWRlcik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXRpc2ZpZWRCeShhcnJheSAkdmVyc2lvbnMsICRjb25zdHJhaW50cykKewokdmVyc2lvbnMgPSBhcnJheV9maWx0ZXIoJHZlcnNpb25zLCBmdW5jdGlvbiAoJHZlcnNpb24pIHVzZSAoJGNvbnN0cmFpbnRzKSB7CnJldHVybiBTZW12ZXI6OnNhdGlzZmllcygkdmVyc2lvbiwgJGNvbnN0cmFpbnRzKTsKfSk7CgpyZXR1cm4gYXJyYXlfdmFsdWVzKCR2ZXJzaW9ucyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnQoYXJyYXkgJHZlcnNpb25zKQp7CnJldHVybiBzZWxmOjp1c29ydCgkdmVyc2lvbnMsIHNlbGY6OlNPUlRfQVNDKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcnNvcnQoYXJyYXkgJHZlcnNpb25zKQp7CnJldHVybiBzZWxmOjp1c29ydCgkdmVyc2lvbnMsIHNlbGY6OlNPUlRfREVTQyk7Cn0KCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHVzb3J0KGFycmF5ICR2ZXJzaW9ucywgJGRpcmVjdGlvbikKewppZiAobnVsbCA9PT0gc2VsZjo6JHZlcnNpb25QYXJzZXIpIHsKc2VsZjo6JHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwp9CgokdmVyc2lvblBhcnNlciA9IHNlbGY6OiR2ZXJzaW9uUGFyc2VyOwokbm9ybWFsaXplZCA9IGFycmF5KCk7CgoKCmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAka2V5ID0+ICR2ZXJzaW9uKSB7CiRub3JtYWxpemVkVmVyc2lvbiA9ICR2ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb24pOwokbm9ybWFsaXplZFZlcnNpb24gPSAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplRGVmYXVsdEJyYW5jaCgkbm9ybWFsaXplZFZlcnNpb24pOwokbm9ybWFsaXplZFtdID0gYXJyYXkoJG5vcm1hbGl6ZWRWZXJzaW9uLCAka2V5KTsKfQoKdXNvcnQoJG5vcm1hbGl6ZWQsIGZ1bmN0aW9uIChhcnJheSAkbGVmdCwgYXJyYXkgJHJpZ2h0KSB1c2UgKCRkaXJlY3Rpb24pIHsKaWYgKCRsZWZ0WzBdID09PSAkcmlnaHRbMF0pIHsKcmV0dXJuIDA7Cn0KCmlmIChDb21wYXJhdG9yOjpsZXNzVGhhbigkbGVmdFswXSwgJHJpZ2h0WzBdKSkgewpyZXR1cm4gLSRkaXJlY3Rpb247Cn0KCnJldHVybiAkZGlyZWN0aW9uOwp9KTsKCgokc29ydGVkID0gYXJyYXkoKTsKZm9yZWFjaCAoJG5vcm1hbGl6ZWQgYXMgJGl0ZW0pIHsKJHNvcnRlZFtdID0gJHZlcnNpb25zWyRpdGVtWzFdXTsKfQoKcmV0dXJuICRzb3J0ZWQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgVmVyc2lvblBhcnNlcgp7CgoKCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyAkbW9kaWZpZXJSZWdleCA9ICdbLl8tXT8oPzooc3RhYmxlfGJldGF8YnxSQ3xhbHBoYXxhfHBhdGNofHBsfHApKCg/OlsuLV0/XGQrKSorKT8pPyhbLi1dP2Rldik/JzsKCgpwcml2YXRlIHN0YXRpYyAkc3RhYmlsaXRpZXNSZWdleCA9ICdzdGFibGV8UkN8YmV0YXxhbHBoYXxkZXYnOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKQp7CiR2ZXJzaW9uID0gKHN0cmluZykgcHJlZ19yZXBsYWNlKCd7Iy4rJH0nLCAnJywgKHN0cmluZykgJHZlcnNpb24pOwoKaWYgKHN0cnBvcygkdmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCB8fCAnLWRldicgPT09IHN1YnN0cigkdmVyc2lvbiwgLTQpKSB7CnJldHVybiAnZGV2JzsKfQoKcHJlZ19tYXRjaCgneycgLiBzZWxmOjokbW9kaWZpZXJSZWdleCAuICcoPzpcKy4qKT8kfWknLCBzdHJ0b2xvd2VyKCR2ZXJzaW9uKSwgJG1hdGNoKTsKCmlmICghZW1wdHkoJG1hdGNoWzNdKSkgewpyZXR1cm4gJ2Rldic7Cn0KCmlmICghZW1wdHkoJG1hdGNoWzFdKSkgewppZiAoJ2JldGEnID09PSAkbWF0Y2hbMV0gfHwgJ2InID09PSAkbWF0Y2hbMV0pIHsKcmV0dXJuICdiZXRhJzsKfQppZiAoJ2FscGhhJyA9PT0gJG1hdGNoWzFdIHx8ICdhJyA9PT0gJG1hdGNoWzFdKSB7CnJldHVybiAnYWxwaGEnOwp9CmlmICgncmMnID09PSAkbWF0Y2hbMV0pIHsKcmV0dXJuICdSQyc7Cn0KfQoKcmV0dXJuICdzdGFibGUnOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplU3RhYmlsaXR5KCRzdGFiaWxpdHkpCnsKJHN0YWJpbGl0eSA9IHN0cnRvbG93ZXIoKHN0cmluZykgJHN0YWJpbGl0eSk7CgpyZXR1cm4gJHN0YWJpbGl0eSA9PT0gJ3JjJyA/ICdSQycgOiAkc3RhYmlsaXR5Owp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZSgkdmVyc2lvbiwgJGZ1bGxWZXJzaW9uID0gbnVsbCkKewokdmVyc2lvbiA9IHRyaW0oKHN0cmluZykgJHZlcnNpb24pOwokb3JpZ1ZlcnNpb24gPSAkdmVyc2lvbjsKaWYgKG51bGwgPT09ICRmdWxsVmVyc2lvbikgewokZnVsbFZlcnNpb24gPSAkdmVyc2lvbjsKfQoKCmlmIChwcmVnX21hdGNoKCd7XihbXixcc10rKykgKythcyArKyhbXixcc10rKykkfScsICR2ZXJzaW9uLCAkbWF0Y2gpKSB7CiR2ZXJzaW9uID0gJG1hdGNoWzFdOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3tAKD86JyAuIHNlbGY6OiRzdGFiaWxpdGllc1JlZ2V4IC4gJykkfWknLCAkdmVyc2lvbiwgJG1hdGNoKSkgewokdmVyc2lvbiA9IHN1YnN0cigkdmVyc2lvbiwgMCwgc3RybGVuKCR2ZXJzaW9uKSAtIHN0cmxlbigkbWF0Y2hbMF0pKTsKfQoKCmlmIChcaW5fYXJyYXkoJHZlcnNpb24sIGFycmF5KCdtYXN0ZXInLCAndHJ1bmsnLCAnZGVmYXVsdCcpLCB0cnVlKSkgewokdmVyc2lvbiA9ICdkZXYtJyAuICR2ZXJzaW9uOwp9CgoKaWYgKHN0cmlwb3MoJHZlcnNpb24sICdkZXYtJykgPT09IDApIHsKcmV0dXJuICdkZXYtJyAuIHN1YnN0cigkdmVyc2lvbiwgNCk7Cn0KCgppZiAocHJlZ19tYXRjaCgne14oW14sXHMrXSsrKVwrW15cc10rKyR9JywgJHZlcnNpb24sICRtYXRjaCkpIHsKJHZlcnNpb24gPSAkbWF0Y2hbMV07Cn0KCgppZiAocHJlZ19tYXRjaCgne152PyhcZHsxLDV9KykoXC5cZCsrKT8oXC5cZCsrKT8oXC5cZCsrKT8nIC4gc2VsZjo6JG1vZGlmaWVyUmVnZXggLiAnJH1pJywgJHZlcnNpb24sICRtYXRjaGVzKSkgewokdmVyc2lvbiA9ICRtYXRjaGVzWzFdCi4gKCFlbXB0eSgkbWF0Y2hlc1syXSkgPyAkbWF0Y2hlc1syXSA6ICcuMCcpCi4gKCFlbXB0eSgkbWF0Y2hlc1szXSkgPyAkbWF0Y2hlc1szXSA6ICcuMCcpCi4gKCFlbXB0eSgkbWF0Y2hlc1s0XSkgPyAkbWF0Y2hlc1s0XSA6ICcuMCcpOwokaW5kZXggPSA1OwoKfSBlbHNlaWYgKHByZWdfbWF0Y2goJ3tedj8oXGR7NH0oPzpbLjotXT9cZHsyfSl7MSw2fSg/OlsuOi1dP1xkezEsM30pezAsMn0pJyAuIHNlbGY6OiRtb2RpZmllclJlZ2V4IC4gJyR9aScsICR2ZXJzaW9uLCAkbWF0Y2hlcykpIHsKJHZlcnNpb24gPSAoc3RyaW5nKSBwcmVnX3JlcGxhY2UoJ3tcRH0nLCAnLicsICRtYXRjaGVzWzFdKTsKJGluZGV4ID0gMjsKfQoKCmlmIChpc3NldCgkaW5kZXgpKSB7CmlmICghZW1wdHkoJG1hdGNoZXNbJGluZGV4XSkpIHsKaWYgKCdzdGFibGUnID09PSAkbWF0Y2hlc1skaW5kZXhdKSB7CnJldHVybiAkdmVyc2lvbjsKfQokdmVyc2lvbiAuPSAnLScgLiAkdGhpcy0+ZXhwYW5kU3RhYmlsaXR5KCRtYXRjaGVzWyRpbmRleF0pIC4gKGlzc2V0KCRtYXRjaGVzWyRpbmRleCArIDFdKSAmJiAnJyAhPT0gJG1hdGNoZXNbJGluZGV4ICsgMV0gPyBsdHJpbSgkbWF0Y2hlc1skaW5kZXggKyAxXSwgJy4tJykgOiAnJyk7Cn0KCmlmICghZW1wdHkoJG1hdGNoZXNbJGluZGV4ICsgMl0pKSB7CiR2ZXJzaW9uIC49ICctZGV2JzsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3soLio/KVsuLV0/ZGV2JH1pJywgJHZlcnNpb24sICRtYXRjaCkpIHsKdHJ5IHsKJG5vcm1hbGl6ZWQgPSAkdGhpcy0+bm9ybWFsaXplQnJhbmNoKCRtYXRjaFsxXSk7CgoKCmlmIChzdHJwb3MoJG5vcm1hbGl6ZWQsICdkZXYtJykgPT09IGZhbHNlKSB7CnJldHVybiAkbm9ybWFsaXplZDsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKJGV4dHJhTWVzc2FnZSA9ICcnOwppZiAocHJlZ19tYXRjaCgneyArYXMgKycgLiBwcmVnX3F1b3RlKCR2ZXJzaW9uKSAuICcoPzpAKD86Jy5zZWxmOjokc3RhYmlsaXRpZXNSZWdleC4nKSk/JH0nLCAkZnVsbFZlcnNpb24pKSB7CiRleHRyYU1lc3NhZ2UgPSAnIGluICInIC4gJGZ1bGxWZXJzaW9uIC4gJyIsIHRoZSBhbGlhcyBtdXN0IGJlIGFuIGV4YWN0IHZlcnNpb24nOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgne14nIC4gcHJlZ19xdW90ZSgkdmVyc2lvbikgLiAnKD86QCg/Oicuc2VsZjo6JHN0YWJpbGl0aWVzUmVnZXguJykpPyArYXMgK30nLCAkZnVsbFZlcnNpb24pKSB7CiRleHRyYU1lc3NhZ2UgPSAnIGluICInIC4gJGZ1bGxWZXJzaW9uIC4gJyIsIHRoZSBhbGlhcyBzb3VyY2UgbXVzdCBiZSBhbiBleGFjdCB2ZXJzaW9uLCBpZiBpdCBpcyBhIGJyYW5jaCBuYW1lIHlvdSBzaG91bGQgcHJlZml4IGl0IHdpdGggZGV2LSc7Cn0KCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIHZlcnNpb24gc3RyaW5nICInIC4gJG9yaWdWZXJzaW9uIC4gJyInIC4gJGV4dHJhTWVzc2FnZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJGJyYW5jaCkKewppZiAocHJlZ19tYXRjaCgne14oP1A8dmVyc2lvbj4oXGQrK1xcLikqXGQrKykoPzpcLngpPy1kZXYkfWknLCAoc3RyaW5nKSAkYnJhbmNoLCAkbWF0Y2hlcykpIHsKcmV0dXJuICRtYXRjaGVzWyd2ZXJzaW9uJ10gLiAnLic7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemVCcmFuY2goJG5hbWUpCnsKJG5hbWUgPSB0cmltKChzdHJpbmcpICRuYW1lKTsKCmlmIChwcmVnX21hdGNoKCd7XnY/KFxkKyspKFwuKD86XGQrK3xbeFgqXSkpPyhcLig/OlxkKyt8W3hYKl0pKT8oXC4oPzpcZCsrfFt4WCpdKSk/JH1pJywgJG5hbWUsICRtYXRjaGVzKSkgewokdmVyc2lvbiA9ICcnOwpmb3IgKCRpID0gMTsgJGkgPCA1OyArKyRpKSB7CiR2ZXJzaW9uIC49IGlzc2V0KCRtYXRjaGVzWyRpXSkgPyBzdHJfcmVwbGFjZShhcnJheSgnKicsICdYJyksICd4JywgJG1hdGNoZXNbJGldKSA6ICcueCc7Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgneCcsICc5OTk5OTk5JywgJHZlcnNpb24pIC4gJy1kZXYnOwp9CgpyZXR1cm4gJ2Rldi0nIC4gJG5hbWU7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemVEZWZhdWx0QnJhbmNoKCRuYW1lKQp7CmlmICgkbmFtZSA9PT0gJ2Rldi1tYXN0ZXInIHx8ICRuYW1lID09PSAnZGV2LWRlZmF1bHQnIHx8ICRuYW1lID09PSAnZGV2LXRydW5rJykgewpyZXR1cm4gJzk5OTk5OTktZGV2JzsKfQoKcmV0dXJuIChzdHJpbmcpICRuYW1lOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnRzKQp7CiRwcmV0dHlDb25zdHJhaW50ID0gKHN0cmluZykgJGNvbnN0cmFpbnRzOwoKJG9yQ29uc3RyYWludHMgPSBwcmVnX3NwbGl0KCd7XHMqXHxcfD9ccyp9JywgdHJpbSgoc3RyaW5nKSAkY29uc3RyYWludHMpKTsKaWYgKGZhbHNlID09PSAkb3JDb25zdHJhaW50cykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBwcmVnX3NwbGl0IHN0cmluZzogJy4kY29uc3RyYWludHMpOwp9CiRvckdyb3VwcyA9IGFycmF5KCk7Cgpmb3JlYWNoICgkb3JDb25zdHJhaW50cyBhcyAkb3JDb25zdHJhaW50KSB7CiRhbmRDb25zdHJhaW50cyA9IHByZWdfc3BsaXQoJ3soPzwhXnxhc3xbPT48ICxdKSAqKD88IS0pWywgXSg/IS0pICooPyEsfGFzfCQpfScsICRvckNvbnN0cmFpbnQpOwppZiAoZmFsc2UgPT09ICRhbmRDb25zdHJhaW50cykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBwcmVnX3NwbGl0IHN0cmluZzogJy4kb3JDb25zdHJhaW50KTsKfQppZiAoXGNvdW50KCRhbmRDb25zdHJhaW50cykgPiAxKSB7CiRjb25zdHJhaW50T2JqZWN0cyA9IGFycmF5KCk7CmZvcmVhY2ggKCRhbmRDb25zdHJhaW50cyBhcyAkYW5kQ29uc3RyYWludCkgewpmb3JlYWNoICgkdGhpcy0+cGFyc2VDb25zdHJhaW50KCRhbmRDb25zdHJhaW50KSBhcyAkcGFyc2VkQW5kQ29uc3RyYWludCkgewokY29uc3RyYWludE9iamVjdHNbXSA9ICRwYXJzZWRBbmRDb25zdHJhaW50Owp9Cn0KfSBlbHNlIHsKJGNvbnN0cmFpbnRPYmplY3RzID0gJHRoaXMtPnBhcnNlQ29uc3RyYWludCgkYW5kQ29uc3RyYWludHNbMF0pOwp9CgppZiAoMSA9PT0gXGNvdW50KCRjb25zdHJhaW50T2JqZWN0cykpIHsKJGNvbnN0cmFpbnQgPSAkY29uc3RyYWludE9iamVjdHNbMF07Cn0gZWxzZSB7CiRjb25zdHJhaW50ID0gbmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludE9iamVjdHMpOwp9Cgokb3JHcm91cHNbXSA9ICRjb25zdHJhaW50Owp9CgokcGFyc2VkQ29uc3RyYWludCA9IE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKCRvckdyb3VwcywgZmFsc2UpOwoKJHBhcnNlZENvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcHJldHR5Q29uc3RyYWludCk7CgpyZXR1cm4gJHBhcnNlZENvbnN0cmFpbnQ7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VDb25zdHJhaW50KCRjb25zdHJhaW50KQp7CgppZiAocHJlZ19tYXRjaCgne14oW14sXHNdKyspICsrYXMgKysoW14sXHNdKyspJH0nLCAkY29uc3RyYWludCwgJG1hdGNoKSkgewokY29uc3RyYWludCA9ICRtYXRjaFsxXTsKfQoKCmlmIChwcmVnX21hdGNoKCd7XihbXixcc10qPylAKCcgLiBzZWxmOjokc3RhYmlsaXRpZXNSZWdleCAuICcpJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJGNvbnN0cmFpbnQgPSAnJyAhPT0gJG1hdGNoWzFdID8gJG1hdGNoWzFdIDogJyonOwppZiAoJG1hdGNoWzJdICE9PSAnc3RhYmxlJykgewokc3RhYmlsaXR5TW9kaWZpZXIgPSAkbWF0Y2hbMl07Cn0KfQoKCmlmIChwcmVnX21hdGNoKCd7XihkZXYtW14sXHNAXSs/fFteLFxzQF0rP1wueC1kZXYpIy4rJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJGNvbnN0cmFpbnQgPSAkbWF0Y2hbMV07Cn0KCmlmIChwcmVnX21hdGNoKCd7Xih2KT9beFgqXShcLlt4WCpdKSokfWknLCAkY29uc3RyYWludCwgJG1hdGNoKSkgewppZiAoIWVtcHR5KCRtYXRjaFsxXSkgfHwgIWVtcHR5KCRtYXRjaFsyXSkpIHsKcmV0dXJuIGFycmF5KG5ldyBDb25zdHJhaW50KCc+PScsICcwLjAuMC4wLWRldicpKTsKfQoKcmV0dXJuIGFycmF5KG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKSk7Cn0KCiR2ZXJzaW9uUmVnZXggPSAndj8oXGQrKykoPzpcLihcZCsrKSk/KD86XC4oXGQrKykpPyg/OlwuKFxkKyspKT8oPzonIC4gc2VsZjo6JG1vZGlmaWVyUmVnZXggLiAnfFwuKFt4WCpdWy4tXT9kZXYpKSg/OlwrW15cc10rKT8nOwoKCgoKCgppZiAocHJlZ19tYXRjaCgne15+Pj8nIC4gJHZlcnNpb25SZWdleCAuICckfWknLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CmlmIChzdHJwb3MoJGNvbnN0cmFpbnQsICd+PicpID09PSAwKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKAonQ291bGQgbm90IHBhcnNlIHZlcnNpb24gY29uc3RyYWludCAnIC4gJGNvbnN0cmFpbnQgLiAnOiAnIC4KJ0ludmFsaWQgb3BlcmF0b3IgIn4+IiwgeW91IHByb2JhYmx5IG1lYW50IHRvIHVzZSB0aGUgIn4iIG9wZXJhdG9yJwopOwp9CgoKaWYgKGlzc2V0KCRtYXRjaGVzWzRdKSAmJiAnJyAhPT0gJG1hdGNoZXNbNF0gJiYgbnVsbCAhPT0gJG1hdGNoZXNbNF0pIHsKJHBvc2l0aW9uID0gNDsKfSBlbHNlaWYgKGlzc2V0KCRtYXRjaGVzWzNdKSAmJiAnJyAhPT0gJG1hdGNoZXNbM10gJiYgbnVsbCAhPT0gJG1hdGNoZXNbM10pIHsKJHBvc2l0aW9uID0gMzsKfSBlbHNlaWYgKGlzc2V0KCRtYXRjaGVzWzJdKSAmJiAnJyAhPT0gJG1hdGNoZXNbMl0gJiYgbnVsbCAhPT0gJG1hdGNoZXNbMl0pIHsKJHBvc2l0aW9uID0gMjsKfSBlbHNlIHsKJHBvc2l0aW9uID0gMTsKfQoKCmlmICghZW1wdHkoJG1hdGNoZXNbOF0pKSB7CiRwb3NpdGlvbisrOwp9CgoKJHN0YWJpbGl0eVN1ZmZpeCA9ICcnOwppZiAoZW1wdHkoJG1hdGNoZXNbNV0pICYmIGVtcHR5KCRtYXRjaGVzWzddKSAmJiBlbXB0eSgkbWF0Y2hlc1s4XSkpIHsKJHN0YWJpbGl0eVN1ZmZpeCAuPSAnLWRldic7Cn0KCiRsb3dWZXJzaW9uID0gJHRoaXMtPm5vcm1hbGl6ZShzdWJzdHIoJGNvbnN0cmFpbnQgLiAkc3RhYmlsaXR5U3VmZml4LCAxKSk7CiRsb3dlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24pOwoKCgokaGlnaFBvc2l0aW9uID0gbWF4KDEsICRwb3NpdGlvbiAtIDEpOwokaGlnaFZlcnNpb24gPSAkdGhpcy0+bWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoJG1hdGNoZXMsICRoaWdoUG9zaXRpb24sIDEpIC4gJy1kZXYnOwokdXBwZXJCb3VuZCA9IG5ldyBDb25zdHJhaW50KCc8JywgJGhpZ2hWZXJzaW9uKTsKCnJldHVybiBhcnJheSgKJGxvd2VyQm91bmQsCiR1cHBlckJvdW5kLAopOwp9CgoKCgoKCmlmIChwcmVnX21hdGNoKCd7XlxeJyAuICR2ZXJzaW9uUmVnZXggLiAnKCQpfWknLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CgppZiAoJzAnICE9PSAkbWF0Y2hlc1sxXSB8fCAnJyA9PT0gJG1hdGNoZXNbMl0gfHwgbnVsbCA9PT0gJG1hdGNoZXNbMl0pIHsKJHBvc2l0aW9uID0gMTsKfSBlbHNlaWYgKCcwJyAhPT0gJG1hdGNoZXNbMl0gfHwgJycgPT09ICRtYXRjaGVzWzNdIHx8IG51bGwgPT09ICRtYXRjaGVzWzNdKSB7CiRwb3NpdGlvbiA9IDI7Cn0gZWxzZSB7CiRwb3NpdGlvbiA9IDM7Cn0KCgokc3RhYmlsaXR5U3VmZml4ID0gJyc7CmlmIChlbXB0eSgkbWF0Y2hlc1s1XSkgJiYgZW1wdHkoJG1hdGNoZXNbN10pICYmIGVtcHR5KCRtYXRjaGVzWzhdKSkgewokc3RhYmlsaXR5U3VmZml4IC49ICctZGV2JzsKfQoKJGxvd1ZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKHN1YnN0cigkY29uc3RyYWludCAuICRzdGFiaWxpdHlTdWZmaXgsIDEpKTsKJGxvd2VyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPj0nLCAkbG93VmVyc2lvbik7CgoKCiRoaWdoVmVyc2lvbiA9ICR0aGlzLT5tYW5pcHVsYXRlVmVyc2lvblN0cmluZygkbWF0Y2hlcywgJHBvc2l0aW9uLCAxKSAuICctZGV2JzsKJHVwcGVyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbik7CgpyZXR1cm4gYXJyYXkoCiRsb3dlckJvdW5kLAokdXBwZXJCb3VuZCwKKTsKfQoKCgoKCmlmIChwcmVnX21hdGNoKCd7XnY/KFxkKyspKD86XC4oXGQrKykpPyg/OlwuKFxkKyspKT8oPzpcLlt4WCpdKSsrJH0nLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CmlmIChpc3NldCgkbWF0Y2hlc1szXSkgJiYgJycgIT09ICRtYXRjaGVzWzNdICYmIG51bGwgIT09ICRtYXRjaGVzWzNdKSB7CiRwb3NpdGlvbiA9IDM7Cn0gZWxzZWlmIChpc3NldCgkbWF0Y2hlc1syXSkgJiYgJycgIT09ICRtYXRjaGVzWzJdICYmIG51bGwgIT09ICRtYXRjaGVzWzJdKSB7CiRwb3NpdGlvbiA9IDI7Cn0gZWxzZSB7CiRwb3NpdGlvbiA9IDE7Cn0KCiRsb3dWZXJzaW9uID0gJHRoaXMtPm1hbmlwdWxhdGVWZXJzaW9uU3RyaW5nKCRtYXRjaGVzLCAkcG9zaXRpb24pIC4gJy1kZXYnOwokaGlnaFZlcnNpb24gPSAkdGhpcy0+bWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoJG1hdGNoZXMsICRwb3NpdGlvbiwgMSkgLiAnLWRldic7CgppZiAoJGxvd1ZlcnNpb24gPT09ICcwLjAuMC4wLWRldicpIHsKcmV0dXJuIGFycmF5KG5ldyBDb25zdHJhaW50KCc8JywgJGhpZ2hWZXJzaW9uKSk7Cn0KCnJldHVybiBhcnJheSgKbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24pLApuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbiksCik7Cn0KCgoKCgoKCmlmIChwcmVnX21hdGNoKCd7Xig/UDxmcm9tPicgLiAkdmVyc2lvblJlZ2V4IC4gJykgKy0gKyg/UDx0bz4nIC4gJHZlcnNpb25SZWdleCAuICcpKCQpfWknLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CgokbG93U3RhYmlsaXR5U3VmZml4ID0gJyc7CmlmIChlbXB0eSgkbWF0Y2hlc1s2XSkgJiYgZW1wdHkoJG1hdGNoZXNbOF0pICYmIGVtcHR5KCRtYXRjaGVzWzldKSkgewokbG93U3RhYmlsaXR5U3VmZml4ID0gJy1kZXYnOwp9CgokbG93VmVyc2lvbiA9ICR0aGlzLT5ub3JtYWxpemUoJG1hdGNoZXNbJ2Zyb20nXSk7CiRsb3dlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24gLiAkbG93U3RhYmlsaXR5U3VmZml4KTsKCiRlbXB0eSA9IGZ1bmN0aW9uICgkeCkgewpyZXR1cm4gKCR4ID09PSAwIHx8ICR4ID09PSAnMCcpID8gZmFsc2UgOiBlbXB0eSgkeCk7Cn07CgppZiAoKCEkZW1wdHkoJG1hdGNoZXNbMTJdKSAmJiAhJGVtcHR5KCRtYXRjaGVzWzEzXSkpIHx8ICFlbXB0eSgkbWF0Y2hlc1sxNV0pIHx8ICFlbXB0eSgkbWF0Y2hlc1sxN10pIHx8ICFlbXB0eSgkbWF0Y2hlc1sxOF0pKSB7CiRoaWdoVmVyc2lvbiA9ICR0aGlzLT5ub3JtYWxpemUoJG1hdGNoZXNbJ3RvJ10pOwokdXBwZXJCb3VuZCA9IG5ldyBDb25zdHJhaW50KCc8PScsICRoaWdoVmVyc2lvbik7Cn0gZWxzZSB7CiRoaWdoTWF0Y2ggPSBhcnJheSgnJywgJG1hdGNoZXNbMTFdLCAkbWF0Y2hlc1sxMl0sICRtYXRjaGVzWzEzXSwgJG1hdGNoZXNbMTRdKTsKCgokdGhpcy0+bm9ybWFsaXplKCRtYXRjaGVzWyd0byddKTsKCiRoaWdoVmVyc2lvbiA9ICR0aGlzLT5tYW5pcHVsYXRlVmVyc2lvblN0cmluZygkaGlnaE1hdGNoLCAkZW1wdHkoJG1hdGNoZXNbMTJdKSA/IDEgOiAyLCAxKSAuICctZGV2JzsKJHVwcGVyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbik7Cn0KCnJldHVybiBhcnJheSgKJGxvd2VyQm91bmQsCiR1cHBlckJvdW5kLAopOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3teKDw+fCE9fD49P3w8PT98PT0/KT9ccyooLiopfScsICRjb25zdHJhaW50LCAkbWF0Y2hlcykpIHsKdHJ5IHsKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKCRtYXRjaGVzWzJdKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewoKCmlmIChzdWJzdHIoJG1hdGNoZXNbMl0sIC00KSA9PT0gJy1kZXYnICYmIHByZWdfbWF0Y2goJ3teWzAtOWEtekEtWi0uL10rJH0nLCAkbWF0Y2hlc1syXSkpIHsKJHZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKCdkZXYtJy5zdWJzdHIoJG1hdGNoZXNbMl0sIDAsIC00KSk7Cn0gZWxzZSB7CnRocm93ICRlOwp9Cn0KCiRvcCA9ICRtYXRjaGVzWzFdID86ICc9JzsKCmlmICgkb3AgIT09ICc9PScgJiYgJG9wICE9PSAnPScgJiYgIWVtcHR5KCRzdGFiaWxpdHlNb2RpZmllcikgJiYgc2VsZjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pID09PSAnc3RhYmxlJykgewokdmVyc2lvbiAuPSAnLScgLiAkc3RhYmlsaXR5TW9kaWZpZXI7Cn0gZWxzZWlmICgnPCcgPT09ICRvcCB8fCAnPj0nID09PSAkb3ApIHsKaWYgKCFwcmVnX21hdGNoKCcvLScgLiBzZWxmOjokbW9kaWZpZXJSZWdleCAuICckLycsIHN0cnRvbG93ZXIoJG1hdGNoZXNbMl0pKSkgewppZiAoc3RycG9zKCRtYXRjaGVzWzJdLCAnZGV2LScpICE9PSAwKSB7CiR2ZXJzaW9uIC49ICctZGV2JzsKfQp9Cn0KCnJldHVybiBhcnJheShuZXcgQ29uc3RyYWludCgkbWF0Y2hlc1sxXSA/OiAnPScsICR2ZXJzaW9uKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgokbWVzc2FnZSA9ICdDb3VsZCBub3QgcGFyc2UgdmVyc2lvbiBjb25zdHJhaW50ICcgLiAkY29uc3RyYWludDsKaWYgKGlzc2V0KCRlKSkgewokbWVzc2FnZSAuPSAnOiAnIC4gJGUtPmdldE1lc3NhZ2UoKTsKfQoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgoKCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoYXJyYXkgJG1hdGNoZXMsICRwb3NpdGlvbiwgJGluY3JlbWVudCA9IDAsICRwYWQgPSAnMCcpCnsKZm9yICgkaSA9IDQ7ICRpID4gMDsgLS0kaSkgewppZiAoJGkgPiAkcG9zaXRpb24pIHsKJG1hdGNoZXNbJGldID0gJHBhZDsKfSBlbHNlaWYgKCRpID09PSAkcG9zaXRpb24gJiYgJGluY3JlbWVudCkgewokbWF0Y2hlc1skaV0gKz0gJGluY3JlbWVudDsKCmlmICgkbWF0Y2hlc1skaV0gPCAwKSB7CiRtYXRjaGVzWyRpXSA9ICRwYWQ7Ci0tJHBvc2l0aW9uOwoKCmlmICgkaSA9PT0gMSkgewpyZXR1cm4gbnVsbDsKfQp9Cn0KfQoKcmV0dXJuICRtYXRjaGVzWzFdIC4gJy4nIC4gJG1hdGNoZXNbMl0gLiAnLicgLiAkbWF0Y2hlc1szXSAuICcuJyAuICRtYXRjaGVzWzRdOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHBhbmRTdGFiaWxpdHkoJHN0YWJpbGl0eSkKewokc3RhYmlsaXR5ID0gc3RydG9sb3dlcigkc3RhYmlsaXR5KTsKCnN3aXRjaCAoJHN0YWJpbGl0eSkgewpjYXNlICdhJzoKcmV0dXJuICdhbHBoYSc7CmNhc2UgJ2InOgpyZXR1cm4gJ2JldGEnOwpjYXNlICdwJzoKY2FzZSAncGwnOgpyZXR1cm4gJ3BhdGNoJzsKY2FzZSAncmMnOgpyZXR1cm4gJ1JDJzsKZGVmYXVsdDoKcmV0dXJuICRzdGFiaWxpdHk7Cn0KfQp9CgpDb3B5cmlnaHQgKEMpIDIwMTUgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgp7CiAgICAiMzg5LWV4Y2VwdGlvbiI6IFsKICAgICAgICAiMzg5IERpcmVjdG9yeSBTZXJ2ZXIgRXhjZXB0aW9uIgogICAgXSwKICAgICJBdXRvY29uZi1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJBdXRvY29uZiBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJBdXRvY29uZi1leGNlcHRpb24tMy4wIjogWwogICAgICAgICJBdXRvY29uZiBleGNlcHRpb24gMy4wIgogICAgXSwKICAgICJCaXNvbi1leGNlcHRpb24tMi4yIjogWwogICAgICAgICJCaXNvbiBleGNlcHRpb24gMi4yIgogICAgXSwKICAgICJCb290bG9hZGVyLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiQm9vdGxvYWRlciBEaXN0cmlidXRpb24gRXhjZXB0aW9uIgogICAgXSwKICAgICJDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiQ2xhc3NwYXRoIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIkNMSVNQLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkNMSVNQIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIkRpZ2lSdWxlLUZPU1MtZXhjZXB0aW9uIjogWwogICAgICAgICJEaWdpUnVsZSBGT1NTIExpY2Vuc2UgRXhjZXB0aW9uIgogICAgXSwKICAgICJlQ29zLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgImVDb3MgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiRmF3a2VzLVJ1bnRpbWUtZXhjZXB0aW9uIjogWwogICAgICAgICJGYXdrZXMgUnVudGltZSBFeGNlcHRpb24iCiAgICBdLAogICAgIkZMVEstZXhjZXB0aW9uIjogWwogICAgICAgICJGTFRLIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiRm9udC1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJGb250IGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgImZyZWVydG9zLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkZyZWVSVE9TIEV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIkdDQy1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJHQ0MgUnVudGltZSBMaWJyYXJ5IGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIkdDQy1leGNlcHRpb24tMy4xIjogWwogICAgICAgICJHQ0MgUnVudGltZSBMaWJyYXJ5IGV4Y2VwdGlvbiAzLjEiCiAgICBdLAogICAgImdudS1qYXZhbWFpbC1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBKYXZhTWFpbCBleGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkdQTC0zLjAgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtbGlua2luZy1zb3VyY2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIExpbmtpbmcgRXhjZXB0aW9uICh3aXRoIENvcnJlc3BvbmRpbmcgU291cmNlKSIKICAgIF0sCiAgICAiR1BMLUNDLTEuMCI6IFsKICAgICAgICAiR1BMIENvb3BlcmF0aW9uIENvbW1pdG1lbnQgMS4wIgogICAgXSwKICAgICJpMnAtZ3BsLWphdmEtZXhjZXB0aW9uIjogWwogICAgICAgICJpMnAgR1BMK0phdmEgRXhjZXB0aW9uIgogICAgXSwKICAgICJMR1BMLTMuMC1saW5raW5nLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiTEdQTC0zLjAgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIkxpYnRvb2wtZXhjZXB0aW9uIjogWwogICAgICAgICJMaWJ0b29sIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTGludXgtc3lzY2FsbC1ub3RlIjogWwogICAgICAgICJMaW51eCBTeXNjYWxsIE5vdGUiCiAgICBdLAogICAgIkxMVk0tZXhjZXB0aW9uIjogWwogICAgICAgICJMTFZNIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTFpNQS1leGNlcHRpb24iOiBbCiAgICAgICAgIkxaTUEgZXhjZXB0aW9uIgogICAgXSwKICAgICJtaWYtZXhjZXB0aW9uIjogWwogICAgICAgICJNYWNyb3MgYW5kIElubGluZSBGdW5jdGlvbnMgRXhjZXB0aW9uIgogICAgXSwKICAgICJOb2tpYS1RdC1leGNlcHRpb24tMS4xIjogWwogICAgICAgICJOb2tpYSBRdCBMR1BMIGV4Y2VwdGlvbiAxLjEiCiAgICBdLAogICAgIk9DYW1sLUxHUEwtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIk9DYW1sIExHUEwgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIk9DQ1QtZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiT3BlbiBDQVNDQURFIEV4Y2VwdGlvbiAxLjAiCiAgICBdLAogICAgIk9wZW5KREstYXNzZW1ibHktZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiT3BlbkpESyBBc3NlbWJseSBleGNlcHRpb24gMS4wIgogICAgXSwKICAgICJvcGVudnBuLW9wZW5zc2wtZXhjZXB0aW9uIjogWwogICAgICAgICJPcGVuVlBOIE9wZW5TU0wgRXhjZXB0aW9uIgogICAgXSwKICAgICJQUy1vci1QREYtZm9udC1leGNlcHRpb24tMjAxNzA4MTciOiBbCiAgICAgICAgIlBTL1BERiBmb250IGV4Y2VwdGlvbiAoMjAxNy0wOC0xNykiCiAgICBdLAogICAgIlF0LUdQTC1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJRdCBHUEwgZXhjZXB0aW9uIDEuMCIKICAgIF0sCiAgICAiUXQtTEdQTC1leGNlcHRpb24tMS4xIjogWwogICAgICAgICJRdCBMR1BMIGV4Y2VwdGlvbiAxLjEiCiAgICBdLAogICAgIlF3dC1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJRd3QgZXhjZXB0aW9uIDEuMCIKICAgIF0sCiAgICAiU0hMLTIuMCI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UgdjIuMCIKICAgIF0sCiAgICAiU0hMLTIuMSI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UgdjIuMSIKICAgIF0sCiAgICAiU3dpZnQtZXhjZXB0aW9uIjogWwogICAgICAgICJTd2lmdCBFeGNlcHRpb24iCiAgICBdLAogICAgInUtYm9vdC1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJVLUJvb3QgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiVW5pdmVyc2FsLUZPU1MtZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiVW5pdmVyc2FsIEZPU1MgRXhjZXB0aW9uLCBWZXJzaW9uIDEuMCIKICAgIF0sCiAgICAiV3hXaW5kb3dzLWV4Y2VwdGlvbi0zLjEiOiBbCiAgICAgICAgIld4V2luZG93cyBMaWJyYXJ5IEV4Y2VwdGlvbiAzLjEiCiAgICBdCn17CiAgICAiMEJTRCI6IFsKICAgICAgICAiQlNEIFplcm8gQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUFMIjogWwogICAgICAgICJBdHRyaWJ1dGlvbiBBc3N1cmFuY2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBYnN0eWxlcyI6IFsKICAgICAgICAiQWJzdHlsZXMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWRvYmUtMjAwNiI6IFsKICAgICAgICAiQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgU291cmNlIENvZGUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLUdseXBoIjogWwogICAgICAgICJBZG9iZSBHbHlwaCBMaXN0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFEU0wiOiBbCiAgICAgICAgIkFtYXpvbiBEaWdpdGFsIFNlcnZpY2VzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFGTC0xLjEiOiBbCiAgICAgICAgIkFjYWRlbWljIEZyZWUgTGljZW5zZSB2MS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFGTC0xLjIiOiBbCiAgICAgICAgIkFjYWRlbWljIEZyZWUgTGljZW5zZSB2MS4yIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFGTC0yLjAiOiBbCiAgICAgICAgIkFjYWRlbWljIEZyZWUgTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFGTC0yLjEiOiBbCiAgICAgICAgIkFjYWRlbWljIEZyZWUgTGljZW5zZSB2Mi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFGTC0zLjAiOiBbCiAgICAgICAgIkFjYWRlbWljIEZyZWUgTGljZW5zZSB2My4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFmbXBhcnNlIjogWwogICAgICAgICJBZm1wYXJzZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBR1BMLTEuMCI6IFsKICAgICAgICAiQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJBR1BMLTEuMC1vbmx5IjogWwogICAgICAgICJBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIG9ubHkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFHUEwtMS4wLW9yLWxhdGVyIjogWwogICAgICAgICJBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBR1BMLTMuMCI6IFsKICAgICAgICAiR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJBR1BMLTMuMC1vbmx5IjogWwogICAgICAgICJHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFHUEwtMy4wLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBbGFkZGluIjogWwogICAgICAgICJBbGFkZGluIEZyZWUgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFNRFBMUEEiOiBbCiAgICAgICAgIkFNRCdzIHBscGFfbWFwLmMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1MIjogWwogICAgICAgICJBcHBsZSBNSVQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1QQVMiOiBbCiAgICAgICAgIkFjYWRlbXkgb2YgTW90aW9uIFBpY3R1cmUgQXJ0cyBhbmQgU2NpZW5jZXMgQlNEIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTlRMUi1QRCI6IFsKICAgICAgICAiQU5UTFIgU29mdHdhcmUgUmlnaHRzIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU5UTFItUEQtZmFsbGJhY2siOiBbCiAgICAgICAgIkFOVExSIFNvZnR3YXJlIFJpZ2h0cyBOb3RpY2Ugd2l0aCBsaWNlbnNlIGZhbGxiYWNrIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcGFjaGUtMS4wIjogWwogICAgICAgICJBcGFjaGUgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFwYWNoZS0xLjEiOiBbCiAgICAgICAgIkFwYWNoZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcGFjaGUtMi4wIjogWwogICAgICAgICJBcGFjaGUgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBBRk1MIjogWwogICAgICAgICJBZG9iZSBQb3N0c2NyaXB0IEFGTSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUEwtMS4wIjogWwogICAgICAgICJBZGFwdGl2ZSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXBwLXMycCI6IFsKICAgICAgICAiQXBwOjpzMnAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0xLjAiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0xLjEiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0xLjIiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAxLjIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVBTTC0yLjAiOiBbCiAgICAgICAgIkFwcGxlIFB1YmxpYyBTb3VyY2UgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJwaGljLTE5OTkiOiBbCiAgICAgICAgIkFycGhpYyBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJ0aXN0aWMtMS4wIjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy0xLjAtY2w4IjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCB3L2NsYXVzZSA4IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFydGlzdGljLTEuMC1QZXJsIjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDEuMCAoUGVybCkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJ0aXN0aWMtMi4wIjogWwogICAgICAgICJBcnRpc3RpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCYWVrbXVrIjogWwogICAgICAgICJCYWVrbXVrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJhaHlwaCI6IFsKICAgICAgICAiQmFoeXBoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJhcnIiOiBbCiAgICAgICAgIkJhcnIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQmVlcndhcmUiOiBbCiAgICAgICAgIkJlZXJ3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJpdHN0cmVhbS1WZXJhIjogWwogICAgICAgICJCaXRzdHJlYW0gVmVyYSBGb250IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJpdFRvcnJlbnQtMS4wIjogWwogICAgICAgICJCaXRUb3JyZW50IE9wZW4gU291cmNlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQml0VG9ycmVudC0xLjEiOiBbCiAgICAgICAgIkJpdFRvcnJlbnQgT3BlbiBTb3VyY2UgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJibGVzc2luZyI6IFsKICAgICAgICAiU1FMaXRlIEJsZXNzaW5nIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCbHVlT2FrLTEuMC4wIjogWwogICAgICAgICJCbHVlIE9hayBNb2RlbCBMaWNlbnNlIDEuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCb3JjZXV4IjogWwogICAgICAgICJCb3JjZXV4IGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0xLUNsYXVzZSI6IFsKICAgICAgICAiQlNEIDEtQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgXCJTaW1wbGlmaWVkXCIgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtRnJlZUJTRCI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIEZyZWVCU0QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtTmV0QlNEIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgTmV0QlNEIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLVBhdGVudCI6IFsKICAgICAgICAiQlNELTItQ2xhdXNlIFBsdXMgUGF0ZW50IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLVZpZXdzIjogWwogICAgICAgICJCU0QgMi1DbGF1c2Ugd2l0aCB2aWV3cyBzZW50ZW5jZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgXCJOZXdcIiBvciBcIlJldmlzZWRcIiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1BdHRyaWJ1dGlvbiI6IFsKICAgICAgICAiQlNEIHdpdGggYXR0cmlidXRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1DbGVhciI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIENsZWFyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1MQk5MIjogWwogICAgICAgICJMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWJzIEJTRCB2YXJpYW50IGxpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU1vZGlmaWNhdGlvbiI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE1vZGlmaWNhdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU5vLU1pbGl0YXJ5LUxpY2Vuc2UiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBNaWxpdGFyeSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTm8tTnVjbGVhci1MaWNlbnNlIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgTm8gTnVjbGVhciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTm8tTnVjbGVhci1MaWNlbnNlLTIwMTQiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBOdWNsZWFyIExpY2Vuc2UgMjAxNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU5vLU51Y2xlYXItV2FycmFudHkiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBOdWNsZWFyIFdhcnJhbnR5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtT3Blbi1NUEkiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBPcGVuIE1QSSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UiOiBbCiAgICAgICAgIkJTRCA0LUNsYXVzZSBcIk9yaWdpbmFsXCIgb3IgXCJPbGRcIiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UtU2hvcnRlbmVkIjogWwogICAgICAgICJCU0QgNCBDbGF1c2UgU2hvcnRlbmVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UtVUMiOiBbCiAgICAgICAgIkJTRC00LUNsYXVzZSAoVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLVNwZWNpZmljKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELVByb3RlY3Rpb24iOiBbCiAgICAgICAgIkJTRCBQcm90ZWN0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1Tb3VyY2UtQ29kZSI6IFsKICAgICAgICAiQlNEIFNvdXJjZSBDb2RlIEF0dHJpYnV0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0wtMS4wIjogWwogICAgICAgICJCb29zdCBTb2Z0d2FyZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCVVNMLTEuMSI6IFsKICAgICAgICAiQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJiemlwMi0xLjAuNSI6IFsKICAgICAgICAiYnppcDIgYW5kIGxpYmJ6aXAyIExpY2Vuc2UgdjEuMC41IiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgImJ6aXAyLTEuMC42IjogWwogICAgICAgICJiemlwMiBhbmQgbGliYnppcDIgTGljZW5zZSB2MS4wLjYiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkMtVURBLTEuMCI6IFsKICAgICAgICAiQ29tcHV0YXRpb25hbCBVc2Ugb2YgRGF0YSBBZ3JlZW1lbnQgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0FMLTEuMCI6IFsKICAgICAgICAiQ3J5cHRvZ3JhcGhpYyBBdXRvbm9teSBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQUwtMS4wLUNvbWJpbmVkLVdvcmstRXhjZXB0aW9uIjogWwogICAgICAgICJDcnlwdG9ncmFwaGljIEF1dG9ub215IExpY2Vuc2UgMS4wIChDb21iaW5lZCBXb3JrIEV4Y2VwdGlvbikiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ2FsZGVyYSI6IFsKICAgICAgICAiQ2FsZGVyYSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQVRPU0wtMS4xIjogWwogICAgICAgICJDb21wdXRlciBBc3NvY2lhdGVzIFRydXN0ZWQgT3BlbiBTb3VyY2UgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMi41LUFVIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNSBBdXN0cmFsaWEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1BVCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgQXVzdHJpYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtTkwiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIE5ldGhlcmxhbmRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtVVMiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC0yLjUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgMi41IEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0yLjAtRlIiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1TaGFyZUFsaWtlIDIuMCBGcmFuY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTIuMC1VSyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAyLjAgRW5nbGFuZCBhbmQgV2FsZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0zLjAtSUdPIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDMuMCBJR08iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0yLjAtVUsiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMi4wIEVuZ2xhbmQgYW5kIFdhbGVzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0yLjEtSlAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMi4xIEphcGFuIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0yLjUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMi41IEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTMuMC1BVCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAzLjAgQXVzdHJpYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLVBEREMiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgUHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGFuZCBDZXJ0aWZpY2F0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQzAtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIFplcm8gdjEuMCBVbml2ZXJzYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNEREwtMS4wIjogWwogICAgICAgICJDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRERMLTEuMSI6IFsKICAgICAgICAiQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNETC0xLjAiOiBbCiAgICAgICAgIkNvbW1vbiBEb2N1bWVudGF0aW9uIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRExBLVBlcm1pc3NpdmUtMS4wIjogWwogICAgICAgICJDb21tdW5pdHkgRGF0YSBMaWNlbnNlIEFncmVlbWVudCBQZXJtaXNzaXZlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RMQS1QZXJtaXNzaXZlLTIuMCI6IFsKICAgICAgICAiQ29tbXVuaXR5IERhdGEgTGljZW5zZSBBZ3JlZW1lbnQgUGVybWlzc2l2ZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNETEEtU2hhcmluZy0xLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBEYXRhIExpY2Vuc2UgQWdyZWVtZW50IFNoYXJpbmcgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRUNJTEwtMS4wIjogWwogICAgICAgICJDZUNJTEwgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRUNJTEwtMS4xIjogWwogICAgICAgICJDZUNJTEwgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRUNJTEwtMi4wIjogWwogICAgICAgICJDZUNJTEwgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCB2Mi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRUNJTEwtMi4xIjogWwogICAgICAgICJDZUNJTEwgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCB2Mi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC1CIjogWwogICAgICAgICJDZUNJTEwtQiBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRUNJTEwtQyI6IFsKICAgICAgICAiQ2VDSUxMLUMgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtMS4xIjogWwogICAgICAgICJDRVJOIE9wZW4gSGFyZHdhcmUgTGljZW5jZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRVJOLU9ITC0xLjIiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIHYxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFUk4tT0hMLVAtMi4wIjogWwogICAgICAgICJDRVJOIE9wZW4gSGFyZHdhcmUgTGljZW5jZSBWZXJzaW9uIDIgLSBQZXJtaXNzaXZlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFUk4tT0hMLVMtMi4wIjogWwogICAgICAgICJDRVJOIE9wZW4gSGFyZHdhcmUgTGljZW5jZSBWZXJzaW9uIDIgLSBTdHJvbmdseSBSZWNpcHJvY2FsIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFUk4tT0hMLVctMi4wIjogWwogICAgICAgICJDRVJOIE9wZW4gSGFyZHdhcmUgTGljZW5jZSBWZXJzaW9uIDIgLSBXZWFrbHkgUmVjaXByb2NhbCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDbEFydGlzdGljIjogWwogICAgICAgICJDbGFyaWZpZWQgQXJ0aXN0aWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ05SSS1KeXRob24iOiBbCiAgICAgICAgIkNOUkkgSnl0aG9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNOUkktUHl0aG9uIjogWwogICAgICAgICJDTlJJIFB5dGhvbiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNOUkktUHl0aG9uLUdQTC1Db21wYXRpYmxlIjogWwogICAgICAgICJDTlJJIFB5dGhvbiBPcGVuIFNvdXJjZSBHUEwgQ29tcGF0aWJsZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ09JTC0xLjAiOiBbCiAgICAgICAgIkNvcHlmcmVlIE9wZW4gSW5ub3ZhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb21tdW5pdHktU3BlYy0xLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBTcGVjaWZpY2F0aW9uIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb25kb3ItMS4xIjogWwogICAgICAgICJDb25kb3IgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY29weWxlZnQtbmV4dC0wLjMuMCI6IFsKICAgICAgICAiY29weWxlZnQtbmV4dCAwLjMuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY29weWxlZnQtbmV4dC0wLjMuMSI6IFsKICAgICAgICAiY29weWxlZnQtbmV4dCAwLjMuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ1BBTC0xLjAiOiBbCiAgICAgICAgIkNvbW1vbiBQdWJsaWMgQXR0cmlidXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ1BMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDUE9MLTEuMDIiOiBbCiAgICAgICAgIkNvZGUgUHJvamVjdCBPcGVuIExpY2Vuc2UgMS4wMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3Jvc3N3b3JkIjogWwogICAgICAgICJDcm9zc3dvcmQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3J5c3RhbFN0YWNrZXIiOiBbCiAgICAgICAgIkNyeXN0YWxTdGFja2VyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNVQS1PUEwtMS4wIjogWwogICAgICAgICJDVUEgT2ZmaWNlIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3ViZSI6IFsKICAgICAgICAiQ3ViZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjdXJsIjogWwogICAgICAgICJjdXJsIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkQtRlNMLTEuMCI6IFsKICAgICAgICAiRGV1dHNjaGUgRnJlaWUgU29mdHdhcmUgTGl6ZW56IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJkaWZmbWFyayI6IFsKICAgICAgICAiZGlmZm1hcmsgbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiREwtREUtQlktMi4wIjogWwogICAgICAgICJEYXRhIGxpY2VuY2UgR2VybWFueSBcdTIwMTMgYXR0cmlidXRpb24gXHUyMDEzIHZlcnNpb24gMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJET0MiOiBbCiAgICAgICAgIkRPQyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEb3RzZXFuIjogWwogICAgICAgICJEb3RzZXFuIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRSTC0xLjAiOiBbCiAgICAgICAgIkRldGVjdGlvbiBSdWxlIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEU0RQIjogWwogICAgICAgICJEU0RQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImR2aXBkZm0iOiBbCiAgICAgICAgImR2aXBkZm0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRUNMLTEuMCI6IFsKICAgICAgICAiRWR1Y2F0aW9uYWwgQ29tbXVuaXR5IExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFQ0wtMi4wIjogWwogICAgICAgICJFZHVjYXRpb25hbCBDb21tdW5pdHkgTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImVDb3MtMi4wIjogWwogICAgICAgICJlQ29zIGxpY2Vuc2UgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiRUZMLTEuMCI6IFsKICAgICAgICAiRWlmZmVsIEZvcnVtIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFRkwtMi4wIjogWwogICAgICAgICJFaWZmZWwgRm9ydW0gTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImVHZW5peCI6IFsKICAgICAgICAiZUdlbml4LmNvbSBQdWJsaWMgTGljZW5zZSAxLjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRWxhc3RpYy0yLjAiOiBbCiAgICAgICAgIkVsYXN0aWMgTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVudGVzc2EiOiBbCiAgICAgICAgIkVudGVzc2EgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUElDUyI6IFsKICAgICAgICAiRVBJQ1MgT3BlbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUEwtMS4wIjogWwogICAgICAgICJFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUEwtMi4wIjogWwogICAgICAgICJFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFcmxQTC0xLjEiOiBbCiAgICAgICAgIkVybGFuZyBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJldGFsYWItMi4wIjogWwogICAgICAgICJFdGFsYWIgT3BlbiBMaWNlbnNlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRVVEYXRhZ3JpZCI6IFsKICAgICAgICAiRVUgRGF0YUdyaWQgU29mdHdhcmUgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVVBMLTEuMCI6IFsKICAgICAgICAiRXVyb3BlYW4gVW5pb24gUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVVBMLTEuMSI6IFsKICAgICAgICAiRXVyb3BlYW4gVW5pb24gUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVVUEwtMS4yIjogWwogICAgICAgICJFdXJvcGVhbiBVbmlvbiBQdWJsaWMgTGljZW5zZSAxLjIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRXVyb3N5bSI6IFsKICAgICAgICAiRXVyb3N5bSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGYWlyIjogWwogICAgICAgICJGYWlyIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRkRLLUFBQyI6IFsKICAgICAgICAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZyYW1ld29yeC0xLjAiOiBbCiAgICAgICAgIkZyYW1ld29yeCBPcGVuIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZyZWVCU0QtRE9DIjogWwogICAgICAgICJGcmVlQlNEIERvY3VtZW50YXRpb24gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnJlZUltYWdlIjogWwogICAgICAgICJGcmVlSW1hZ2UgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGQVAiOiBbCiAgICAgICAgIkZTRiBBbGwgUGVybWlzc2l2ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZVTCI6IFsKICAgICAgICAiRlNGIFVubGltaXRlZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZVTExSIjogWwogICAgICAgICJGU0YgVW5saW1pdGVkIExpY2Vuc2UgKHdpdGggTGljZW5zZSBSZXRlbnRpb24pIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGVEwiOiBbCiAgICAgICAgIkZyZWV0eXBlIFByb2plY3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0QiOiBbCiAgICAgICAgIkdEIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHRkRMLTEuMS1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9ubHkgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMS1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSBvciBsYXRlciAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xLW5vLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb25seSAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xLW5vLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9yIGxhdGVyIC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMiI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR0ZETC0xLjItaW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvbmx5IC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjItaW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIgb3IgbGF0ZXIgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMi1uby1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9ubHkgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMi1uby1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvciBsYXRlciAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9ubHkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdGREwtMS4zLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb25seSAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4zLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIG9yIGxhdGVyIC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMtbm8taW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvbmx5IC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMtbm8taW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb3IgbGF0ZXIgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb3IgbGF0ZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdpZnR3YXJlIjogWwogICAgICAgICJHaWZ0d2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHTDJQUyI6IFsKICAgICAgICAiR0wyUFMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2xpZGUiOiBbCiAgICAgICAgIjNkZnggR2xpZGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2x1bHhlIjogWwogICAgICAgICJHbHVseGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0xXVFBMIjogWwogICAgICAgICJHb29kIEx1Y2sgV2l0aCBUaGF0IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJnbnVwbG90IjogWwogICAgICAgICJnbnVwbG90IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0xLjAiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMS4wKyI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMS4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTEuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTIuMCI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMCsiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMi4wLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0yLjAtd2l0aC1hdXRvY29uZi1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgdy9BdXRvY29uZiBleGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLWJpc29uLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0Jpc29uIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtY2xhc3NwYXRoLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0NsYXNzcGF0aCBleGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLWZvbnQtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIHcvRm9udCBleGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLUdDQy1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgdy9HQ0MgUnVudGltZSBMaWJyYXJ5IGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMy4wIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMy4wKyI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjAtb25seSI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0zLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTMuMC13aXRoLWF1dG9jb25mLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCB3L0F1dG9jb25mIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMy4wLXdpdGgtR0NDLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCB3L0dDQyBSdW50aW1lIExpYnJhcnkgZXhjZXB0aW9uIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiZ1NPQVAtMS4zYiI6IFsKICAgICAgICAiZ1NPQVAgUHVibGljIExpY2Vuc2UgdjEuM2IiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhhc2tlbGxSZXBvcnQiOiBbCiAgICAgICAgIkhhc2tlbGwgTGFuZ3VhZ2UgUmVwb3J0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhpcHBvY3JhdGljLTIuMSI6IFsKICAgICAgICAiSGlwcG9jcmF0aWMgTGljZW5zZSAyLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLXZhcmlhbnQiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBzZWxsIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhUTUxUSURZIjogWwogICAgICAgICJIVE1MIFRpZHkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUJNLXBpYnMiOiBbCiAgICAgICAgIklCTSBQb3dlclBDIEluaXRpYWxpemF0aW9uIGFuZCBCb290IFNvZnR3YXJlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJQ1UiOiBbCiAgICAgICAgIklDVSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJSkciOiBbCiAgICAgICAgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW1hZ2VNYWdpY2siOiBbCiAgICAgICAgIkltYWdlTWFnaWNrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImlNYXRpeCI6IFsKICAgICAgICAiaU1hdGl4IFN0YW5kYXJkIEZ1bmN0aW9uIExpYnJhcnkgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbWxpYjIiOiBbCiAgICAgICAgIkltbGliMiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbmZvLVpJUCI6IFsKICAgICAgICAiSW5mby1aSVAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW50ZWwiOiBbCiAgICAgICAgIkludGVsIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW50ZWwtQUNQSSI6IFsKICAgICAgICAiSW50ZWwgQUNQSSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW50ZXJiYXNlLTEuMCI6IFsKICAgICAgICAiSW50ZXJiYXNlIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklQQSI6IFsKICAgICAgICAiSVBBIEZvbnQgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJUEwtMS4wIjogWwogICAgICAgICJJQk0gUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJU0MiOiBbCiAgICAgICAgIklTQyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkphbSI6IFsKICAgICAgICAiSmFtIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSmFzUGVyLTIuMCI6IFsKICAgICAgICAiSmFzUGVyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkpQTklDIjogWwogICAgICAgICJKYXBhbiBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKU09OIjogWwogICAgICAgICJKU09OIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIktpQ2FkLWxpYnJhcmllcy1leGNlcHRpb24iOiBbCiAgICAgICAgIktpQ2FkIExpYnJhcmllcyBFeGNlcHRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxBTC0xLjIiOiBbCiAgICAgICAgIkxpY2VuY2UgQXJ0IExpYnJlIDEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEFMLTEuMyI6IFsKICAgICAgICAiTGljZW5jZSBBcnQgTGlicmUgMS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMYXRleDJlIjogWwogICAgICAgICJMYXRleDJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxlcHRvbmljYSI6IFsKICAgICAgICAiTGVwdG9uaWNhIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUEwtMi4wIjogWwogICAgICAgICJHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMCsiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMC1vbmx5IjogWwogICAgICAgICJHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjEiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMSsiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMSBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkxHUEwtMi4xLW9ubHkiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjEtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUEwtMy4wIjogWwogICAgICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiTEdQTC0zLjArIjogWwogICAgICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkxHUEwtMy4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0zLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUExMUiI6IFsKICAgICAgICAiTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgRm9yIExpbmd1aXN0aWMgUmVzb3VyY2VzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaWJwbmciOiBbCiAgICAgICAgImxpYnBuZyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJsaWJwbmctMi4wIjogWwogICAgICAgICJQTkcgUmVmZXJlbmNlIExpYnJhcnkgdmVyc2lvbiAyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJsaWJzZWxpbnV4LTEuMCI6IFsKICAgICAgICAibGlic2VsaW51eCBwdWJsaWMgZG9tYWluIG5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibGlidGlmZiI6IFsKICAgICAgICAibGlidGlmZiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaUxpUS1QLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUGVybWlzc2l2ZSB2ZXJzaW9uIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaUxpUS1SLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUlx1MDBlOWNpcHJvY2l0XHUwMGU5IHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpTGlRLVJwbHVzLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUlx1MDBlOWNpcHJvY2l0XHUwMGU5IGZvcnRlIHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpbnV4LW1hbi1wYWdlcy1jb3B5bGVmdCI6IFsKICAgICAgICAiTGludXggbWFuLXBhZ2VzIENvcHlsZWZ0IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1PcGVuSUIiOiBbCiAgICAgICAgIkxpbnV4IEtlcm5lbCBWYXJpYW50IG9mIE9wZW5JQi5vcmcgbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBMLTEuMCI6IFsKICAgICAgICAiTHVjZW50IFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQTC0xLjAyIjogWwogICAgICAgICJMdWNlbnQgUHVibGljIExpY2Vuc2UgdjEuMDIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBQTC0xLjAiOiBbCiAgICAgICAgIkxhVGVYIFByb2plY3QgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBQTC0xLjEiOiBbCiAgICAgICAgIkxhVGVYIFByb2plY3QgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBQTC0xLjIiOiBbCiAgICAgICAgIkxhVGVYIFByb2plY3QgUHVibGljIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBQTC0xLjNhIjogWwogICAgICAgICJMYVRlWCBQcm9qZWN0IFB1YmxpYyBMaWNlbnNlIHYxLjNhIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuM2MiOiBbCiAgICAgICAgIkxhVGVYIFByb2plY3QgUHVibGljIExpY2Vuc2UgdjEuM2MiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWFrZUluZGV4IjogWwogICAgICAgICJNYWtlSW5kZXggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWlyT1MiOiBbCiAgICAgICAgIlRoZSBNaXJPUyBMaWNlbmNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVCI6IFsKICAgICAgICAiTUlUIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULTAiOiBbCiAgICAgICAgIk1JVCBObyBBdHRyaWJ1dGlvbiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtYWR2ZXJ0aXNpbmciOiBbCiAgICAgICAgIkVubGlnaHRlbm1lbnQgTGljZW5zZSAoZTE2KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUNNVSI6IFsKICAgICAgICAiQ01VIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1lbm5hIjogWwogICAgICAgICJlbm5hIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1mZWgiOiBbCiAgICAgICAgImZlaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtTW9kZXJuLVZhcmlhbnQiOiBbCiAgICAgICAgIk1JVCBMaWNlbnNlIE1vZGVybiBWYXJpYW50IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1vcGVuLWdyb3VwIjogWwogICAgICAgICJNSVQgT3BlbiBHcm91cCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVRORkEiOiBbCiAgICAgICAgIk1JVCArbm8tZmFsc2UtYXR0cmlicyBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNb3Rvc290byI6IFsKICAgICAgICAiTW90b3NvdG8gTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtcGljaDIiOiBbCiAgICAgICAgIm1waWNoMiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUEwtMS4wIjogWwogICAgICAgICJNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUEwtMS4xIjogWwogICAgICAgICJNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUEwtMi4wIjogWwogICAgICAgICJNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUEwtMi4wLW5vLWNvcHlsZWZ0LWV4Y2VwdGlvbiI6IFsKICAgICAgICAiTW96aWxsYSBQdWJsaWMgTGljZW5zZSAyLjAgKG5vIGNvcHlsZWZ0IGV4Y2VwdGlvbikiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibXBsdXMiOiBbCiAgICAgICAgIm1wbHVzIEZvbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVMtUEwiOiBbCiAgICAgICAgIk1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUy1STCI6IFsKICAgICAgICAiTWljcm9zb2Z0IFJlY2lwcm9jYWwgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNVExMIjogWwogICAgICAgICJNYXRyaXggVGVtcGxhdGUgTGlicmFyeSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNdWxhblBTTC0xLjAiOiBbCiAgICAgICAgIk11bGFuIFBlcm1pc3NpdmUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNdWxhblBTTC0yLjAiOiBbCiAgICAgICAgIk11bGFuIFBlcm1pc3NpdmUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11bHRpY3MiOiBbCiAgICAgICAgIk11bHRpY3MgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNdXAiOiBbCiAgICAgICAgIk11cCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQUlTVC0yMDAzIjogWwogICAgICAgICJOYXJhIEluc3RpdHV0ZSBvZiBTY2llbmNlIGFuZCBUZWNobm9sb2d5IExpY2Vuc2UgKDIwMDMpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQVNBLTEuMyI6IFsKICAgICAgICAiTkFTQSBPcGVuIFNvdXJjZSBBZ3JlZW1lbnQgMS4zIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5hdW1lbiI6IFsKICAgICAgICAiTmF1bWVuIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5CUEwtMS4wIjogWwogICAgICAgICJOZXQgQm9vbGVhbiBQdWJsaWMgTGljZW5zZSB2MSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkNHTC1VSy0yLjAiOiBbCiAgICAgICAgIk5vbi1Db21tZXJjaWFsIEdvdmVybm1lbnQgTGljZW5jZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkNTQSI6IFsKICAgICAgICAiVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTmV0LVNOTVAiOiBbCiAgICAgICAgIk5ldC1TTk1QIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5ldENERiI6IFsKICAgICAgICAiTmV0Q0RGIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5ld3NsZXRyIjogWwogICAgICAgICJOZXdzbGV0ciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOR1BMIjogWwogICAgICAgICJOZXRoYWNrIEdlbmVyYWwgUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTklTVC1QRCI6IFsKICAgICAgICAiTklTVCBQdWJsaWMgRG9tYWluIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTklTVC1QRC1mYWxsYmFjayI6IFsKICAgICAgICAiTklTVCBQdWJsaWMgRG9tYWluIE5vdGljZSB3aXRoIGxpY2Vuc2UgZmFsbGJhY2siLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5MT0QtMS4wIjogWwogICAgICAgICJOb3J3ZWdpYW4gTGljZW5jZSBmb3IgT3BlbiBHb3Zlcm5tZW50IERhdGEgKE5MT0QpIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkxPRC0yLjAiOiBbCiAgICAgICAgIk5vcndlZ2lhbiBMaWNlbmNlIGZvciBPcGVuIEdvdmVybm1lbnQgRGF0YSAoTkxPRCkgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOTFBMIjogWwogICAgICAgICJObyBMaW1pdCBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTm9raWEiOiBbCiAgICAgICAgIk5va2lhIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTk9TTCI6IFsKICAgICAgICAiTmV0aXplbiBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOb3dlYiI6IFsKICAgICAgICAiTm93ZWIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBMLTEuMCI6IFsKICAgICAgICAiTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBMLTEuMSI6IFsKICAgICAgICAiTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBPU0wtMy4wIjogWwogICAgICAgICJOb24tUHJvZml0IE9wZW4gU29mdHdhcmUgTGljZW5zZSAzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlJMIjogWwogICAgICAgICJOUkwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlRQIjogWwogICAgICAgICJOVFAgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOVFAtMCI6IFsKICAgICAgICAiTlRQIE5vIEF0dHJpYnV0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOdW5pdCI6IFsKICAgICAgICAiTnVuaXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJPLVVEQS0xLjAiOiBbCiAgICAgICAgIk9wZW4gVXNlIG9mIERhdGEgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9DQ1QtUEwiOiBbCiAgICAgICAgIk9wZW4gQ0FTQ0FERSBUZWNobm9sb2d5IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPQ0xDLTIuMCI6IFsKICAgICAgICAiT0NMQyBSZXNlYXJjaCBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0RiTC0xLjAiOiBbCiAgICAgICAgIk9wZW4gRGF0YSBDb21tb25zIE9wZW4gRGF0YWJhc2UgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPREMtQnktMS4wIjogWwogICAgICAgICJPcGVuIERhdGEgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjAiOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjAtbm8tUkZOIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4wIHdpdGggbm8gUmVzZXJ2ZWQgRm9udCBOYW1lIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4wLVJGTiI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMCB3aXRoIFJlc2VydmVkIEZvbnQgTmFtZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMSI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4xLW5vLVJGTiI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMSB3aXRoIG5vIFJlc2VydmVkIEZvbnQgTmFtZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4xLVJGTiI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMSB3aXRoIFJlc2VydmVkIEZvbnQgTmFtZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0MtMS4wIjogWwogICAgICAgICJPR0MgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HREwtVGFpd2FuLTEuMCI6IFsKICAgICAgICAiVGFpd2FuIE9wZW4gR292ZXJubWVudCBEYXRhIExpY2Vuc2UsIHZlcnNpb24gMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtQ2FuYWRhLTIuMCI6IFsKICAgICAgICAiT3BlbiBHb3Zlcm5tZW50IExpY2VuY2UgLSBDYW5hZGEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HTC1VSy0xLjAiOiBbCiAgICAgICAgIk9wZW4gR292ZXJubWVudCBMaWNlbmNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HTC1VSy0yLjAiOiBbCiAgICAgICAgIk9wZW4gR292ZXJubWVudCBMaWNlbmNlIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HTC1VSy0zLjAiOiBbCiAgICAgICAgIk9wZW4gR292ZXJubWVudCBMaWNlbmNlIHYzLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9HVFNMIjogWwogICAgICAgICJPcGVuIEdyb3VwIFRlc3QgU3VpdGUgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0xLjEiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0xLjIiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2MS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0xLjMiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2MS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0xLjQiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2MS40IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjAiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4wIChvciBwb3NzaWJseSAyLjBBIGFuZCAyLjBCKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4wLjEiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4wLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMSI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMiI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMi4xIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMi4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjIuMiI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIDIuMi4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjMiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjQiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi40IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjUiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi41IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjYiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi42IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjciOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi43IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjgiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi44IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9NTCI6IFsKICAgICAgICAiT3BlbiBNYXJrZXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3BlblNTTCI6IFsKICAgICAgICAiT3BlblNTTCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPUEwtMS4wIjogWwogICAgICAgICJPcGVuIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9QVUJMLTEuMCI6IFsKICAgICAgICAiT3BlbiBQdWJsaWNhdGlvbiBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TRVQtUEwtMi4xIjogWwogICAgICAgICJPU0VUIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0xLjAiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1NMLTEuMSI6IFsKICAgICAgICAiT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1NMLTIuMCI6IFsKICAgICAgICAiT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0wtMi4xIjogWwogICAgICAgICJPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0zLjAiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUGFyaXR5LTYuMC4wIjogWwogICAgICAgICJUaGUgUGFyaXR5IFB1YmxpYyBMaWNlbnNlIDYuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQYXJpdHktNy4wLjAiOiBbCiAgICAgICAgIlRoZSBQYXJpdHkgUHVibGljIExpY2Vuc2UgNy4wLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBEREwtMS4wIjogWwogICAgICAgICJPcGVuIERhdGEgQ29tbW9ucyBQdWJsaWMgRG9tYWluIERlZGljYXRpb24gJiBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUEhQLTMuMCI6IFsKICAgICAgICAiUEhQIExpY2Vuc2UgdjMuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQSFAtMy4wMSI6IFsKICAgICAgICAiUEhQIExpY2Vuc2UgdjMuMDEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUGxleHVzIjogWwogICAgICAgICJQbGV4dXMgQ2xhc3N3b3JsZHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUG9seUZvcm0tTm9uY29tbWVyY2lhbC0xLjAuMCI6IFsKICAgICAgICAiUG9seUZvcm0gTm9uY29tbWVyY2lhbCBMaWNlbnNlIDEuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQb2x5Rm9ybS1TbWFsbC1CdXNpbmVzcy0xLjAuMCI6IFsKICAgICAgICAiUG9seUZvcm0gU21hbGwgQnVzaW5lc3MgTGljZW5zZSAxLjAuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUG9zdGdyZVNRTCI6IFsKICAgICAgICAiUG9zdGdyZVNRTCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBTRi0yLjAiOiBbCiAgICAgICAgIlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJwc2ZyYWciOiBbCiAgICAgICAgInBzZnJhZyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJwc3V0aWxzIjogWwogICAgICAgICJwc3V0aWxzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlB5dGhvbi0yLjAiOiBbCiAgICAgICAgIlB5dGhvbiBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJRaHVsbCI6IFsKICAgICAgICAiUWh1bGwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUVBMLTEuMCI6IFsKICAgICAgICAiUSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUmRpc2MiOiBbCiAgICAgICAgIlJkaXNjIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJIZUNvcy0xLjEiOiBbCiAgICAgICAgIlJlZCBIYXQgZUNvcyBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSUEwtMS4xIjogWwogICAgICAgICJSZWNpcHJvY2FsIFB1YmxpYyBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSUEwtMS41IjogWwogICAgICAgICJSZWNpcHJvY2FsIFB1YmxpYyBMaWNlbnNlIDEuNSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSUFNMLTEuMCI6IFsKICAgICAgICAiUmVhbE5ldHdvcmtzIFB1YmxpYyBTb3VyY2UgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJTQS1NRCI6IFsKICAgICAgICAiUlNBIE1lc3NhZ2UtRGlnZXN0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJTQ1BMIjogWwogICAgICAgICJSaWNvaCBTb3VyY2UgQ29kZSBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSdWJ5IjogWwogICAgICAgICJSdWJ5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNBWC1QRCI6IFsKICAgICAgICAiU2F4IFB1YmxpYyBEb21haW4gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTYXhwYXRoIjogWwogICAgICAgICJTYXhwYXRoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNDRUEiOiBbCiAgICAgICAgIlNDRUEgU2hhcmVkIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTY2hlbWVSZXBvcnQiOiBbCiAgICAgICAgIlNjaGVtZSBMYW5ndWFnZSBSZXBvcnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2VuZG1haWwiOiBbCiAgICAgICAgIlNlbmRtYWlsIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNlbmRtYWlsLTguMjMiOiBbCiAgICAgICAgIlNlbmRtYWlsIExpY2Vuc2UgOC4yMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0dJLUItMS4wIjogWwogICAgICAgICJTR0kgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEIgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0dJLUItMS4xIjogWwogICAgICAgICJTR0kgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEIgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0dJLUItMi4wIjogWwogICAgICAgICJTR0kgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEIgdjIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0hMLTAuNSI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UgdjAuNSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0hMLTAuNTEiOiBbCiAgICAgICAgIlNvbGRlcnBhZCBIYXJkd2FyZSBMaWNlbnNlLCBWZXJzaW9uIDAuNTEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNpbVBMLTIuMCI6IFsKICAgICAgICAiU2ltcGxlIFB1YmxpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTSVNTTCI6IFsKICAgICAgICAiU3VuIEluZHVzdHJ5IFN0YW5kYXJkcyBTb3VyY2UgTGljZW5zZSB2MS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNJU1NMLTEuMiI6IFsKICAgICAgICAiU3VuIEluZHVzdHJ5IFN0YW5kYXJkcyBTb3VyY2UgTGljZW5zZSB2MS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTbGVlcHljYXQiOiBbCiAgICAgICAgIlNsZWVweWNhdCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNNTE5KIjogWwogICAgICAgICJTdGFuZGFyZCBNTCBvZiBOZXcgSmVyc2V5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNNUFBMIjogWwogICAgICAgICJTZWN1cmUgTWVzc2FnaW5nIFByb3RvY29sIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTTklBIjogWwogICAgICAgICJTTklBIFB1YmxpYyBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3BlbmNlci04NiI6IFsKICAgICAgICAiU3BlbmNlciBMaWNlbnNlIDg2IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTcGVuY2VyLTk0IjogWwogICAgICAgICJTcGVuY2VyIExpY2Vuc2UgOTQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNwZW5jZXItOTkiOiBbCiAgICAgICAgIlNwZW5jZXIgTGljZW5zZSA5OSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1BMLTEuMCI6IFsKICAgICAgICAiU3VuIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1NILU9wZW5TU0giOiBbCiAgICAgICAgIlNTSCBPcGVuU1NIIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNTSC1zaG9ydCI6IFsKICAgICAgICAiU1NIIHNob3J0IG5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1NQTC0xLjAiOiBbCiAgICAgICAgIlNlcnZlciBTaWRlIFB1YmxpYyBMaWNlbnNlLCB2IDEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlN0YW5kYXJkTUwtTkoiOiBbCiAgICAgICAgIlN0YW5kYXJkIE1MIG9mIE5ldyBKZXJzZXkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJTdWdhckNSTS0xLjEuMyI6IFsKICAgICAgICAiU3VnYXJDUk0gUHVibGljIExpY2Vuc2UgdjEuMS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTV0wiOiBbCiAgICAgICAgIlNjaGVtZSBXaWRnZXQgTGlicmFyeSAoU1dMKSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVEFQUi1PSEwtMS4wIjogWwogICAgICAgICJUQVBSIE9wZW4gSGFyZHdhcmUgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUQ0wiOiBbCiAgICAgICAgIlRDTC9USyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUQ1Atd3JhcHBlcnMiOiBbCiAgICAgICAgIlRDUCBXcmFwcGVycyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUTWF0ZSI6IFsKICAgICAgICAiVE1hdGUgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVE9SUVVFLTEuMSI6IFsKICAgICAgICAiVE9SUVVFIHYyLjUrIFNvZnR3YXJlIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVE9TTCI6IFsKICAgICAgICAiVHJ1c3N0ZXIgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFUtQmVybGluLTEuMCI6IFsKICAgICAgICAiVGVjaG5pc2NoZSBVbml2ZXJzaXRhZXQgQmVybGluIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUVS1CZXJsaW4tMi4wIjogWwogICAgICAgICJUZWNobmlzY2hlIFVuaXZlcnNpdGFldCBCZXJsaW4gTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVDTC0xLjAiOiBbCiAgICAgICAgIlVwc3RyZWFtIENvbXBhdGliaWxpdHkgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaWNvZGUtREZTLTIwMTUiOiBbCiAgICAgICAgIlVuaWNvZGUgTGljZW5zZSBBZ3JlZW1lbnQgLSBEYXRhIEZpbGVzIGFuZCBTb2Z0d2FyZSAoMjAxNSkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaWNvZGUtREZTLTIwMTYiOiBbCiAgICAgICAgIlVuaWNvZGUgTGljZW5zZSBBZ3JlZW1lbnQgLSBEYXRhIEZpbGVzIGFuZCBTb2Z0d2FyZSAoMjAxNikiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5pY29kZS1UT1UiOiBbCiAgICAgICAgIlVuaWNvZGUgVGVybXMgb2YgVXNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmxpY2Vuc2UiOiBbCiAgICAgICAgIlRoZSBVbmxpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVVBMLTEuMCI6IFsKICAgICAgICAiVW5pdmVyc2FsIFBlcm1pc3NpdmUgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlZpbSI6IFsKICAgICAgICAiVmltIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlZPU1RST00iOiBbCiAgICAgICAgIlZPU1RST00gUHVibGljIExpY2Vuc2UgZm9yIE9wZW4gU291cmNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJWU0wtMS4wIjogWwogICAgICAgICJWb3ZpZGEgU29mdHdhcmUgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlczQyI6IFsKICAgICAgICAiVzNDIFNvZnR3YXJlIE5vdGljZSBhbmQgTGljZW5zZSAoMjAwMi0xMi0zMSkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVzNDLTE5OTgwNzIwIjogWwogICAgICAgICJXM0MgU29mdHdhcmUgTm90aWNlIGFuZCBMaWNlbnNlICgxOTk4LTA3LTIwKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVzNDLTIwMTUwNTEzIjogWwogICAgICAgICJXM0MgU29mdHdhcmUgTm90aWNlIGFuZCBEb2N1bWVudCBMaWNlbnNlICgyMDE1LTA1LTEzKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV2F0Y29tLTEuMCI6IFsKICAgICAgICAiU3liYXNlIE9wZW4gV2F0Y29tIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXc3VpcGEiOiBbCiAgICAgICAgIldzdWlwYSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXVEZQTCI6IFsKICAgICAgICAiRG8gV2hhdCBUaGUgRipjayBZb3UgV2FudCBUbyBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAid3hXaW5kb3dzIjogWwogICAgICAgICJ3eFdpbmRvd3MgTGlicmFyeSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiWDExIjogWwogICAgICAgICJYMTEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWDExLWRpc3RyaWJ1dGUtbW9kaWZpY2F0aW9ucy12YXJpYW50IjogWwogICAgICAgICJYMTEgTGljZW5zZSBEaXN0cmlidXRpb24gTW9kaWZpY2F0aW9uIFZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhlcm94IjogWwogICAgICAgICJYZXJveCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYRnJlZTg2LTEuMSI6IFsKICAgICAgICAiWEZyZWU4NiBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAieGluZXRkIjogWwogICAgICAgICJ4aW5ldGQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWG5ldCI6IFsKICAgICAgICAiWC5OZXQgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4cHAiOiBbCiAgICAgICAgIlhQUCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYU2thdCI6IFsKICAgICAgICAiWFNrYXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWVBMLTEuMCI6IFsKICAgICAgICAiWWFob28hIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIllQTC0xLjEiOiBbCiAgICAgICAgIllhaG9vISBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZWQiOiBbCiAgICAgICAgIlplZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZW5kLTIuMCI6IFsKICAgICAgICAiWmVuZCBMaWNlbnNlIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlppbWJyYS0xLjMiOiBbCiAgICAgICAgIlppbWJyYSBQdWJsaWMgTGljZW5zZSB2MS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaaW1icmEtMS40IjogWwogICAgICAgICJaaW1icmEgUHVibGljIExpY2Vuc2UgdjEuNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWmxpYiI6IFsKICAgICAgICAiemxpYiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInpsaWItYWNrbm93bGVkZ2VtZW50IjogWwogICAgICAgICJ6bGliL2xpYnBuZyBMaWNlbnNlIHdpdGggQWNrbm93bGVkZ2VtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaUEwtMS4xIjogWwogICAgICAgICJab3BlIFB1YmxpYyBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWlBMLTIuMCI6IFsKICAgICAgICAiWm9wZSBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWlBMLTIuMSI6IFsKICAgICAgICAiWm9wZSBQdWJsaWMgTGljZW5zZSAyLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0KfTw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU3BkeDsKCmNsYXNzIFNwZHhMaWNlbnNlcwp7Cgpjb25zdCBMSUNFTlNFU19GSUxFID0gJ3NwZHgtbGljZW5zZXMuanNvbic7CgoKY29uc3QgRVhDRVBUSU9OU19GSUxFID0gJ3NwZHgtZXhjZXB0aW9ucy5qc29uJzsKCgoKCgoKCgoKCgoKCgpwcml2YXRlICRsaWNlbnNlczsKCgoKCnByaXZhdGUgJGxpY2Vuc2VzRXhwcmVzc2lvbjsKCgoKCgoKCgoKCgoKCgpwcml2YXRlICRleGNlcHRpb25zOwoKCgoKcHJpdmF0ZSAkZXhjZXB0aW9uc0V4cHJlc3Npb247CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5sb2FkTGljZW5zZXMoKTsKJHRoaXMtPmxvYWRFeGNlcHRpb25zKCk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlQnlJZGVudGlmaWVyKCRpZGVudGlmaWVyKQp7CiRrZXkgPSBzdHJ0b2xvd2VyKCRpZGVudGlmaWVyKTsKCmlmICghaXNzZXQoJHRoaXMtPmxpY2Vuc2VzWyRrZXldKSkgewpyZXR1cm4gbnVsbDsKfQoKbGlzdCgkaWRlbnRpZmllciwgJG5hbWUsICRpc09zaUFwcHJvdmVkLCAkaXNEZXByZWNhdGVkTGljZW5zZUlkKSA9ICR0aGlzLT5saWNlbnNlc1ska2V5XTsKCnJldHVybiBhcnJheSgKJG5hbWUsCiRpc09zaUFwcHJvdmVkLAonaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8nIC4gJGlkZW50aWZpZXIgLiAnLmh0bWwjbGljZW5zZVRleHQnLAokaXNEZXByZWNhdGVkTGljZW5zZUlkLAopOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlcygpCnsKcmV0dXJuICR0aGlzLT5saWNlbnNlczsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4Y2VwdGlvbkJ5SWRlbnRpZmllcigkaWRlbnRpZmllcikKewoka2V5ID0gc3RydG9sb3dlcigkaWRlbnRpZmllcik7CgppZiAoIWlzc2V0KCR0aGlzLT5leGNlcHRpb25zWyRrZXldKSkgewpyZXR1cm4gbnVsbDsKfQoKbGlzdCgkaWRlbnRpZmllciwgJG5hbWUpID0gJHRoaXMtPmV4Y2VwdGlvbnNbJGtleV07CgpyZXR1cm4gYXJyYXkoCiRuYW1lLAonaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8nIC4gJGlkZW50aWZpZXIgLiAnLmh0bWwjbGljZW5zZUV4Y2VwdGlvblRleHQnLAopOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElkZW50aWZpZXJCeU5hbWUoJG5hbWUpCnsKZm9yZWFjaCAoJHRoaXMtPmxpY2Vuc2VzIGFzICRsaWNlbnNlRGF0YSkgewppZiAoJGxpY2Vuc2VEYXRhWzFdID09PSAkbmFtZSkgewpyZXR1cm4gJGxpY2Vuc2VEYXRhWzBdOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5leGNlcHRpb25zIGFzICRsaWNlbnNlRGF0YSkgewppZiAoJGxpY2Vuc2VEYXRhWzFdID09PSAkbmFtZSkgewpyZXR1cm4gJGxpY2Vuc2VEYXRhWzBdOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzT3NpQXBwcm92ZWRCeUlkZW50aWZpZXIoJGlkZW50aWZpZXIpCnsKcmV0dXJuICR0aGlzLT5saWNlbnNlc1tzdHJ0b2xvd2VyKCRpZGVudGlmaWVyKV1bMl07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXByZWNhdGVkQnlJZGVudGlmaWVyKCRpZGVudGlmaWVyKQp7CnJldHVybiAkdGhpcy0+bGljZW5zZXNbc3RydG9sb3dlcigkaWRlbnRpZmllcildWzNdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCRsaWNlbnNlKQp7CmlmIChpc19hcnJheSgkbGljZW5zZSkpIHsKJGNvdW50ID0gY291bnQoJGxpY2Vuc2UpOwppZiAoJGNvdW50ICE9PSBjb3VudChhcnJheV9maWx0ZXIoJGxpY2Vuc2UsICdpc19zdHJpbmcnKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0FycmF5IG9mIHN0cmluZ3MgZXhwZWN0ZWQuJyk7Cn0KJGxpY2Vuc2UgPSAkY291bnQgPiAxID8gJygnIC4gaW1wbG9kZSgnIE9SICcsICRsaWNlbnNlKSAuICcpJyA6IChzdHJpbmcpIHJlc2V0KCRsaWNlbnNlKTsKfQoKaWYgKCFpc19zdHJpbmcoJGxpY2Vuc2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidBcnJheSBvciBTdHJpbmcgZXhwZWN0ZWQsICVzIGdpdmVuLicsCmdldHR5cGUoJGxpY2Vuc2UpCikpOwp9CgpyZXR1cm4gJHRoaXMtPmlzVmFsaWRMaWNlbnNlU3RyaW5nKCRsaWNlbnNlKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZXNvdXJjZXNEaXIoKQp7CnJldHVybiBkaXJuYW1lKF9fRElSX18pIC4gJy9yZXMnOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRMaWNlbnNlcygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5saWNlbnNlcykgewpyZXR1cm47Cn0KCiRqc29uID0gZmlsZV9nZXRfY29udGVudHMoc2VsZjo6Z2V0UmVzb3VyY2VzRGlyKCkgLiAnLycgLiBzZWxmOjpMSUNFTlNFU19GSUxFKTsKaWYgKGZhbHNlID09PSAkanNvbikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgbGljZW5zZSBmaWxlIGluICcgLiBzZWxmOjpnZXRSZXNvdXJjZXNEaXIoKSAuICcvJyAuIHNlbGY6OkxJQ0VOU0VTX0ZJTEUpOwp9CiR0aGlzLT5saWNlbnNlcyA9IGFycmF5KCk7Cgpmb3JlYWNoIChqc29uX2RlY29kZSgkanNvbiwgdHJ1ZSkgYXMgJGlkZW50aWZpZXIgPT4gJGxpY2Vuc2UpIHsKJHRoaXMtPmxpY2Vuc2VzW3N0cnRvbG93ZXIoJGlkZW50aWZpZXIpXSA9IGFycmF5KCRpZGVudGlmaWVyLCAkbGljZW5zZVswXSwgJGxpY2Vuc2VbMV0sICRsaWNlbnNlWzJdKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRFeGNlcHRpb25zKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmV4Y2VwdGlvbnMpIHsKcmV0dXJuOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OmdldFJlc291cmNlc0RpcigpIC4gJy8nIC4gc2VsZjo6RVhDRVBUSU9OU19GSUxFKTsKaWYgKGZhbHNlID09PSAkanNvbikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgZXhjZXB0aW9ucyBmaWxlIGluICcgLiBzZWxmOjpnZXRSZXNvdXJjZXNEaXIoKSAuICcvJyAuIHNlbGY6OkVYQ0VQVElPTlNfRklMRSk7Cn0KJHRoaXMtPmV4Y2VwdGlvbnMgPSBhcnJheSgpOwoKZm9yZWFjaCAoanNvbl9kZWNvZGUoJGpzb24sIHRydWUpIGFzICRpZGVudGlmaWVyID0+ICRleGNlcHRpb24pIHsKJHRoaXMtPmV4Y2VwdGlvbnNbc3RydG9sb3dlcigkaWRlbnRpZmllcildID0gYXJyYXkoJGlkZW50aWZpZXIsICRleGNlcHRpb25bMF0pOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TGljZW5zZXNFeHByZXNzaW9uKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxpY2Vuc2VzRXhwcmVzc2lvbikgewokbGljZW5zZXMgPSBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBhcnJheV9rZXlzKCR0aGlzLT5saWNlbnNlcykpOwpyc29ydCgkbGljZW5zZXMpOwokbGljZW5zZXMgPSBpbXBsb2RlKCd8JywgJGxpY2Vuc2VzKTsKJHRoaXMtPmxpY2Vuc2VzRXhwcmVzc2lvbiA9ICRsaWNlbnNlczsKfQoKcmV0dXJuICR0aGlzLT5saWNlbnNlc0V4cHJlc3Npb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RXhjZXB0aW9uc0V4cHJlc3Npb24oKQp7CmlmIChudWxsID09PSAkdGhpcy0+ZXhjZXB0aW9uc0V4cHJlc3Npb24pIHsKJGV4Y2VwdGlvbnMgPSBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBhcnJheV9rZXlzKCR0aGlzLT5leGNlcHRpb25zKSk7CnJzb3J0KCRleGNlcHRpb25zKTsKJGV4Y2VwdGlvbnMgPSBpbXBsb2RlKCd8JywgJGV4Y2VwdGlvbnMpOwokdGhpcy0+ZXhjZXB0aW9uc0V4cHJlc3Npb24gPSAkZXhjZXB0aW9uczsKfQoKcmV0dXJuICR0aGlzLT5leGNlcHRpb25zRXhwcmVzc2lvbjsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNWYWxpZExpY2Vuc2VTdHJpbmcoJGxpY2Vuc2UpCnsKaWYgKGlzc2V0KCR0aGlzLT5saWNlbnNlc1tzdHJ0b2xvd2VyKCRsaWNlbnNlKV0pKSB7CnJldHVybiB0cnVlOwp9CgokbGljZW5zZXMgPSAkdGhpcy0+Z2V0TGljZW5zZXNFeHByZXNzaW9uKCk7CiRleGNlcHRpb25zID0gJHRoaXMtPmdldEV4Y2VwdGlvbnNFeHByZXNzaW9uKCk7CgokcmVnZXggPSA8PDxSRUdFWAp7Cig/KERFRklORSkKICAgICMgaWRzdHJpbmc6IDEqKCBBTFBIQSAvIERJR0lUIC8gLSAvIC4gKQogICAgKD88aWRzdHJpbmc+W1xwTFxwTi4tXXsxLH0pCgogICAgIyBsaWNlbnNlLWlkOiB0YWtlbiBmcm9tIGxpc3QKICAgICg/PGxpY2Vuc2VpZD57JGxpY2Vuc2VzfSkKCiAgICAjIGxpY2Vuc2UtZXhjZXB0aW9uLWlkOiB0YWtlbiBmcm9tIGxpc3QKICAgICg/PGxpY2Vuc2VleGNlcHRpb25pZD57JGV4Y2VwdGlvbnN9KQoKICAgICMgbGljZW5zZS1yZWY6IFtEb2N1bWVudFJlZi0xKihpZHN0cmluZyk6XUxpY2Vuc2VSZWYtMSooaWRzdHJpbmcpCiAgICAoPzxsaWNlbnNlcmVmPig/OkRvY3VtZW50UmVmLSg/Jmlkc3RyaW5nKTopP0xpY2Vuc2VSZWYtKD8maWRzdHJpbmcpKQoKICAgICMgc2ltcGxlLWV4cHJlc3NzaW9uOiBsaWNlbnNlLWlkIC8gbGljZW5zZS1pZCsgLyBsaWNlbnNlLXJlZgogICAgKD88c2ltcGxlX2V4cHJlc3Npb24+KD8mbGljZW5zZWlkKVwrPyB8ICg/JmxpY2Vuc2VpZCkgfCAoPyZsaWNlbnNlcmVmKSkKCiAgICAjIGNvbXBvdW5kLWV4cHJlc3Npb246IDEqKAogICAgIyAgIHNpbXBsZS1leHByZXNzaW9uIC8KICAgICMgICBzaW1wbGUtZXhwcmVzc2lvbiBXSVRIIGxpY2Vuc2UtZXhjZXB0aW9uLWlkIC8KICAgICMgICBjb21wb3VuZC1leHByZXNzaW9uIEFORCBjb21wb3VuZC1leHByZXNzaW9uIC8KICAgICMgICBjb21wb3VuZC1leHByZXNzaW9uIE9SIGNvbXBvdW5kLWV4cHJlc3Npb24KICAgICMgKSAvICggY29tcG91bmQtZXhwcmVzc2lvbiApICkKICAgICg/PGNvbXBvdW5kX2hlYWQ+CiAgICAgICAgKD8mc2ltcGxlX2V4cHJlc3Npb24pICggXHMrIFdJVEggXHMrICg/JmxpY2Vuc2VleGNlcHRpb25pZCkpPwogICAgICAgICAgICB8IFwoIFxzKiAoPyZjb21wb3VuZF9leHByZXNzaW9uKSBccyogXCkKICAgICkKICAgICg/PGNvbXBvdW5kX2V4cHJlc3Npb24+CiAgICAgICAgKD8mY29tcG91bmRfaGVhZCkgKD86IFxzKyAoPzpBTkR8T1IpIFxzKyAoPyZjb21wb3VuZF9leHByZXNzaW9uKSk/CiAgICApCgogICAgIyBsaWNlbnNlLWV4cHJlc3Npb246IDEqMShzaW1wbGUtZXhwcmVzc2lvbiAvIGNvbXBvdW5kLWV4cHJlc3Npb24pCiAgICAoPzxsaWNlbnNlX2V4cHJlc3Npb24+KD8mY29tcG91bmRfZXhwcmVzc2lvbikgfCAoPyZzaW1wbGVfZXhwcmVzc2lvbikpCikgIyBlbmQgb2YgZGVmaW5lCgpeKE5PTkUgfCBOT0FTU0VSVElPTiB8ICg/JmxpY2Vuc2VfZXhwcmVzc2lvbikpJAp9eGkKUkVHRVg7CgokbWF0Y2ggPSBwcmVnX21hdGNoKCRyZWdleCwgJGxpY2Vuc2UpOwoKaWYgKDAgPT09ICRtYXRjaCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChmYWxzZSA9PT0gJG1hdGNoKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUmVnZXggZmFpbGVkIHRvIGNvbXBpbGUvcnVuLicpOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9CgpNSVQgTGljZW5zZQoKQ29weXJpZ2h0IChjKSAyMDE3IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXI7CgoKCgoKCmNsYXNzIFBocENvbmZpZwp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIHVzZU9yaWdpbmFsKCk6IGFycmF5CnsKJHRoaXMtPmdldERhdGFBbmRSZXNldCgpOwpyZXR1cm4gW107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVzZVN0YW5kYXJkKCk6IGFycmF5CnsKJGRhdGEgPSAkdGhpcy0+Z2V0RGF0YUFuZFJlc2V0KCk7CmlmICgkZGF0YSAhPT0gbnVsbCkgewpyZXR1cm4gWyctbicsICctYycsICRkYXRhWyd0bXBJbmknXV07Cn0KCnJldHVybiBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXNlUGVyc2lzdGVudCgpOiBhcnJheQp7CiRkYXRhID0gJHRoaXMtPmdldERhdGFBbmRSZXNldCgpOwppZiAoJGRhdGEgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZUVudignUEhQUkMnLCAkZGF0YVsndG1wSW5pJ10pOwokdGhpcy0+dXBkYXRlRW52KCdQSFBfSU5JX1NDQU5fRElSJywgJycpOwp9CgpyZXR1cm4gW107Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREYXRhQW5kUmVzZXQoKTogP2FycmF5CnsKJGRhdGEgPSBYZGVidWdIYW5kbGVyOjpnZXRSZXN0YXJ0U2V0dGluZ3MoKTsKaWYgKCRkYXRhICE9PSBudWxsKSB7CiR0aGlzLT51cGRhdGVFbnYoJ1BIUFJDJywgJGRhdGFbJ3BocHJjJ10pOwokdGhpcy0+dXBkYXRlRW52KCdQSFBfSU5JX1NDQU5fRElSJywgJGRhdGFbJ3NjYW5EaXInXSk7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVFbnYoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkCnsKUHJvY2Vzczo6c2V0RW52KCRuYW1lLCBmYWxzZSAhPT0gJHZhbHVlID8gJHZhbHVlIDogbnVsbCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCmNsYXNzIFByb2Nlc3MKewoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nICRhcmcsIGJvb2wgJG1ldGEgPSB0cnVlLCBib29sICRtb2R1bGUgPSBmYWxzZSk6IHN0cmluZwp7CmlmICghZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJnKS4iJyI7Cn0KCiRxdW90ZSA9IHN0cnBicmsoJGFyZywgIiBcdCIpICE9PSBmYWxzZSB8fCAkYXJnID09PSAnJzsKCiRhcmcgPSBQcmVnOjpyZXBsYWNlKCcvKFxcXFwqKSIvJywgJyQxJDFcXCInLCAkYXJnLCAtMSwgJGRxdW90ZXMpOwoKaWYgKCRtZXRhKSB7CiRtZXRhID0gJGRxdW90ZXMgfHwgUHJlZzo6aXNNYXRjaCgnLyVbXiVdKyUvJywgJGFyZyk7CgppZiAoISRtZXRhKSB7CiRxdW90ZSA9ICRxdW90ZSB8fCBzdHJwYnJrKCRhcmcsICdeJnw8PigpJykgIT09IGZhbHNlOwp9IGVsc2VpZiAoJG1vZHVsZSAmJiAhJGRxdW90ZXMgJiYgJHF1b3RlKSB7CiRtZXRhID0gZmFsc2U7Cn0KfQoKaWYgKCRxdW90ZSkgewokYXJnID0gJyInLihQcmVnOjpyZXBsYWNlKCcvKFxcXFwqKSQvJywgJyQxJDEnLCAkYXJnKSkuJyInOwp9CgppZiAoJG1ldGEpIHsKJGFyZyA9IFByZWc6OnJlcGxhY2UoJy8oWyJeJnw8PigpJV0pLycsICdeJDEnLCAkYXJnKTsKfQoKcmV0dXJuICRhcmc7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGVTaGVsbENvbW1hbmQoYXJyYXkgJGFyZ3MpOiBzdHJpbmcKewokY29tbWFuZCA9ICcnOwokbW9kdWxlID0gYXJyYXlfc2hpZnQoJGFyZ3MpOwoKaWYgKCRtb2R1bGUgIT09IG51bGwpIHsKJGNvbW1hbmQgPSBzZWxmOjplc2NhcGUoJG1vZHVsZSwgdHJ1ZSwgdHJ1ZSk7Cgpmb3JlYWNoICgkYXJncyBhcyAkYXJnKSB7CiRjb21tYW5kIC49ICcgJy5zZWxmOjplc2NhcGUoJGFyZyk7Cn0KfQoKcmV0dXJuICRjb21tYW5kOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEVudihzdHJpbmcgJG5hbWUsID9zdHJpbmcgJHZhbHVlID0gbnVsbCk6IGJvb2wKewokdW5zZXQgPSBudWxsID09PSAkdmFsdWU7CgppZiAoIXB1dGVudigkdW5zZXQgPyAkbmFtZSA6ICRuYW1lLic9Jy4kdmFsdWUpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR1bnNldCkgewp1bnNldCgkX1NFUlZFUlskbmFtZV0pOwp9IGVsc2UgewokX1NFUlZFUlskbmFtZV0gPSAkdmFsdWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cmlwb3MoKHN0cmluZykgaW5pX2dldCgndmFyaWFibGVzX29yZGVyJyksICdFJykpIHsKaWYgKCR1bnNldCkgewp1bnNldCgkX0VOVlskbmFtZV0pOwp9IGVsc2UgewokX0VOVlskbmFtZV0gPSAkdmFsdWU7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIFBzclxMb2dcTG9nTGV2ZWw7CgoKCgoKY2xhc3MgU3RhdHVzCnsKY29uc3QgRU5WX1JFU1RBUlQgPSAnWERFQlVHX0hBTkRMRVJfUkVTVEFSVCc7CmNvbnN0IENIRUNLID0gJ0NoZWNrJzsKY29uc3QgRVJST1IgPSAnRXJyb3InOwpjb25zdCBJTkZPID0gJ0luZm8nOwpjb25zdCBOT1JFU1RBUlQgPSAnTm9SZXN0YXJ0JzsKY29uc3QgUkVTVEFSVCA9ICdSZXN0YXJ0JzsKY29uc3QgUkVTVEFSVElORyA9ICdSZXN0YXJ0aW5nJzsKY29uc3QgUkVTVEFSVEVEID0gJ1Jlc3RhcnRlZCc7CgoKcHJpdmF0ZSAkZGVidWc7CgoKcHJpdmF0ZSAkZW52QWxsb3dYZGVidWc7CgoKcHJpdmF0ZSAkbG9hZGVkOwoKCnByaXZhdGUgJGxvZ2dlcjsKCgpwcml2YXRlICRtb2RlT2ZmOwoKCnByaXZhdGUgJHRpbWU7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZW52QWxsb3dYZGVidWcsIGJvb2wgJGRlYnVnKQp7CiRzdGFydCA9IGdldGVudihzZWxmOjpFTlZfUkVTVEFSVCk7ClByb2Nlc3M6OnNldEVudihzZWxmOjpFTlZfUkVTVEFSVCk7CiR0aGlzLT50aW1lID0gaXNfbnVtZXJpYygkc3RhcnQpID8gcm91bmQoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgKiAxMDAwKSA6IDA7CgokdGhpcy0+ZW52QWxsb3dYZGVidWcgPSAkZW52QWxsb3dYZGVidWc7CiR0aGlzLT5kZWJ1ZyA9ICRkZWJ1ZyAmJiBkZWZpbmVkKCdTVERFUlInKTsKJHRoaXMtPm1vZGVPZmYgPSBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9nZ2VyKExvZ2dlckludGVyZmFjZSAkbG9nZ2VyKTogdm9pZAp7CiR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXBvcnQoc3RyaW5nICRvcCwgP3N0cmluZyAkZGF0YSk6IHZvaWQKewppZiAoJHRoaXMtPmxvZ2dlciAhPT0gbnVsbCB8fCAkdGhpcy0+ZGVidWcpIHsKJGNhbGxhYmxlID0gWyR0aGlzLCAncmVwb3J0Jy4kb3BdOwoKaWYgKCFpc19jYWxsYWJsZSgkY2FsbGFibGUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbmtub3duIG9wIGhhbmRsZXI6ICcuJG9wKTsKfQoKJHBhcmFtcyA9ICRkYXRhICE9PSBudWxsID8gWyRkYXRhXSA6IFtdOwpjYWxsX3VzZXJfZnVuY19hcnJheSgkY2FsbGFibGUsICRwYXJhbXMpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0KHN0cmluZyAkdGV4dCwgP3N0cmluZyAkbGV2ZWwgPSBudWxsKTogdm9pZAp7CmlmICgkdGhpcy0+bG9nZ2VyICE9PSBudWxsKSB7CiR0aGlzLT5sb2dnZXItPmxvZygkbGV2ZWwgIT09IG51bGwgPyAkbGV2ZWw6IExvZ0xldmVsOjpERUJVRywgJHRleHQpOwp9CgppZiAoJHRoaXMtPmRlYnVnKSB7CmZ3cml0ZShTVERFUlIsIHNwcmludGYoJ3hkZWJ1Zy1oYW5kbGVyWyVkXSAlcycsIGdldG15cGlkKCksICR0ZXh0LlBIUF9FT0wpKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydENoZWNrKHN0cmluZyAkbG9hZGVkKTogdm9pZAp7Cmxpc3QoJHZlcnNpb24sICRtb2RlKSA9IGV4cGxvZGUoJ3wnLCAkbG9hZGVkKTsKCmlmICgkdmVyc2lvbiAhPT0gJycpIHsKJHRoaXMtPmxvYWRlZCA9ICcoJy4kdmVyc2lvbi4nKScuKCRtb2RlICE9PSAnJyA/ICcgeGRlYnVnLm1vZGU9Jy4kbW9kZSA6ICcnKTsKfQokdGhpcy0+bW9kZU9mZiA9ICRtb2RlID09PSAnb2ZmJzsKJHRoaXMtPm91dHB1dCgnQ2hlY2tpbmcgJy4kdGhpcy0+ZW52QWxsb3dYZGVidWcpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydEVycm9yKHN0cmluZyAkZXJyb3IpOiB2b2lkCnsKJHRoaXMtPm91dHB1dChzcHJpbnRmKCdObyByZXN0YXJ0ICglcyknLCAkZXJyb3IpLCBMb2dMZXZlbDo6V0FSTklORyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0SW5mbyhzdHJpbmcgJGluZm8pOiB2b2lkCnsKJHRoaXMtPm91dHB1dCgkaW5mbyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0Tm9SZXN0YXJ0KCk6IHZvaWQKewokdGhpcy0+b3V0cHV0KCR0aGlzLT5nZXRMb2FkZWRNZXNzYWdlKCkpOwoKaWYgKCR0aGlzLT5sb2FkZWQgIT09IG51bGwpIHsKJHRleHQgPSBzcHJpbnRmKCdObyByZXN0YXJ0ICglcyknLCAkdGhpcy0+Z2V0RW52QWxsb3coKSk7CmlmICghKChib29sKSBnZXRlbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnKSkpIHsKJHRleHQgLj0gJyBBbGxvd2VkIGJ5ICcuKCR0aGlzLT5tb2RlT2ZmID8gJ3hkZWJ1Zy5tb2RlJyA6ICdhcHBsaWNhdGlvbicpOwp9CiR0aGlzLT5vdXRwdXQoJHRleHQpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0UmVzdGFydCgpOiB2b2lkCnsKJHRoaXMtPm91dHB1dCgkdGhpcy0+Z2V0TG9hZGVkTWVzc2FnZSgpKTsKUHJvY2Vzczo6c2V0RW52KHNlbGY6OkVOVl9SRVNUQVJULCAoc3RyaW5nKSBtaWNyb3RpbWUodHJ1ZSkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydFJlc3RhcnRlZCgpOiB2b2lkCnsKJGxvYWRlZCA9ICR0aGlzLT5nZXRMb2FkZWRNZXNzYWdlKCk7CiR0ZXh0ID0gc3ByaW50ZignUmVzdGFydGVkICglZCBtcykuICVzJywgJHRoaXMtPnRpbWUsICRsb2FkZWQpOwokbGV2ZWwgPSAkdGhpcy0+bG9hZGVkICE9PSBudWxsID8gTG9nTGV2ZWw6OldBUk5JTkcgOiBudWxsOwokdGhpcy0+b3V0cHV0KCR0ZXh0LCAkbGV2ZWwpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydFJlc3RhcnRpbmcoc3RyaW5nICRjb21tYW5kKTogdm9pZAp7CiR0ZXh0ID0gc3ByaW50ZignUHJvY2VzcyByZXN0YXJ0aW5nICglcyknLCAkdGhpcy0+Z2V0RW52QWxsb3coKSk7CiR0aGlzLT5vdXRwdXQoJHRleHQpOwokdGV4dCA9ICdSdW5uaW5nICcuJGNvbW1hbmQ7CiR0aGlzLT5vdXRwdXQoJHRleHQpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEVudkFsbG93KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZW52QWxsb3dYZGVidWcuJz0nLmdldGVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldExvYWRlZE1lc3NhZ2UoKTogc3RyaW5nCnsKJGxvYWRlZCA9ICR0aGlzLT5sb2FkZWQgIT09IG51bGwgPyBzcHJpbnRmKCdsb2FkZWQgJXMnLCAkdGhpcy0+bG9hZGVkKSA6ICdub3QgbG9hZGVkJzsKcmV0dXJuICdUaGUgWGRlYnVnIGV4dGVuc2lvbiBpcyAnLiRsb2FkZWQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKCgoKCgoKY2xhc3MgWGRlYnVnSGFuZGxlcgp7CmNvbnN0IFNVRkZJWF9BTExPVyA9ICdfQUxMT1dfWERFQlVHJzsKY29uc3QgU1VGRklYX0lOSVMgPSAnX09SSUdJTkFMX0lOSVMnOwpjb25zdCBSRVNUQVJUX0lEID0gJ2ludGVybmFsJzsKY29uc3QgUkVTVEFSVF9TRVRUSU5HUyA9ICdYREVCVUdfSEFORExFUl9TRVRUSU5HUyc7CmNvbnN0IERFQlVHID0gJ1hERUJVR19IQU5ETEVSX0RFQlVHJzsKCgpwcm90ZWN0ZWQgJHRtcEluaTsKCgpwcml2YXRlIHN0YXRpYyAkaW5SZXN0YXJ0OwoKCnByaXZhdGUgc3RhdGljICRuYW1lOwoKCnByaXZhdGUgc3RhdGljICRza2lwcGVkOwoKCnByaXZhdGUgc3RhdGljICR4ZGVidWdBY3RpdmU7CgoKcHJpdmF0ZSBzdGF0aWMgJHhkZWJ1Z01vZGU7CgoKcHJpdmF0ZSBzdGF0aWMgJHhkZWJ1Z1ZlcnNpb247CgoKcHJpdmF0ZSAkY2xpOwoKCnByaXZhdGUgJGRlYnVnOwoKCnByaXZhdGUgJGVudkFsbG93WGRlYnVnOwoKCnByaXZhdGUgJGVudk9yaWdpbmFsSW5pczsKCgpwcml2YXRlICRwZXJzaXN0ZW50OwoKCnByaXZhdGUgJHNjcmlwdDsKCgpwcml2YXRlICRzdGF0dXNXcml0ZXI7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZW52UHJlZml4KQp7CmlmICgkZW52UHJlZml4ID09PSAnJykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgY29uc3RydWN0b3IgcGFyYW1ldGVyJyk7Cn0KCnNlbGY6OiRuYW1lID0gc3RydG91cHBlcigkZW52UHJlZml4KTsKJHRoaXMtPmVudkFsbG93WGRlYnVnID0gc2VsZjo6JG5hbWUuc2VsZjo6U1VGRklYX0FMTE9XOwokdGhpcy0+ZW52T3JpZ2luYWxJbmlzID0gc2VsZjo6JG5hbWUuc2VsZjo6U1VGRklYX0lOSVM7CgpzZWxmOjpzZXRYZGVidWdEZXRhaWxzKCk7CnNlbGY6OiRpblJlc3RhcnQgPSBmYWxzZTsKCmlmICgkdGhpcy0+Y2xpID0gUEhQX1NBUEkgPT09ICdjbGknKSB7CiR0aGlzLT5kZWJ1ZyA9IChzdHJpbmcpIGdldGVudihzZWxmOjpERUJVRyk7Cn0KCiR0aGlzLT5zdGF0dXNXcml0ZXIgPSBuZXcgU3RhdHVzKCR0aGlzLT5lbnZBbGxvd1hkZWJ1ZywgKGJvb2wpICR0aGlzLT5kZWJ1Zyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpOiBzZWxmCnsKJHRoaXMtPnN0YXR1c1dyaXRlci0+c2V0TG9nZ2VyKCRsb2dnZXIpOwpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNYWluU2NyaXB0KHN0cmluZyAkc2NyaXB0KTogc2VsZgp7CiR0aGlzLT5zY3JpcHQgPSAkc2NyaXB0OwpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQZXJzaXN0ZW50KCk6IHNlbGYKewokdGhpcy0+cGVyc2lzdGVudCA9IHRydWU7CnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygpOiB2b2lkCnsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkNIRUNLLCBzZWxmOjokeGRlYnVnVmVyc2lvbi4nfCcuc2VsZjo6JHhkZWJ1Z01vZGUpOwokZW52QXJncyA9IGV4cGxvZGUoJ3wnLCAoc3RyaW5nKSBnZXRlbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnKSk7CgppZiAoISgoYm9vbCkgJGVudkFyZ3NbMF0pICYmICR0aGlzLT5yZXF1aXJlc1Jlc3RhcnQoc2VsZjo6JHhkZWJ1Z0FjdGl2ZSkpIHsKCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpSRVNUQVJUKTsKCmlmICgkdGhpcy0+cHJlcGFyZVJlc3RhcnQoKSkgewokY29tbWFuZCA9ICR0aGlzLT5nZXRDb21tYW5kKCk7CiR0aGlzLT5yZXN0YXJ0KCRjb21tYW5kKTsKfQpyZXR1cm47Cn0KCmlmIChzZWxmOjpSRVNUQVJUX0lEID09PSAkZW52QXJnc1swXSAmJiBjb3VudCgkZW52QXJncykgPT09IDUpIHsKCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpSRVNUQVJURUQpOwoKUHJvY2Vzczo6c2V0RW52KCR0aGlzLT5lbnZBbGxvd1hkZWJ1Zyk7CnNlbGY6OiRpblJlc3RhcnQgPSB0cnVlOwoKaWYgKHNlbGY6OiR4ZGVidWdWZXJzaW9uID09PSBudWxsKSB7CgpzZWxmOjokc2tpcHBlZCA9ICRlbnZBcmdzWzFdOwp9CgokdGhpcy0+dHJ5RW5hYmxlU2lnbmFscygpOwoKCiR0aGlzLT5zZXRFbnZSZXN0YXJ0U2V0dGluZ3MoJGVudkFyZ3MpOwpyZXR1cm47Cn0KCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpOT1JFU1RBUlQpOwokc2V0dGluZ3MgPSBzZWxmOjpnZXRSZXN0YXJ0U2V0dGluZ3MoKTsKCmlmICgkc2V0dGluZ3MgIT09IG51bGwpIHsKCiR0aGlzLT5zeW5jU2V0dGluZ3MoJHNldHRpbmdzKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsSW5pRmlsZXMoKTogYXJyYXkKewppZiAoc2VsZjo6JG5hbWUgIT09IG51bGwpIHsKJGVudiA9IGdldGVudihzZWxmOjokbmFtZS5zZWxmOjpTVUZGSVhfSU5JUyk7CgppZiAoZmFsc2UgIT09ICRlbnYpIHsKcmV0dXJuIGV4cGxvZGUoUEFUSF9TRVBBUkFUT1IsICRlbnYpOwp9Cn0KCiRwYXRocyA9IFsoc3RyaW5nKSBwaHBfaW5pX2xvYWRlZF9maWxlKCldOwokc2Nhbm5lZCA9IHBocF9pbmlfc2Nhbm5lZF9maWxlcygpOwoKaWYgKCRzY2FubmVkICE9PSBmYWxzZSkgewokcGF0aHMgPSBhcnJheV9tZXJnZSgkcGF0aHMsIGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJywnLCAkc2Nhbm5lZCkpKTsKfQoKcmV0dXJuICRwYXRoczsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlc3RhcnRTZXR0aW5ncygpOiA/YXJyYXkKewokZW52QXJncyA9IGV4cGxvZGUoJ3wnLCAoc3RyaW5nKSBnZXRlbnYoc2VsZjo6UkVTVEFSVF9TRVRUSU5HUykpOwoKaWYgKGNvdW50KCRlbnZBcmdzKSAhPT0gNgp8fCAoIXNlbGY6OiRpblJlc3RhcnQgJiYgcGhwX2luaV9sb2FkZWRfZmlsZSgpICE9PSAkZW52QXJnc1swXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBbCid0bXBJbmknID0+ICRlbnZBcmdzWzBdLAonc2Nhbm5lZEluaXMnID0+IChib29sKSAkZW52QXJnc1sxXSwKJ3NjYW5EaXInID0+ICcqJyA9PT0gJGVudkFyZ3NbMl0gPyBmYWxzZSA6ICRlbnZBcmdzWzJdLAoncGhwcmMnID0+ICcqJyA9PT0gJGVudkFyZ3NbM10gPyBmYWxzZSA6ICRlbnZBcmdzWzNdLAonaW5pcycgPT4gZXhwbG9kZShQQVRIX1NFUEFSQVRPUiwgJGVudkFyZ3NbNF0pLAonc2tpcHBlZCcgPT4gJGVudkFyZ3NbNV0sCl07Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U2tpcHBlZFZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuIChzdHJpbmcpIHNlbGY6OiRza2lwcGVkOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzWGRlYnVnQWN0aXZlKCk6IGJvb2wKewpzZWxmOjpzZXRYZGVidWdEZXRhaWxzKCk7CnJldHVybiBzZWxmOjokeGRlYnVnQWN0aXZlOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXF1aXJlc1Jlc3RhcnQoYm9vbCAkZGVmYXVsdCk6IGJvb2wKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlc3RhcnQoYXJyYXkgJGNvbW1hbmQpOiB2b2lkCnsKJHRoaXMtPmRvUmVzdGFydCgkY29tbWFuZCk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9SZXN0YXJ0KGFycmF5ICRjb21tYW5kKTogdm9pZAp7CiR0aGlzLT50cnlFbmFibGVTaWduYWxzKCk7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpSRVNUQVJUSU5HLCBpbXBsb2RlKCcgJywgJGNvbW1hbmQpKTsKCmlmIChQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCkgewokY21kID0gJGNvbW1hbmQ7Cn0gZWxzZSB7CiRjbWQgPSBQcm9jZXNzOjplc2NhcGVTaGVsbENvbW1hbmQoJGNvbW1hbmQpOwppZiAoZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CgokY21kID0gJyInLiRjbWQuJyInOwp9Cn0KCiRwcm9jZXNzID0gcHJvY19vcGVuKCRjbWQsIFtdLCAkcGlwZXMpOwppZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7CiRleGl0Q29kZSA9IHByb2NfY2xvc2UoJHByb2Nlc3MpOwp9CgppZiAoIWlzc2V0KCRleGl0Q29kZSkpIHsKCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJ1VuYWJsZSB0byByZXN0YXJ0IHByb2Nlc3MnKTsKJGV4aXRDb2RlID0gLTE7Cn0gZWxzZSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpJTkZPLCAnUmVzdGFydGVkIHByb2Nlc3MgZXhpdGVkICcuJGV4aXRDb2RlKTsKfQoKaWYgKCR0aGlzLT5kZWJ1ZyA9PT0gJzInKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpJTkZPLCAnVGVtcCBpbmkgc2F2ZWQ6ICcuJHRoaXMtPnRtcEluaSk7Cn0gZWxzZSB7CkB1bmxpbmsoKHN0cmluZykgJHRoaXMtPnRtcEluaSk7Cn0KCmV4aXQoJGV4aXRDb2RlKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmVSZXN0YXJ0KCk6IGJvb2wKewokZXJyb3IgPSBudWxsOwokaW5pRmlsZXMgPSBzZWxmOjpnZXRBbGxJbmlGaWxlcygpOwokc2Nhbm5lZEluaXMgPSBjb3VudCgkaW5pRmlsZXMpID4gMTsKJHRtcERpciA9IHN5c19nZXRfdGVtcF9kaXIoKTsKCmlmICghJHRoaXMtPmNsaSkgewokZXJyb3IgPSAnVW5zdXBwb3J0ZWQgU0FQSTogJy5QSFBfU0FQSTsKfSBlbHNlaWYgKCEkdGhpcy0+Y2hlY2tDb25maWd1cmF0aW9uKCRpbmZvKSkgewokZXJyb3IgPSAkaW5mbzsKfSBlbHNlaWYgKCEkdGhpcy0+Y2hlY2tNYWluU2NyaXB0KCkpIHsKJGVycm9yID0gJ1VuYWJsZSB0byBhY2Nlc3MgbWFpbiBzY3JpcHQ6ICcuJHRoaXMtPnNjcmlwdDsKfSBlbHNlaWYgKCEkdGhpcy0+d3JpdGVUbXBJbmkoJGluaUZpbGVzLCAkdG1wRGlyLCAkZXJyb3IpKSB7CiRlcnJvciA9ICRlcnJvciAhPT0gbnVsbCA/ICRlcnJvciA6ICdVbmFibGUgdG8gY3JlYXRlIHRlbXAgaW5pIGZpbGUgYXQ6ICcuJHRtcERpcjsKfSBlbHNlaWYgKCEkdGhpcy0+c2V0RW52aXJvbm1lbnQoJHNjYW5uZWRJbmlzLCAkaW5pRmlsZXMpKSB7CiRlcnJvciA9ICdVbmFibGUgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyc7Cn0KCmlmICgkZXJyb3IgIT09IG51bGwpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAkZXJyb3IpOwp9CgpyZXR1cm4gJGVycm9yID09PSBudWxsOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVUbXBJbmkoYXJyYXkgJGluaUZpbGVzLCBzdHJpbmcgJHRtcERpciwgP3N0cmluZyAmJGVycm9yKTogYm9vbAp7CmlmICgoJHRtcGZpbGUgPSBAdGVtcG5hbSgkdG1wRGlyLCAnJykpID09PSBmYWxzZSkgewpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT50bXBJbmkgPSAkdG1wZmlsZTsKCgppZiAoJGluaUZpbGVzWzBdID09PSAnJykgewphcnJheV9zaGlmdCgkaW5pRmlsZXMpOwp9CgokY29udGVudCA9ICcnOwokc2VjdGlvblJlZ2V4ID0gJy9eXHMqXFsoPzpQQVRIfEhPU1QpXHMqPS9taSc7CiR4ZGVidWdSZWdleCA9ICcvXlxzKih6ZW5kX2V4dGVuc2lvblxzKj0uKnhkZWJ1Zy4qKSQvbWknOwoKZm9yZWFjaCAoJGluaUZpbGVzIGFzICRmaWxlKSB7CgppZiAoKCRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSkgPT09IGZhbHNlKSB7CiRlcnJvciA9ICdVbmFibGUgdG8gcmVhZCBpbmk6ICcuJGZpbGU7CnJldHVybiBmYWxzZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hXaXRoT2Zmc2V0cygkc2VjdGlvblJlZ2V4LCAkZGF0YSwgJG1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpKSB7CiRkYXRhID0gc3Vic3RyKCRkYXRhLCAwLCAkbWF0Y2hlc1swXVsxXSk7Cn0KJGNvbnRlbnQgLj0gUHJlZzo6cmVwbGFjZSgkeGRlYnVnUmVnZXgsICc7JDEnLCAkZGF0YSkuUEhQX0VPTDsKfQoKCiRjb25maWcgPSBwYXJzZV9pbmlfc3RyaW5nKCRjb250ZW50KTsKJGxvYWRlZCA9IGluaV9nZXRfYWxsKG51bGwsIGZhbHNlKTsKCmlmIChmYWxzZSA9PT0gJGNvbmZpZyB8fCBmYWxzZSA9PT0gJGxvYWRlZCkgewokZXJyb3IgPSAnVW5hYmxlIHRvIHBhcnNlIGluaSBkYXRhJzsKcmV0dXJuIGZhbHNlOwp9CgokY29udGVudCAuPSAkdGhpcy0+bWVyZ2VMb2FkZWRDb25maWcoJGxvYWRlZCwgJGNvbmZpZyk7CgoKJGNvbnRlbnQgLj0gJ29wY2FjaGUuZW5hYmxlX2NsaT0wJy5QSFBfRU9MOwoKcmV0dXJuIChib29sKSBAZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPnRtcEluaSwgJGNvbnRlbnQpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpOiBhcnJheQp7CiRwaHAgPSBbUEhQX0JJTkFSWV07CiRhcmdzID0gYXJyYXlfc2xpY2UoJF9TRVJWRVJbJ2FyZ3YnXSwgMSk7CgppZiAoISR0aGlzLT5wZXJzaXN0ZW50KSB7CgphcnJheV9wdXNoKCRwaHAsICctbicsICctYycsICR0aGlzLT50bXBJbmkpOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJHBocCwgWyR0aGlzLT5zY3JpcHRdLCAkYXJncyk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldEVudmlyb25tZW50KGJvb2wgJHNjYW5uZWRJbmlzLCBhcnJheSAkaW5pRmlsZXMpOiBib29sCnsKJHNjYW5EaXIgPSBnZXRlbnYoJ1BIUF9JTklfU0NBTl9ESVInKTsKJHBocHJjID0gZ2V0ZW52KCdQSFBSQycpOwoKCmlmICghcHV0ZW52KCR0aGlzLT5lbnZPcmlnaW5hbEluaXMuJz0nLmltcGxvZGUoUEFUSF9TRVBBUkFUT1IsICRpbmlGaWxlcykpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5wZXJzaXN0ZW50KSB7CgppZiAoIXB1dGVudignUEhQX0lOSV9TQ0FOX0RJUj0nKSB8fCAhcHV0ZW52KCdQSFBSQz0nLiR0aGlzLT50bXBJbmkpKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKJGVudkFyZ3MgPSBbCnNlbGY6OlJFU1RBUlRfSUQsCnNlbGY6OiR4ZGVidWdWZXJzaW9uLAooaW50KSAkc2Nhbm5lZEluaXMsCmZhbHNlID09PSAkc2NhbkRpciA/ICcqJyA6ICRzY2FuRGlyLApmYWxzZSA9PT0gJHBocHJjID8gJyonIDogJHBocHJjLApdOwoKcmV0dXJuIHB1dGVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcuJz0nLmltcGxvZGUoJ3wnLCAkZW52QXJncykpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vdGlmeShzdHJpbmcgJG9wLCA/c3RyaW5nICRkYXRhID0gbnVsbCk6IHZvaWQKewokdGhpcy0+c3RhdHVzV3JpdGVyLT5yZXBvcnQoJG9wLCAkZGF0YSk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1lcmdlTG9hZGVkQ29uZmlnKGFycmF5ICRsb2FkZWRDb25maWcsIGFycmF5ICRpbmlDb25maWcpOiBzdHJpbmcKewokY29udGVudCA9ICcnOwoKZm9yZWFjaCAoJGxvYWRlZENvbmZpZyBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKCmlmICghaXNfc3RyaW5nKCR2YWx1ZSkKfHwgc3RycG9zKCRuYW1lLCAneGRlYnVnJykgPT09IDAKfHwgJG5hbWUgPT09ICdhcGMubW1hcF9maWxlX21hc2snKSB7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCRpbmlDb25maWdbJG5hbWVdKSB8fCAkaW5pQ29uZmlnWyRuYW1lXSAhPT0gJHZhbHVlKSB7CgokY29udGVudCAuPSAkbmFtZS4nPSInLmFkZGNzbGFzaGVzKCR2YWx1ZSwgJ1xcIicpLiciJy5QSFBfRU9MOwp9Cn0KCnJldHVybiAkY29udGVudDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja01haW5TY3JpcHQoKTogYm9vbAp7CmlmICgkdGhpcy0+c2NyaXB0ICE9PSBudWxsKSB7CgpyZXR1cm4gZmlsZV9leGlzdHMoJHRoaXMtPnNjcmlwdCkgfHwgJy0tJyA9PT0gJHRoaXMtPnNjcmlwdDsKfQoKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5zY3JpcHQgPSAkX1NFUlZFUlsnYXJndiddWzBdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiR0cmFjZSA9IGRlYnVnX2JhY2t0cmFjZShERUJVR19CQUNLVFJBQ0VfSUdOT1JFX0FSR1MpOwokbWFpbiA9IGVuZCgkdHJhY2UpOwoKaWYgKCRtYWluICE9PSBmYWxzZSAmJiBpc3NldCgkbWFpblsnZmlsZSddKSkgewpyZXR1cm4gZmlsZV9leGlzdHMoJHRoaXMtPnNjcmlwdCA9ICRtYWluWydmaWxlJ10pOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRFbnZSZXN0YXJ0U2V0dGluZ3MoYXJyYXkgJGVudkFyZ3MpOiB2b2lkCnsKJHNldHRpbmdzID0gWwpwaHBfaW5pX2xvYWRlZF9maWxlKCksCiRlbnZBcmdzWzJdLAokZW52QXJnc1szXSwKJGVudkFyZ3NbNF0sCmdldGVudigkdGhpcy0+ZW52T3JpZ2luYWxJbmlzKSwKc2VsZjo6JHNraXBwZWQsCl07CgpQcm9jZXNzOjpzZXRFbnYoc2VsZjo6UkVTVEFSVF9TRVRUSU5HUywgaW1wbG9kZSgnfCcsICRzZXR0aW5ncykpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc3luY1NldHRpbmdzKGFycmF5ICRzZXR0aW5ncyk6IHZvaWQKewppZiAoZmFsc2UgPT09IGdldGVudigkdGhpcy0+ZW52T3JpZ2luYWxJbmlzKSkgewoKUHJvY2Vzczo6c2V0RW52KCR0aGlzLT5lbnZPcmlnaW5hbEluaXMsIGltcGxvZGUoUEFUSF9TRVBBUkFUT1IsICRzZXR0aW5nc1snaW5pcyddKSk7Cn0KCnNlbGY6OiRza2lwcGVkID0gJHNldHRpbmdzWydza2lwcGVkJ107CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpJTkZPLCAnUHJvY2VzcyBjYWxsZWQgd2l0aCBleGlzdGluZyByZXN0YXJ0IHNldHRpbmdzJyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb25maWd1cmF0aW9uKD9zdHJpbmcgJiRpbmZvKTogYm9vbAp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewokaW5mbyA9ICdwcm9jX29wZW4gZnVuY3Rpb24gaXMgZGlzYWJsZWQnOwpyZXR1cm4gZmFsc2U7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCd1b3B6JykgJiYgISgoYm9vbCkgaW5pX2dldCgndW9wei5kaXNhYmxlJykpKSB7CgppZiAoZnVuY3Rpb25fZXhpc3RzKCd1b3B6X2FsbG93X2V4aXQnKSkgewpAdW9wel9hbGxvd19leGl0KHRydWUpOwp9IGVsc2UgewokaW5mbyA9ICd1b3B6IGV4dGVuc2lvbiBpcyBub3QgY29tcGF0aWJsZSc7CnJldHVybiBmYWxzZTsKfQp9CgoKaWYgKGRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKSAmJiBQSFBfVkVSU0lPTl9JRCA8IDcwNDAwKSB7CiR3b3JraW5nRGlyID0gZ2V0Y3dkKCk7CgppZiAoJHdvcmtpbmdEaXIgPT09IGZhbHNlKSB7CiRpbmZvID0gJ3VuYWJsZSB0byBkZXRlcm1pbmUgd29ya2luZyBkaXJlY3RvcnknOwpyZXR1cm4gZmFsc2U7Cn0KCmlmICgwID09PSBzdHJwb3MoJHdvcmtpbmdEaXIsICdcXFxcJykpIHsKJGluZm8gPSAnY21kLmV4ZSBkb2VzIG5vdCBzdXBwb3J0IFVOQyBwYXRoczogJy4kd29ya2luZ0RpcjsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdHJ5RW5hYmxlU2lnbmFscygpOiB2b2lkCnsKaWYgKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfYXN5bmNfc2lnbmFscycpICYmIGZ1bmN0aW9uX2V4aXN0cygncGNudGxfc2lnbmFsJykpIHsKcGNudGxfYXN5bmNfc2lnbmFscyh0cnVlKTsKJG1lc3NhZ2UgPSAnQXN5bmMgc2lnbmFscyBlbmFibGVkJzsKCmlmICghc2VsZjo6JGluUmVzdGFydCkgewoKcGNudGxfc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Cn0gZWxzZWlmIChpc19pbnQocGNudGxfc2lnbmFsX2dldF9oYW5kbGVyKFNJR0lOVCkpKSB7CgpwY250bF9zaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKfQp9CgppZiAoIXNlbGY6OiRpblJlc3RhcnQgJiYgZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcicpKSB7CgoKCnNhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyKGZ1bmN0aW9uICgkZXZ0KSB7fSk7Cn0KfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2V0WGRlYnVnRGV0YWlscygpOiB2b2lkCnsKaWYgKHNlbGY6OiR4ZGVidWdBY3RpdmUgIT09IG51bGwpIHsKcmV0dXJuOwp9CgpzZWxmOjokeGRlYnVnQWN0aXZlID0gZmFsc2U7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgneGRlYnVnJykpIHsKcmV0dXJuOwp9CgokdmVyc2lvbiA9IHBocHZlcnNpb24oJ3hkZWJ1ZycpOwpzZWxmOjokeGRlYnVnVmVyc2lvbiA9ICR2ZXJzaW9uICE9PSBmYWxzZSA/ICR2ZXJzaW9uIDogJ3Vua25vd24nOwoKaWYgKHZlcnNpb25fY29tcGFyZShzZWxmOjokeGRlYnVnVmVyc2lvbiwgJzMuMScsICc+PScpKSB7CiRtb2RlcyA9IHhkZWJ1Z19pbmZvKCdtb2RlJyk7CnNlbGY6OiR4ZGVidWdNb2RlID0gY291bnQoJG1vZGVzKSA9PT0gMCA/ICdvZmYnIDogaW1wbG9kZSgnLCcsICRtb2Rlcyk7CnNlbGY6OiR4ZGVidWdBY3RpdmUgPSBzZWxmOjokeGRlYnVnTW9kZSAhPT0gJ29mZic7CnJldHVybjsKfQoKCiRpbmlNb2RlID0gaW5pX2dldCgneGRlYnVnLm1vZGUnKTsKaWYgKCRpbmlNb2RlID09PSBmYWxzZSkgewpzZWxmOjokeGRlYnVnQWN0aXZlID0gdHJ1ZTsKcmV0dXJuOwp9CgoKJGVudk1vZGUgPSAoc3RyaW5nKSBnZXRlbnYoJ1hERUJVR19NT0RFJyk7CmlmICgkZW52TW9kZSAhPT0gJycpIHsKc2VsZjo6JHhkZWJ1Z01vZGUgPSAkZW52TW9kZTsKfSBlbHNlIHsKc2VsZjo6JHhkZWJ1Z01vZGUgPSAkaW5pTW9kZSAhPT0gJycgPyAkaW5pTW9kZSA6ICdvZmYnOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eLCskLycsIHN0cl9yZXBsYWNlKCcgJywgJycsIHNlbGY6OiR4ZGVidWdNb2RlKSkpIHsKc2VsZjo6JHhkZWJ1Z01vZGUgPSAnb2ZmJzsKfQoKc2VsZjo6JHhkZWJ1Z0FjdGl2ZSA9IHNlbGY6OiR4ZGVidWdNb2RlICE9PSAnb2ZmJzsKfQp9CgpNSVQgTGljZW5zZQoKQ29weXJpZ2h0IChjKSAyMDE2CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgpjbGFzcyBCYXNlQ29uc3RyYWludAp7CgoKCnByb3RlY3RlZCAkZXJyb3JzID0gYXJyYXkoKTsKCgoKCnByb3RlY3RlZCAkZXJyb3JNYXNrID0gVmFsaWRhdG9yOjpFUlJPUl9OT05FOwoKCgoKcHJvdGVjdGVkICRmYWN0b3J5OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9yKEpzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJG1lc3NhZ2UsICRjb25zdHJhaW50ID0gJycsIGFycmF5ICRtb3JlID0gbnVsbCkKewokZXJyb3IgPSBhcnJheSgKJ3Byb3BlcnR5JyA9PiAkdGhpcy0+Y29udmVydEpzb25Qb2ludGVySW50b1Byb3BlcnR5UGF0aCgkcGF0aCA/OiBuZXcgSnNvblBvaW50ZXIoJycpKSwKJ3BvaW50ZXInID0+IGx0cmltKHN0cnZhbCgkcGF0aCA/OiBuZXcgSnNvblBvaW50ZXIoJycpKSwgJyMnKSwKJ21lc3NhZ2UnID0+ICRtZXNzYWdlLAonY29uc3RyYWludCcgPT4gJGNvbnN0cmFpbnQsCidjb250ZXh0JyA9PiAkdGhpcy0+ZmFjdG9yeS0+Z2V0RXJyb3JDb250ZXh0KCksCik7CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhDb25zdHJhaW50OjpDSEVDS19NT0RFX0VYQ0VQVElPTlMpKSB7CnRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKHNwcmludGYoJ0Vycm9yIHZhbGlkYXRpbmcgJXM6ICVzJywgJGVycm9yWydwb2ludGVyJ10sICRlcnJvclsnbWVzc2FnZSddKSk7Cn0KCmlmIChpc19hcnJheSgkbW9yZSkgJiYgY291bnQoJG1vcmUpID4gMCkgewokZXJyb3IgKz0gJG1vcmU7Cn0KCiR0aGlzLT5lcnJvcnNbXSA9ICRlcnJvcjsKJHRoaXMtPmVycm9yTWFzayB8PSAkZXJyb3JbJ2NvbnRleHQnXTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9ycyhhcnJheSAkZXJyb3JzKQp7CmlmICgkZXJyb3JzKSB7CiR0aGlzLT5lcnJvcnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZXJyb3JzLCAkZXJyb3JzKTsKJGVycm9yTWFzayA9ICYkdGhpcy0+ZXJyb3JNYXNrOwphcnJheV93YWxrKCRlcnJvcnMsIGZ1bmN0aW9uICgkZXJyb3IpIHVzZSAoJiRlcnJvck1hc2spIHsKaWYgKGlzc2V0KCRlcnJvclsnY29udGV4dCddKSkgewokZXJyb3JNYXNrIHw9ICRlcnJvclsnY29udGV4dCddOwp9Cn0pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoJGVycm9yQ29udGV4dCA9IFZhbGlkYXRvcjo6RVJST1JfQUxMKQp7CmlmICgkZXJyb3JDb250ZXh0ID09PSBWYWxpZGF0b3I6OkVSUk9SX0FMTCkgewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQoKcmV0dXJuIGFycmF5X2ZpbHRlcigkdGhpcy0+ZXJyb3JzLCBmdW5jdGlvbiAoJGVycm9yKSB1c2UgKCRlcnJvckNvbnRleHQpIHsKaWYgKCRlcnJvckNvbnRleHQgJiAkZXJyb3JbJ2NvbnRleHQnXSkgewpyZXR1cm4gdHJ1ZTsKfQp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIG51bUVycm9ycygkZXJyb3JDb250ZXh0ID0gVmFsaWRhdG9yOjpFUlJPUl9BTEwpCnsKaWYgKCRlcnJvckNvbnRleHQgPT09IFZhbGlkYXRvcjo6RVJST1JfQUxMKSB7CnJldHVybiBjb3VudCgkdGhpcy0+ZXJyb3JzKTsKfQoKcmV0dXJuIGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoJGVycm9yQ29udGV4dCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgpCnsKcmV0dXJuICEkdGhpcy0+Z2V0RXJyb3JzKCk7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7CiR0aGlzLT5lcnJvcnMgPSBhcnJheSgpOwokdGhpcy0+ZXJyb3JNYXNrID0gVmFsaWRhdG9yOjpFUlJPUl9OT05FOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck1hc2soKQp7CnJldHVybiAkdGhpcy0+ZXJyb3JNYXNrOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhcnJheVRvT2JqZWN0UmVjdXJzaXZlKCRhcnJheSkKewokanNvbiA9IGpzb25fZW5jb2RlKCRhcnJheSk7CmlmIChqc29uX2xhc3RfZXJyb3IoKSAhPT0gXEpTT05fRVJST1JfTk9ORSkgewokbWVzc2FnZSA9ICdVbmFibGUgdG8gZW5jb2RlIHNjaGVtYSBhcnJheSBhcyBKU09OJzsKaWYgKGZ1bmN0aW9uX2V4aXN0cygnanNvbl9sYXN0X2Vycm9yX21zZycpKSB7CiRtZXNzYWdlIC49ICc6ICcgLiBqc29uX2xhc3RfZXJyb3JfbXNnKCk7Cn0KdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KCnJldHVybiAob2JqZWN0KSBqc29uX2RlY29kZSgkanNvbik7Cn0KfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKY2xhc3MgQ29sbGVjdGlvbkNvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewoKaWYgKGlzc2V0KCRzY2hlbWEtPm1pbkl0ZW1zKSAmJiBjb3VudCgkdmFsdWUpIDwgJHNjaGVtYS0+bWluSXRlbXMpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnVGhlcmUgbXVzdCBiZSBhIG1pbmltdW0gb2YgJyAuICRzY2hlbWEtPm1pbkl0ZW1zIC4gJyBpdGVtcyBpbiB0aGUgYXJyYXknLCAnbWluSXRlbXMnLCBhcnJheSgnbWluSXRlbXMnID0+ICRzY2hlbWEtPm1pbkl0ZW1zKSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bWF4SXRlbXMpICYmIGNvdW50KCR2YWx1ZSkgPiAkc2NoZW1hLT5tYXhJdGVtcykgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdUaGVyZSBtdXN0IGJlIGEgbWF4aW11bSBvZiAnIC4gJHNjaGVtYS0+bWF4SXRlbXMgLiAnIGl0ZW1zIGluIHRoZSBhcnJheScsICdtYXhJdGVtcycsIGFycmF5KCdtYXhJdGVtcycgPT4gJHNjaGVtYS0+bWF4SXRlbXMpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT51bmlxdWVJdGVtcykgJiYgJHNjaGVtYS0+dW5pcXVlSXRlbXMpIHsKJHVuaXF1ZSA9ICR2YWx1ZTsKaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgY291bnQoJHZhbHVlKSkgewokdW5pcXVlID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkZSkgewpyZXR1cm4gdmFyX2V4cG9ydCgkZSwgdHJ1ZSk7Cn0sICR2YWx1ZSk7Cn0KaWYgKGNvdW50KGFycmF5X3VuaXF1ZSgkdW5pcXVlKSkgIT0gY291bnQoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdUaGVyZSBhcmUgbm8gZHVwbGljYXRlcyBhbGxvd2VkIGluIHRoZSBhcnJheScsICd1bmlxdWVJdGVtcycpOwp9Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+aXRlbXMpKSB7CiR0aGlzLT52YWxpZGF0ZUl0ZW1zKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewppZiAoaXNfb2JqZWN0KCRzY2hlbWEtPml0ZW1zKSkgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKCgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHYsICRzY2hlbWEtPml0ZW1zLCAkcGF0aCwgJGspOwoKCmlmIChjb3VudCgkaW5pdEVycm9ycykgPCBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpICYmIChpc3NldCgkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMpICYmICRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpKSB7CiRzZWNvbmRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zLCAkcGF0aCwgJGspOwp9CgoKaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpIDwgY291bnQoJHRoaXMtPmdldEVycm9ycygpKSkgewokdGhpcy0+ZXJyb3JzID0gJHNlY29uZEVycm9yczsKfSBlbHNlaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpID09PSBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpKSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CnVuc2V0KCR2KTsgCgp9IGVsc2UgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewppZiAoYXJyYXlfa2V5X2V4aXN0cygkaywgJHNjaGVtYS0+aXRlbXMpKSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9IGVsc2UgewoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnYWRkaXRpb25hbEl0ZW1zJykpIHsKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMsICRwYXRoLCAkayk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcigKJHBhdGgsICdUaGUgaXRlbSAnIC4gJGkgLiAnWycgLiAkayAuICddIGlzIG5vdCBkZWZpbmVkIGFuZCB0aGUgZGVmaW5pdGlvbiBkb2VzIG5vdCBhbGxvdyBhZGRpdGlvbmFsIGl0ZW1zJywgJ2FkZGl0aW9uYWxJdGVtcycsIGFycmF5KCdhZGRpdGlvbmFsSXRlbXMnID0+ICRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcykpOwp9Cn0gZWxzZSB7CgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHYsIG5ldyBcc3RkQ2xhc3MoKSwgJHBhdGgsICRrKTsKfQp9Cn0KdW5zZXQoJHYpOyAKCgoKaWYgKGNvdW50KCR2YWx1ZSkgPiAwKSB7CmZvciAoJGsgPSBjb3VudCgkdmFsdWUpOyAkayA8IGNvdW50KCRzY2hlbWEtPml0ZW1zKTsgJGsrKykgewokdW5kZWZpbmVkSW5zdGFuY2UgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3VuZGVmaW5lZCcpOwokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHVuZGVmaW5lZEluc3RhbmNlLCAkc2NoZW1hLT5pdGVtc1ska10sICRwYXRoLCAkayk7Cn0KfQp9Cn0KfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludCBleHRlbmRzIEJhc2VDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnByb3RlY3RlZCAkaW5saW5lU2NoZW1hUHJvcGVydHkgPSAnJHNjaGVtYSc7Cgpjb25zdCBDSEVDS19NT0RFX05PTkUgPSAweDAwMDAwMDAwOwpjb25zdCBDSEVDS19NT0RFX05PUk1BTCA9IDB4MDAwMDAwMDE7CmNvbnN0IENIRUNLX01PREVfVFlQRV9DQVNUID0gMHgwMDAwMDAwMjsKY29uc3QgQ0hFQ0tfTU9ERV9DT0VSQ0VfVFlQRVMgPSAweDAwMDAwMDA0Owpjb25zdCBDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTID0gMHgwMDAwMDAwODsKY29uc3QgQ0hFQ0tfTU9ERV9FWENFUFRJT05TID0gMHgwMDAwMDAxMDsKY29uc3QgQ0hFQ0tfTU9ERV9ESVNBQkxFX0ZPUk1BVCA9IDB4MDAwMDAwMjA7CmNvbnN0IENIRUNLX01PREVfT05MWV9SRVFVSVJFRF9ERUZBVUxUUyA9IDB4MDAwMDAwODA7CmNvbnN0IENIRUNLX01PREVfVkFMSURBVEVfU0NIRU1BID0gMHgwMDAwMDEwMDsKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluY3JlbWVudFBhdGgoSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSkKewokcGF0aCA9ICRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJyk7CgppZiAoJGkgPT09IG51bGwgfHwgJGkgPT09ICcnKSB7CnJldHVybiAkcGF0aDsKfQoKJHBhdGggPSAkcGF0aC0+d2l0aFByb3BlcnR5UGF0aHMoCmFycmF5X21lcmdlKAokcGF0aC0+Z2V0UHJvcGVydHlQYXRocygpLAphcnJheSgkaSkKKQopOwoKcmV0dXJuICRwYXRoOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0FycmF5KCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdjb2xsZWN0aW9uJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrT2JqZWN0KCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRwcm9wZXJ0aWVzID0gbnVsbCwKJGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbnVsbCwgJHBhdHRlcm5Qcm9wZXJ0aWVzID0gbnVsbCwgJGFwcGxpZWREZWZhdWx0cyA9IGFycmF5KCkpCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignb2JqZWN0Jyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRwcm9wZXJ0aWVzLCAkYWRkaXRpb25hbFByb3BlcnRpZXMsICRwYXR0ZXJuUHJvcGVydGllcywgJGFwcGxpZWREZWZhdWx0cyk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tUeXBlKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd0eXBlJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1VuZGVmaW5lZCgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwsICRmcm9tRGVmYXVsdCA9IGZhbHNlKQp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3VuZGVmaW5lZCcpOwoKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5yZXNvbHZlUmVmU2NoZW1hKCRzY2hlbWEpLCAkcGF0aCwgJGksICRmcm9tRGVmYXVsdCk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tTdHJpbmcoJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc3RyaW5nJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja051bWJlcigkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdudW1iZXInKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrRW51bSgkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdlbnVtJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0Zvcm1hdCgkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdmb3JtYXQnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFR5cGVDaGVjaygpCnsKcmV0dXJuICR0aGlzLT5mYWN0b3J5LT5nZXRUeXBlQ2hlY2soKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29udmVydEpzb25Qb2ludGVySW50b1Byb3BlcnR5UGF0aChKc29uUG9pbnRlciAkcG9pbnRlcikKewokcmVzdWx0ID0gYXJyYXlfbWFwKApmdW5jdGlvbiAoJHBhdGgpIHsKcmV0dXJuIHNwcmludGYoaXNfbnVtZXJpYygkcGF0aCkgPyAnWyVkXScgOiAnLiVzJywgJHBhdGgpOwp9LAokcG9pbnRlci0+Z2V0UHJvcGVydHlQYXRocygpCik7CgpyZXR1cm4gdHJpbShpbXBsb2RlKCcnLCAkcmVzdWx0KSwgJy4nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgoKCgoKCmludGVyZmFjZSBDb25zdHJhaW50SW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcnMoYXJyYXkgJGVycm9ycyk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcihKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRtZXNzYWdlLCAkY29uc3RyYWludD0nJywgYXJyYXkgJG1vcmUgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmFsaWQoKTsKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOwp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgoKCgoKCgpjbGFzcyBFbnVtQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiRlbGVtZW50LCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpCnsKCmlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFVuZGVmaW5lZENvbnN0cmFpbnQgJiYgKCFpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgfHwgISRzY2hlbWEtPnJlcXVpcmVkKSkgewpyZXR1cm47Cn0KJHR5cGUgPSBnZXR0eXBlKCRlbGVtZW50KTsKCmZvcmVhY2ggKCRzY2hlbWEtPmVudW0gYXMgJGVudW0pIHsKJGVudW1UeXBlID0gZ2V0dHlwZSgkZW51bSk7CmlmICgkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfVFlQRV9DQVNUKSAmJiAkdHlwZSA9PSAnYXJyYXknICYmICRlbnVtVHlwZSA9PSAnb2JqZWN0JykgewppZiAoKG9iamVjdCkgJGVsZW1lbnQgPT0gJGVudW0pIHsKcmV0dXJuOwp9Cn0KCmlmICgkdHlwZSA9PT0gZ2V0dHlwZSgkZW51bSkpIHsKaWYgKCR0eXBlID09ICdvYmplY3QnKSB7CmlmICgkZWxlbWVudCA9PSAkZW51bSkgewpyZXR1cm47Cn0KfSBlbHNlaWYgKCRlbGVtZW50ID09PSAkZW51bSkgewpyZXR1cm47Cn0KfQp9CgokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdEb2VzIG5vdCBoYXZlIGEgdmFsdWUgaW4gdGhlIGVudW1lcmF0aW9uICcgLiBqc29uX2VuY29kZSgkc2NoZW1hLT5lbnVtKSwgJ2VudW0nLCBhcnJheSgnZW51bScgPT4gJHNjaGVtYS0+ZW51bSkpOwp9Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFNjaGVtYVN0b3JhZ2U7CnVzZSBKc29uU2NoZW1hXFNjaGVtYVN0b3JhZ2VJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXRyaWV2ZXI7CnVzZSBKc29uU2NoZW1hXFVyaVJldHJpZXZlckludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKY2xhc3MgRmFjdG9yeQp7CgoKCnByb3RlY3RlZCAkc2NoZW1hU3RvcmFnZTsKCgoKCnByb3RlY3RlZCAkdXJpUmV0cmlldmVyOwoKCgoKcHJpdmF0ZSAkY2hlY2tNb2RlID0gQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9OT1JNQUw7CgoKCgpwcml2YXRlICR0eXBlQ2hlY2sgPSBhcnJheSgpOwoKCgoKcHJvdGVjdGVkICRlcnJvckNvbnRleHQgPSBWYWxpZGF0b3I6OkVSUk9SX0RPQ1VNRU5UX1ZBTElEQVRJT047CgoKCgpwcm90ZWN0ZWQgJGNvbnN0cmFpbnRNYXAgPSBhcnJheSgKJ2FycmF5JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb2xsZWN0aW9uQ29uc3RyYWludCcsCidjb2xsZWN0aW9uJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb2xsZWN0aW9uQ29uc3RyYWludCcsCidvYmplY3QnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXE9iamVjdENvbnN0cmFpbnQnLAondHlwZScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNvbnN0cmFpbnQnLAondW5kZWZpbmVkJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xVbmRlZmluZWRDb25zdHJhaW50JywKJ3N0cmluZycgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcU3RyaW5nQ29uc3RyYWludCcsCidudW1iZXInID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXE51bWJlckNvbnN0cmFpbnQnLAonZW51bScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcRW51bUNvbnN0cmFpbnQnLAonZm9ybWF0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xGb3JtYXRDb25zdHJhaW50JywKJ3NjaGVtYScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcU2NoZW1hQ29uc3RyYWludCcsCid2YWxpZGF0b3InID0+ICdKc29uU2NoZW1hXFZhbGlkYXRvcicKKTsKCgoKCnByaXZhdGUgJGluc3RhbmNlQ2FjaGUgPSBhcnJheSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoClNjaGVtYVN0b3JhZ2VJbnRlcmZhY2UgJHNjaGVtYVN0b3JhZ2UgPSBudWxsLApVcmlSZXRyaWV2ZXJJbnRlcmZhY2UgJHVyaVJldHJpZXZlciA9IG51bGwsCiRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTAopIHsKCiR0aGlzLT5zZXRDb25maWcoJGNoZWNrTW9kZSk7CgokdGhpcy0+dXJpUmV0cmlldmVyID0gJHVyaVJldHJpZXZlciA/OiBuZXcgVXJpUmV0cmlldmVyKCk7CiR0aGlzLT5zY2hlbWFTdG9yYWdlID0gJHNjaGVtYVN0b3JhZ2UgPzogbmV3IFNjaGVtYVN0b3JhZ2UoJHRoaXMtPnVyaVJldHJpZXZlcik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZygkY2hlY2tNb2RlID0gQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9OT1JNQUwpCnsKJHRoaXMtPmNoZWNrTW9kZSA9ICRjaGVja01vZGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbmZpZygkb3B0aW9ucykKewokdGhpcy0+Y2hlY2tNb2RlIHw9ICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWcoJG9wdGlvbnMpCnsKJHRoaXMtPmNoZWNrTW9kZSAmPSB+JG9wdGlvbnM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCRvcHRpb25zID0gbnVsbCkKewppZiAoJG9wdGlvbnMgPT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5jaGVja01vZGU7Cn0KCnJldHVybiAkdGhpcy0+Y2hlY2tNb2RlICYgJG9wdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKQp7CnJldHVybiAkdGhpcy0+dXJpUmV0cmlldmVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NoZW1hU3RvcmFnZSgpCnsKcmV0dXJuICR0aGlzLT5zY2hlbWFTdG9yYWdlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZUNoZWNrKCkKewppZiAoIWlzc2V0KCR0aGlzLT50eXBlQ2hlY2tbJHRoaXMtPmNoZWNrTW9kZV0pKSB7CiR0aGlzLT50eXBlQ2hlY2tbJHRoaXMtPmNoZWNrTW9kZV0gPSAoJHRoaXMtPmNoZWNrTW9kZSAmIENvbnN0cmFpbnQ6OkNIRUNLX01PREVfVFlQRV9DQVNUKQo/IG5ldyBUeXBlQ2hlY2tcTG9vc2VUeXBlQ2hlY2soKQo6IG5ldyBUeXBlQ2hlY2tcU3RyaWN0VHlwZUNoZWNrKCk7Cn0KCnJldHVybiAkdGhpcy0+dHlwZUNoZWNrWyR0aGlzLT5jaGVja01vZGVdOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uc3RyYWludENsYXNzKCRuYW1lLCAkY2xhc3MpCnsKCmlmICghY2xhc3NfZXhpc3RzKCRjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBjb25zdHJhaW50ICcgLiAkbmFtZSk7Cn0KCmlmICghaW5fYXJyYXkoJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZScsIGNsYXNzX2ltcGxlbWVudHMoJGNsYXNzKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBjbGFzcyAnIC4gJG5hbWUpOwp9CiR0aGlzLT5jb25zdHJhaW50TWFwWyRuYW1lXSA9ICRjbGFzczsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlRm9yKCRjb25zdHJhaW50TmFtZSkKewppZiAoIWlzc2V0KCR0aGlzLT5jb25zdHJhaW50TWFwWyRjb25zdHJhaW50TmFtZV0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gY29uc3RyYWludCAnIC4gJGNvbnN0cmFpbnROYW1lKTsKfQoKaWYgKCFpc3NldCgkdGhpcy0+aW5zdGFuY2VDYWNoZVskY29uc3RyYWludE5hbWVdKSkgewokdGhpcy0+aW5zdGFuY2VDYWNoZVskY29uc3RyYWludE5hbWVdID0gbmV3ICR0aGlzLT5jb25zdHJhaW50TWFwWyRjb25zdHJhaW50TmFtZV0oJHRoaXMpOwp9CgpyZXR1cm4gY2xvbmUgJHRoaXMtPmluc3RhbmNlQ2FjaGVbJGNvbnN0cmFpbnROYW1lXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JDb250ZXh0KCkKewpyZXR1cm4gJHRoaXMtPmVycm9yQ29udGV4dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JDb250ZXh0KCRlcnJvckNvbnRleHQpCnsKJHRoaXMtPmVycm9yQ29udGV4dCA9ICRlcnJvckNvbnRleHQ7Cn0KfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxSZmMzMzM5OwoKCgoKCgoKCmNsYXNzIEZvcm1hdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsIEpzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKQp7CmlmICghaXNzZXQoJHNjaGVtYS0+Zm9ybWF0KSB8fCAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfRElTQUJMRV9GT1JNQVQpKSB7CnJldHVybjsKfQoKc3dpdGNoICgkc2NoZW1hLT5mb3JtYXQpIHsKY2FzZSAnZGF0ZSc6CmlmICghJGRhdGUgPSAkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1ktbS1kJykpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCBzcHJpbnRmKCdJbnZhbGlkIGRhdGUgJXMsIGV4cGVjdGVkIGZvcm1hdCBZWVlZLU1NLUREJywganNvbl9lbmNvZGUoJGVsZW1lbnQpKSwgJ2Zvcm1hdCcsIGFycmF5KCdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdCkpOwp9CmJyZWFrOwoKY2FzZSAndGltZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlRGF0ZVRpbWUoJGVsZW1lbnQsICdIOmk6cycpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgc3ByaW50ZignSW52YWxpZCB0aW1lICVzLCBleHBlY3RlZCBmb3JtYXQgaGg6bW06c3MnLCBqc29uX2VuY29kZSgkZWxlbWVudCkpLCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICdkYXRlLXRpbWUnOgppZiAobnVsbCA9PT0gUmZjMzMzOTo6Y3JlYXRlRnJvbVN0cmluZygkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCBzcHJpbnRmKCdJbnZhbGlkIGRhdGUtdGltZSAlcywgZXhwZWN0ZWQgZm9ybWF0IFlZWVktTU0tRERUaGg6bW06c3NaIG9yIFlZWVktTU0tRERUaGg6bW06c3MraGg6bW0nLCBqc29uX2VuY29kZSgkZWxlbWVudCkpLCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICd1dGMtbWlsbGlzZWMnOgppZiAoISR0aGlzLT52YWxpZGF0ZURhdGVUaW1lKCRlbGVtZW50LCAnVScpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgc3ByaW50ZignSW52YWxpZCB0aW1lICVzLCBleHBlY3RlZCBpbnRlZ2VyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBFcG9jaCcsIGpzb25fZW5jb2RlKCRlbGVtZW50KSksICdmb3JtYXQnLCBhcnJheSgnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQpKTsKfQpicmVhazsKCmNhc2UgJ3JlZ2V4JzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVSZWdleCgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnSW52YWxpZCByZWdleCBmb3JtYXQgJyAuICRlbGVtZW50LCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICdjb2xvcic6CmlmICghJHRoaXMtPnZhbGlkYXRlQ29sb3IoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ludmFsaWQgY29sb3InLCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICdzdHlsZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlU3R5bGUoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ludmFsaWQgc3R5bGUnLCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICdwaG9uZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlUGhvbmUoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ludmFsaWQgcGhvbmUgbnVtYmVyJywgJ2Zvcm1hdCcsIGFycmF5KCdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdCkpOwp9CmJyZWFrOwoKY2FzZSAndXJpJzoKaWYgKG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9VUkwsIEZJTFRFUl9OVUxMX09OX0ZBSUxVUkUpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ludmFsaWQgVVJMIGZvcm1hdCcsICdmb3JtYXQnLCBhcnJheSgnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQpKTsKfQpicmVhazsKCmNhc2UgJ3VyaXJlZic6CmNhc2UgJ3VyaS1yZWZlcmVuY2UnOgppZiAobnVsbCA9PT0gZmlsdGVyX3ZhcigkZWxlbWVudCwgRklMVEVSX1ZBTElEQVRFX1VSTCwgRklMVEVSX05VTExfT05fRkFJTFVSRSkpIHsKCgoKaWYgKHN1YnN0cigkZWxlbWVudCwgMCwgMikgPT09ICcvLycpIHsgCiR2YWxpZFVSTCA9IGZpbHRlcl92YXIoJ3NjaGVtZTonIC4gJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9VUkwsIEZJTFRFUl9OVUxMX09OX0ZBSUxVUkUpOwp9IGVsc2VpZiAoc3Vic3RyKCRlbGVtZW50LCAwLCAxKSA9PT0gJy8nKSB7IAokdmFsaWRVUkwgPSBmaWx0ZXJfdmFyKCdzY2hlbWU6Ly9ob3N0JyAuICRlbGVtZW50LCBGSUxURVJfVkFMSURBVEVfVVJMLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFKTsKfSBlbHNlaWYgKHN0cmxlbigkZWxlbWVudCkpIHsgCiRwYXRoUGFydHMgPSBleHBsb2RlKCcvJywgJGVsZW1lbnQsIDIpOwppZiAoc3RycG9zKCRwYXRoUGFydHNbMF0sICc6JykgIT09IGZhbHNlKSB7CiR2YWxpZFVSTCA9IG51bGw7Cn0gZWxzZSB7CiR2YWxpZFVSTCA9IGZpbHRlcl92YXIoJ3NjaGVtZTovL2hvc3QvJyAuICRlbGVtZW50LCBGSUxURVJfVkFMSURBVEVfVVJMLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFKTsKfQp9IGVsc2UgewokdmFsaWRVUkwgPSBudWxsOwp9CmlmICgkdmFsaWRVUkwgPT09IG51bGwpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnSW52YWxpZCBVUkwgZm9ybWF0JywgJ2Zvcm1hdCcsIGFycmF5KCdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdCkpOwp9Cn0KYnJlYWs7CgpjYXNlICdlbWFpbCc6CiRmaWx0ZXJGbGFncyA9IEZJTFRFUl9OVUxMX09OX0ZBSUxVUkU7CmlmIChkZWZpbmVkKCdGSUxURVJfRkxBR19FTUFJTF9VTklDT0RFJykpIHsKCiRmaWx0ZXJGbGFncyB8PSBjb25zdGFudCgnRklMVEVSX0ZMQUdfRU1BSUxfVU5JQ09ERScpOyAKfQppZiAobnVsbCA9PT0gZmlsdGVyX3ZhcigkZWxlbWVudCwgRklMVEVSX1ZBTElEQVRFX0VNQUlMLCAkZmlsdGVyRmxhZ3MpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ludmFsaWQgZW1haWwnLCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICdpcC1hZGRyZXNzJzoKY2FzZSAnaXB2NCc6CmlmIChudWxsID09PSBmaWx0ZXJfdmFyKCRlbGVtZW50LCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9OVUxMX09OX0ZBSUxVUkUgfCBGSUxURVJfRkxBR19JUFY0KSkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdJbnZhbGlkIElQIGFkZHJlc3MnLCAnZm9ybWF0JywgYXJyYXkoJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0KSk7Cn0KYnJlYWs7CgpjYXNlICdpcHY2JzoKaWYgKG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjYpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ludmFsaWQgSVAgYWRkcmVzcycsICdmb3JtYXQnLCBhcnJheSgnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQpKTsKfQpicmVhazsKCmNhc2UgJ2hvc3QtbmFtZSc6CmNhc2UgJ2hvc3RuYW1lJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVIb3N0bmFtZSgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnSW52YWxpZCBob3N0bmFtZScsICdmb3JtYXQnLCBhcnJheSgnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQpKTsKfQpicmVhazsKCmRlZmF1bHQ6CgoKCgoKCmJyZWFrOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZURhdGVUaW1lKCRkYXRldGltZSwgJGZvcm1hdCkKewokZHQgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJGZvcm1hdCwgJGRhdGV0aW1lKTsKCmlmICghJGR0KSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRkYXRldGltZSA9PT0gJGR0LT5mb3JtYXQoJGZvcm1hdCkpIHsKcmV0dXJuIHRydWU7Cn0KCgoKCgppZiAoKHN0cnBvcygndScsICRmb3JtYXQpICE9PSAtMSkgJiYgKHByZWdfbWF0Y2goJy9cLlxkK1okLycsICRkYXRldGltZSkpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2V4KCRyZWdleCkKewpyZXR1cm4gZmFsc2UgIT09IEBwcmVnX21hdGNoKCcvJyAuICRyZWdleCAuICcvdScsICcnKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3IoJGNvbG9yKQp7CmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRjb2xvciksIGFycmF5KCdhcXVhJywgJ2JsYWNrJywgJ2JsdWUnLCAnZnVjaHNpYScsCidncmF5JywgJ2dyZWVuJywgJ2xpbWUnLCAnbWFyb29uJywgJ25hdnknLCAnb2xpdmUnLCAnb3JhbmdlJywgJ3B1cnBsZScsCidyZWQnLCAnc2lsdmVyJywgJ3RlYWwnLCAnd2hpdGUnLCAneWVsbG93JykpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gcHJlZ19tYXRjaCgnL14jKFthLWYwLTldezN9fFthLWYwLTldezZ9KSQvaScsICRjb2xvcik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlKCRzdHlsZSkKewokcHJvcGVydGllcyA9IGV4cGxvZGUoJzsnLCBydHJpbSgkc3R5bGUsICc7JykpOwokaW52YWxpZEVudHJpZXMgPSBwcmVnX2dyZXAoJy9eXHMqWy1hLXpdK1xzKjpccyouKyQvaScsICRwcm9wZXJ0aWVzLCBQUkVHX0dSRVBfSU5WRVJUKTsKCnJldHVybiBlbXB0eSgkaW52YWxpZEVudHJpZXMpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVQaG9uZSgkcGhvbmUpCnsKcmV0dXJuIHByZWdfbWF0Y2goJy9eXCs/KFwoXGR7M31cKXxcZHszfSkgXGR7M30gXGR7NH0kLycsICRwaG9uZSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZUhvc3RuYW1lKCRob3N0KQp7CiRob3N0bmFtZVJlZ2V4ID0gJy9eKChbYS16QS1aMC05XXxbYS16QS1aMC05XVthLXpBLVowLTlcLV0qW2EtekEtWjAtOV0pXC4pKihbQS1aYS16MC05XXxbQS1aYS16MC05XVtBLVphLXowLTlcLV0qW0EtWmEtejAtOV0pJC9pJzsKCnJldHVybiBwcmVnX21hdGNoKCRob3N0bmFtZVJlZ2V4LCAkaG9zdCk7Cn0KfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKY2xhc3MgTnVtYmVyQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiRlbGVtZW50LCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpCnsKCmlmIChpc3NldCgkc2NoZW1hLT5leGNsdXNpdmVNaW5pbXVtKSkgewppZiAoaXNzZXQoJHNjaGVtYS0+bWluaW11bSkpIHsKaWYgKCRzY2hlbWEtPmV4Y2x1c2l2ZU1pbmltdW0gJiYgJGVsZW1lbnQgPD0gJHNjaGVtYS0+bWluaW11bSkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdNdXN0IGhhdmUgYSBtaW5pbXVtIHZhbHVlIG9mICcgLiAkc2NoZW1hLT5taW5pbXVtLCAnZXhjbHVzaXZlTWluaW11bScsIGFycmF5KCdtaW5pbXVtJyA9PiAkc2NoZW1hLT5taW5pbXVtKSk7Cn0gZWxzZWlmICgkZWxlbWVudCA8ICRzY2hlbWEtPm1pbmltdW0pIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnTXVzdCBoYXZlIGEgbWluaW11bSB2YWx1ZSBvZiAnIC4gJHNjaGVtYS0+bWluaW11bSwgJ21pbmltdW0nLCBhcnJheSgnbWluaW11bScgPT4gJHNjaGVtYS0+bWluaW11bSkpOwp9Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ1VzZSBvZiBleGNsdXNpdmVNaW5pbXVtIHJlcXVpcmVzIHByZXNlbmNlIG9mIG1pbmltdW0nLCAnbWlzc2luZ01pbmltdW0nKTsKfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+bWluaW11bSkgJiYgJGVsZW1lbnQgPCAkc2NoZW1hLT5taW5pbXVtKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ011c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgb2YgJyAuICRzY2hlbWEtPm1pbmltdW0sICdtaW5pbXVtJywgYXJyYXkoJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW0pKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5leGNsdXNpdmVNYXhpbXVtKSkgewppZiAoaXNzZXQoJHNjaGVtYS0+bWF4aW11bSkpIHsKaWYgKCRzY2hlbWEtPmV4Y2x1c2l2ZU1heGltdW0gJiYgJGVsZW1lbnQgPj0gJHNjaGVtYS0+bWF4aW11bSkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdNdXN0IGhhdmUgYSBtYXhpbXVtIHZhbHVlIG9mICcgLiAkc2NoZW1hLT5tYXhpbXVtLCAnZXhjbHVzaXZlTWF4aW11bScsIGFycmF5KCdtYXhpbXVtJyA9PiAkc2NoZW1hLT5tYXhpbXVtKSk7Cn0gZWxzZWlmICgkZWxlbWVudCA+ICRzY2hlbWEtPm1heGltdW0pIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnTXVzdCBoYXZlIGEgbWF4aW11bSB2YWx1ZSBvZiAnIC4gJHNjaGVtYS0+bWF4aW11bSwgJ21heGltdW0nLCBhcnJheSgnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bSkpOwp9Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ1VzZSBvZiBleGNsdXNpdmVNYXhpbXVtIHJlcXVpcmVzIHByZXNlbmNlIG9mIG1heGltdW0nLCAnbWlzc2luZ01heGltdW0nKTsKfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+bWF4aW11bSkgJiYgJGVsZW1lbnQgPiAkc2NoZW1hLT5tYXhpbXVtKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ011c3QgaGF2ZSBhIG1heGltdW0gdmFsdWUgb2YgJyAuICRzY2hlbWEtPm1heGltdW0sICdtYXhpbXVtJywgYXJyYXkoJ21heGltdW0nID0+ICRzY2hlbWEtPm1heGltdW0pKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kaXZpc2libGVCeSkgJiYgJHRoaXMtPmZtb2QoJGVsZW1lbnQsICRzY2hlbWEtPmRpdmlzaWJsZUJ5KSAhPSAwKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0lzIG5vdCBkaXZpc2libGUgYnkgJyAuICRzY2hlbWEtPmRpdmlzaWJsZUJ5LCAnZGl2aXNpYmxlQnknLCBhcnJheSgnZGl2aXNpYmxlQnknID0+ICRzY2hlbWEtPmRpdmlzaWJsZUJ5KSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bXVsdGlwbGVPZikgJiYgJHRoaXMtPmZtb2QoJGVsZW1lbnQsICRzY2hlbWEtPm11bHRpcGxlT2YpICE9IDApIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnTXVzdCBiZSBhIG11bHRpcGxlIG9mICcgLiAkc2NoZW1hLT5tdWx0aXBsZU9mLCAnbXVsdGlwbGVPZicsIGFycmF5KCdtdWx0aXBsZU9mJyA9PiAkc2NoZW1hLT5tdWx0aXBsZU9mKSk7Cn0KCiR0aGlzLT5jaGVja0Zvcm1hdCgkZWxlbWVudCwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBmbW9kKCRudW1iZXIxLCAkbnVtYmVyMikKewokbW9kdWx1cyA9ICgkbnVtYmVyMSAtIHJvdW5kKCRudW1iZXIxIC8gJG51bWJlcjIpICogJG51bWJlcjIpOwokcHJlY2lzaW9uID0gMC4wMDAwMDAwMDAxOwoKaWYgKC0kcHJlY2lzaW9uIDwgJG1vZHVsdXMgJiYgJG1vZHVsdXMgPCAkcHJlY2lzaW9uKSB7CnJldHVybiAwLjA7Cn0KCnJldHVybiAkbW9kdWx1czsKfQp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgoKCgoKCgpjbGFzcyBPYmplY3RDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnByb3RlY3RlZCAkYXBwbGllZERlZmF1bHRzID0gYXJyYXkoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRwcm9wZXJ0aWVzID0gbnVsbCwKJGFkZGl0aW9uYWxQcm9wID0gbnVsbCwgJHBhdHRlcm5Qcm9wZXJ0aWVzID0gbnVsbCwgJGFwcGxpZWREZWZhdWx0cyA9IGFycmF5KCkpCnsKaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCkgewpyZXR1cm47Cn0KCiR0aGlzLT5hcHBsaWVkRGVmYXVsdHMgPSAkYXBwbGllZERlZmF1bHRzOwoKJG1hdGNoZXMgPSBhcnJheSgpOwppZiAoJHBhdHRlcm5Qcm9wZXJ0aWVzKSB7CgokbWF0Y2hlcyA9ICR0aGlzLT52YWxpZGF0ZVBhdHRlcm5Qcm9wZXJ0aWVzKCRlbGVtZW50LCAkcGF0aCwgJHBhdHRlcm5Qcm9wZXJ0aWVzKTsKfQoKaWYgKCRwcm9wZXJ0aWVzKSB7CgokdGhpcy0+dmFsaWRhdGVQcm9wZXJ0aWVzKCRlbGVtZW50LCAkcHJvcGVydGllcywgJHBhdGgpOwp9CgoKJHRoaXMtPnZhbGlkYXRlRWxlbWVudCgkZWxlbWVudCwgJG1hdGNoZXMsICRzY2hlbWEsICRwYXRoLCAkcHJvcGVydGllcywgJGFkZGl0aW9uYWxQcm9wKTsKfQoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlUGF0dGVyblByb3BlcnRpZXMoJGVsZW1lbnQsIEpzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJHBhdHRlcm5Qcm9wZXJ0aWVzKQp7CiR0cnkgPSBhcnJheSgnLycsICcjJywgJysnLCAnficsICclJyk7CiRtYXRjaGVzID0gYXJyYXkoKTsKZm9yZWFjaCAoJHBhdHRlcm5Qcm9wZXJ0aWVzIGFzICRwcmVnZXggPT4gJHNjaGVtYSkgewokZGVsaW1pdGVyID0gJy8nOwoKZm9yZWFjaCAoJHRyeSBhcyAkZGVsaW1pdGVyKSB7CmlmIChzdHJwb3MoJHByZWdleCwgJGRlbGltaXRlcikgPT09IGZhbHNlKSB7IApicmVhazsKfQp9CgoKaWYgKEBwcmVnX21hdGNoKCRkZWxpbWl0ZXIgLiAkcHJlZ2V4IC4gJGRlbGltaXRlciAuICd1JywgJycpID09PSBmYWxzZSkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdUaGUgcGF0dGVybiAiJyAuICRwcmVnZXggLiAnIiBpcyBpbnZhbGlkJywgJ3ByZWdleCcsIGFycmF5KCdwcmVnZXgnID0+ICRwcmVnZXgpKTsKY29udGludWU7Cn0KZm9yZWFjaCAoJGVsZW1lbnQgYXMgJGkgPT4gJHZhbHVlKSB7CmlmIChwcmVnX21hdGNoKCRkZWxpbWl0ZXIgLiAkcHJlZ2V4IC4gJGRlbGltaXRlciAuICd1JywgJGkpKSB7CiRtYXRjaGVzW10gPSAkaTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHNjaGVtYSA/OiBuZXcgXHN0ZENsYXNzKCksICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoJGVsZW1lbnQsICRtYXRjaGVzLCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLAokcHJvcGVydGllcyA9IG51bGwsICRhZGRpdGlvbmFsUHJvcCA9IG51bGwpCnsKJHRoaXMtPnZhbGlkYXRlTWluTWF4Q29uc3RyYWludCgkZWxlbWVudCwgJHNjaGVtYSwgJHBhdGgpOwoKZm9yZWFjaCAoJGVsZW1lbnQgYXMgJGkgPT4gJHZhbHVlKSB7CiRkZWZpbml0aW9uID0gJHRoaXMtPmdldFByb3BlcnR5KCRwcm9wZXJ0aWVzLCAkaSk7CgoKaWYgKCFpbl9hcnJheSgkaSwgJG1hdGNoZXMpICYmICRhZGRpdGlvbmFsUHJvcCA9PT0gZmFsc2UgJiYgJHRoaXMtPmlubGluZVNjaGVtYVByb3BlcnR5ICE9PSAkaSAmJiAhJGRlZmluaXRpb24pIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnVGhlIHByb3BlcnR5ICcgLiAkaSAuICcgaXMgbm90IGRlZmluZWQgYW5kIHRoZSBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllcycsICdhZGRpdGlvbmFsUHJvcCcpOwp9CgoKaWYgKCFpbl9hcnJheSgkaSwgJG1hdGNoZXMpICYmICRhZGRpdGlvbmFsUHJvcCAmJiAhJGRlZmluaXRpb24pIHsKaWYgKCRhZGRpdGlvbmFsUHJvcCA9PT0gdHJ1ZSkgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCBudWxsLCAkcGF0aCwgJGksIGluX2FycmF5KCRpLCAkdGhpcy0+YXBwbGllZERlZmF1bHRzKSk7Cn0gZWxzZSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRhZGRpdGlvbmFsUHJvcCwgJHBhdGgsICRpLCBpbl9hcnJheSgkaSwgJHRoaXMtPmFwcGxpZWREZWZhdWx0cykpOwp9Cn0KCgokcmVxdWlyZSA9ICR0aGlzLT5nZXRQcm9wZXJ0eSgkZGVmaW5pdGlvbiwgJ3JlcXVpcmVzJyk7CmlmICgkcmVxdWlyZSAmJiAhJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkcmVxdWlyZSkpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnVGhlIHByZXNlbmNlIG9mIHRoZSBwcm9wZXJ0eSAnIC4gJGkgLiAnIHJlcXVpcmVzIHRoYXQgJyAuICRyZXF1aXJlIC4gJyBhbHNvIGJlIHByZXNlbnQnLCAncmVxdWlyZXMnKTsKfQoKJHByb3BlcnR5ID0gJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkaSwgJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKSk7CmlmIChpc19vYmplY3QoJHByb3BlcnR5KSkgewokdGhpcy0+dmFsaWRhdGVNaW5NYXhDb25zdHJhaW50KCEoJHByb3BlcnR5IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCkgPyAkcHJvcGVydHkgOiAkZWxlbWVudCwgJGRlZmluaXRpb24sICRwYXRoKTsKfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKCYkZWxlbWVudCwgJHByb3BlcnRpZXMgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwpCnsKJHVuZGVmaW5lZENvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3VuZGVmaW5lZCcpOwoKZm9yZWFjaCAoJHByb3BlcnRpZXMgYXMgJGkgPT4gJHZhbHVlKSB7CiRwcm9wZXJ0eSA9ICYkdGhpcy0+Z2V0UHJvcGVydHkoJGVsZW1lbnQsICRpLCAkdW5kZWZpbmVkQ29uc3RyYWludCk7CiRkZWZpbml0aW9uID0gJHRoaXMtPmdldFByb3BlcnR5KCRwcm9wZXJ0aWVzLCAkaSk7CgppZiAoaXNfb2JqZWN0KCRkZWZpbml0aW9uKSkgewoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCRwcm9wZXJ0eSwgJGRlZmluaXRpb24sICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiAmZ2V0UHJvcGVydHkoJiRlbGVtZW50LCAkcHJvcGVydHksICRmYWxsYmFjayA9IG51bGwpCnsKaWYgKGlzX2FycmF5KCRlbGVtZW50KSAmJiAoaXNzZXQoJGVsZW1lbnRbJHByb3BlcnR5XSkgfHwgYXJyYXlfa2V5X2V4aXN0cygkcHJvcGVydHksICRlbGVtZW50KSkgKSB7CnJldHVybiAkZWxlbWVudFskcHJvcGVydHldOwp9IGVsc2VpZiAoaXNfb2JqZWN0KCRlbGVtZW50KSAmJiBwcm9wZXJ0eV9leGlzdHMoJGVsZW1lbnQsICRwcm9wZXJ0eSkpIHsKcmV0dXJuICRlbGVtZW50LT4kcHJvcGVydHk7Cn0KCnJldHVybiAkZmFsbGJhY2s7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVNaW5NYXhDb25zdHJhaW50KCRlbGVtZW50LCAkb2JqZWN0RGVmaW5pdGlvbiwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsKQp7CgppZiAoaXNzZXQoJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpICYmICFpc19vYmplY3QoJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpKSB7CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5Q291bnQoJGVsZW1lbnQpIDwgJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnTXVzdCBjb250YWluIGEgbWluaW11bSBvZiAnIC4gJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMgLiAnIHByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsIGFycmF5KCdtaW5Qcm9wZXJ0aWVzJyA9PiAkb2JqZWN0RGVmaW5pdGlvbi0+bWluUHJvcGVydGllcykpOwp9Cn0KCmlmIChpc3NldCgkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllcykgJiYgIWlzX29iamVjdCgkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllcykpIHsKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlDb3VudCgkZWxlbWVudCkgPiAkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllcykgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdNdXN0IGNvbnRhaW4gbm8gbW9yZSB0aGFuICcgLiAkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllcyAuICcgcHJvcGVydGllcycsICdtYXhQcm9wZXJ0aWVzJywgYXJyYXkoJ21heFByb3BlcnRpZXMnID0+ICRvYmplY3REZWZpbml0aW9uLT5tYXhQcm9wZXJ0aWVzKSk7Cn0KfQp9Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRTY2hlbWFFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCgpjbGFzcyBTY2hlbWFDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CmNvbnN0IERFRkFVTFRfU0NIRU1BX1NQRUMgPSAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCkKewppZiAoJHNjaGVtYSAhPT0gbnVsbCkgewoKJHZhbGlkYXRpb25TY2hlbWEgPSAkc2NoZW1hOwp9IGVsc2VpZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkZWxlbWVudCwgJHRoaXMtPmlubGluZVNjaGVtYVByb3BlcnR5KSkgewoKJHZhbGlkYXRpb25TY2hlbWEgPSAkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5R2V0KCRlbGVtZW50LCAkdGhpcy0+aW5saW5lU2NoZW1hUHJvcGVydHkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdubyBzY2hlbWEgZm91bmQgdG8gdmVyaWZ5IGFnYWluc3QnKTsKfQoKCmlmIChpc19hcnJheSgkdmFsaWRhdGlvblNjaGVtYSkpIHsKJHZhbGlkYXRpb25TY2hlbWEgPSBCYXNlQ29uc3RyYWludDo6YXJyYXlUb09iamVjdFJlY3Vyc2l2ZSgkdmFsaWRhdGlvblNjaGVtYSk7Cn0KCgoKaWYgKCR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9WQUxJREFURV9TQ0hFTUEpKSB7CmlmICghJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkdmFsaWRhdGlvblNjaGVtYSkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCB2YWxpZGF0ZSB0aGUgc2NoZW1hIG9mIGEgbm9uLW9iamVjdCcpOwp9CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWxpZGF0aW9uU2NoZW1hLCAnJHNjaGVtYScpKSB7CiRzY2hlbWFTcGVjID0gJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUdldCgkdmFsaWRhdGlvblNjaGVtYSwgJyRzY2hlbWEnKTsKfSBlbHNlIHsKJHNjaGVtYVNwZWMgPSBzZWxmOjpERUZBVUxUX1NDSEVNQV9TUEVDOwp9CgoKJHNjaGVtYVN0b3JhZ2UgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpOwppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHNjaGVtYVNwZWMpKSB7CiRzY2hlbWFTcGVjID0gJHNjaGVtYVN0b3JhZ2UtPmdldFNjaGVtYSgkc2NoZW1hU3BlYyk7Cn0KCgokaW5pdGlhbEVycm9yQ291bnQgPSAkdGhpcy0+bnVtRXJyb3JzKCk7CiRpbml0aWFsQ29uZmlnID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZygpOwokaW5pdGlhbENvbnRleHQgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0RXJyb3JDb250ZXh0KCk7CiR0aGlzLT5mYWN0b3J5LT5yZW1vdmVDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9WQUxJREFURV9TQ0hFTUEgfCBzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKTsKJHRoaXMtPmZhY3RvcnktPmFkZENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1RZUEVfQ0FTVCk7CiR0aGlzLT5mYWN0b3J5LT5zZXRFcnJvckNvbnRleHQoVmFsaWRhdG9yOjpFUlJPUl9TQ0hFTUFfVkFMSURBVElPTik7CgoKdHJ5IHsKJHRoaXMtPmNoZWNrKCR2YWxpZGF0aW9uU2NoZW1hLCAkc2NoZW1hU3BlYyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9FWENFUFRJT05TKSkgewp0aHJvdyBuZXcgSW52YWxpZFNjaGVtYUV4Y2VwdGlvbignU2NoZW1hIGRpZCBub3QgcGFzcyB2YWxpZGF0aW9uJywgMCwgJGUpOwp9Cn0KaWYgKCR0aGlzLT5udW1FcnJvcnMoKSA+ICRpbml0aWFsRXJyb3JDb3VudCkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdTY2hlbWEgaXMgbm90IHZhbGlkJywgJ3NjaGVtYScpOwp9CgoKJHRoaXMtPmZhY3RvcnktPnNldENvbmZpZygkaW5pdGlhbENvbmZpZyk7CiR0aGlzLT5mYWN0b3J5LT5zZXRFcnJvckNvbnRleHQoJGluaXRpYWxDb250ZXh0KTsKfQoKCiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkZWxlbWVudCwgJHZhbGlkYXRpb25TY2hlbWEsICRwYXRoLCAkaSk7Cn0KfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKY2xhc3MgU3RyaW5nQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiRlbGVtZW50LCAkc2NoZW1hID0gbnVsbCwgSnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpCnsKCmlmIChpc3NldCgkc2NoZW1hLT5tYXhMZW5ndGgpICYmICR0aGlzLT5zdHJsZW4oJGVsZW1lbnQpID4gJHNjaGVtYS0+bWF4TGVuZ3RoKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ011c3QgYmUgYXQgbW9zdCAnIC4gJHNjaGVtYS0+bWF4TGVuZ3RoIC4gJyBjaGFyYWN0ZXJzIGxvbmcnLCAnbWF4TGVuZ3RoJywgYXJyYXkoCidtYXhMZW5ndGgnID0+ICRzY2hlbWEtPm1heExlbmd0aCwKKSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bWluTGVuZ3RoKSAmJiAkdGhpcy0+c3RybGVuKCRlbGVtZW50KSA8ICRzY2hlbWEtPm1pbkxlbmd0aCkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdNdXN0IGJlIGF0IGxlYXN0ICcgLiAkc2NoZW1hLT5taW5MZW5ndGggLiAnIGNoYXJhY3RlcnMgbG9uZycsICdtaW5MZW5ndGgnLCBhcnJheSgKJ21pbkxlbmd0aCcgPT4gJHNjaGVtYS0+bWluTGVuZ3RoLAopKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5wYXR0ZXJuKSAmJiAhcHJlZ19tYXRjaCgnIycgLiBzdHJfcmVwbGFjZSgnIycsICdcXCMnLCAkc2NoZW1hLT5wYXR0ZXJuKSAuICcjdScsICRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoJHBhdGgsICdEb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXggcGF0dGVybiAnIC4gJHNjaGVtYS0+cGF0dGVybiwgJ3BhdHRlcm4nLCBhcnJheSgKJ3BhdHRlcm4nID0+ICRzY2hlbWEtPnBhdHRlcm4sCikpOwp9CgokdGhpcy0+Y2hlY2tGb3JtYXQoJGVsZW1lbnQsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc3RybGVuKCRzdHJpbmcpCnsKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpIHsKcmV0dXJuIG1iX3N0cmxlbigkc3RyaW5nLCBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZykpOwp9CgoKcmV0dXJuIHN0cmxlbigkc3RyaW5nKTsgCn0KfQo8P3BocAoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNoZWNrOwoKY2xhc3MgTG9vc2VUeXBlQ2hlY2sgaW1wbGVtZW50cyBUeXBlQ2hlY2tJbnRlcmZhY2UKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT2JqZWN0KCR2YWx1ZSkKewpyZXR1cm4KaXNfb2JqZWN0KCR2YWx1ZSkgfHwKKGlzX2FycmF5KCR2YWx1ZSkgJiYgKGNvdW50KCR2YWx1ZSkgPT0gMCB8fCBzZWxmOjppc0Fzc29jaWF0aXZlQXJyYXkoJHZhbHVlKSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQXJyYXkoJHZhbHVlKQp7CnJldHVybgppc19hcnJheSgkdmFsdWUpICYmCihjb3VudCgkdmFsdWUpID09IDAgfHwgIXNlbGY6OmlzQXNzb2NpYXRpdmVBcnJheSgkdmFsdWUpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUdldCgkdmFsdWUsICRwcm9wZXJ0eSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuICR2YWx1ZS0+eyRwcm9wZXJ0eX07Cn0KCnJldHVybiAkdmFsdWVbJHByb3BlcnR5XTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eVNldCgmJHZhbHVlLCAkcHJvcGVydHksICRkYXRhKQp7CmlmIChpc19vYmplY3QoJHZhbHVlKSkgewokdmFsdWUtPnskcHJvcGVydHl9ID0gJGRhdGE7Cn0gZWxzZSB7CiR2YWx1ZVskcHJvcGVydHldID0gJGRhdGE7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuIHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSk7Cn0KCnJldHVybiBhcnJheV9rZXlfZXhpc3RzKCRwcm9wZXJ0eSwgJHZhbHVlKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUNvdW50KCR2YWx1ZSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuIGNvdW50KGdldF9vYmplY3RfdmFycygkdmFsdWUpKTsKfQoKcmV0dXJuIGNvdW50KCR2YWx1ZSk7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0Fzc29jaWF0aXZlQXJyYXkoJGFycikKewpyZXR1cm4gYXJyYXlfa2V5cygkYXJyKSAhPT0gcmFuZ2UoMCwgY291bnQoJGFycikgLSAxKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2s7CgpjbGFzcyBTdHJpY3RUeXBlQ2hlY2sgaW1wbGVtZW50cyBUeXBlQ2hlY2tJbnRlcmZhY2UKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT2JqZWN0KCR2YWx1ZSkKewpyZXR1cm4gaXNfb2JqZWN0KCR2YWx1ZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBcnJheSgkdmFsdWUpCnsKcmV0dXJuIGlzX2FycmF5KCR2YWx1ZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlHZXQoJHZhbHVlLCAkcHJvcGVydHkpCnsKcmV0dXJuICR2YWx1ZS0+eyRwcm9wZXJ0eX07Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlTZXQoJiR2YWx1ZSwgJHByb3BlcnR5LCAkZGF0YSkKewokdmFsdWUtPnskcHJvcGVydHl9ID0gJGRhdGE7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkcHJvcGVydHkpCnsKcmV0dXJuIHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlDb3VudCgkdmFsdWUpCnsKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIGNvdW50KGdldF9vYmplY3RfdmFycygkdmFsdWUpKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2s7CgppbnRlcmZhY2UgVHlwZUNoZWNrSW50ZXJmYWNlCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc09iamVjdCgkdmFsdWUpOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0FycmF5KCR2YWx1ZSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5R2V0KCR2YWx1ZSwgJHByb3BlcnR5KTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlTZXQoJiR2YWx1ZSwgJHByb3BlcnR5LCAkZGF0YSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJHByb3BlcnR5KTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlDb3VudCgkdmFsdWUpOwp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gYXMgU3RhbmRhcmRVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBUeXBlQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgc3RhdGljICR3b3JkaW5nID0gYXJyYXkoCidpbnRlZ2VyJyA9PiAnYW4gaW50ZWdlcicsCidudW1iZXInID0+ICdhIG51bWJlcicsCidib29sZWFuJyA9PiAnYSBib29sZWFuJywKJ29iamVjdCcgPT4gJ2FuIG9iamVjdCcsCidhcnJheScgPT4gJ2FuIGFycmF5JywKJ3N0cmluZycgPT4gJ2Egc3RyaW5nJywKJ251bGwnID0+ICdhIG51bGwnLAonYW55JyA9PiBudWxsLCAKMCA9PiBudWxsLCAKKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlID0gbnVsbCwgJHNjaGVtYSA9IG51bGwsIEpzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKQp7CiR0eXBlID0gaXNzZXQoJHNjaGVtYS0+dHlwZSkgPyAkc2NoZW1hLT50eXBlIDogbnVsbDsKJGlzVmFsaWQgPSBmYWxzZTsKJHdvcmRpbmcgPSBhcnJheSgpOwoKaWYgKGlzX2FycmF5KCR0eXBlKSkgewokdGhpcy0+dmFsaWRhdGVUeXBlc0FycmF5KCR2YWx1ZSwgJHR5cGUsICR3b3JkaW5nLCAkaXNWYWxpZCwgJHBhdGgpOwp9IGVsc2VpZiAoaXNfb2JqZWN0KCR0eXBlKSkgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkdHlwZSwgJHBhdGgpOwoKcmV0dXJuOwp9IGVsc2UgewokaXNWYWxpZCA9ICR0aGlzLT52YWxpZGF0ZVR5cGUoJHZhbHVlLCAkdHlwZSk7Cn0KCmlmICgkaXNWYWxpZCA9PT0gZmFsc2UpIHsKaWYgKCFpc19hcnJheSgkdHlwZSkpIHsKJHRoaXMtPnZhbGlkYXRlVHlwZU5hbWVXb3JkaW5nKCR0eXBlKTsKJHdvcmRpbmdbXSA9IHNlbGY6OiR3b3JkaW5nWyR0eXBlXTsKfQokdGhpcy0+YWRkRXJyb3IoJHBhdGgsIHVjd29yZHMoZ2V0dHlwZSgkdmFsdWUpKSAuICcgdmFsdWUgZm91bmQsIGJ1dCAnIC4KJHRoaXMtPmltcGxvZGVXaXRoKCR3b3JkaW5nLCAnLCAnLCAnb3InKSAuICcgaXMgcmVxdWlyZWQnLCAndHlwZScpOwp9Cn0KCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZXNBcnJheSgmJHZhbHVlLCBhcnJheSAkdHlwZSwgJiR2YWxpZFR5cGVzV29yZGluZywgJiRpc1ZhbGlkLCAkcGF0aCkKewpmb3JlYWNoICgkdHlwZSBhcyAkdHApIHsKCgppZiAoaXNfb2JqZWN0KCR0cCkpIHsKaWYgKCEkaXNWYWxpZCkgewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd0eXBlJyk7CiRzdWJTY2hlbWEgPSBuZXcgXHN0ZENsYXNzKCk7CiRzdWJTY2hlbWEtPnR5cGUgPSAkdHA7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHN1YlNjaGVtYSwgJHBhdGgsIG51bGwpOwokZXJyb3IgPSAkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKTsKJGlzVmFsaWQgPSAhKGJvb2wpICRlcnJvcjsKJHZhbGlkVHlwZXNXb3JkaW5nW10gPSBzZWxmOjokd29yZGluZ1snb2JqZWN0J107Cn0KfSBlbHNlIHsKJHRoaXMtPnZhbGlkYXRlVHlwZU5hbWVXb3JkaW5nKCR0cCk7CiR2YWxpZFR5cGVzV29yZGluZ1tdID0gc2VsZjo6JHdvcmRpbmdbJHRwXTsKaWYgKCEkaXNWYWxpZCkgewokaXNWYWxpZCA9ICR0aGlzLT52YWxpZGF0ZVR5cGUoJHZhbHVlLCAkdHApOwp9Cn0KfQp9CgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbXBsb2RlV2l0aChhcnJheSAkZWxlbWVudHMsICRkZWxpbWl0ZXIgPSAnLCAnLCAkbGlzdEVuZCA9IGZhbHNlKQp7CmlmICgkbGlzdEVuZCA9PT0gZmFsc2UgfHwgIWlzc2V0KCRlbGVtZW50c1sxXSkpIHsKcmV0dXJuIGltcGxvZGUoJGRlbGltaXRlciwgJGVsZW1lbnRzKTsKfQokbGFzdEVsZW1lbnQgPSBhcnJheV9zbGljZSgkZWxlbWVudHMsIC0xKTsKJGZpcnNFbGVtZW50cyA9IGpvaW4oJGRlbGltaXRlciwgYXJyYXlfc2xpY2UoJGVsZW1lbnRzLCAwLCAtMSkpOwokaW1wbG9kZWRFbGVtZW50cyA9IGFycmF5X21lcmdlKGFycmF5KCRmaXJzRWxlbWVudHMpLCAkbGFzdEVsZW1lbnQpOwoKcmV0dXJuIGpvaW4oIiAkbGlzdEVuZCAiLCAkaW1wbG9kZWRFbGVtZW50cyk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZU5hbWVXb3JkaW5nKCR0eXBlKQp7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkdHlwZSwgc2VsZjo6JHdvcmRpbmcpKSB7CnRocm93IG5ldyBTdGFuZGFyZFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigKc3ByaW50ZigKJ05vIHdvcmRpbmcgZm9yICVzIGF2YWlsYWJsZSwgZXhwZWN0ZWQgd29yZGluZ3MgYXJlOiBbJXNdJywKdmFyX2V4cG9ydCgkdHlwZSwgdHJ1ZSksCmltcGxvZGUoJywgJywgYXJyYXlfZmlsdGVyKHNlbGY6OiR3b3JkaW5nKSkpCik7Cn0KfQoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGUoJiR2YWx1ZSwgJHR5cGUpCnsKCmlmICghJHR5cGUpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnYW55JyA9PT0gJHR5cGUpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnb2JqZWN0JyA9PT0gJHR5cGUpIHsKcmV0dXJuICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbHVlKTsKfQoKaWYgKCdhcnJheScgPT09ICR0eXBlKSB7CnJldHVybiAkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzQXJyYXkoJHZhbHVlKTsKfQoKJGNvZXJjZSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9DT0VSQ0VfVFlQRVMpOwoKaWYgKCdpbnRlZ2VyJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvSW50ZWdlcigkdmFsdWUpOwp9CgpyZXR1cm4gaXNfaW50KCR2YWx1ZSk7Cn0KCmlmICgnbnVtYmVyJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvTnVtYmVyKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19udW1lcmljKCR2YWx1ZSkgJiYgIWlzX3N0cmluZygkdmFsdWUpOwp9CgppZiAoJ2Jvb2xlYW4nID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9Cb29sZWFuKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19ib29sKCR2YWx1ZSk7Cn0KCmlmICgnc3RyaW5nJyA9PT0gJHR5cGUpIHsKcmV0dXJuIGlzX3N0cmluZygkdmFsdWUpOwp9CgppZiAoJ2VtYWlsJyA9PT0gJHR5cGUpIHsKcmV0dXJuIGlzX3N0cmluZygkdmFsdWUpOwp9CgppZiAoJ251bGwnID09PSAkdHlwZSkgewpyZXR1cm4gaXNfbnVsbCgkdmFsdWUpOwp9Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKChpc19vYmplY3QoJHZhbHVlKSA/ICdvYmplY3QnIDogJHZhbHVlKSAuICcgaXMgYW4gaW52YWxpZCB0eXBlIGZvciAnIC4gJHR5cGUpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvQm9vbGVhbigkdmFsdWUpCnsKaWYgKCR2YWx1ZSA9PT0gJ3RydWUnKSB7CnJldHVybiB0cnVlOwp9CgppZiAoJHZhbHVlID09PSAnZmFsc2UnKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b051bWJlcigkdmFsdWUpCnsKaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewpyZXR1cm4gJHZhbHVlICsgMDsgCn0KCnJldHVybiAkdmFsdWU7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB0b0ludGVnZXIoJHZhbHVlKQp7CmlmIChpc19udW1lcmljKCR2YWx1ZSkgJiYgKGludCkgJHZhbHVlID09ICR2YWx1ZSkgewpyZXR1cm4gKGludCkgJHZhbHVlOyAKfQoKcmV0dXJuICR2YWx1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2tcTG9vc2VUeXBlQ2hlY2s7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXNvbHZlcjsKCgoKCgoKCmNsYXNzIFVuZGVmaW5lZENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRhcHBsaWVkRGVmYXVsdHMgPSBhcnJheSgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCBKc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCwgJGZyb21EZWZhdWx0ID0gZmFsc2UpCnsKaWYgKGlzX251bGwoJHNjaGVtYSkgfHwgIWlzX29iamVjdCgkc2NoZW1hKSkgewpyZXR1cm47Cn0KCiRwYXRoID0gJHRoaXMtPmluY3JlbWVudFBhdGgoJHBhdGggPzogbmV3IEpzb25Qb2ludGVyKCcnKSwgJGkpOwppZiAoJGZyb21EZWZhdWx0KSB7CiRwYXRoLT5zZXRGcm9tRGVmYXVsdCgpOwp9CgoKJHRoaXMtPnZhbGlkYXRlQ29tbW9uUHJvcGVydGllcygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgoKJHRoaXMtPnZhbGlkYXRlT2ZQcm9wZXJ0aWVzKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICcnKTsKCgokdGhpcy0+dmFsaWRhdGVUeXBlcygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZXMoJiR2YWx1ZSwgJHNjaGVtYSwgSnNvblBvaW50ZXIgJHBhdGgsICRpID0gbnVsbCkKewoKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpKSB7CiR0aGlzLT5jaGVja0FycmF5KCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChMb29zZVR5cGVDaGVjazo6aXNPYmplY3QoJHZhbHVlKSkgeyAKCgokdGhpcy0+Y2hlY2tPYmplY3QoCiR2YWx1ZSwKJHNjaGVtYSwKJHBhdGgsCmlzc2V0KCRzY2hlbWEtPnByb3BlcnRpZXMpID8gJHNjaGVtYS0+cHJvcGVydGllcyA6IG51bGwsCmlzc2V0KCRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSA/ICRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzIDogbnVsbCwKaXNzZXQoJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMpID8gJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMgOiBudWxsLAokdGhpcy0+YXBwbGllZERlZmF1bHRzCik7Cn0KCgppZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrU3RyaW5nKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrTnVtYmVyKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5lbnVtKSkgewokdGhpcy0+Y2hlY2tFbnVtKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZUNvbW1vblByb3BlcnRpZXMoJiR2YWx1ZSwgJHNjaGVtYSwgSnNvblBvaW50ZXIgJHBhdGgsICRpID0gJycpCnsKCmlmIChpc3NldCgkc2NoZW1hLT5leHRlbmRzKSkgewppZiAoaXNfc3RyaW5nKCRzY2hlbWEtPmV4dGVuZHMpKSB7CiRzY2hlbWEtPmV4dGVuZHMgPSAkdGhpcy0+dmFsaWRhdGVVcmkoJHNjaGVtYSwgJHNjaGVtYS0+ZXh0ZW5kcyk7Cn0KaWYgKGlzX2FycmF5KCRzY2hlbWEtPmV4dGVuZHMpKSB7CmZvcmVhY2ggKCRzY2hlbWEtPmV4dGVuZHMgYXMgJGV4dGVuZHMpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJGV4dGVuZHMsICRwYXRoLCAkaSk7Cn0KfSBlbHNlIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHNjaGVtYS0+ZXh0ZW5kcywgJHBhdGgsICRpKTsKfQp9CgoKaWYgKCEkcGF0aC0+ZnJvbURlZmF1bHQoKSkgewokdGhpcy0+YXBwbHlEZWZhdWx0VmFsdWVzKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgpOwp9CgoKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbHVlKSkgewppZiAoISgkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSAmJiBpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgJiYgaXNfYXJyYXkoJHNjaGVtYS0+cmVxdWlyZWQpKSB7Cgpmb3JlYWNoICgkc2NoZW1hLT5yZXF1aXJlZCBhcyAkcmVxdWlyZWQpIHsKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJHJlcXVpcmVkKSkgewokdGhpcy0+YWRkRXJyb3IoCiR0aGlzLT5pbmNyZW1lbnRQYXRoKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJyksICRyZXF1aXJlZCksCidUaGUgcHJvcGVydHkgJyAuICRyZXF1aXJlZCAuICcgaXMgcmVxdWlyZWQnLAoncmVxdWlyZWQnCik7Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmICFpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkpIHsKCmlmICgkc2NoZW1hLT5yZXF1aXJlZCAmJiAkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSB7CiRwcm9wZXJ0eVBhdGhzID0gJHBhdGgtPmdldFByb3BlcnR5UGF0aHMoKTsKJHByb3BlcnR5TmFtZSA9IGVuZCgkcHJvcGVydHlQYXRocyk7CiR0aGlzLT5hZGRFcnJvcigKJHBhdGgsCidUaGUgcHJvcGVydHkgJyAuICRwcm9wZXJ0eU5hbWUgLiAnIGlzIHJlcXVpcmVkJywKJ3JlcXVpcmVkJwopOwp9Cn0gZWxzZSB7CgoKaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYpIHsKcmV0dXJuOwp9Cn0KfQoKCmlmICghKCR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYpKSB7CiR0aGlzLT5jaGVja1R5cGUoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPmRpc2FsbG93KSkgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKCiR0eXBlU2NoZW1hID0gbmV3IFxzdGRDbGFzcygpOwokdHlwZVNjaGVtYS0+dHlwZSA9ICRzY2hlbWEtPmRpc2FsbG93OwokdGhpcy0+Y2hlY2tUeXBlKCR2YWx1ZSwgJHR5cGVTY2hlbWEsICRwYXRoKTsKCgppZiAoY291bnQoJHRoaXMtPmdldEVycm9ycygpKSA9PSBjb3VudCgkaW5pdEVycm9ycykpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnRGlzYWxsb3dlZCB2YWx1ZSB3YXMgbWF0Y2hlZCcsICdkaXNhbGxvdycpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJGluaXRFcnJvcnM7Cn0KfQoKaWYgKGlzc2V0KCRzY2hlbWEtPm5vdCkpIHsKJGluaXRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRzY2hlbWEtPm5vdCwgJHBhdGgsICRpKTsKCgppZiAoY291bnQoJHRoaXMtPmdldEVycm9ycygpKSA9PSBjb3VudCgkaW5pdEVycm9ycykpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnTWF0Y2hlZCBhIHNjaGVtYSB3aGljaCBpdCBzaG91bGQgbm90JywgJ25vdCcpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJGluaXRFcnJvcnM7Cn0KfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kZXBlbmRlbmNpZXMpICYmICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbHVlKSkgewokdGhpcy0+dmFsaWRhdGVEZXBlbmRlbmNpZXMoJHZhbHVlLCAkc2NoZW1hLT5kZXBlbmRlbmNpZXMsICRwYXRoKTsKfQp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNob3VsZEFwcGx5RGVmYXVsdFZhbHVlKCRyZXF1aXJlZE9ubHksICRzY2hlbWEsICRuYW1lID0gbnVsbCwgJHBhcmVudFNjaGVtYSA9IG51bGwpCnsKCmlmICghJHJlcXVpcmVkT25seSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKAokbmFtZSAhPT0gbnVsbAomJiBpc3NldCgkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKJiYgaXNfYXJyYXkoJHBhcmVudFNjaGVtYS0+cmVxdWlyZWQpCiYmIGluX2FycmF5KCRuYW1lLCAkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmICFpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkgJiYgJHNjaGVtYS0+cmVxdWlyZWQpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhcHBseURlZmF1bHRWYWx1ZXMoJiR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgpCnsKCmlmICghJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKSkgewpyZXR1cm47Cn0KCgokcmVxdWlyZWRPbmx5ID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX09OTFlfUkVRVUlSRURfREVGQVVMVFMpOwppZiAoaXNzZXQoJHNjaGVtYS0+cHJvcGVydGllcykgJiYgTG9vc2VUeXBlQ2hlY2s6OmlzT2JqZWN0KCR2YWx1ZSkpIHsKCmZvcmVhY2ggKCRzY2hlbWEtPnByb3BlcnRpZXMgYXMgJGN1cnJlbnRQcm9wZXJ0eSA9PiAkcHJvcGVydHlEZWZpbml0aW9uKSB7CiRwcm9wZXJ0eURlZmluaXRpb24gPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5yZXNvbHZlUmVmU2NoZW1hKCRwcm9wZXJ0eURlZmluaXRpb24pOwppZiAoCiFMb29zZVR5cGVDaGVjazo6cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkY3VycmVudFByb3BlcnR5KQomJiBwcm9wZXJ0eV9leGlzdHMoJHByb3BlcnR5RGVmaW5pdGlvbiwgJ2RlZmF1bHQnKQomJiAkdGhpcy0+c2hvdWxkQXBwbHlEZWZhdWx0VmFsdWUoJHJlcXVpcmVkT25seSwgJHByb3BlcnR5RGVmaW5pdGlvbiwgJGN1cnJlbnRQcm9wZXJ0eSwgJHNjaGVtYSkKKSB7CgppZiAoaXNfb2JqZWN0KCRwcm9wZXJ0eURlZmluaXRpb24tPmRlZmF1bHQpKSB7Ckxvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eVNldCgkdmFsdWUsICRjdXJyZW50UHJvcGVydHksIGNsb25lICRwcm9wZXJ0eURlZmluaXRpb24tPmRlZmF1bHQpOwp9IGVsc2UgewpMb29zZVR5cGVDaGVjazo6cHJvcGVydHlTZXQoJHZhbHVlLCAkY3VycmVudFByb3BlcnR5LCAkcHJvcGVydHlEZWZpbml0aW9uLT5kZWZhdWx0KTsKfQokdGhpcy0+YXBwbGllZERlZmF1bHRzW10gPSAkY3VycmVudFByb3BlcnR5Owp9Cn0KfSBlbHNlaWYgKGlzc2V0KCRzY2hlbWEtPml0ZW1zKSAmJiBMb29zZVR5cGVDaGVjazo6aXNBcnJheSgkdmFsdWUpKSB7CiRpdGVtcyA9IGFycmF5KCk7CmlmIChMb29zZVR5cGVDaGVjazo6aXNBcnJheSgkc2NoZW1hLT5pdGVtcykpIHsKJGl0ZW1zID0gJHNjaGVtYS0+aXRlbXM7Cn0gZWxzZWlmIChpc3NldCgkc2NoZW1hLT5taW5JdGVtcykgJiYgY291bnQoJHZhbHVlKSA8ICRzY2hlbWEtPm1pbkl0ZW1zKSB7CiRpdGVtcyA9IGFycmF5X2ZpbGwoY291bnQoJHZhbHVlKSwgJHNjaGVtYS0+bWluSXRlbXMgLSBjb3VudCgkdmFsdWUpLCAkc2NoZW1hLT5pdGVtcyk7Cn0KCmZvcmVhY2ggKCRpdGVtcyBhcyAkY3VycmVudEl0ZW0gPT4gJGl0ZW1EZWZpbml0aW9uKSB7CiRpdGVtRGVmaW5pdGlvbiA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPnJlc29sdmVSZWZTY2hlbWEoJGl0ZW1EZWZpbml0aW9uKTsKaWYgKAohYXJyYXlfa2V5X2V4aXN0cygkY3VycmVudEl0ZW0sICR2YWx1ZSkKJiYgcHJvcGVydHlfZXhpc3RzKCRpdGVtRGVmaW5pdGlvbiwgJ2RlZmF1bHQnKQomJiAkdGhpcy0+c2hvdWxkQXBwbHlEZWZhdWx0VmFsdWUoJHJlcXVpcmVkT25seSwgJGl0ZW1EZWZpbml0aW9uKSkgewppZiAoaXNfb2JqZWN0KCRpdGVtRGVmaW5pdGlvbi0+ZGVmYXVsdCkpIHsKJHZhbHVlWyRjdXJyZW50SXRlbV0gPSBjbG9uZSAkaXRlbURlZmluaXRpb24tPmRlZmF1bHQ7Cn0gZWxzZSB7CiR2YWx1ZVskY3VycmVudEl0ZW1dID0gJGl0ZW1EZWZpbml0aW9uLT5kZWZhdWx0Owp9Cn0KJHBhdGgtPnNldEZyb21EZWZhdWx0KCk7Cn0KfSBlbHNlaWYgKAokdmFsdWUgaW5zdGFuY2VvZiBzZWxmCiYmIHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZGVmYXVsdCcpCiYmICR0aGlzLT5zaG91bGRBcHBseURlZmF1bHRWYWx1ZSgkcmVxdWlyZWRPbmx5LCAkc2NoZW1hKSkgewoKJHZhbHVlID0gaXNfb2JqZWN0KCRzY2hlbWEtPmRlZmF1bHQpID8gY2xvbmUgJHNjaGVtYS0+ZGVmYXVsdCA6ICRzY2hlbWEtPmRlZmF1bHQ7CiRwYXRoLT5zZXRGcm9tRGVmYXVsdCgpOwp9Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlT2ZQcm9wZXJ0aWVzKCYkdmFsdWUsICRzY2hlbWEsIEpzb25Qb2ludGVyICRwYXRoLCAkaSA9ICcnKQp7CgppZiAoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikgewpyZXR1cm47Cn0KCmlmIChpc3NldCgkc2NoZW1hLT5hbGxPZikpIHsKJGlzVmFsaWQgPSB0cnVlOwpmb3JlYWNoICgkc2NoZW1hLT5hbGxPZiBhcyAkYWxsT2YpIHsKJGluaXRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRhbGxPZiwgJHBhdGgsICRpKTsKJGlzVmFsaWQgPSAkaXNWYWxpZCAmJiAoY291bnQoJHRoaXMtPmdldEVycm9ycygpKSA9PSBjb3VudCgkaW5pdEVycm9ycykpOwp9CmlmICghJGlzVmFsaWQpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnRmFpbGVkIHRvIG1hdGNoIGFsbCBzY2hlbWFzJywgJ2FsbE9mJyk7Cn0KfQoKaWYgKGlzc2V0KCRzY2hlbWEtPmFueU9mKSkgewokaXNWYWxpZCA9IGZhbHNlOwokc3RhcnRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiRjYXVnaHRFeGNlcHRpb24gPSBudWxsOwpmb3JlYWNoICgkc2NoZW1hLT5hbnlPZiBhcyAkYW55T2YpIHsKJGluaXRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CnRyeSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRhbnlPZiwgJHBhdGgsICRpKTsKaWYgKCRpc1ZhbGlkID0gKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT0gY291bnQoJGluaXRFcnJvcnMpKSkgewpicmVhazsKfQp9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uICRlKSB7CiRpc1ZhbGlkID0gZmFsc2U7Cn0KfQppZiAoISRpc1ZhbGlkKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgJ0ZhaWxlZCB0byBtYXRjaCBhdCBsZWFzdCBvbmUgc2NoZW1hJywgJ2FueU9mJyk7Cn0gZWxzZSB7CiR0aGlzLT5lcnJvcnMgPSAkc3RhcnRFcnJvcnM7Cn0KfQoKaWYgKGlzc2V0KCRzY2hlbWEtPm9uZU9mKSkgewokYWxsRXJyb3JzID0gYXJyYXkoKTsKJG1hdGNoZWRTY2hlbWFzID0gMDsKJHN0YXJ0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwpmb3JlYWNoICgkc2NoZW1hLT5vbmVPZiBhcyAkb25lT2YpIHsKdHJ5IHsKJHRoaXMtPmVycm9ycyA9IGFycmF5KCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRvbmVPZiwgJHBhdGgsICRpKTsKaWYgKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT0gMCkgewokbWF0Y2hlZFNjaGVtYXMrKzsKfQokYWxsRXJyb3JzID0gYXJyYXlfbWVyZ2UoJGFsbEVycm9ycywgYXJyYXlfdmFsdWVzKCR0aGlzLT5nZXRFcnJvcnMoKSkpOwp9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uICRlKSB7CgoKfQp9CmlmICgkbWF0Y2hlZFNjaGVtYXMgIT09IDEpIHsKJHRoaXMtPmFkZEVycm9ycyhhcnJheV9tZXJnZSgkYWxsRXJyb3JzLCAkc3RhcnRFcnJvcnMpKTsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAnRmFpbGVkIHRvIG1hdGNoIGV4YWN0bHkgb25lIHNjaGVtYScsICdvbmVPZicpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJHN0YXJ0RXJyb3JzOwp9Cn0KfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMoJHZhbHVlLCAkZGVwZW5kZW5jaWVzLCBKc29uUG9pbnRlciAkcGF0aCwgJGkgPSAnJykKewpmb3JlYWNoICgkZGVwZW5kZW5jaWVzIGFzICRrZXkgPT4gJGRlcGVuZGVuY3kpIHsKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAka2V5KSkgewppZiAoaXNfc3RyaW5nKCRkZXBlbmRlbmN5KSkgewoKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJGRlcGVuZGVuY3kpKSB7CiR0aGlzLT5hZGRFcnJvcigkcGF0aCwgIiRrZXkgZGVwZW5kcyBvbiAkZGVwZW5kZW5jeSBhbmQgJGRlcGVuZGVuY3kgaXMgbWlzc2luZyIsICdkZXBlbmRlbmNpZXMnKTsKfQp9IGVsc2VpZiAoaXNfYXJyYXkoJGRlcGVuZGVuY3kpKSB7Cgpmb3JlYWNoICgkZGVwZW5kZW5jeSBhcyAkZCkgewppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkZCkpIHsKJHRoaXMtPmFkZEVycm9yKCRwYXRoLCAiJGtleSBkZXBlbmRzIG9uICRkIGFuZCAkZCBpcyBtaXNzaW5nIiwgJ2RlcGVuZGVuY2llcycpOwp9Cn0KfSBlbHNlaWYgKGlzX29iamVjdCgkZGVwZW5kZW5jeSkpIHsKCiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRkZXBlbmRlbmN5LCAkcGF0aCwgJGkpOwp9Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVVcmkoJHNjaGVtYSwgJHNjaGVtYVVyaSA9IG51bGwpCnsKJHJlc29sdmVyID0gbmV3IFVyaVJlc29sdmVyKCk7CiRyZXRyaWV2ZXIgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0VXJpUmV0cmlldmVyKCk7CgokanNvblNjaGVtYSA9IG51bGw7CmlmICgkcmVzb2x2ZXItPmlzVmFsaWQoJHNjaGVtYVVyaSkpIHsKJHNjaGVtYUlkID0gcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpZCcpID8gJHNjaGVtYS0+aWQgOiBudWxsOwokanNvblNjaGVtYSA9ICRyZXRyaWV2ZXItPnJldHJpZXZlKCRzY2hlbWFJZCwgJHNjaGVtYVVyaSk7Cn0KCnJldHVybiAkanNvblNjaGVtYTsKfQp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRW50aXR5OwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSnNvblBvaW50ZXIKewoKcHJpdmF0ZSAkZmlsZW5hbWU7CgoKcHJpdmF0ZSAkcHJvcGVydHlQYXRocyA9IGFycmF5KCk7CgoKCgpwcml2YXRlICRmcm9tRGVmYXVsdCA9IGZhbHNlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhbHVlKQp7CmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUmVmIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTsKfQoKJHNwbGl0UmVmID0gZXhwbG9kZSgnIycsICR2YWx1ZSwgMik7CiR0aGlzLT5maWxlbmFtZSA9ICRzcGxpdFJlZlswXTsKaWYgKGFycmF5X2tleV9leGlzdHMoMSwgJHNwbGl0UmVmKSkgewokdGhpcy0+cHJvcGVydHlQYXRocyA9ICR0aGlzLT5kZWNvZGVQcm9wZXJ0eVBhdGhzKCRzcGxpdFJlZlsxXSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlY29kZVByb3BlcnR5UGF0aHMoJHByb3BlcnR5UGF0aFN0cmluZykKewokcGF0aHMgPSBhcnJheSgpOwpmb3JlYWNoIChleHBsb2RlKCcvJywgdHJpbSgkcHJvcGVydHlQYXRoU3RyaW5nLCAnLycpKSBhcyAkcGF0aCkgewokcGF0aCA9ICR0aGlzLT5kZWNvZGVQYXRoKCRwYXRoKTsKaWYgKGlzX3N0cmluZygkcGF0aCkgJiYgJycgIT09ICRwYXRoKSB7CiRwYXRoc1tdID0gJHBhdGg7Cn0KfQoKcmV0dXJuICRwYXRoczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQcm9wZXJ0eVBhdGhzKCkKewpyZXR1cm4gYXJyYXlfbWFwKAphcnJheSgkdGhpcywgJ2VuY29kZVBhdGgnKSwKJHRoaXMtPmdldFByb3BlcnR5UGF0aHMoKQopOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZGVjb2RlUGF0aCgkcGF0aCkKewpyZXR1cm4gc3RydHIoJHBhdGgsIGFycmF5KCd+MScgPT4gJy8nLCAnfjAnID0+ICd+JywgJyUyNScgPT4gJyUnKSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQYXRoKCRwYXRoKQp7CnJldHVybiBzdHJ0cigkcGF0aCwgYXJyYXkoJy8nID0+ICd+MScsICd+JyA9PiAnfjAnLCAnJScgPT4gJyUyNScpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lKCkKewpyZXR1cm4gJHRoaXMtPmZpbGVuYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvcGVydHlQYXRocygpCnsKcmV0dXJuICR0aGlzLT5wcm9wZXJ0eVBhdGhzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoUHJvcGVydHlQYXRocyhhcnJheSAkcHJvcGVydHlQYXRocykKewokbmV3ID0gY2xvbmUgJHRoaXM7CiRuZXctPnByb3BlcnR5UGF0aHMgPSAkcHJvcGVydHlQYXRoczsKCnJldHVybiAkbmV3Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvcGVydHlQYXRoQXNTdHJpbmcoKQp7CnJldHVybiBydHJpbSgnIy8nIC4gaW1wbG9kZSgnLycsICR0aGlzLT5lbmNvZGVQcm9wZXJ0eVBhdGhzKCkpLCAnLycpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuICR0aGlzLT5nZXRGaWxlbmFtZSgpIC4gJHRoaXMtPmdldFByb3BlcnR5UGF0aEFzU3RyaW5nKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGcm9tRGVmYXVsdCgpCnsKJHRoaXMtPmZyb21EZWZhdWx0ID0gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZnJvbURlZmF1bHQoKQp7CnJldHVybiAkdGhpcy0+ZnJvbURlZmF1bHQ7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKaW50ZXJmYWNlIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRDb25maWdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRTY2hlbWFFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRTb3VyY2VVcmlFeGNlcHRpb24gZXh0ZW5kcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSnNvbkRlY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkY29kZSA9IEpTT05fRVJST1JfTk9ORSwgXEV4Y2VwdGlvbiAkcHJldmlvdXMgPSBudWxsKQp7CnN3aXRjaCAoJGNvZGUpIHsKY2FzZSBKU09OX0VSUk9SX0RFUFRIOgokbWVzc2FnZSA9ICdUaGUgbWF4aW11bSBzdGFjayBkZXB0aCBoYXMgYmVlbiBleGNlZWRlZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfU1RBVEVfTUlTTUFUQ0g6CiRtZXNzYWdlID0gJ0ludmFsaWQgb3IgbWFsZm9ybWVkIEpTT04nOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX0NUUkxfQ0hBUjoKJG1lc3NhZ2UgPSAnQ29udHJvbCBjaGFyYWN0ZXIgZXJyb3IsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1VURjg6CiRtZXNzYWdlID0gJ01hbGZvcm1lZCBVVEYtOCBjaGFyYWN0ZXJzLCBwb3NzaWJseSBpbmNvcnJlY3RseSBlbmNvZGVkJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9TWU5UQVg6CiRtZXNzYWdlID0gJ0pTT04gc3ludGF4IGlzIG1hbGZvcm1lZCc7CmJyZWFrOwpkZWZhdWx0OgokbWVzc2FnZSA9ICdTeW50YXggZXJyb3InOwp9CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwp9Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbiBleHRlbmRzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBVcmlSZXNvbHZlckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKY2xhc3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcSXRlcmF0b3I7CgoKCgoKCmNsYXNzIE9iamVjdEl0ZXJhdG9yIGltcGxlbWVudHMgXEl0ZXJhdG9yLCBcQ291bnRhYmxlCnsKCnByaXZhdGUgJG9iamVjdDsKCgpwcml2YXRlICRwb3NpdGlvbiA9IDA7CgoKcHJpdmF0ZSAkZGF0YSA9IGFycmF5KCk7CgoKcHJpdmF0ZSAkaW5pdGlhbGl6ZWQgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb2JqZWN0KQp7CiR0aGlzLT5vYmplY3QgPSAkb2JqZWN0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3VycmVudCgpCnsKJHRoaXMtPmluaXRpYWxpemUoKTsKCnJldHVybiAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbmV4dCgpCnsKJHRoaXMtPmluaXRpYWxpemUoKTsKJHRoaXMtPnBvc2l0aW9uKys7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBrZXkoKQp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPnBvc2l0aW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKQp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKQp7CiR0aGlzLT5pbml0aWFsaXplKCk7CiR0aGlzLT5wb3NpdGlvbiA9IDA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpCnsKJHRoaXMtPmluaXRpYWxpemUoKTsKCnJldHVybiBjb3VudCgkdGhpcy0+ZGF0YSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKaWYgKCEkdGhpcy0+aW5pdGlhbGl6ZWQpIHsKJHRoaXMtPmRhdGEgPSAkdGhpcy0+YnVpbGREYXRhRnJvbU9iamVjdCgkdGhpcy0+b2JqZWN0KTsKJHRoaXMtPmluaXRpYWxpemVkID0gdHJ1ZTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYnVpbGREYXRhRnJvbU9iamVjdCgkb2JqZWN0KQp7CiRyZXN1bHQgPSBhcnJheSgpOwoKJHN0YWNrID0gbmV3IFxTcGxTdGFjaygpOwokc3RhY2stPnB1c2goJG9iamVjdCk7Cgp3aGlsZSAoISRzdGFjay0+aXNFbXB0eSgpKSB7CiRjdXJyZW50ID0gJHN0YWNrLT5wb3AoKTsKaWYgKGlzX29iamVjdCgkY3VycmVudCkpIHsKYXJyYXlfcHVzaCgkcmVzdWx0LCAkY3VycmVudCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXREYXRhRnJvbUl0ZW0oJGN1cnJlbnQpIGFzICRwcm9wZXJ0eU5hbWUgPT4gJHByb3BlcnR5VmFsdWUpIHsKaWYgKGlzX29iamVjdCgkcHJvcGVydHlWYWx1ZSkgfHwgaXNfYXJyYXkoJHByb3BlcnR5VmFsdWUpKSB7CiRzdGFjay0+cHVzaCgkcHJvcGVydHlWYWx1ZSk7Cn0KfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERhdGFGcm9tSXRlbSgkaXRlbSkKewppZiAoIWlzX29iamVjdCgkaXRlbSkgJiYgIWlzX2FycmF5KCRpdGVtKSkgewpyZXR1cm4gYXJyYXkoKTsKfQoKcmV0dXJuIGlzX29iamVjdCgkaXRlbSkgPyBnZXRfb2JqZWN0X3ZhcnMoJGl0ZW0pIDogJGl0ZW07Cn0KfQo8P3BocAoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgpjbGFzcyBSZmMzMzM5CnsKY29uc3QgUkVHRVggPSAnL14oXGR7NH0tXGR7Mn0tXGR7Mn1bVCBdezF9XGR7Mn06XGR7Mn06XGR7Mn0pKFwuXGQrKT8oWnwoWystXVxkezJ9KTo/KFxkezJ9KSkkLyc7CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tU3RyaW5nKCRzdHJpbmcpCnsKaWYgKCFwcmVnX21hdGNoKHNlbGY6OlJFR0VYLCBzdHJ0b3VwcGVyKCRzdHJpbmcpLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCiRkYXRlQW5kVGltZSA9ICRtYXRjaGVzWzFdOwokbWljcm9zZWNvbmRzID0gJG1hdGNoZXNbMl0gPzogJy4wMDAwMDAnOwokdGltZVpvbmUgPSAnWicgIT09ICRtYXRjaGVzWzNdID8gJG1hdGNoZXNbNF0gLiAnOicgLiAkbWF0Y2hlc1s1XSA6ICcrMDA6MDAnOwokZGF0ZUZvcm1hdCA9IHN0cnBvcygkZGF0ZUFuZFRpbWUsICdUJykgPT09IGZhbHNlID8gJ1ktbS1kIEg6aTpzLnVQJyA6ICdZLW0tZFxUSDppOnMudVAnOwokZGF0ZVRpbWUgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJGRhdGVGb3JtYXQsICRkYXRlQW5kVGltZSAuICRtaWNyb3NlY29uZHMgLiAkdGltZVpvbmUsIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7CgpyZXR1cm4gJGRhdGVUaW1lID86IG51bGw7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIEpzb25TY2hlbWE7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xCYXNlQ29uc3RyYWludDsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXNvbHZlcjsKdXNlIEpzb25TY2hlbWFcVXJpXFVyaVJldHJpZXZlcjsKCmNsYXNzIFNjaGVtYVN0b3JhZ2UgaW1wbGVtZW50cyBTY2hlbWFTdG9yYWdlSW50ZXJmYWNlCnsKY29uc3QgSU5URVJOQUxfUFJPVklERURfU0NIRU1BX1VSSSA9ICdpbnRlcm5hbDovL3Byb3ZpZGVkLXNjaGVtYS8nOwoKcHJvdGVjdGVkICR1cmlSZXRyaWV2ZXI7CnByb3RlY3RlZCAkdXJpUmVzb2x2ZXI7CnByb3RlY3RlZCAkc2NoZW1hcyA9IGFycmF5KCk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoClVyaVJldHJpZXZlckludGVyZmFjZSAkdXJpUmV0cmlldmVyID0gbnVsbCwKVXJpUmVzb2x2ZXJJbnRlcmZhY2UgJHVyaVJlc29sdmVyID0gbnVsbAopIHsKJHRoaXMtPnVyaVJldHJpZXZlciA9ICR1cmlSZXRyaWV2ZXIgPzogbmV3IFVyaVJldHJpZXZlcigpOwokdGhpcy0+dXJpUmVzb2x2ZXIgPSAkdXJpUmVzb2x2ZXIgPzogbmV3IFVyaVJlc29sdmVyKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKQp7CnJldHVybiAkdGhpcy0+dXJpUmV0cmlldmVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJpUmVzb2x2ZXIoKQp7CnJldHVybiAkdGhpcy0+dXJpUmVzb2x2ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTY2hlbWEoJGlkLCAkc2NoZW1hID0gbnVsbCkKewppZiAoaXNfbnVsbCgkc2NoZW1hKSAmJiAkaWQgIT09IHNlbGY6OklOVEVSTkFMX1BST1ZJREVEX1NDSEVNQV9VUkkpIHsKCgoKJHNjaGVtYSA9ICR0aGlzLT51cmlSZXRyaWV2ZXItPnJldHJpZXZlKCRpZCk7Cn0KCgppZiAoaXNfYXJyYXkoJHNjaGVtYSkpIHsKJHNjaGVtYSA9IEJhc2VDb25zdHJhaW50OjphcnJheVRvT2JqZWN0UmVjdXJzaXZlKCRzY2hlbWEpOwp9CgoKCmlmIChpc19vYmplY3QoJHNjaGVtYSkgJiYgcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpZCcpKSB7CmlmICgkc2NoZW1hLT5pZCA9PSAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjJykgewokc2NoZW1hLT5wcm9wZXJ0aWVzLT5pZC0+Zm9ybWF0ID0gJ3VyaS1yZWZlcmVuY2UnOwp9IGVsc2VpZiAoJHNjaGVtYS0+aWQgPT0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIycpIHsKJHNjaGVtYS0+cHJvcGVydGllcy0+aWQtPmZvcm1hdCA9ICd1cmktcmVmZXJlbmNlJzsKJHNjaGVtYS0+cHJvcGVydGllcy0+eyckcmVmJ30tPmZvcm1hdCA9ICd1cmktcmVmZXJlbmNlJzsKfQp9CgoKJHRoaXMtPmV4cGFuZFJlZnMoJHNjaGVtYSwgJGlkKTsKCiR0aGlzLT5zY2hlbWFzWyRpZF0gPSAkc2NoZW1hOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4cGFuZFJlZnMoJiRzY2hlbWEsICRiYXNlID0gbnVsbCkKewppZiAoIWlzX29iamVjdCgkc2NoZW1hKSkgewppZiAoaXNfYXJyYXkoJHNjaGVtYSkpIHsKZm9yZWFjaCAoJHNjaGVtYSBhcyAmJG1lbWJlcikgewokdGhpcy0+ZXhwYW5kUmVmcygkbWVtYmVyLCAkYmFzZSk7Cn0KfQoKcmV0dXJuOwp9CgppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpZCcpICYmIGlzX3N0cmluZygkc2NoZW1hLT5pZCkgJiYgJGJhc2UgIT0gJHNjaGVtYS0+aWQpIHsKJGJhc2UgPSAkdGhpcy0+dXJpUmVzb2x2ZXItPnJlc29sdmUoJHNjaGVtYS0+aWQsICRiYXNlKTsKfQoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnJHJlZicpICYmIGlzX3N0cmluZygkc2NoZW1hLT57JyRyZWYnfSkpIHsKJHJlZlBvaW50ZXIgPSBuZXcgSnNvblBvaW50ZXIoJHRoaXMtPnVyaVJlc29sdmVyLT5yZXNvbHZlKCRzY2hlbWEtPnsnJHJlZid9LCAkYmFzZSkpOwokc2NoZW1hLT57JyRyZWYnfSA9IChzdHJpbmcpICRyZWZQb2ludGVyOwp9Cgpmb3JlYWNoICgkc2NoZW1hIGFzICYkbWVtYmVyKSB7CiR0aGlzLT5leHBhbmRSZWZzKCRtZW1iZXIsICRiYXNlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NoZW1hKCRpZCkKewppZiAoIWFycmF5X2tleV9leGlzdHMoJGlkLCAkdGhpcy0+c2NoZW1hcykpIHsKJHRoaXMtPmFkZFNjaGVtYSgkaWQpOwp9CgpyZXR1cm4gJHRoaXMtPnNjaGVtYXNbJGlkXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmVSZWYoJHJlZikKewokanNvblBvaW50ZXIgPSBuZXcgSnNvblBvaW50ZXIoJHJlZik7CgoKJGZpbGVOYW1lID0gJGpzb25Qb2ludGVyLT5nZXRGaWxlbmFtZSgpOwppZiAoIXN0cmxlbigkZmlsZU5hbWUpKSB7CnRocm93IG5ldyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbihzcHJpbnRmKAoiQ291bGQgbm90IHJlc29sdmUgZnJhZ21lbnQgJyVzJzogbm8gZmlsZSBpcyBkZWZpbmVkIiwKJGpzb25Qb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhBc1N0cmluZygpCikpOwp9CgoKJHJlZlNjaGVtYSA9ICR0aGlzLT5nZXRTY2hlbWEoJGZpbGVOYW1lKTsKZm9yZWFjaCAoJGpzb25Qb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhzKCkgYXMgJHBhdGgpIHsKaWYgKGlzX29iamVjdCgkcmVmU2NoZW1hKSAmJiBwcm9wZXJ0eV9leGlzdHMoJHJlZlNjaGVtYSwgJHBhdGgpKSB7CiRyZWZTY2hlbWEgPSAkdGhpcy0+cmVzb2x2ZVJlZlNjaGVtYSgkcmVmU2NoZW1hLT57JHBhdGh9KTsKfSBlbHNlaWYgKGlzX2FycmF5KCRyZWZTY2hlbWEpICYmIGFycmF5X2tleV9leGlzdHMoJHBhdGgsICRyZWZTY2hlbWEpKSB7CiRyZWZTY2hlbWEgPSAkdGhpcy0+cmVzb2x2ZVJlZlNjaGVtYSgkcmVmU2NoZW1hWyRwYXRoXSk7Cn0gZWxzZSB7CnRocm93IG5ldyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbihzcHJpbnRmKAonRmlsZTogJXMgaXMgZm91bmQsIGJ1dCBjb3VsZCBub3QgcmVzb2x2ZSBmcmFnbWVudDogJXMnLAokanNvblBvaW50ZXItPmdldEZpbGVuYW1lKCksCiRqc29uUG9pbnRlci0+Z2V0UHJvcGVydHlQYXRoQXNTdHJpbmcoKQopKTsKfQp9CgpyZXR1cm4gJHJlZlNjaGVtYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmVSZWZTY2hlbWEoJHJlZlNjaGVtYSkKewppZiAoaXNfb2JqZWN0KCRyZWZTY2hlbWEpICYmIHByb3BlcnR5X2V4aXN0cygkcmVmU2NoZW1hLCAnJHJlZicpICYmIGlzX3N0cmluZygkcmVmU2NoZW1hLT57JyRyZWYnfSkpIHsKJG5ld1NjaGVtYSA9ICR0aGlzLT5yZXNvbHZlUmVmKCRyZWZTY2hlbWEtPnsnJHJlZid9KTsKJHJlZlNjaGVtYSA9IChvYmplY3QpIChnZXRfb2JqZWN0X3ZhcnMoJHJlZlNjaGVtYSkgKyBnZXRfb2JqZWN0X3ZhcnMoJG5ld1NjaGVtYSkpOwp1bnNldCgkcmVmU2NoZW1hLT57JyRyZWYnfSk7Cn0KCnJldHVybiAkcmVmU2NoZW1hOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKaW50ZXJmYWNlIFNjaGVtYVN0b3JhZ2VJbnRlcmZhY2UKewoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU2NoZW1hKCRpZCwgJHNjaGVtYSA9IG51bGwpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWEoJGlkKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVJlZigkcmVmKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVJlZlNjaGVtYSgkcmVmU2NoZW1hKTsKfQo8P3BocAoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyczsKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmV0cmlldmVyIGltcGxlbWVudHMgVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKCgpwcm90ZWN0ZWQgJGNvbnRlbnRUeXBlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudFR5cGUoKQp7CnJldHVybiAkdGhpcy0+Y29udGVudFR5cGU7Cn0KfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgoKY2xhc3MgQ3VybCBleHRlbmRzIEFic3RyYWN0UmV0cmlldmVyCnsKcHJvdGVjdGVkICRtZXNzYWdlQm9keTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignY1VSTCBub3QgaW5zdGFsbGVkJyk7IAp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpCnsKJGNoID0gY3VybF9pbml0KCk7CgpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJpKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgdHJ1ZSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgnQWNjZXB0OiAnIC4gVmFsaWRhdG9yOjpTQ0hFTUFfTUVESUFfVFlQRSkpOwoKJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CmlmIChmYWxzZSA9PT0gJHJlc3BvbnNlKSB7CnRocm93IG5ldyBcSnNvblNjaGVtYVxFeGNlcHRpb25cUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbignSlNPTiBzY2hlbWEgbm90IGZvdW5kJyk7Cn0KCiR0aGlzLT5mZXRjaE1lc3NhZ2VCb2R5KCRyZXNwb25zZSk7CiR0aGlzLT5mZXRjaENvbnRlbnRUeXBlKCRyZXNwb25zZSk7CgpjdXJsX2Nsb3NlKCRjaCk7CgpyZXR1cm4gJHRoaXMtPm1lc3NhZ2VCb2R5Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZldGNoTWVzc2FnZUJvZHkoJHJlc3BvbnNlKQp7CnByZWdfbWF0Y2goIi8oPzpcclxuKXsyfSguKikkL21zIiwgJHJlc3BvbnNlLCAkbWF0Y2gpOwokdGhpcy0+bWVzc2FnZUJvZHkgPSAkbWF0Y2hbMV07Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoQ29udGVudFR5cGUoJHJlc3BvbnNlKQp7CmlmICgwIDwgcHJlZ19tYXRjaCgiL0NvbnRlbnQtVHlwZTooXFYqKS9pbXMiLCAkcmVzcG9uc2UsICRtYXRjaCkpIHsKJHRoaXMtPmNvbnRlbnRUeXBlID0gdHJpbSgkbWF0Y2hbMV0pOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwCgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgRmlsZUdldENvbnRlbnRzIGV4dGVuZHMgQWJzdHJhY3RSZXRyaWV2ZXIKewpwcm90ZWN0ZWQgJG1lc3NhZ2VCb2R5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSkKewokZXJyb3JNZXNzYWdlID0gbnVsbDsKc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKCRlcnJubywgJGVycnN0cikgdXNlICgmJGVycm9yTWVzc2FnZSkgewokZXJyb3JNZXNzYWdlID0gJGVycnN0cjsKfSk7CiRyZXNwb25zZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmkpOwpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCmlmICgkZXJyb3JNZXNzYWdlKSB7CnRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCRlcnJvck1lc3NhZ2UpOwp9CgppZiAoZmFsc2UgPT09ICRyZXNwb25zZSkgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbignSlNPTiBzY2hlbWEgbm90IGZvdW5kIGF0ICcgLiAkdXJpKTsKfQoKaWYgKCRyZXNwb25zZSA9PSAnJwomJiBzdWJzdHIoJHVyaSwgMCwgNykgPT0gJ2ZpbGU6Ly8nICYmIHN1YnN0cigkdXJpLCAtMSkgPT0gJy8nCikgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbignSlNPTiBzY2hlbWEgbm90IGZvdW5kIGF0ICcgLiAkdXJpKTsKfQoKJHRoaXMtPm1lc3NhZ2VCb2R5ID0gJHJlc3BvbnNlOwppZiAoIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlcikpIHsKCgokdGhpcy0+ZmV0Y2hDb250ZW50VHlwZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIpOyAKfSBlbHNlIHsgCgokdGhpcy0+Y29udGVudFR5cGUgPSBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPm1lc3NhZ2VCb2R5Owp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmV0Y2hDb250ZW50VHlwZShhcnJheSAkaGVhZGVycykKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmICgkdGhpcy0+Y29udGVudFR5cGUgPSBzZWxmOjpnZXRDb250ZW50VHlwZU1hdGNoSW5IZWFkZXIoJGhlYWRlcikpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGVudFR5cGVNYXRjaEluSGVhZGVyKCRoZWFkZXIpCnsKaWYgKDAgPCBwcmVnX21hdGNoKCIvQ29udGVudC1UeXBlOihcViopL2ltcyIsICRoZWFkZXIsICRtYXRjaCkpIHsKcmV0dXJuIHRyaW0oJG1hdGNoWzFdKTsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7Cgp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCgoKCgoKCgpjbGFzcyBQcmVkZWZpbmVkQXJyYXkgZXh0ZW5kcyBBYnN0cmFjdFJldHJpZXZlcgp7CgoKCgoKcHJpdmF0ZSAkc2NoZW1hczsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc2NoZW1hcywgJGNvbnRlbnRUeXBlID0gVmFsaWRhdG9yOjpTQ0hFTUFfTUVESUFfVFlQRSkKewokdGhpcy0+c2NoZW1hcyA9ICRzY2hlbWFzOwokdGhpcy0+Y29udGVudFR5cGUgPSAkY29udGVudFR5cGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpCnsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCR1cmksICR0aGlzLT5zY2hlbWFzKSkgewp0aHJvdyBuZXcgXEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZigKJ1RoZSBKU09OIHNjaGVtYSAiJXMiIHdhcyBub3QgZm91bmQuJywKJHVyaQopKTsKfQoKcmV0dXJuICR0aGlzLT5zY2hlbWFzWyR1cmldOwp9Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyczsKCgoKCgoKaW50ZXJmYWNlIFVyaVJldHJpZXZlckludGVyZmFjZQp7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZSgkdXJpKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlKCk7Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmk7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVXJpUmVzb2x2ZXJFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVJlc29sdmVySW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBVcmlSZXNvbHZlciBpbXBsZW1lbnRzIFVyaVJlc29sdmVySW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZSgkdXJpKQp7CnByZWdfbWF0Y2goJ3xeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT98JywgJHVyaSwgJG1hdGNoKTsKCiRjb21wb25lbnRzID0gYXJyYXkoKTsKaWYgKDUgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzID0gYXJyYXkoCidzY2hlbWUnID0+ICRtYXRjaFsyXSwKJ2F1dGhvcml0eScgPT4gJG1hdGNoWzRdLAoncGF0aCcgPT4gJG1hdGNoWzVdCik7Cn0KaWYgKDcgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzWydxdWVyeSddID0gJG1hdGNoWzddOwp9CmlmICg5IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50c1snZnJhZ21lbnQnXSA9ICRtYXRjaFs5XTsKfQoKcmV0dXJuICRjb21wb25lbnRzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlKGFycmF5ICRjb21wb25lbnRzKQp7CiR1cmkgPSAkY29tcG9uZW50c1snc2NoZW1lJ10gLiAnOi8vJwouICRjb21wb25lbnRzWydhdXRob3JpdHknXQouICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkY29tcG9uZW50cykgJiYgc3RybGVuKCRjb21wb25lbnRzWydxdWVyeSddKSkgewokdXJpIC49ICc/JyAuICRjb21wb25lbnRzWydxdWVyeSddOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdmcmFnbWVudCcsICRjb21wb25lbnRzKSkgewokdXJpIC49ICcjJyAuICRjb21wb25lbnRzWydmcmFnbWVudCddOwp9CgpyZXR1cm4gJHVyaTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKQp7CgppZiAoCiFpc19udWxsKCRiYXNlVXJpKSAmJgohZmlsdGVyX3ZhcigkYmFzZVVyaSwgXEZJTFRFUl9WQUxJREFURV9VUkwpICYmCiFwcmVnX21hdGNoKCd8XlteL10rOi8vfHUnLCAkYmFzZVVyaSkKKSB7CmlmIChpc19maWxlKCRiYXNlVXJpKSkgewokYmFzZVVyaSA9ICdmaWxlOi8vJyAuIHJlYWxwYXRoKCRiYXNlVXJpKTsKfSBlbHNlaWYgKGlzX2RpcigkYmFzZVVyaSkpIHsKJGJhc2VVcmkgPSAnZmlsZTovLycgLiByZWFscGF0aCgkYmFzZVVyaSkgLiAnLyc7Cn0gZWxzZSB7CiRiYXNlVXJpID0gJ2ZpbGU6Ly8nIC4gZ2V0Y3dkKCkgLiAnLycgLiAkYmFzZVVyaTsKfQp9CgppZiAoJHVyaSA9PSAnJykgewpyZXR1cm4gJGJhc2VVcmk7Cn0KCiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwokcGF0aCA9ICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoIWVtcHR5KCRjb21wb25lbnRzWydzY2hlbWUnXSkpIHsKcmV0dXJuICR1cmk7Cn0KJGJhc2VDb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCRiYXNlVXJpKTsKJGJhc2VQYXRoID0gJGJhc2VDb21wb25lbnRzWydwYXRoJ107CgokYmFzZUNvbXBvbmVudHNbJ3BhdGgnXSA9IHNlbGY6OmNvbWJpbmVSZWxhdGl2ZVBhdGhXaXRoQmFzZVBhdGgoJHBhdGgsICRiYXNlUGF0aCk7CmlmIChpc3NldCgkY29tcG9uZW50c1snZnJhZ21lbnQnXSkpIHsKJGJhc2VDb21wb25lbnRzWydmcmFnbWVudCddID0gJGNvbXBvbmVudHNbJ2ZyYWdtZW50J107Cn0KCnJldHVybiAkdGhpcy0+Z2VuZXJhdGUoJGJhc2VDb21wb25lbnRzKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tYmluZVJlbGF0aXZlUGF0aFdpdGhCYXNlUGF0aCgkcmVsYXRpdmVQYXRoLCAkYmFzZVBhdGgpCnsKJHJlbGF0aXZlUGF0aCA9IHNlbGY6Om5vcm1hbGl6ZVBhdGgoJHJlbGF0aXZlUGF0aCk7CmlmICgkcmVsYXRpdmVQYXRoID09ICcnKSB7CnJldHVybiAkYmFzZVBhdGg7Cn0KaWYgKCRyZWxhdGl2ZVBhdGhbMF0gPT0gJy8nKSB7CnJldHVybiAkcmVsYXRpdmVQYXRoOwp9CgokYmFzZVBhdGhTZWdtZW50cyA9IGV4cGxvZGUoJy8nLCAkYmFzZVBhdGgpOwoKcHJlZ19tYXRjaCgnfF4vPyhcLlwuLyg/OlwuLykqKSp8JywgJHJlbGF0aXZlUGF0aCwgJG1hdGNoKTsKJG51bUxldmVsVXAgPSBzdHJsZW4oJG1hdGNoWzBdKSAvMyArIDE7CmlmICgkbnVtTGV2ZWxVcCA+PSBjb3VudCgkYmFzZVBhdGhTZWdtZW50cykpIHsKdGhyb3cgbmV3IFVyaVJlc29sdmVyRXhjZXB0aW9uKHNwcmludGYoIlVuYWJsZSB0byByZXNvbHZlIFVSSSAnJXMnIGZyb20gYmFzZSAnJXMnIiwgJHJlbGF0aXZlUGF0aCwgJGJhc2VQYXRoKSk7Cn0KCiRiYXNlUGF0aFNlZ21lbnRzID0gYXJyYXlfc2xpY2UoJGJhc2VQYXRoU2VnbWVudHMsIDAsIC0kbnVtTGV2ZWxVcCk7CiRwYXRoID0gcHJlZ19yZXBsYWNlKCd8Xi8/KFwuXC4vKFwuLykqKSp8JywgJycsICRyZWxhdGl2ZVBhdGgpOwoKcmV0dXJuIGltcGxvZGUoJy8nLCAkYmFzZVBhdGhTZWdtZW50cykgLiAnLycgLiAkcGF0aDsKfQoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgoJHBhdGgpCnsKJHBhdGggPSBwcmVnX3JlcGxhY2UoJ3woKD88IVwuKVwuLykqfCcsICcnLCAkcGF0aCk7CiRwYXRoID0gcHJlZ19yZXBsYWNlKCd8Ly98JywgJy8nLCAkcGF0aCk7CgpyZXR1cm4gJHBhdGg7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmFsaWQoJHVyaSkKewokY29tcG9uZW50cyA9ICR0aGlzLT5wYXJzZSgkdXJpKTsKCnJldHVybiAhZW1wdHkoJGNvbXBvbmVudHMpOwp9Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmk7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZFNjaGVtYU1lZGlhVHlwZUV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEpzb25EZWNvZGluZ0V4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzXEZpbGVHZXRDb250ZW50czsKdXNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnNcVXJpUmV0cmlldmVySW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxVcmlSZXRyaWV2ZXJJbnRlcmZhY2UgYXMgQmFzZVVyaVJldHJpZXZlckludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCgpjbGFzcyBVcmlSZXRyaWV2ZXIgaW1wbGVtZW50cyBCYXNlVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKcHJvdGVjdGVkICR0cmFuc2xhdGlvbk1hcCA9IGFycmF5KAoKJ3xeaHR0cHM/Oi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LSgwWzM0XSkvc2NoZW1hIz98JyA9PiAncGFja2FnZTovL2Rpc3Qvc2NoZW1hL2pzb24tc2NoZW1hLWRyYWZ0LSQxLmpzb24nCik7CgoKCgpwcm90ZWN0ZWQgJGFsbG93ZWRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludHMgPSBhcnJheSgKJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvJywKJ2h0dHBzOi8vanNvbi1zY2hlbWEub3JnLycKKTsKCgoKCnByb3RlY3RlZCAkdXJpUmV0cmlldmVyID0gbnVsbDsKCgoKCgoKcHJpdmF0ZSAkc2NoZW1hQ2FjaGUgPSBhcnJheSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkSW52YWxpZENvbnRlbnRUeXBlRW5kcG9pbnQoJGVuZHBvaW50KQp7CiR0aGlzLT5hbGxvd2VkSW52YWxpZENvbnRlbnRUeXBlRW5kcG9pbnRzW10gPSAkZW5kcG9pbnQ7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbmZpcm1NZWRpYVR5cGUoJHVyaVJldHJpZXZlciwgJHVyaSkKewokY29udGVudFR5cGUgPSAkdXJpUmV0cmlldmVyLT5nZXRDb250ZW50VHlwZSgpOwoKaWYgKGlzX251bGwoJGNvbnRlbnRUeXBlKSkgewoKcmV0dXJuOwp9CgppZiAoaW5fYXJyYXkoJGNvbnRlbnRUeXBlLCBhcnJheShWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFLCAnYXBwbGljYXRpb24vanNvbicpKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCR0aGlzLT5hbGxvd2VkSW52YWxpZENvbnRlbnRUeXBlRW5kcG9pbnRzIGFzICRlbmRwb2ludCkgewppZiAoc3RycG9zKCR1cmksICRlbmRwb2ludCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKdGhyb3cgbmV3IEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb24oc3ByaW50ZignTWVkaWEgdHlwZSAlcyBleHBlY3RlZCcsIFZhbGlkYXRvcjo6U0NIRU1BX01FRElBX1RZUEUpKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJpUmV0cmlldmVyKCkKewppZiAoaXNfbnVsbCgkdGhpcy0+dXJpUmV0cmlldmVyKSkgewokdGhpcy0+c2V0VXJpUmV0cmlldmVyKG5ldyBGaWxlR2V0Q29udGVudHMoKSk7Cn0KCnJldHVybiAkdGhpcy0+dXJpUmV0cmlldmVyOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUG9pbnRlcigkanNvblNjaGVtYSwgJHVyaSkKewokcmVzb2x2ZXIgPSBuZXcgVXJpUmVzb2x2ZXIoKTsKJHBhcnNlZCA9ICRyZXNvbHZlci0+cGFyc2UoJHVyaSk7CmlmIChlbXB0eSgkcGFyc2VkWydmcmFnbWVudCddKSkgewpyZXR1cm4gJGpzb25TY2hlbWE7Cn0KCiRwYXRoID0gZXhwbG9kZSgnLycsICRwYXJzZWRbJ2ZyYWdtZW50J10pOwp3aGlsZSAoJHBhdGgpIHsKJHBhdGhFbGVtZW50ID0gYXJyYXlfc2hpZnQoJHBhdGgpOwppZiAoIWVtcHR5KCRwYXRoRWxlbWVudCkpIHsKJHBhdGhFbGVtZW50ID0gc3RyX3JlcGxhY2UoJ34xJywgJy8nLCAkcGF0aEVsZW1lbnQpOwokcGF0aEVsZW1lbnQgPSBzdHJfcmVwbGFjZSgnfjAnLCAnficsICRwYXRoRWxlbWVudCk7CmlmICghZW1wdHkoJGpzb25TY2hlbWEtPiRwYXRoRWxlbWVudCkpIHsKJGpzb25TY2hlbWEgPSAkanNvblNjaGVtYS0+JHBhdGhFbGVtZW50Owp9IGVsc2Ugewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigKJ0ZyYWdtZW50ICInIC4gJHBhcnNlZFsnZnJhZ21lbnQnXSAuICciIG5vdCBmb3VuZCcKLiAnIGluICcgLiAkdXJpCik7Cn0KCmlmICghaXNfb2JqZWN0KCRqc29uU2NoZW1hKSkgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigKJ0ZyYWdtZW50IHBhcnQgIicgLiAkcGF0aEVsZW1lbnQgLiAnIiBpcyBubyBvYmplY3QgJwouICcgaW4gJyAuICR1cmkKKTsKfQp9Cn0KCnJldHVybiAkanNvblNjaGVtYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmksICRiYXNlVXJpID0gbnVsbCwgJHRyYW5zbGF0ZSA9IHRydWUpCnsKJHJlc29sdmVyID0gbmV3IFVyaVJlc29sdmVyKCk7CiRyZXNvbHZlZFVyaSA9ICRmZXRjaFVyaSA9ICRyZXNvbHZlci0+cmVzb2x2ZSgkdXJpLCAkYmFzZVVyaSk7CgoKJGFyUGFydHMgPSAkcmVzb2x2ZXItPnBhcnNlKCRyZXNvbHZlZFVyaSk7CmlmIChpc3NldCgkYXJQYXJ0c1snZnJhZ21lbnQnXSkpIHsKdW5zZXQoJGFyUGFydHNbJ2ZyYWdtZW50J10pOwokZmV0Y2hVcmkgPSAkcmVzb2x2ZXItPmdlbmVyYXRlKCRhclBhcnRzKTsKfQoKCmlmICgkdHJhbnNsYXRlKSB7CiRmZXRjaFVyaSA9ICR0aGlzLT50cmFuc2xhdGUoJGZldGNoVXJpKTsKfQoKJGpzb25TY2hlbWEgPSAkdGhpcy0+bG9hZFNjaGVtYSgkZmV0Y2hVcmkpOwoKCiRqc29uU2NoZW1hID0gJHRoaXMtPnJlc29sdmVQb2ludGVyKCRqc29uU2NoZW1hLCAkcmVzb2x2ZWRVcmkpOwoKaWYgKCRqc29uU2NoZW1hIGluc3RhbmNlb2YgXHN0ZENsYXNzKSB7CiRqc29uU2NoZW1hLT5pZCA9ICRyZXNvbHZlZFVyaTsKfQoKcmV0dXJuICRqc29uU2NoZW1hOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBsb2FkU2NoZW1hKCRmZXRjaFVyaSkKewppZiAoaXNzZXQoJHRoaXMtPnNjaGVtYUNhY2hlWyRmZXRjaFVyaV0pKSB7CnJldHVybiAkdGhpcy0+c2NoZW1hQ2FjaGVbJGZldGNoVXJpXTsKfQoKJHVyaVJldHJpZXZlciA9ICR0aGlzLT5nZXRVcmlSZXRyaWV2ZXIoKTsKJGNvbnRlbnRzID0gJHRoaXMtPnVyaVJldHJpZXZlci0+cmV0cmlldmUoJGZldGNoVXJpKTsKJHRoaXMtPmNvbmZpcm1NZWRpYVR5cGUoJHVyaVJldHJpZXZlciwgJGZldGNoVXJpKTsKJGpzb25TY2hlbWEgPSBqc29uX2RlY29kZSgkY29udGVudHMpOwoKaWYgKEpTT05fRVJST1JfTk9ORSA8ICRlcnJvciA9IGpzb25fbGFzdF9lcnJvcigpKSB7CnRocm93IG5ldyBKc29uRGVjb2RpbmdFeGNlcHRpb24oJGVycm9yKTsKfQoKJHRoaXMtPnNjaGVtYUNhY2hlWyRmZXRjaFVyaV0gPSAkanNvblNjaGVtYTsKCnJldHVybiAkanNvblNjaGVtYTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcmlSZXRyaWV2ZXIoVXJpUmV0cmlldmVySW50ZXJmYWNlICR1cmlSZXRyaWV2ZXIpCnsKJHRoaXMtPnVyaVJldHJpZXZlciA9ICR1cmlSZXRyaWV2ZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2UoJHVyaSkKewpwcmVnX21hdGNoKCd8XigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/fCcsICR1cmksICRtYXRjaCk7CgokY29tcG9uZW50cyA9IGFycmF5KCk7CmlmICg1IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50cyA9IGFycmF5KAonc2NoZW1lJyA9PiAkbWF0Y2hbMl0sCidhdXRob3JpdHknID0+ICRtYXRjaFs0XSwKJ3BhdGgnID0+ICRtYXRjaFs1XQopOwp9CgppZiAoNyA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHNbJ3F1ZXJ5J10gPSAkbWF0Y2hbN107Cn0KCmlmICg5IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50c1snZnJhZ21lbnQnXSA9ICRtYXRjaFs5XTsKfQoKcmV0dXJuICRjb21wb25lbnRzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlKGFycmF5ICRjb21wb25lbnRzKQp7CiR1cmkgPSAkY29tcG9uZW50c1snc2NoZW1lJ10gLiAnOi8vJwouICRjb21wb25lbnRzWydhdXRob3JpdHknXQouICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkY29tcG9uZW50cykpIHsKJHVyaSAuPSAkY29tcG9uZW50c1sncXVlcnknXTsKfQoKaWYgKGFycmF5X2tleV9leGlzdHMoJ2ZyYWdtZW50JywgJGNvbXBvbmVudHMpKSB7CiR1cmkgLj0gJGNvbXBvbmVudHNbJ2ZyYWdtZW50J107Cn0KCnJldHVybiAkdXJpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKCR1cmksICRiYXNlVXJpID0gbnVsbCkKewokY29tcG9uZW50cyA9ICR0aGlzLT5wYXJzZSgkdXJpKTsKJHBhdGggPSAkY29tcG9uZW50c1sncGF0aCddOwoKaWYgKChhcnJheV9rZXlfZXhpc3RzKCdzY2hlbWUnLCAkY29tcG9uZW50cykpICYmICgnaHR0cCcgPT09ICRjb21wb25lbnRzWydzY2hlbWUnXSkpIHsKcmV0dXJuICR1cmk7Cn0KCiRiYXNlQ29tcG9uZW50cyA9ICR0aGlzLT5wYXJzZSgkYmFzZVVyaSk7CiRiYXNlUGF0aCA9ICRiYXNlQ29tcG9uZW50c1sncGF0aCddOwoKJGJhc2VDb21wb25lbnRzWydwYXRoJ10gPSBVcmlSZXNvbHZlcjo6Y29tYmluZVJlbGF0aXZlUGF0aFdpdGhCYXNlUGF0aCgkcGF0aCwgJGJhc2VQYXRoKTsKCnJldHVybiAkdGhpcy0+Z2VuZXJhdGUoJGJhc2VDb21wb25lbnRzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgkdXJpKQp7CiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwoKcmV0dXJuICFlbXB0eSgkY29tcG9uZW50cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc2xhdGlvbigkZnJvbSwgJHRvKQp7CiR0aGlzLT50cmFuc2xhdGlvbk1hcFskZnJvbV0gPSAkdG87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0cmFuc2xhdGUoJHVyaSkKewpmb3JlYWNoICgkdGhpcy0+dHJhbnNsYXRpb25NYXAgYXMgJGZyb20gPT4gJHRvKSB7CiR1cmkgPSBwcmVnX3JlcGxhY2UoJGZyb20sICR0bywgJHVyaSk7Cn0KCgokdXJpID0gcHJlZ19yZXBsYWNlKCd8XnBhY2thZ2U6Ly98Jywgc3ByaW50ZignZmlsZTovLyVzLycsIHJlYWxwYXRoKF9fRElSX18gLiAnLy4uLy4uLy4uJykpLCAkdXJpKTsKCnJldHVybiAkdXJpOwp9Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCgoKCmludGVyZmFjZSBVcmlSZXNvbHZlckludGVyZmFjZQp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKTsKfQo8P3BocAoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKCgoKaW50ZXJmYWNlIFVyaVJldHJpZXZlckludGVyZmFjZQp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmksICRiYXNlVXJpID0gbnVsbCk7Cn0KPD9waHAKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEJhc2VDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50OwoKCgoKCgoKCgpjbGFzcyBWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlQ29uc3RyYWludAp7CmNvbnN0IFNDSEVNQV9NRURJQV9UWVBFID0gJ2FwcGxpY2F0aW9uL3NjaGVtYStqc29uJzsKCmNvbnN0IEVSUk9SX05PTkUgPSAweDAwMDAwMDAwOwpjb25zdCBFUlJPUl9BTEwgPSAweEZGRkZGRkZGOwpjb25zdCBFUlJPUl9ET0NVTUVOVF9WQUxJREFUSU9OID0gMHgwMDAwMDAwMTsKY29uc3QgRVJST1JfU0NIRU1BX1ZBTElEQVRJT04gPSAweDAwMDAwMDAyOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgJGNoZWNrTW9kZSA9IG51bGwpCnsKCmlmIChpc19hcnJheSgkc2NoZW1hKSkgewokc2NoZW1hID0gc2VsZjo6YXJyYXlUb09iamVjdFJlY3Vyc2l2ZSgkc2NoZW1hKTsKfQoKCiRpbml0aWFsQ2hlY2tNb2RlID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZygpOwppZiAoJGNoZWNrTW9kZSAhPT0gbnVsbCkgewokdGhpcy0+ZmFjdG9yeS0+c2V0Q29uZmlnKCRjaGVja01vZGUpOwp9CgoKaWYgKGlzX29iamVjdCgkc2NoZW1hKSAmJiBwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2lkJykpIHsKJHNjaGVtYVVSSSA9ICRzY2hlbWEtPmlkOwp9IGVsc2Ugewokc2NoZW1hVVJJID0gU2NoZW1hU3RvcmFnZTo6SU5URVJOQUxfUFJPVklERURfU0NIRU1BX1VSSTsKfQokdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5hZGRTY2hlbWEoJHNjaGVtYVVSSSwgJHNjaGVtYSk7CgokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHZhbGlkYXRvci0+Y2hlY2soCiR2YWx1ZSwKJHRoaXMtPmZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKS0+Z2V0U2NoZW1hKCRzY2hlbWFVUkkpCik7CgokdGhpcy0+ZmFjdG9yeS0+c2V0Q29uZmlnKCRpbml0aWFsQ2hlY2tNb2RlKTsKCiR0aGlzLT5hZGRFcnJvcnMoYXJyYXlfdW5pcXVlKCR2YWxpZGF0b3ItPmdldEVycm9ycygpLCBTT1JUX1JFR1VMQVIpKTsKCnJldHVybiAkdmFsaWRhdG9yLT5nZXRFcnJvck1hc2soKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCR2YWx1ZSwgJHNjaGVtYSkKewpyZXR1cm4gJHRoaXMtPnZhbGlkYXRlKCR2YWx1ZSwgJHNjaGVtYSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb2VyY2UoJiR2YWx1ZSwgJHNjaGVtYSkKewpyZXR1cm4gJHRoaXMtPnZhbGlkYXRlKCR2YWx1ZSwgJHNjaGVtYSwgQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9DT0VSQ0VfVFlQRVMpOwp9Cn0KClRoZSBNSVQgTGljZW5zZSAoTUlUKQoKQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYgY29udGFpbmVyLWludGVyb3AKQ29weXJpZ2h0IChjKSAyMDE2IFBIUCBGcmFtZXdvcmsgSW50ZXJvcGVyYWJpbGl0eSBHcm91cAoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCnRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgpDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCjw/cGhwCgpuYW1lc3BhY2UgUHNyXENvbnRhaW5lcjsKCgoKCmludGVyZmFjZSBDb250YWluZXJFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBQc3JcQ29udGFpbmVyOwoKCgoKaW50ZXJmYWNlIENvbnRhaW5lckludGVyZmFjZQp7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkaWQpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkaWQpOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXENvbnRhaW5lcjsKCgoKCmludGVyZmFjZSBOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KCkNvcHlyaWdodCAoYykgMjAxMiBQSFAgRnJhbWV3b3JrIEludGVyb3BlcmFiaWxpdHkgR3JvdXAKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgCm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIAphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExvZ2dlciBpbXBsZW1lbnRzIExvZ2dlckludGVyZmFjZQp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVtZXJnZW5jeSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxlcnQoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpBTEVSVCwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcml0aWNhbCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkNSSVRJQ0FMLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFUlJPUiwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OldBUk5JTkcsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6Ok5PVElDRSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6SU5GTywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpERUJVRywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCmNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24Kewp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCmNsYXNzIExvZ0xldmVsCnsKY29uc3QgRU1FUkdFTkNZID0gJ2VtZXJnZW5jeSc7CmNvbnN0IEFMRVJUID0gJ2FsZXJ0JzsKY29uc3QgQ1JJVElDQUwgPSAnY3JpdGljYWwnOwpjb25zdCBFUlJPUiA9ICdlcnJvcic7CmNvbnN0IFdBUk5JTkcgPSAnd2FybmluZyc7CmNvbnN0IE5PVElDRSA9ICdub3RpY2UnOwpjb25zdCBJTkZPID0gJ2luZm8nOwpjb25zdCBERUJVRyA9ICdkZWJ1Zyc7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKaW50ZXJmYWNlIExvZ2dlckF3YXJlSW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCnRyYWl0IExvZ2dlckF3YXJlVHJhaXQKewoKCgoKCnByb3RlY3RlZCAkbG9nZ2VyOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9nZ2VyKExvZ2dlckludGVyZmFjZSAkbG9nZ2VyKQp7CiR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCgoKCgoKCgoKaW50ZXJmYWNlIExvZ2dlckludGVyZmFjZQp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVtZXJnZW5jeSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsZXJ0KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcml0aWNhbCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RpY2UoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCgoKCgoKdHJhaXQgTG9nZ2VyVHJhaXQKewoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbWVyZ2VuY3koJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFTUVSR0VOQ1ksICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsZXJ0KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6QUxFUlQsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JpdGljYWwoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpDUklUSUNBTCwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6RVJST1IsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpXQVJOSU5HLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RpY2UoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpOT1RJQ0UsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5mbygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OklORk8sICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYnVnKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6REVCVUcsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCgoKCgoKY2xhc3MgTnVsbExvZ2dlciBleHRlbmRzIEFic3RyYWN0TG9nZ2VyCnsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewoKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZ1xUZXN0OwoKCgoKCgoKCmNsYXNzIER1bW15VGVzdAp7CnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJ0R1bW15VGVzdCc7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2dcVGVzdDsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIFBzclxMb2dcTG9nTGV2ZWw7CnVzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKCgoKCgoKCmFic3RyYWN0IGNsYXNzIExvZ2dlckludGVyZmFjZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQp7CgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRMb2dnZXIoKTsKCgoKCgoKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRMb2dzKCk7CgpwdWJsaWMgZnVuY3Rpb24gdGVzdEltcGxlbWVudHMoKQp7CiR0aGlzLT5hc3NlcnRJbnN0YW5jZU9mKCdQc3JcTG9nXExvZ2dlckludGVyZmFjZScsICR0aGlzLT5nZXRMb2dnZXIoKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0TG9nc0F0QWxsTGV2ZWxzKCRsZXZlbCwgJG1lc3NhZ2UpCnsKJGxvZ2dlciA9ICR0aGlzLT5nZXRMb2dnZXIoKTsKJGxvZ2dlci0+eyRsZXZlbH0oJG1lc3NhZ2UsIGFycmF5KCd1c2VyJyA9PiAnQm9iJykpOwokbG9nZ2VyLT5sb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkoJ3VzZXInID0+ICdCb2InKSk7CgokZXhwZWN0ZWQgPSBhcnJheSgKJGxldmVsLicgbWVzc2FnZSBvZiBsZXZlbCAnLiRsZXZlbC4nIHdpdGggY29udGV4dDogQm9iJywKJGxldmVsLicgbWVzc2FnZSBvZiBsZXZlbCAnLiRsZXZlbC4nIHdpdGggY29udGV4dDogQm9iJywKKTsKJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICR0aGlzLT5nZXRMb2dzKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJvdmlkZUxldmVsc0FuZE1lc3NhZ2VzKCkKewpyZXR1cm4gYXJyYXkoCkxvZ0xldmVsOjpFTUVSR0VOQ1kgPT4gYXJyYXkoTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJ21lc3NhZ2Ugb2YgbGV2ZWwgZW1lcmdlbmN5IHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpBTEVSVCA9PiBhcnJheShMb2dMZXZlbDo6QUxFUlQsICdtZXNzYWdlIG9mIGxldmVsIGFsZXJ0IHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpDUklUSUNBTCA9PiBhcnJheShMb2dMZXZlbDo6Q1JJVElDQUwsICdtZXNzYWdlIG9mIGxldmVsIGNyaXRpY2FsIHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpFUlJPUiA9PiBhcnJheShMb2dMZXZlbDo6RVJST1IsICdtZXNzYWdlIG9mIGxldmVsIGVycm9yIHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpXQVJOSU5HID0+IGFycmF5KExvZ0xldmVsOjpXQVJOSU5HLCAnbWVzc2FnZSBvZiBsZXZlbCB3YXJuaW5nIHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpOT1RJQ0UgPT4gYXJyYXkoTG9nTGV2ZWw6Ok5PVElDRSwgJ21lc3NhZ2Ugb2YgbGV2ZWwgbm90aWNlIHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpJTkZPID0+IGFycmF5KExvZ0xldmVsOjpJTkZPLCAnbWVzc2FnZSBvZiBsZXZlbCBpbmZvIHdpdGggY29udGV4dDoge3VzZXJ9JyksCkxvZ0xldmVsOjpERUJVRyA9PiBhcnJheShMb2dMZXZlbDo6REVCVUcsICdtZXNzYWdlIG9mIGxldmVsIGRlYnVnIHdpdGggY29udGV4dDoge3VzZXJ9JyksCik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0VGhyb3dzT25JbnZhbGlkTGV2ZWwoKQp7CiRsb2dnZXIgPSAkdGhpcy0+Z2V0TG9nZ2VyKCk7CiRsb2dnZXItPmxvZygnaW52YWxpZCBsZXZlbCcsICdGb28nKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RDb250ZXh0UmVwbGFjZW1lbnQoKQp7CiRsb2dnZXIgPSAkdGhpcy0+Z2V0TG9nZ2VyKCk7CiRsb2dnZXItPmluZm8oJ3tNZXNzYWdlIHtub3RoaW5nfSB7dXNlcn0ge2Zvby5iYXJ9IGF9JywgYXJyYXkoJ3VzZXInID0+ICdCb2InLCAnZm9vLmJhcicgPT4gJ0JhcicpKTsKCiRleHBlY3RlZCA9IGFycmF5KCdpbmZvIHtNZXNzYWdlIHtub3RoaW5nfSBCb2IgQmFyIGF9Jyk7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RPYmplY3RDYXN0VG9TdHJpbmcoKQp7CmlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAnY3JlYXRlUGFydGlhbE1vY2snKSkgewokZHVtbXkgPSAkdGhpcy0+Y3JlYXRlUGFydGlhbE1vY2soJ1BzclxMb2dcVGVzdFxEdW1teVRlc3QnLCBhcnJheSgnX190b1N0cmluZycpKTsKfSBlbHNlIHsKJGR1bW15ID0gJHRoaXMtPmdldE1vY2soJ1BzclxMb2dcVGVzdFxEdW1teVRlc3QnLCBhcnJheSgnX190b1N0cmluZycpKTsKfQokZHVtbXktPmV4cGVjdHMoJHRoaXMtPm9uY2UoKSkKLT5tZXRob2QoJ19fdG9TdHJpbmcnKQotPndpbGwoJHRoaXMtPnJldHVyblZhbHVlKCdEVU1NWScpKTsKCiR0aGlzLT5nZXRMb2dnZXIoKS0+d2FybmluZygkZHVtbXkpOwoKJGV4cGVjdGVkID0gYXJyYXkoJ3dhcm5pbmcgRFVNTVknKTsKJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICR0aGlzLT5nZXRMb2dzKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdENvbnRleHRDYW5Db250YWluQW55dGhpbmcoKQp7CiRjbG9zZWQgPSBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3InKTsKZmNsb3NlKCRjbG9zZWQpOwoKJGNvbnRleHQgPSBhcnJheSgKJ2Jvb2wnID0+IHRydWUsCidudWxsJyA9PiBudWxsLAonc3RyaW5nJyA9PiAnRm9vJywKJ2ludCcgPT4gMCwKJ2Zsb2F0JyA9PiAwLjUsCiduZXN0ZWQnID0+IGFycmF5KCd3aXRoIG9iamVjdCcgPT4gbmV3IER1bW15VGVzdCksCidvYmplY3QnID0+IG5ldyBcRGF0ZVRpbWUsCidyZXNvdXJjZScgPT4gZm9wZW4oJ3BocDovL21lbW9yeScsICdyJyksCidjbG9zZWQnID0+ICRjbG9zZWQsCik7CgokdGhpcy0+Z2V0TG9nZ2VyKCktPndhcm5pbmcoJ0NyYXp5IGNvbnRleHQgZGF0YScsICRjb250ZXh0KTsKCiRleHBlY3RlZCA9IGFycmF5KCd3YXJuaW5nIENyYXp5IGNvbnRleHQgZGF0YScpOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0Q29udGV4dEV4Y2VwdGlvbktleUNhbkJlRXhjZXB0aW9uT3JPdGhlclZhbHVlcygpCnsKJGxvZ2dlciA9ICR0aGlzLT5nZXRMb2dnZXIoKTsKJGxvZ2dlci0+d2FybmluZygnUmFuZG9tIG1lc3NhZ2UnLCBhcnJheSgnZXhjZXB0aW9uJyA9PiAnb29wcycpKTsKJGxvZ2dlci0+Y3JpdGljYWwoJ1VuY2F1Z2h0IEV4Y2VwdGlvbiEnLCBhcnJheSgnZXhjZXB0aW9uJyA9PiBuZXcgXExvZ2ljRXhjZXB0aW9uKCdGYWlsJykpKTsKCiRleHBlY3RlZCA9IGFycmF5KAond2FybmluZyBSYW5kb20gbWVzc2FnZScsCidjcml0aWNhbCBVbmNhdWdodCBFeGNlcHRpb24hJwopOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2dcVGVzdDsKCnVzZSBQc3JcTG9nXEFic3RyYWN0TG9nZ2VyOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBUZXN0TG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dnZXIKewoKCgpwdWJsaWMgJHJlY29yZHMgPSBbXTsKCnB1YmxpYyAkcmVjb3Jkc0J5TGV2ZWwgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSkKewokcmVjb3JkID0gWwonbGV2ZWwnID0+ICRsZXZlbCwKJ21lc3NhZ2UnID0+ICRtZXNzYWdlLAonY29udGV4dCcgPT4gJGNvbnRleHQsCl07CgokdGhpcy0+cmVjb3Jkc0J5TGV2ZWxbJHJlY29yZFsnbGV2ZWwnXV1bXSA9ICRyZWNvcmQ7CiR0aGlzLT5yZWNvcmRzW10gPSAkcmVjb3JkOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkcygkbGV2ZWwpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5yZWNvcmRzQnlMZXZlbFskbGV2ZWxdKTsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1JlY29yZCgkcmVjb3JkLCAkbGV2ZWwpCnsKaWYgKGlzX3N0cmluZygkcmVjb3JkKSkgewokcmVjb3JkID0gWydtZXNzYWdlJyA9PiAkcmVjb3JkXTsKfQpyZXR1cm4gJHRoaXMtPmhhc1JlY29yZFRoYXRQYXNzZXMoZnVuY3Rpb24gKCRyZWMpIHVzZSAoJHJlY29yZCkgewppZiAoJHJlY1snbWVzc2FnZSddICE9PSAkcmVjb3JkWydtZXNzYWdlJ10pIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChpc3NldCgkcmVjb3JkWydjb250ZXh0J10pICYmICRyZWNbJ2NvbnRleHQnXSAhPT0gJHJlY29yZFsnY29udGV4dCddKSB7CnJldHVybiBmYWxzZTsKfQpyZXR1cm4gdHJ1ZTsKfSwgJGxldmVsKTsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1JlY29yZFRoYXRDb250YWlucygkbWVzc2FnZSwgJGxldmVsKQp7CnJldHVybiAkdGhpcy0+aGFzUmVjb3JkVGhhdFBhc3NlcyhmdW5jdGlvbiAoJHJlYykgdXNlICgkbWVzc2FnZSkgewpyZXR1cm4gc3RycG9zKCRyZWNbJ21lc3NhZ2UnXSwgJG1lc3NhZ2UpICE9PSBmYWxzZTsKfSwgJGxldmVsKTsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1JlY29yZFRoYXRNYXRjaGVzKCRyZWdleCwgJGxldmVsKQp7CnJldHVybiAkdGhpcy0+aGFzUmVjb3JkVGhhdFBhc3NlcyhmdW5jdGlvbiAoJHJlYykgdXNlICgkcmVnZXgpIHsKcmV0dXJuIHByZWdfbWF0Y2goJHJlZ2V4LCAkcmVjWydtZXNzYWdlJ10pID4gMDsKfSwgJGxldmVsKTsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1JlY29yZFRoYXRQYXNzZXMoY2FsbGFibGUgJHByZWRpY2F0ZSwgJGxldmVsKQp7CmlmICghaXNzZXQoJHRoaXMtPnJlY29yZHNCeUxldmVsWyRsZXZlbF0pKSB7CnJldHVybiBmYWxzZTsKfQpmb3JlYWNoICgkdGhpcy0+cmVjb3Jkc0J5TGV2ZWxbJGxldmVsXSBhcyAkaSA9PiAkcmVjKSB7CmlmIChjYWxsX3VzZXJfZnVuYygkcHJlZGljYXRlLCAkcmVjLCAkaSkpIHsKcmV0dXJuIHRydWU7Cn0KfQpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoJG1ldGhvZCwgJGFyZ3MpCnsKaWYgKHByZWdfbWF0Y2goJy8oLiopKERlYnVnfEluZm98Tm90aWNlfFdhcm5pbmd8RXJyb3J8Q3JpdGljYWx8QWxlcnR8RW1lcmdlbmN5KSguKikvJywgJG1ldGhvZCwgJG1hdGNoZXMpID4gMCkgewokZ2VuZXJpY01ldGhvZCA9ICRtYXRjaGVzWzFdIC4gKCdSZWNvcmRzJyAhPT0gJG1hdGNoZXNbM10gPyAnUmVjb3JkJyA6ICcnKSAuICRtYXRjaGVzWzNdOwokbGV2ZWwgPSBzdHJ0b2xvd2VyKCRtYXRjaGVzWzJdKTsKaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRnZW5lcmljTWV0aG9kKSkgewokYXJnc1tdID0gJGxldmVsOwpyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoWyR0aGlzLCAkZ2VuZXJpY01ldGhvZF0sICRhcmdzKTsKfQp9CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2FsbCB0byB1bmRlZmluZWQgbWV0aG9kICcgLiBnZXRfY2xhc3MoJHRoaXMpIC4gJzo6JyAuICRtZXRob2QgLiAnKCknKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKewokdGhpcy0+cmVjb3JkcyA9IFtdOwokdGhpcy0+cmVjb3Jkc0J5TGV2ZWwgPSBbXTsKfQp9CgpUaGUgTUlUIExpY2Vuc2UgKE1JVCkKCkNvcHlyaWdodCAoYykgMjAxMiBKYW4gU29yZ2FsbGEsIENocmlzdGlhbiBMw7xjaywgQ2Vlcy1KYW4gS2lld2lldCwgQ2hyaXMgQm9kZW4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCm9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCmZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCmNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZwpjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCk9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECk5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCkhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2U7CgoKCgpmaW5hbCBjbGFzcyBEZWZlcnJlZAp7CgoKCnByaXZhdGUgJHByb21pc2U7CgoKcHJpdmF0ZSAkcmVzb2x2ZUNhbGxiYWNrOwoKCnByaXZhdGUgJHJlamVjdENhbGxiYWNrOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGNhbGxhYmxlICRjYW5jZWxsZXIgPSBudWxsKQp7CiR0aGlzLT5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KTogdm9pZCB7CiR0aGlzLT5yZXNvbHZlQ2FsbGJhY2sgPSAkcmVzb2x2ZTsKJHRoaXMtPnJlamVjdENhbGxiYWNrID0gJHJlamVjdDsKfSwgJGNhbmNlbGxlcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9taXNlKCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnByb21pc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKCR2YWx1ZSk6IHZvaWQKewooJHRoaXMtPnJlc29sdmVDYWxsYmFjaykoJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiB2b2lkCnsKKCR0aGlzLT5yZWplY3RDYWxsYmFjaykoJHJlYXNvbik7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIENvbXBvc2l0ZUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKcHJpdmF0ZSAkdGhyb3dhYmxlczsKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHRocm93YWJsZXMsIHN0cmluZyAkbWVzc2FnZSA9ICcnLCBpbnQgJGNvZGUgPSAwLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwoKJHRoaXMtPnRocm93YWJsZXMgPSAkdGhyb3dhYmxlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRocm93YWJsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRocm93YWJsZXM7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uOwoKY2xhc3MgTGVuZ3RoRXhjZXB0aW9uIGV4dGVuZHMgXExlbmd0aEV4Y2VwdGlvbgp7Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlXEludGVybmFsOwoKCgoKZmluYWwgY2xhc3MgQ2FuY2VsbGF0aW9uUXVldWUKewoKcHJpdmF0ZSAkc3RhcnRlZCA9IGZhbHNlOwoKCnByaXZhdGUgJHF1ZXVlID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19pbnZva2UoKTogdm9pZAp7CmlmICgkdGhpcy0+c3RhcnRlZCkgewpyZXR1cm47Cn0KCiR0aGlzLT5zdGFydGVkID0gdHJ1ZTsKJHRoaXMtPmRyYWluKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnF1ZXVlKCRjYW5jZWxsYWJsZSk6IHZvaWQKewppZiAoIVxpc19vYmplY3QoJGNhbmNlbGxhYmxlKSB8fCAhXG1ldGhvZF9leGlzdHMoJGNhbmNlbGxhYmxlLCAndGhlbicpIHx8ICFcbWV0aG9kX2V4aXN0cygkY2FuY2VsbGFibGUsICdjYW5jZWwnKSkgewpyZXR1cm47Cn0KCiRsZW5ndGggPSBcYXJyYXlfcHVzaCgkdGhpcy0+cXVldWUsICRjYW5jZWxsYWJsZSk7CgppZiAoJHRoaXMtPnN0YXJ0ZWQgJiYgMSA9PT0gJGxlbmd0aCkgewokdGhpcy0+ZHJhaW4oKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRyYWluKCk6IHZvaWQKewpmb3IgKCRpID0gXGtleSgkdGhpcy0+cXVldWUpOyBpc3NldCgkdGhpcy0+cXVldWVbJGldKTsgJGkrKykgewokY2FuY2VsbGFibGUgPSAkdGhpcy0+cXVldWVbJGldOwphc3NlcnQoXG1ldGhvZF9leGlzdHMoJGNhbmNlbGxhYmxlLCAnY2FuY2VsJykpOwoKJGV4Y2VwdGlvbiA9IG51bGw7Cgp0cnkgewokY2FuY2VsbGFibGUtPmNhbmNlbCgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRleGNlcHRpb24pIHsKfQoKdW5zZXQoJHRoaXMtPnF1ZXVlWyRpXSk7CgppZiAoJGV4Y2VwdGlvbikgewp0aHJvdyAkZXhjZXB0aW9uOwp9Cn0KCiR0aGlzLT5xdWV1ZSA9IFtdOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlXEludGVybmFsOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2VccmVzb2x2ZTsKCgoKCgoKCmZpbmFsIGNsYXNzIEZ1bGZpbGxlZFByb21pc2UgaW1wbGVtZW50cyBQcm9taXNlSW50ZXJmYWNlCnsKCnByaXZhdGUgJHZhbHVlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUgPSBudWxsKQp7CmlmICgkdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdZb3UgY2Fubm90IGNyZWF0ZSBSZWFjdFxQcm9taXNlXEZ1bGZpbGxlZFByb21pc2Ugd2l0aCBhIHByb21pc2UuIFVzZSBSZWFjdFxQcm9taXNlXHJlc29sdmUoJHByb21pc2VPclZhbHVlKSBpbnN0ZWFkLicpOwp9CgokdGhpcy0+dmFsdWUgPSAkdmFsdWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRoZW4oY2FsbGFibGUgJG9uRnVsZmlsbGVkID0gbnVsbCwgY2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAkb25GdWxmaWxsZWQpIHsKcmV0dXJuICR0aGlzOwp9Cgp0cnkgewoKCgokcmVzdWx0ID0gJG9uRnVsZmlsbGVkKCR0aGlzLT52YWx1ZSk7CnJldHVybiByZXNvbHZlKCRyZXN1bHQpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRleGNlcHRpb24pIHsKcmV0dXJuIG5ldyBSZWplY3RlZFByb21pc2UoJGV4Y2VwdGlvbik7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGNhdGNoKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIGZpbmFsbHkoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnRoZW4oZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiByZXNvbHZlKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQoKSktPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkdmFsdWUpIHsKcmV0dXJuICR2YWx1ZTsKfSk7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQKewp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNhdGNoKCRvblJlamVjdGVkKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZpbmFsbHkoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcSW50ZXJuYWw7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxfY2hlY2tUeXBlaGludDsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2VccmVzb2x2ZTsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2Vcc2V0X3JlamVjdGlvbl9oYW5kbGVyOwoKCgoKCgpmaW5hbCBjbGFzcyBSZWplY3RlZFByb21pc2UgaW1wbGVtZW50cyBQcm9taXNlSW50ZXJmYWNlCnsKCnByaXZhdGUgJHJlYXNvbjsKCgpwcml2YXRlICRoYW5kbGVkID0gZmFsc2U7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXFRocm93YWJsZSAkcmVhc29uKQp7CiR0aGlzLT5yZWFzb24gPSAkcmVhc29uOwp9CgoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CmlmICgkdGhpcy0+aGFuZGxlZCkgewpyZXR1cm47Cn0KCiRoYW5kbGVyID0gc2V0X3JlamVjdGlvbl9oYW5kbGVyKG51bGwpOwppZiAoJGhhbmRsZXIgPT09IG51bGwpIHsKJG1lc3NhZ2UgPSAnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIHdpdGggJyAuIFxnZXRfY2xhc3MoJHRoaXMtPnJlYXNvbikgLiAnOiAnIC4gJHRoaXMtPnJlYXNvbi0+Z2V0TWVzc2FnZSgpIC4gJyBpbiAnIC4gJHRoaXMtPnJlYXNvbi0+Z2V0RmlsZSgpIC4gJzonIC4gJHRoaXMtPnJlYXNvbi0+Z2V0TGluZSgpIC4gUEhQX0VPTDsKJG1lc3NhZ2UgLj0gJ1N0YWNrIHRyYWNlOicgLiBQSFBfRU9MIC4gJHRoaXMtPnJlYXNvbi0+Z2V0VHJhY2VBc1N0cmluZygpOwoKXGVycm9yX2xvZygkbWVzc2FnZSk7CnJldHVybjsKfQoKdHJ5IHsKJGhhbmRsZXIoJHRoaXMtPnJlYXNvbik7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJG1lc3NhZ2UgPSAnRmF0YWwgZXJyb3I6IFVuY2F1Z2h0ICcgLiBcZ2V0X2NsYXNzKCRlKSAuICcgZnJvbSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gaGFuZGxlcjogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnIGluICcgLiAkZS0+Z2V0RmlsZSgpIC4gJzonIC4gJGUtPmdldExpbmUoKSAuIFBIUF9FT0w7CiRtZXNzYWdlIC49ICdTdGFjayB0cmFjZTonIC4gUEhQX0VPTCAuICRlLT5nZXRUcmFjZUFzU3RyaW5nKCk7CgpcZXJyb3JfbG9nKCRtZXNzYWdlKTsKZXhpdCgyNTUpOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0aGVuKGNhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsIGNhbGxhYmxlICRvblJlamVjdGVkID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gJG9uUmVqZWN0ZWQpIHsKcmV0dXJuICR0aGlzOwp9CgokdGhpcy0+aGFuZGxlZCA9IHRydWU7Cgp0cnkgewpyZXR1cm4gcmVzb2x2ZSgkb25SZWplY3RlZCgkdGhpcy0+cmVhc29uKSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGV4Y2VwdGlvbikgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkZXhjZXB0aW9uKTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCFfY2hlY2tUeXBlaGludCgkb25SZWplY3RlZCwgJHRoaXMtPnJlYXNvbikpIHsKcmV0dXJuICR0aGlzOwp9CgoKCgpyZXR1cm4gJHRoaXMtPnRoZW4obnVsbCwgJG9uUmVqZWN0ZWQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihudWxsLCBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuIHJlc29sdmUoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCgpKS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRyZWFzb24pOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuIG5ldyBSZWplY3RlZFByb21pc2UoJHJlYXNvbik7Cn0pOwp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNhbmNlbCgpOiB2b2lkCnsKJHRoaXMtPmhhbmRsZWQgPSB0cnVlOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNhdGNoKCRvblJlamVjdGVkKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZpbmFsbHkoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2U7Cgp1c2UgUmVhY3RcUHJvbWlzZVxJbnRlcm5hbFxSZWplY3RlZFByb21pc2U7CgoKCgoKZmluYWwgY2xhc3MgUHJvbWlzZSBpbXBsZW1lbnRzIFByb21pc2VJbnRlcmZhY2UKewoKcHJpdmF0ZSAkY2FuY2VsbGVyOwoKCnByaXZhdGUgJHJlc3VsdDsKCgpwcml2YXRlICRoYW5kbGVycyA9IFtdOwoKCnByaXZhdGUgJHJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMgPSAwOwoKCnByaXZhdGUgJGNhbmNlbGxlZCA9IGZhbHNlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGNhbGxhYmxlICRyZXNvbHZlciwgY2FsbGFibGUgJGNhbmNlbGxlciA9IG51bGwpCnsKJHRoaXMtPmNhbmNlbGxlciA9ICRjYW5jZWxsZXI7CgoKCgokY2IgPSAkcmVzb2x2ZXI7CiRyZXNvbHZlciA9ICRjYW5jZWxsZXIgPSBudWxsOwokdGhpcy0+Y2FsbCgkY2IpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGhlbihjYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCBjYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yZXN1bHQpIHsKcmV0dXJuICR0aGlzLT5yZXN1bHQtPnRoZW4oJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Y2FuY2VsbGVyKSB7CnJldHVybiBuZXcgc3RhdGljKCR0aGlzLT5yZXNvbHZlcigkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKSk7Cn0KCgoKCgoKJHBhcmVudCA9ICR0aGlzOworKyRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHM7CgpyZXR1cm4gbmV3IHN0YXRpYygKJHRoaXMtPnJlc29sdmVyKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpLApzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJHBhcmVudCkgewphc3NlcnQoJHBhcmVudCBpbnN0YW5jZW9mIHNlbGYpOwotLSRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHM7CgppZiAoJHBhcmVudC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA8PSAwKSB7CiRwYXJlbnQtPmNhbmNlbCgpOwp9CgokcGFyZW50ID0gbnVsbDsKfQopOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50aGVuKG51bGwsIHN0YXRpYyBmdW5jdGlvbiAoJHJlYXNvbikgdXNlICgkb25SZWplY3RlZCkgewppZiAoIV9jaGVja1R5cGVoaW50KCRvblJlamVjdGVkLCAkcmVhc29uKSkgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfQoKCgoKcmV0dXJuICRvblJlamVjdGVkKCRyZWFzb24pOwp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIGZpbmFsbHkoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCkgewpyZXR1cm4gcmVzb2x2ZSgkb25GdWxmaWxsZWRPclJlamVjdGVkKCkpLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHZhbHVlKSB7CnJldHVybiAkdmFsdWU7Cn0pOwp9LCBzdGF0aWMgZnVuY3Rpb24gKCRyZWFzb24pIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCkgewpyZXR1cm4gcmVzb2x2ZSgkb25GdWxmaWxsZWRPclJlamVjdGVkKCkpLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHJlYXNvbikgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfSk7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQKewokdGhpcy0+Y2FuY2VsbGVkID0gdHJ1ZTsKJGNhbmNlbGxlciA9ICR0aGlzLT5jYW5jZWxsZXI7CiR0aGlzLT5jYW5jZWxsZXIgPSBudWxsOwoKJHBhcmVudENhbmNlbGxlciA9IG51bGw7CgppZiAobnVsbCAhPT0gJHRoaXMtPnJlc3VsdCkgewoKaWYgKCR0aGlzLT5yZXN1bHQgaW5zdGFuY2VvZiBSZWplY3RlZFByb21pc2UpIHsKJHRoaXMtPnJlc3VsdC0+Y2FuY2VsKCk7Cn0KCgoKJHJvb3QgPSAkdGhpcy0+dW53cmFwKCR0aGlzLT5yZXN1bHQpOwoKCgppZiAoISRyb290IGluc3RhbmNlb2Ygc2VsZiB8fCBudWxsICE9PSAkcm9vdC0+cmVzdWx0KSB7CnJldHVybjsKfQoKJHJvb3QtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMtLTsKCmlmICgkcm9vdC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA8PSAwKSB7CiRwYXJlbnRDYW5jZWxsZXIgPSBbJHJvb3QsICdjYW5jZWwnXTsKfQp9CgppZiAobnVsbCAhPT0gJGNhbmNlbGxlcikgewokdGhpcy0+Y2FsbCgkY2FuY2VsbGVyKTsKfQoKCmlmICgkcGFyZW50Q2FuY2VsbGVyKSB7CiRwYXJlbnRDYW5jZWxsZXIoKTsKfQp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNhdGNoKCRvblJlamVjdGVkKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZpbmFsbHkoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZXIoY2FsbGFibGUgJG9uRnVsZmlsbGVkID0gbnVsbCwgY2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogY2FsbGFibGUKewpyZXR1cm4gZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpIHsKJHRoaXMtPmhhbmRsZXJzW10gPSBzdGF0aWMgZnVuY3Rpb24gKFByb21pc2VJbnRlcmZhY2UgJHByb21pc2UpIHVzZSAoJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCwgJHJlc29sdmUsICRyZWplY3QpIHsKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbigkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKTsKCmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIHNlbGYgJiYgJHByb21pc2UtPnJlc3VsdCA9PT0gbnVsbCkgewokcHJvbWlzZS0+aGFuZGxlcnNbXSA9IHN0YXRpYyBmdW5jdGlvbiAoUHJvbWlzZUludGVyZmFjZSAkcHJvbWlzZSkgdXNlICgkcmVzb2x2ZSwgJHJlamVjdCkgewokcHJvbWlzZS0+dGhlbigkcmVzb2x2ZSwgJHJlamVjdCk7Cn07Cn0gZWxzZSB7CiRwcm9taXNlLT50aGVuKCRyZXNvbHZlLCAkcmVqZWN0KTsKfQp9Owp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiB2b2lkCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yZXN1bHQpIHsKcmV0dXJuOwp9CgokdGhpcy0+c2V0dGxlKHJlamVjdCgkcmVhc29uKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0dGxlKFByb21pc2VJbnRlcmZhY2UgJHJlc3VsdCk6IHZvaWQKewokcmVzdWx0ID0gJHRoaXMtPnVud3JhcCgkcmVzdWx0KTsKCmlmICgkcmVzdWx0ID09PSAkdGhpcykgewokcmVzdWx0ID0gbmV3IFJlamVjdGVkUHJvbWlzZSgKbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmLicpCik7Cn0KCmlmICgkcmVzdWx0IGluc3RhbmNlb2Ygc2VsZikgewokcmVzdWx0LT5yZXF1aXJlZENhbmNlbFJlcXVlc3RzKys7Cn0gZWxzZSB7CgokdGhpcy0+Y2FuY2VsbGVyID0gbnVsbDsKfQoKJGhhbmRsZXJzID0gJHRoaXMtPmhhbmRsZXJzOwoKJHRoaXMtPmhhbmRsZXJzID0gW107CiR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0OwoKZm9yZWFjaCAoJGhhbmRsZXJzIGFzICRoYW5kbGVyKSB7CiRoYW5kbGVyKCRyZXN1bHQpOwp9CgoKaWYgKCR0aGlzLT5jYW5jZWxsZWQgJiYgJHJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdGVkUHJvbWlzZSkgewokcmVzdWx0LT5jYW5jZWwoKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bndyYXAoUHJvbWlzZUludGVyZmFjZSAkcHJvbWlzZSk6IFByb21pc2VJbnRlcmZhY2UKewp3aGlsZSAoJHByb21pc2UgaW5zdGFuY2VvZiBzZWxmICYmIG51bGwgIT09ICRwcm9taXNlLT5yZXN1bHQpIHsKCiRwcm9taXNlID0gJHByb21pc2UtPnJlc3VsdDsKfQoKcmV0dXJuICRwcm9taXNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNhbGwoY2FsbGFibGUgJGNiKTogdm9pZAp7CgoKJGNhbGxiYWNrID0gJGNiOwokY2IgPSBudWxsOwoKCgoKCgppZiAoXGlzX2FycmF5KCRjYWxsYmFjaykpIHsKJHJlZiA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY2FsbGJhY2tbMF0sICRjYWxsYmFja1sxXSk7Cn0gZWxzZWlmIChcaXNfb2JqZWN0KCRjYWxsYmFjaykgJiYgISRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRyZWYgPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNhbGxiYWNrLCAnX19pbnZva2UnKTsKfSBlbHNlIHsKYXNzZXJ0KCRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlIHx8IFxpc19zdHJpbmcoJGNhbGxiYWNrKSk7CiRyZWYgPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkY2FsbGJhY2spOwp9CiRhcmdzID0gJHJlZi0+Z2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCk7Cgp0cnkgewppZiAoJGFyZ3MgPT09IDApIHsKJGNhbGxiYWNrKCk7Cn0gZWxzZSB7CgoKCgoKCgoKJHRhcmdldCA9JiAkdGhpczsKCiRjYWxsYmFjaygKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJiR0YXJnZXQpIHsKaWYgKCR0YXJnZXQgIT09IG51bGwpIHsKJHRhcmdldC0+c2V0dGxlKHJlc29sdmUoJHZhbHVlKSk7CiR0YXJnZXQgPSBudWxsOwp9Cn0sCnN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCYkdGFyZ2V0KSB7CmlmICgkdGFyZ2V0ICE9PSBudWxsKSB7CiR0YXJnZXQtPnJlamVjdCgkcmVhc29uKTsKJHRhcmdldCA9IG51bGw7Cn0KfQopOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJHRhcmdldCA9IG51bGw7CiR0aGlzLT5yZWplY3QoJGUpOwp9Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2U7CgoKCgppbnRlcmZhY2UgUHJvbWlzZUludGVyZmFjZQp7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0aGVuKD9jYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCA/Y2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXRjaChjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYW5jZWwoKTogdm9pZDsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWx3YXlzKGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCnVzZSBSZWFjdFxQcm9taXNlXEV4Y2VwdGlvblxDb21wb3NpdGVFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXEludGVybmFsXEZ1bGZpbGxlZFByb21pc2U7CnVzZSBSZWFjdFxQcm9taXNlXEludGVybmFsXFJlamVjdGVkUHJvbWlzZTsKCgoKCgoKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlc29sdmUoJHByb21pc2VPclZhbHVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkcHJvbWlzZU9yVmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnJldHVybiAkcHJvbWlzZU9yVmFsdWU7Cn0KCmlmIChcaXNfb2JqZWN0KCRwcm9taXNlT3JWYWx1ZSkgJiYgXG1ldGhvZF9leGlzdHMoJHByb21pc2VPclZhbHVlLCAndGhlbicpKSB7CiRjYW5jZWxsZXIgPSBudWxsOwoKaWYgKFxtZXRob2RfZXhpc3RzKCRwcm9taXNlT3JWYWx1ZSwgJ2NhbmNlbCcpKSB7CiRjYW5jZWxsZXIgPSBbJHByb21pc2VPclZhbHVlLCAnY2FuY2VsJ107CmFzc2VydChcaXNfY2FsbGFibGUoJGNhbmNlbGxlcikpOwp9CgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCRwcm9taXNlT3JWYWx1ZSk6IHZvaWQgewokcHJvbWlzZU9yVmFsdWUtPnRoZW4oJHJlc29sdmUsICRyZWplY3QpOwp9LCAkY2FuY2VsbGVyKTsKfQoKcmV0dXJuIG5ldyBGdWxmaWxsZWRQcm9taXNlKCRwcm9taXNlT3JWYWx1ZSk7Cn0KCgoKCgoKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuIG5ldyBSZWplY3RlZFByb21pc2UoJHJlYXNvbik7Cn0KCgoKCgoKCgoKCgpmdW5jdGlvbiBhbGwoaXRlcmFibGUgJHByb21pc2VzT3JWYWx1ZXMpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGNhbmNlbGxhdGlvblF1ZXVlID0gbmV3IEludGVybmFsXENhbmNlbGxhdGlvblF1ZXVlKCk7CgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCRwcm9taXNlc09yVmFsdWVzLCAkY2FuY2VsbGF0aW9uUXVldWUpOiB2b2lkIHsKJHRvUmVzb2x2ZSA9IDA7CgokY29udGludWUgPSB0cnVlOwokdmFsdWVzID0gW107Cgpmb3JlYWNoICgkcHJvbWlzZXNPclZhbHVlcyBhcyAkaSA9PiAkcHJvbWlzZU9yVmFsdWUpIHsKJGNhbmNlbGxhdGlvblF1ZXVlLT5lbnF1ZXVlKCRwcm9taXNlT3JWYWx1ZSk7CiR2YWx1ZXNbJGldID0gbnVsbDsKKyskdG9SZXNvbHZlOwoKcmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpLT50aGVuKApmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRpLCAmJHZhbHVlcywgJiR0b1Jlc29sdmUsICYkY29udGludWUsICRyZXNvbHZlKTogdm9pZCB7CiR2YWx1ZXNbJGldID0gJHZhbHVlOwoKaWYgKDAgPT09IC0tJHRvUmVzb2x2ZSAmJiAhJGNvbnRpbnVlKSB7CiRyZXNvbHZlKCR2YWx1ZXMpOwp9Cn0sCmZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJiRjb250aW51ZSwgJHJlamVjdCk6IHZvaWQgewokY29udGludWUgPSBmYWxzZTsKJHJlamVjdCgkcmVhc29uKTsKfQopOwoKaWYgKCEkY29udGludWUgJiYgIVxpc19hcnJheSgkcHJvbWlzZXNPclZhbHVlcykpIHsKYnJlYWs7Cn0KfQoKJGNvbnRpbnVlID0gZmFsc2U7CmlmICgkdG9SZXNvbHZlID09PSAwKSB7CiRyZXNvbHZlKCR2YWx1ZXMpOwp9Cn0sICRjYW5jZWxsYXRpb25RdWV1ZSk7Cn0KCgoKCgoKCgoKCgoKZnVuY3Rpb24gcmFjZShpdGVyYWJsZSAkcHJvbWlzZXNPclZhbHVlcyk6IFByb21pc2VJbnRlcmZhY2UKewokY2FuY2VsbGF0aW9uUXVldWUgPSBuZXcgSW50ZXJuYWxcQ2FuY2VsbGF0aW9uUXVldWUoKTsKCnJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QpIHVzZSAoJHByb21pc2VzT3JWYWx1ZXMsICRjYW5jZWxsYXRpb25RdWV1ZSk6IHZvaWQgewokY29udGludWUgPSB0cnVlOwoKZm9yZWFjaCAoJHByb21pc2VzT3JWYWx1ZXMgYXMgJHByb21pc2VPclZhbHVlKSB7CiRjYW5jZWxsYXRpb25RdWV1ZS0+ZW5xdWV1ZSgkcHJvbWlzZU9yVmFsdWUpOwoKcmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpLT50aGVuKCRyZXNvbHZlLCAkcmVqZWN0KS0+ZmluYWxseShmdW5jdGlvbiAoKSB1c2UgKCYkY29udGludWUpOiB2b2lkIHsKJGNvbnRpbnVlID0gZmFsc2U7Cn0pOwoKaWYgKCEkY29udGludWUgJiYgIVxpc19hcnJheSgkcHJvbWlzZXNPclZhbHVlcykpIHsKYnJlYWs7Cn0KfQp9LCAkY2FuY2VsbGF0aW9uUXVldWUpOwp9CgoKCgoKCgoKCgoKCgoKCgpmdW5jdGlvbiBhbnkoaXRlcmFibGUgJHByb21pc2VzT3JWYWx1ZXMpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGNhbmNlbGxhdGlvblF1ZXVlID0gbmV3IEludGVybmFsXENhbmNlbGxhdGlvblF1ZXVlKCk7CgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCRwcm9taXNlc09yVmFsdWVzLCAkY2FuY2VsbGF0aW9uUXVldWUpOiB2b2lkIHsKJHRvUmVqZWN0ID0gMDsKJGNvbnRpbnVlID0gdHJ1ZTsKJHJlYXNvbnMgPSBbXTsKCmZvcmVhY2ggKCRwcm9taXNlc09yVmFsdWVzIGFzICRpID0+ICRwcm9taXNlT3JWYWx1ZSkgewokY2FuY2VsbGF0aW9uUXVldWUtPmVucXVldWUoJHByb21pc2VPclZhbHVlKTsKKyskdG9SZWplY3Q7CgpyZXNvbHZlKCRwcm9taXNlT3JWYWx1ZSktPnRoZW4oCmZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJHJlc29sdmUsICYkY29udGludWUpOiB2b2lkIHsKJGNvbnRpbnVlID0gZmFsc2U7CiRyZXNvbHZlKCR2YWx1ZSk7Cn0sCmZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJGksICYkcmVhc29ucywgJiR0b1JlamVjdCwgJHJlamVjdCwgJiRjb250aW51ZSk6IHZvaWQgewokcmVhc29uc1skaV0gPSAkcmVhc29uOwoKaWYgKDAgPT09IC0tJHRvUmVqZWN0ICYmICEkY29udGludWUpIHsKJHJlamVjdChuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKAokcmVhc29ucywKJ0FsbCBwcm9taXNlcyByZWplY3RlZC4nCikpOwp9Cn0KKTsKCmlmICghJGNvbnRpbnVlICYmICFcaXNfYXJyYXkoJHByb21pc2VzT3JWYWx1ZXMpKSB7CmJyZWFrOwp9Cn0KCiRjb250aW51ZSA9IGZhbHNlOwppZiAoJHRvUmVqZWN0ID09PSAwICYmICEkcmVhc29ucykgewokcmVqZWN0KG5ldyBFeGNlcHRpb25cTGVuZ3RoRXhjZXB0aW9uKAonTXVzdCBjb250YWluIGF0IGxlYXN0IDEgaXRlbSBidXQgY29udGFpbnMgb25seSAwIGl0ZW1zLicKKSk7Cn0gZWxzZWlmICgkdG9SZWplY3QgPT09IDApIHsKJHJlamVjdChuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKAokcmVhc29ucywKJ0FsbCBwcm9taXNlcyByZWplY3RlZC4nCikpOwp9Cn0sICRjYW5jZWxsYXRpb25RdWV1ZSk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gc2V0X3JlamVjdGlvbl9oYW5kbGVyKD9jYWxsYWJsZSAkY2FsbGJhY2spOiA/Y2FsbGFibGUKewpzdGF0aWMgJGN1cnJlbnQgPSBudWxsOwokcHJldmlvdXMgPSAkY3VycmVudDsKJGN1cnJlbnQgPSAkY2FsbGJhY2s7CgpyZXR1cm4gJHByZXZpb3VzOwp9CgoKCgpmdW5jdGlvbiBfY2hlY2tUeXBlaGludChjYWxsYWJsZSAkY2FsbGJhY2ssIFxUaHJvd2FibGUgJHJlYXNvbik6IGJvb2wKewppZiAoXGlzX2FycmF5KCRjYWxsYmFjaykpIHsKJGNhbGxiYWNrUmVmbGVjdGlvbiA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY2FsbGJhY2tbMF0sICRjYWxsYmFja1sxXSk7Cn0gZWxzZWlmIChcaXNfb2JqZWN0KCRjYWxsYmFjaykgJiYgISRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRjYWxsYmFja1JlZmxlY3Rpb24gPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNhbGxiYWNrLCAnX19pbnZva2UnKTsKfSBlbHNlIHsKYXNzZXJ0KCRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlIHx8IFxpc19zdHJpbmcoJGNhbGxiYWNrKSk7CiRjYWxsYmFja1JlZmxlY3Rpb24gPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkY2FsbGJhY2spOwp9CgokcGFyYW1ldGVycyA9ICRjYWxsYmFja1JlZmxlY3Rpb24tPmdldFBhcmFtZXRlcnMoKTsKCmlmICghaXNzZXQoJHBhcmFtZXRlcnNbMF0pKSB7CnJldHVybiB0cnVlOwp9CgokZXhwZWN0ZWRFeGNlcHRpb24gPSAkcGFyYW1ldGVyc1swXTsKCgokdHlwZSA9ICRleHBlY3RlZEV4Y2VwdGlvbi0+Z2V0VHlwZSgpOwoKJGlzVHlwZVVuaW9uID0gdHJ1ZTsKJHR5cGVzID0gW107Cgpzd2l0Y2ggKHRydWUpIHsKY2FzZSAkdHlwZSA9PT0gbnVsbDoKYnJlYWs7CmNhc2UgJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZToKJHR5cGVzID0gWyR0eXBlXTsKYnJlYWs7CmNhc2UgJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbkludGVyc2VjdGlvblR5cGU6CiRpc1R5cGVVbmlvbiA9IGZhbHNlOwpjYXNlICR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25VbmlvblR5cGU7CiR0eXBlcyA9ICR0eXBlLT5nZXRUeXBlcygpOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgb2YgUmVmbGVjdGlvblBhcmFtZXRlcjo6Z2V0VHlwZScpOwp9CgoKaWYgKGVtcHR5KCR0eXBlcykpIHsKcmV0dXJuIHRydWU7Cn0KCmZvcmVhY2ggKCR0eXBlcyBhcyAkdHlwZSkgewoKaWYgKCR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25JbnRlcnNlY3Rpb25UeXBlKSB7CmZvcmVhY2ggKCR0eXBlLT5nZXRUeXBlcygpIGFzICR0eXBlVG9NYXRjaCkgewphc3NlcnQoJHR5cGVUb01hdGNoIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUpOwokbmFtZSA9ICR0eXBlVG9NYXRjaC0+Z2V0TmFtZSgpOwppZiAoISgkbWF0Y2hlcyA9ICghJHR5cGVUb01hdGNoLT5pc0J1aWx0aW4oKSAmJiAkcmVhc29uIGluc3RhbmNlb2YgJG5hbWUpKSkgewpicmVhazsKfQp9CmFzc2VydChpc3NldCgkbWF0Y2hlcykpOwp9IGVsc2Ugewphc3NlcnQoJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSk7CiRuYW1lID0gJHR5cGUtPmdldE5hbWUoKTsKJG1hdGNoZXMgPSAhJHR5cGUtPmlzQnVpbHRpbigpICYmICRyZWFzb24gaW5zdGFuY2VvZiAkbmFtZTsKfQoKCgppZiAoJG1hdGNoZXMpIHsKaWYgKCRpc1R5cGVVbmlvbikgewpyZXR1cm4gdHJ1ZTsKfQp9IGVsc2UgewppZiAoISRpc1R5cGVVbmlvbikgewpyZXR1cm4gZmFsc2U7Cn0KfQp9CgoKCnJldHVybiAkaXNUeXBlVW5pb24gPyBmYWxzZSA6IHRydWU7Cn0KPD9waHAKCmlmICghXGZ1bmN0aW9uX2V4aXN0cygnUmVhY3RcUHJvbWlzZVxyZXNvbHZlJykpIHsKcmVxdWlyZSBfX0RJUl9fLicvZnVuY3Rpb25zLnBocCc7Cn0KCkNvcHlyaWdodCAoYykgMjAxMSBKb3JkaSBCb2dnaWFubwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKCmNsYXNzIER1cGxpY2F0ZUtleUV4Y2VwdGlvbiBleHRlbmRzIFBhcnNpbmdFeGNlcHRpb24KewoKCgoKcHJvdGVjdGVkICRkZXRhaWxzOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRrZXksIGFycmF5ICRkZXRhaWxzKQp7CiRkZXRhaWxzWydrZXknXSA9ICRrZXk7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRkZXRhaWxzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleSgpCnsKcmV0dXJuICR0aGlzLT5kZXRhaWxzWydrZXknXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldGFpbHMoKQp7CnJldHVybiAkdGhpcy0+ZGV0YWlsczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKdXNlIHN0ZENsYXNzOwoKCgoKCgoKCgoKCgoKCmNsYXNzIEpzb25QYXJzZXIKewpjb25zdCBERVRFQ1RfS0VZX0NPTkZMSUNUUyA9IDE7CmNvbnN0IEFMTE9XX0RVUExJQ0FURV9LRVlTID0gMjsKY29uc3QgUEFSU0VfVE9fQVNTT0MgPSA0Owpjb25zdCBBTExPV19DT01NRU5UUyA9IDg7CgoKcHJpdmF0ZSAkbGV4ZXI7CgoKCgoKcHJpdmF0ZSAkZmxhZ3M7Cgpwcml2YXRlICRzdGFjazsKCnByaXZhdGUgJHZzdGFjazsgCgpwcml2YXRlICRsc3RhY2s7IAoKCgoKcHJpdmF0ZSAkc3ltYm9scyA9IGFycmF5KAonZXJyb3InID0+IDIsCidKU09OU3RyaW5nJyA9PiAzLAonU1RSSU5HJyA9PiA0LAonSlNPTk51bWJlcicgPT4gNSwKJ05VTUJFUicgPT4gNiwKJ0pTT05OdWxsTGl0ZXJhbCcgPT4gNywKJ05VTEwnID0+IDgsCidKU09OQm9vbGVhbkxpdGVyYWwnID0+IDksCidUUlVFJyA9PiAxMCwKJ0ZBTFNFJyA9PiAxMSwKJ0pTT05UZXh0JyA9PiAxMiwKJ0pTT05WYWx1ZScgPT4gMTMsCidFT0YnID0+IDE0LAonSlNPTk9iamVjdCcgPT4gMTUsCidKU09OQXJyYXknID0+IDE2LAoneycgPT4gMTcsCid9JyA9PiAxOCwKJ0pTT05NZW1iZXJMaXN0JyA9PiAxOSwKJ0pTT05NZW1iZXInID0+IDIwLAonOicgPT4gMjEsCicsJyA9PiAyMiwKJ1snID0+IDIzLAonXScgPT4gMjQsCidKU09ORWxlbWVudExpc3QnID0+IDI1LAonJGFjY2VwdCcgPT4gMCwKJyRlbmQnID0+IDEsCik7CgoKCgoKcHJpdmF0ZSAkdGVybWluYWxzXyA9IGFycmF5KAoyID0+ICJlcnJvciIsCjQgPT4gIlNUUklORyIsCjYgPT4gIk5VTUJFUiIsCjggPT4gIk5VTEwiLAoxMCA9PiAiVFJVRSIsCjExID0+ICJGQUxTRSIsCjE0ID0+ICJFT0YiLAoxNyA9PiAieyIsCjE4ID0+ICJ9IiwKMjEgPT4gIjoiLAoyMiA9PiAiLCIsCjIzID0+ICJbIiwKMjQgPT4gIl0iLAopOwoKCgoKCnByaXZhdGUgJHByb2R1Y3Rpb25zXyA9IGFycmF5KAoxID0+IGFycmF5KDMsIDEpLAoyID0+IGFycmF5KDUsIDEpLAozID0+IGFycmF5KDcsIDEpLAo0ID0+IGFycmF5KDksIDEpLAo1ID0+IGFycmF5KDksIDEpLAo2ID0+IGFycmF5KDEyLCAyKSwKNyA9PiBhcnJheSgxMywgMSksCjggPT4gYXJyYXkoMTMsIDEpLAo5ID0+IGFycmF5KDEzLCAxKSwKMTAgPT4gYXJyYXkoMTMsIDEpLAoxMSA9PiBhcnJheSgxMywgMSksCjEyID0+IGFycmF5KDEzLCAxKSwKMTMgPT4gYXJyYXkoMTUsIDIpLAoxNCA9PiBhcnJheSgxNSwgMyksCjE1ID0+IGFycmF5KDIwLCAzKSwKMTYgPT4gYXJyYXkoMTksIDEpLAoxNyA9PiBhcnJheSgxOSwgMyksCjE4ID0+IGFycmF5KDE2LCAyKSwKMTkgPT4gYXJyYXkoMTYsIDMpLAoyMCA9PiBhcnJheSgyNSwgMSksCjIxID0+IGFycmF5KDI1LCAzKQopOwoKCgoKCnByaXZhdGUgJHRhYmxlID0gYXJyYXkoCjAgPT4gYXJyYXkoIDMgPT4gNSwgNCA9PiBhcnJheSgxLDEyKSwgNSA9PiA2LCA2ID0+IGFycmF5KDEsMTMpLCA3ID0+IDMsIDggPT4gYXJyYXkoMSw5KSwgOSA9PiA0LCAxMCA9PiBhcnJheSgxLDEwKSwgMTEgPT4gYXJyYXkoMSwxMSksIDEyID0+IDEsIDEzID0+IDIsIDE1ID0+IDcsIDE2ID0+IDgsIDE3ID0+IGFycmF5KDEsMTQpLCAyMyA9PiBhcnJheSgxLDE1KSksCjEgPT4gYXJyYXkoIDEgPT4gYXJyYXkoMykpLAoyID0+IGFycmF5KCAxNCA9PiBhcnJheSgxLDE2KSksCjMgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsNyksIDE4ID0+IGFycmF5KDIsNyksIDIyID0+IGFycmF5KDIsNyksIDI0ID0+IGFycmF5KDIsNykpLAo0ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDgpLCAxOCA9PiBhcnJheSgyLDgpLCAyMiA9PiBhcnJheSgyLDgpLCAyNCA9PiBhcnJheSgyLDgpKSwKNSA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiw5KSwgMTggPT4gYXJyYXkoMiw5KSwgMjIgPT4gYXJyYXkoMiw5KSwgMjQgPT4gYXJyYXkoMiw5KSksCjYgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTApLCAxOCA9PiBhcnJheSgyLDEwKSwgMjIgPT4gYXJyYXkoMiwxMCksIDI0ID0+IGFycmF5KDIsMTApKSwKNyA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxMSksIDE4ID0+IGFycmF5KDIsMTEpLCAyMiA9PiBhcnJheSgyLDExKSwgMjQgPT4gYXJyYXkoMiwxMSkpLAo4ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDEyKSwgMTggPT4gYXJyYXkoMiwxMiksIDIyID0+IGFycmF5KDIsMTIpLCAyNCA9PiBhcnJheSgyLDEyKSksCjkgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMyksIDE4ID0+IGFycmF5KDIsMyksIDIyID0+IGFycmF5KDIsMyksIDI0ID0+IGFycmF5KDIsMykpLAoxMCA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiw0KSwgMTggPT4gYXJyYXkoMiw0KSwgMjIgPT4gYXJyYXkoMiw0KSwgMjQgPT4gYXJyYXkoMiw0KSksCjExID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDUpLCAxOCA9PiBhcnJheSgyLDUpLCAyMiA9PiBhcnJheSgyLDUpLCAyNCA9PiBhcnJheSgyLDUpKSwKMTIgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMSksIDE4ID0+IGFycmF5KDIsMSksIDIxID0+IGFycmF5KDIsMSksIDIyID0+IGFycmF5KDIsMSksIDI0ID0+IGFycmF5KDIsMSkpLAoxMyA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwyKSwgMTggPT4gYXJyYXkoMiwyKSwgMjIgPT4gYXJyYXkoMiwyKSwgMjQgPT4gYXJyYXkoMiwyKSksCjE0ID0+IGFycmF5KCAzID0+IDIwLCA0ID0+IGFycmF5KDEsMTIpLCAxOCA9PiBhcnJheSgxLDE3KSwgMTkgPT4gMTgsIDIwID0+IDE5ICksCjE1ID0+IGFycmF5KCAzID0+IDUsIDQgPT4gYXJyYXkoMSwxMiksIDUgPT4gNiwgNiA9PiBhcnJheSgxLDEzKSwgNyA9PiAzLCA4ID0+IGFycmF5KDEsOSksIDkgPT4gNCwgMTAgPT4gYXJyYXkoMSwxMCksIDExID0+IGFycmF5KDEsMTEpLCAxMyA9PiAyMywgMTUgPT4gNywgMTYgPT4gOCwgMTcgPT4gYXJyYXkoMSwxNCksIDIzID0+IGFycmF5KDEsMTUpLCAyNCA9PiBhcnJheSgxLDIxKSwgMjUgPT4gMjIgKSwKMTYgPT4gYXJyYXkoIDEgPT4gYXJyYXkoMiw2KSksCjE3ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDEzKSwgMTggPT4gYXJyYXkoMiwxMyksIDIyID0+IGFycmF5KDIsMTMpLCAyNCA9PiBhcnJheSgyLDEzKSksCjE4ID0+IGFycmF5KCAxOCA9PiBhcnJheSgxLDI0KSwgMjIgPT4gYXJyYXkoMSwyNSkpLAoxOSA9PiBhcnJheSggMTggPT4gYXJyYXkoMiwxNiksIDIyID0+IGFycmF5KDIsMTYpKSwKMjAgPT4gYXJyYXkoIDIxID0+IGFycmF5KDEsMjYpKSwKMjEgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTgpLCAxOCA9PiBhcnJheSgyLDE4KSwgMjIgPT4gYXJyYXkoMiwxOCksIDI0ID0+IGFycmF5KDIsMTgpKSwKMjIgPT4gYXJyYXkoIDIyID0+IGFycmF5KDEsMjgpLCAyNCA9PiBhcnJheSgxLDI3KSksCjIzID0+IGFycmF5KCAyMiA9PiBhcnJheSgyLDIwKSwgMjQgPT4gYXJyYXkoMiwyMCkpLAoyNCA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxNCksIDE4ID0+IGFycmF5KDIsMTQpLCAyMiA9PiBhcnJheSgyLDE0KSwgMjQgPT4gYXJyYXkoMiwxNCkpLAoyNSA9PiBhcnJheSggMyA9PiAyMCwgNCA9PiBhcnJheSgxLDEyKSwgMjAgPT4gMjkgKSwKMjYgPT4gYXJyYXkoIDMgPT4gNSwgNCA9PiBhcnJheSgxLDEyKSwgNSA9PiA2LCA2ID0+IGFycmF5KDEsMTMpLCA3ID0+IDMsIDggPT4gYXJyYXkoMSw5KSwgOSA9PiA0LCAxMCA9PiBhcnJheSgxLDEwKSwgMTEgPT4gYXJyYXkoMSwxMSksIDEzID0+IDMwLCAxNSA9PiA3LCAxNiA9PiA4LCAxNyA9PiBhcnJheSgxLDE0KSwgMjMgPT4gYXJyYXkoMSwxNSkpLAoyNyA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxOSksIDE4ID0+IGFycmF5KDIsMTkpLCAyMiA9PiBhcnJheSgyLDE5KSwgMjQgPT4gYXJyYXkoMiwxOSkpLAoyOCA9PiBhcnJheSggMyA9PiA1LCA0ID0+IGFycmF5KDEsMTIpLCA1ID0+IDYsIDYgPT4gYXJyYXkoMSwxMyksIDcgPT4gMywgOCA9PiBhcnJheSgxLDkpLCA5ID0+IDQsIDEwID0+IGFycmF5KDEsMTApLCAxMSA9PiBhcnJheSgxLDExKSwgMTMgPT4gMzEsIDE1ID0+IDcsIDE2ID0+IDgsIDE3ID0+IGFycmF5KDEsMTQpLCAyMyA9PiBhcnJheSgxLDE1KSksCjI5ID0+IGFycmF5KCAxOCA9PiBhcnJheSgyLDE3KSwgMjIgPT4gYXJyYXkoMiwxNykpLAozMCA9PiBhcnJheSggMTggPT4gYXJyYXkoMiwxNSksIDIyID0+IGFycmF5KDIsMTUpKSwKMzEgPT4gYXJyYXkoIDIyID0+IGFycmF5KDIsMjEpLCAyNCA9PiBhcnJheSgyLDIxKSksCik7CgoKCgoKcHJpdmF0ZSAkZGVmYXVsdEFjdGlvbnMgPSBhcnJheSgKMTYgPT4gYXJyYXkoMiwgNikKKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbGludCgkaW5wdXQsICRmbGFncyA9IDApCnsKdHJ5IHsKJHRoaXMtPnBhcnNlKCRpbnB1dCwgJGZsYWdzKTsKfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGU7Cn0KcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlKCRpbnB1dCwgJGZsYWdzID0gMCkKewokdGhpcy0+ZmFpbE9uQk9NKCRpbnB1dCk7CgokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7CgokdGhpcy0+c3RhY2sgPSBhcnJheSgwKTsKJHRoaXMtPnZzdGFjayA9IGFycmF5KG51bGwpOwokdGhpcy0+bHN0YWNrID0gYXJyYXkoKTsKCiR5eXRleHQgPSAnJzsKJHl5bGluZW5vID0gMDsKJHl5bGVuZyA9IDA7CgokcmVjb3ZlcmluZyA9IDA7CgokdGhpcy0+bGV4ZXIgPSBuZXcgTGV4ZXIoJGZsYWdzKTsKJHRoaXMtPmxleGVyLT5zZXRJbnB1dCgkaW5wdXQpOwoKJHl5bG9jID0gJHRoaXMtPmxleGVyLT55eWxsb2M7CiR0aGlzLT5sc3RhY2tbXSA9ICR5eWxvYzsKCiRzeW1ib2wgPSBudWxsOwokcHJlRXJyb3JTeW1ib2wgPSBudWxsOwokYWN0aW9uID0gbnVsbDsKJGEgPSBudWxsOwokciA9IG51bGw7CiRwID0gbnVsbDsKJGxlbiA9IG51bGw7CiRuZXdTdGF0ZSA9IG51bGw7CiRleHBlY3RlZCA9IG51bGw7CgokZXJyU3RyID0gbnVsbDsKCndoaWxlICh0cnVlKSB7Cgokc3RhdGUgPSAkdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMV07CgoKaWYgKGlzc2V0KCR0aGlzLT5kZWZhdWx0QWN0aW9uc1skc3RhdGVdKSkgewokYWN0aW9uID0gJHRoaXMtPmRlZmF1bHRBY3Rpb25zWyRzdGF0ZV07Cn0gZWxzZSB7CmlmICgkc3ltYm9sID09PSBudWxsKSB7CiRzeW1ib2wgPSAkdGhpcy0+bGV4ZXItPmxleCgpOwp9CgoKJGFjdGlvbiA9IGlzc2V0KCR0aGlzLT50YWJsZVskc3RhdGVdWyRzeW1ib2xdKSA/ICR0aGlzLT50YWJsZVskc3RhdGVdWyRzeW1ib2xdIDogZmFsc2U7Cn0KCgppZiAoISRhY3Rpb24gfHwgISRhY3Rpb25bMF0pIHsKYXNzZXJ0KGlzc2V0KCRzeW1ib2wpKTsKaWYgKCEkcmVjb3ZlcmluZykgewoKJGV4cGVjdGVkID0gYXJyYXkoKTsKZm9yZWFjaCAoJHRoaXMtPnRhYmxlWyRzdGF0ZV0gYXMgJHAgPT4gJGlnbm9yZSkgewppZiAoaXNzZXQoJHRoaXMtPnRlcm1pbmFsc19bJHBdKSAmJiAkcCA+IDIpIHsKJGV4cGVjdGVkW10gPSAiJyIgLiAkdGhpcy0+dGVybWluYWxzX1skcF0gLiAiJyI7Cn0KfQoKJG1lc3NhZ2UgPSBudWxsOwppZiAoXGluX2FycmF5KCInU1RSSU5HJyIsICRleHBlY3RlZCkgJiYgXGluX2FycmF5KHN1YnN0cigkdGhpcy0+bGV4ZXItPm1hdGNoLCAwLCAxKSwgYXJyYXkoJyInLCAiJyIpKSkgewokbWVzc2FnZSA9ICJJbnZhbGlkIHN0cmluZyI7CmlmICgiJyIgPT09IHN1YnN0cigkdGhpcy0+bGV4ZXItPm1hdGNoLCAwLCAxKSkgewokbWVzc2FnZSAuPSAiLCBpdCBhcHBlYXJzIHlvdSB1c2VkIHNpbmdsZSBxdW90ZXMgaW5zdGVhZCBvZiBkb3VibGUgcXVvdGVzIjsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJ3siLis/KFxcXFxbXiJiZm5ydC9cXFxcdV0oLi4uKT8pfScsICR0aGlzLT5sZXhlci0+Z2V0RnVsbFVwY29taW5nSW5wdXQoKSwgJG1hdGNoKSkgewokbWVzc2FnZSAuPSAiLCBpdCBhcHBlYXJzIHlvdSBoYXZlIGFuIHVuZXNjYXBlZCBiYWNrc2xhc2ggYXQ6ICIuJG1hdGNoWzFdOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgneyIoPzpbXiJdK3xcXFxcIikqJH1tJywgJHRoaXMtPmxleGVyLT5nZXRGdWxsVXBjb21pbmdJbnB1dCgpKSkgewokbWVzc2FnZSAuPSAiLCBpdCBhcHBlYXJzIHlvdSBmb3Jnb3QgdG8gdGVybWluYXRlIGEgc3RyaW5nLCBvciBhdHRlbXB0ZWQgdG8gd3JpdGUgYSBtdWx0aWxpbmUgc3RyaW5nIHdoaWNoIGlzIGludmFsaWQiOwp9Cn0KCiRlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnIC4gKCR5eWxpbmVubysxKSAuICI6XG4iOwokZXJyU3RyIC49ICR0aGlzLT5sZXhlci0+c2hvd1Bvc2l0aW9uKCkgLiAiXG4iOwppZiAoJG1lc3NhZ2UpIHsKJGVyclN0ciAuPSAkbWVzc2FnZTsKfSBlbHNlIHsKJGVyclN0ciAuPSAoXGNvdW50KCRleHBlY3RlZCkgPiAxKSA/ICJFeHBlY3RlZCBvbmUgb2Y6ICIgOiAiRXhwZWN0ZWQ6ICI7CiRlcnJTdHIgLj0gaW1wbG9kZSgnLCAnLCAkZXhwZWN0ZWQpOwp9CgppZiAoJywnID09PSBzdWJzdHIodHJpbSgkdGhpcy0+bGV4ZXItPmdldFBhc3RJbnB1dCgpKSwgLTEpKSB7CiRlcnJTdHIgLj0gIiAtIEl0IGFwcGVhcnMgeW91IGhhdmUgYW4gZXh0cmEgdHJhaWxpbmcgY29tbWEiOwp9CgokdGhpcy0+cGFyc2VFcnJvcigkZXJyU3RyLCBhcnJheSgKJ3RleHQnID0+ICR0aGlzLT5sZXhlci0+bWF0Y2gsCid0b2tlbicgPT4gaXNzZXQoJHRoaXMtPnRlcm1pbmFsc19bJHN5bWJvbF0pID8gJHRoaXMtPnRlcm1pbmFsc19bJHN5bWJvbF0gOiAkc3ltYm9sLAonbGluZScgPT4gJHRoaXMtPmxleGVyLT55eWxpbmVubywKJ2xvYycgPT4gJHl5bG9jLAonZXhwZWN0ZWQnID0+ICRleHBlY3RlZCwKKSk7Cn0KCgppZiAoJHJlY292ZXJpbmcgPT0gMykgewppZiAoJHN5bWJvbCA9PT0gTGV4ZXI6OkVPRikgewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigkZXJyU3RyID86ICdQYXJzaW5nIGhhbHRlZC4nKTsKfQoKCiR5eWxlbmcgPSAkdGhpcy0+bGV4ZXItPnl5bGVuZzsKJHl5dGV4dCA9ICR0aGlzLT5sZXhlci0+eXl0ZXh0OwokeXlsaW5lbm8gPSAkdGhpcy0+bGV4ZXItPnl5bGluZW5vOwokeXlsb2MgPSAkdGhpcy0+bGV4ZXItPnl5bGxvYzsKJHN5bWJvbCA9ICR0aGlzLT5sZXhlci0+bGV4KCk7Cn0KCgp3aGlsZSAodHJ1ZSkgewoKaWYgKFxhcnJheV9rZXlfZXhpc3RzKExleGVyOjpUX0VSUk9SLCAkdGhpcy0+dGFibGVbJHN0YXRlXSkpIHsKYnJlYWs7Cn0KaWYgKCRzdGF0ZSA9PSAwKSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCRlcnJTdHIgPzogJ1BhcnNpbmcgaGFsdGVkLicpOwp9CiR0aGlzLT5wb3BTdGFjaygxKTsKJHN0YXRlID0gJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTFdOwp9CgokcHJlRXJyb3JTeW1ib2wgPSAkc3ltYm9sOyAKJHN5bWJvbCA9IExleGVyOjpUX0VSUk9SOyAKJHN0YXRlID0gJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTFdOwoKJGFjdGlvbiA9IGlzc2V0KCR0aGlzLT50YWJsZVskc3RhdGVdW0xleGVyOjpUX0VSUk9SXSkgPyAkdGhpcy0+dGFibGVbJHN0YXRlXVtMZXhlcjo6VF9FUlJPUl0gOiBmYWxzZTsKaWYgKCRhY3Rpb24gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vIHRhYmxlIHZhbHVlIGZvdW5kIGZvciAnLiRzdGF0ZS4nID0+ICcuTGV4ZXI6OlRfRVJST1IpOwp9CiRyZWNvdmVyaW5nID0gMzsgCn0KCgppZiAoXGlzX2FycmF5KCRhY3Rpb25bMF0pICYmIFxjb3VudCgkYWN0aW9uKSA+IDEpIHsgCnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCdQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogJyAuICRzdGF0ZSAuICcsIHRva2VuOiAnIC4gJHN5bWJvbCk7Cn0KCnN3aXRjaCAoJGFjdGlvblswXSkgewpjYXNlIDE6IAphc3NlcnQoaXNzZXQoJHN5bWJvbCkpOwokdGhpcy0+c3RhY2tbXSA9ICRzeW1ib2w7CiR0aGlzLT52c3RhY2tbXSA9ICR0aGlzLT5sZXhlci0+eXl0ZXh0OwokdGhpcy0+bHN0YWNrW10gPSAkdGhpcy0+bGV4ZXItPnl5bGxvYzsKJHRoaXMtPnN0YWNrW10gPSAkYWN0aW9uWzFdOyAKJHN5bWJvbCA9IG51bGw7CmlmICghJHByZUVycm9yU3ltYm9sKSB7IAokeXlsZW5nID0gJHRoaXMtPmxleGVyLT55eWxlbmc7CiR5eXRleHQgPSAkdGhpcy0+bGV4ZXItPnl5dGV4dDsKJHl5bGluZW5vID0gJHRoaXMtPmxleGVyLT55eWxpbmVubzsKJHl5bG9jID0gJHRoaXMtPmxleGVyLT55eWxsb2M7CmlmICgkcmVjb3ZlcmluZyA+IDApIHsKJHJlY292ZXJpbmctLTsKfQp9IGVsc2UgeyAKJHN5bWJvbCA9ICRwcmVFcnJvclN5bWJvbDsKJHByZUVycm9yU3ltYm9sID0gbnVsbDsKfQpicmVhazsKCmNhc2UgMjogCiRsZW4gPSAkdGhpcy0+cHJvZHVjdGlvbnNfWyRhY3Rpb25bMV1dWzFdOwoKCiRjdXJyZW50VG9rZW4gPSAkdGhpcy0+dnN0YWNrW1xjb3VudCgkdGhpcy0+dnN0YWNrKSAtICRsZW5dOyAKCiRwb3NpdGlvbiA9IGFycmF5KCAKJ2ZpcnN0X2xpbmUnID0+ICR0aGlzLT5sc3RhY2tbXGNvdW50KCR0aGlzLT5sc3RhY2spIC0gKCRsZW4gPzogMSldWydmaXJzdF9saW5lJ10sCidsYXN0X2xpbmUnID0+ICR0aGlzLT5sc3RhY2tbXGNvdW50KCR0aGlzLT5sc3RhY2spIC0gMV1bJ2xhc3RfbGluZSddLAonZmlyc3RfY29sdW1uJyA9PiAkdGhpcy0+bHN0YWNrW1xjb3VudCgkdGhpcy0+bHN0YWNrKSAtICgkbGVuID86IDEpXVsnZmlyc3RfY29sdW1uJ10sCidsYXN0X2NvbHVtbicgPT4gJHRoaXMtPmxzdGFja1tcY291bnQoJHRoaXMtPmxzdGFjaykgLSAxXVsnbGFzdF9jb2x1bW4nXSwKKTsKbGlzdCgkbmV3VG9rZW4sICRhY3Rpb25SZXN1bHQpID0gJHRoaXMtPnBlcmZvcm1BY3Rpb24oJGN1cnJlbnRUb2tlbiwgJHl5dGV4dCwgJHl5bGVuZywgJHl5bGluZW5vLCAkYWN0aW9uWzFdKTsKCmlmICghJGFjdGlvblJlc3VsdCBpbnN0YW5jZW9mIFVuZGVmaW5lZCkgewpyZXR1cm4gJGFjdGlvblJlc3VsdDsKfQoKaWYgKCRsZW4pIHsKJHRoaXMtPnBvcFN0YWNrKCRsZW4pOwp9CgokdGhpcy0+c3RhY2tbXSA9ICR0aGlzLT5wcm9kdWN0aW9uc19bJGFjdGlvblsxXV1bMF07IAokdGhpcy0+dnN0YWNrW10gPSAkbmV3VG9rZW47CiR0aGlzLT5sc3RhY2tbXSA9ICRwb3NpdGlvbjsKCiRuZXdTdGF0ZSA9ICR0aGlzLT50YWJsZVskdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMl1dWyR0aGlzLT5zdGFja1tcY291bnQoJHRoaXMtPnN0YWNrKS0xXV07CiR0aGlzLT5zdGFja1tdID0gJG5ld1N0YXRlOwpicmVhazsKCmNhc2UgMzogCgpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlRXJyb3IoJHN0ciwgJGhhc2ggPSBudWxsKQp7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCRzdHIsICRoYXNoID86IGFycmF5KCkpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbigkY3VycmVudFRva2VuLCAkeXl0ZXh0LCAkeXlsZW5nLCAkeXlsaW5lbm8sICR5eXN0YXRlKQp7CiR0b2tlbiA9ICRjdXJyZW50VG9rZW47CgokbGVuID0gXGNvdW50KCR0aGlzLT52c3RhY2spIC0gMTsKc3dpdGNoICgkeXlzdGF0ZSkgewpjYXNlIDE6CiR5eXRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3soPzpcXFxcWyJiZm5ydC9cXFxcXXxcXFxcdVthLWZBLUYwLTldezR9KX0nLCBhcnJheSgkdGhpcywgJ3N0cmluZ0ludGVycG9sYXRpb24nKSwgJHl5dGV4dCk7CiR0b2tlbiA9ICR5eXRleHQ7CmJyZWFrOwpjYXNlIDI6CmlmIChzdHJwb3MoJHl5dGV4dCwgJ2UnKSAhPT0gZmFsc2UgfHwgc3RycG9zKCR5eXRleHQsICdFJykgIT09IGZhbHNlKSB7CiR0b2tlbiA9IFxmbG9hdHZhbCgkeXl0ZXh0KTsKfSBlbHNlIHsKJHRva2VuID0gc3RycG9zKCR5eXRleHQsICcuJykgPT09IGZhbHNlID8gXGludHZhbCgkeXl0ZXh0KSA6IFxmbG9hdHZhbCgkeXl0ZXh0KTsKfQpicmVhazsKY2FzZSAzOgokdG9rZW4gPSBudWxsOwpicmVhazsKY2FzZSA0OgokdG9rZW4gPSB0cnVlOwpicmVhazsKY2FzZSA1OgokdG9rZW4gPSBmYWxzZTsKYnJlYWs7CmNhc2UgNjoKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTFdOwoKcmV0dXJuIGFycmF5KCR0b2tlbiwgJHRva2VuKTsKY2FzZSAxMzoKaWYgKCR0aGlzLT5mbGFncyAmIHNlbGY6OlBBUlNFX1RPX0FTU09DKSB7CiR0b2tlbiA9IGFycmF5KCk7Cn0gZWxzZSB7CiR0b2tlbiA9IG5ldyBzdGRDbGFzczsKfQpicmVhazsKY2FzZSAxNDoKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTFdOwpicmVhazsKY2FzZSAxNToKJHRva2VuID0gYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdLCAkdGhpcy0+dnN0YWNrWyRsZW5dKTsKYnJlYWs7CmNhc2UgMTY6CmFzc2VydChcaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuXSkpOwppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDEwMCkgewokcHJvcGVydHkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdID09PSAnJyA/ICdfZW1wdHlfJyA6ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0gZWxzZSB7CiRwcm9wZXJ0eSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0KaWYgKCR0aGlzLT5mbGFncyAmIHNlbGY6OlBBUlNFX1RPX0FTU09DKSB7CiR0b2tlbiA9IGFycmF5KCk7CiR0b2tlblskcHJvcGVydHldID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfSBlbHNlIHsKJHRva2VuID0gbmV3IHN0ZENsYXNzOwokdG9rZW4tPiRwcm9wZXJ0eSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0KYnJlYWs7CmNhc2UgMTc6CmFzc2VydChcaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuXSkpOwppZiAoJHRoaXMtPmZsYWdzICYgc2VsZjo6UEFSU0VfVE9fQVNTT0MpIHsKYXNzZXJ0KFxpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl0pKTsKJHRva2VuID0mICR0aGlzLT52c3RhY2tbJGxlbi0yXTsKJGtleSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07CmlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6REVURUNUX0tFWV9DT05GTElDVFMpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSkpIHsKJGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcgLiAoJHl5bGluZW5vKzEpIC4gIjpcbiI7CiRlcnJTdHIgLj0gJHRoaXMtPmxleGVyLT5zaG93UG9zaXRpb24oKSAuICJcbiI7CiRlcnJTdHIgLj0gIkR1cGxpY2F0ZSBrZXk6ICIuJHRoaXMtPnZzdGFja1skbGVuXVswXTsKdGhyb3cgbmV3IER1cGxpY2F0ZUtleUV4Y2VwdGlvbigkZXJyU3RyLCAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdLCBhcnJheSgnbGluZScgPT4gJHl5bGluZW5vKzEpKTsKfSBlbHNlaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZUykgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldKSkgewokZHVwbGljYXRlQ291bnQgPSAxOwpkbyB7CiRkdXBsaWNhdGVLZXkgPSAka2V5IC4gJy4nIC4gJGR1cGxpY2F0ZUNvdW50Kys7Cn0gd2hpbGUgKGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVskZHVwbGljYXRlS2V5XSkpOwoka2V5ID0gJGR1cGxpY2F0ZUtleTsKfQokdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0gPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9IGVsc2Ugewphc3NlcnQoJHRoaXMtPnZzdGFja1skbGVuLTJdIGluc3RhbmNlb2Ygc3RkQ2xhc3MpOwokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMl07CmlmIChQSFBfVkVSU0lPTl9JRCA8IDcwMTAwKSB7CiRrZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdID09PSAnJyA/ICdfZW1wdHlfJyA6ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0gZWxzZSB7CiRrZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp9CmlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6REVURUNUX0tFWV9DT05GTElDVFMpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+eyRrZXl9KSkgewokZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJyAuICgkeXlsaW5lbm8rMSkgLiAiOlxuIjsKJGVyclN0ciAuPSAkdGhpcy0+bGV4ZXItPnNob3dQb3NpdGlvbigpIC4gIlxuIjsKJGVyclN0ciAuPSAiRHVwbGljYXRlIGtleTogIi4kdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp0aHJvdyBuZXcgRHVwbGljYXRlS2V5RXhjZXB0aW9uKCRlcnJTdHIsICR0aGlzLT52c3RhY2tbJGxlbl1bMF0sIGFycmF5KCdsaW5lJyA9PiAkeXlsaW5lbm8rMSkpOwp9IGVsc2VpZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPnska2V5fSkpIHsKJGR1cGxpY2F0ZUNvdW50ID0gMTsKZG8gewokZHVwbGljYXRlS2V5ID0gJGtleSAuICcuJyAuICRkdXBsaWNhdGVDb3VudCsrOwp9IHdoaWxlIChpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRkdXBsaWNhdGVLZXkpKTsKJGtleSA9ICRkdXBsaWNhdGVLZXk7Cn0KJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5ID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfQpicmVhazsKY2FzZSAxODoKJHRva2VuID0gYXJyYXkoKTsKYnJlYWs7CmNhc2UgMTk6CiR0b2tlbiA9ICR0aGlzLT52c3RhY2tbJGxlbi0xXTsKYnJlYWs7CmNhc2UgMjA6CiR0b2tlbiA9IGFycmF5KCR0aGlzLT52c3RhY2tbJGxlbl0pOwpicmVhazsKY2FzZSAyMToKYXNzZXJ0KFxpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl0pKTsKJHRoaXMtPnZzdGFja1skbGVuLTJdW10gPSAkdGhpcy0+dnN0YWNrWyRsZW5dOwokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMl07CmJyZWFrOwp9CgpyZXR1cm4gYXJyYXkoJHRva2VuLCBuZXcgVW5kZWZpbmVkKCkpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdHJpbmdJbnRlcnBvbGF0aW9uKCRtYXRjaCkKewpzd2l0Y2ggKCRtYXRjaFswXSkgewpjYXNlICdcXFxcJzoKcmV0dXJuICdcXCc7CmNhc2UgJ1wiJzoKcmV0dXJuICciJzsKY2FzZSAnXGInOgpyZXR1cm4gXGNocig4KTsKY2FzZSAnXGYnOgpyZXR1cm4gXGNocigxMik7CmNhc2UgJ1xuJzoKcmV0dXJuICJcbiI7CmNhc2UgJ1xyJzoKcmV0dXJuICJcciI7CmNhc2UgJ1x0JzoKcmV0dXJuICJcdCI7CmNhc2UgJ1wvJzoKcmV0dXJuICIvIjsKZGVmYXVsdDoKcmV0dXJuIGh0bWxfZW50aXR5X2RlY29kZSgnJiN4Jy5sdHJpbShzdWJzdHIoJG1hdGNoWzBdLCAyKSwgJzAnKS4nOycsIEVOVF9RVU9URVMsICdVVEYtOCcpOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBvcFN0YWNrKCRuKQp7CiR0aGlzLT5zdGFjayA9IFxhcnJheV9zbGljZSgkdGhpcy0+c3RhY2ssIDAsIC0gKDIgKiAkbikpOwokdGhpcy0+dnN0YWNrID0gXGFycmF5X3NsaWNlKCR0aGlzLT52c3RhY2ssIDAsIC0gJG4pOwokdGhpcy0+bHN0YWNrID0gXGFycmF5X3NsaWNlKCR0aGlzLT5sc3RhY2ssIDAsIC0gJG4pOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmYWlsT25CT00oJGlucHV0KQp7CgokYm9tID0gIlx4RUZceEJCXHhCRiI7CgppZiAoc3Vic3RyKCRpbnB1dCwgMCwgMykgPT09ICRib20pIHsKJHRoaXMtPnBhcnNlRXJyb3IoIkJPTSBkZXRlY3RlZCwgbWFrZSBzdXJlIHlvdXIgaW5wdXQgZG9lcyBub3QgaW5jbHVkZSBhIFVuaWNvZGUgQnl0ZS1PcmRlci1NYXJrIik7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKCgoKCgoKY2xhc3MgTGV4ZXIKewoKY29uc3QgRU9GID0gMTsKCmNvbnN0IFRfSU5WQUxJRCA9IC0xOwpjb25zdCBUX1NLSVBfV0hJVEVTUEFDRSA9IDA7CmNvbnN0IFRfRVJST1IgPSAyOwoKY29uc3QgVF9CUkVBS19MSU5FID0gMzsKCmNvbnN0IFRfQ09NTUVOVCA9IDMwOwoKY29uc3QgVF9PUEVOX0NPTU1FTlQgPSAzMTsKCmNvbnN0IFRfQ0xPU0VfQ09NTUVOVCA9IDMyOwoKCgoKCnByaXZhdGUgJHJ1bGVzID0gYXJyYXkoCjAgPT4gJy9cR1xzKlxuXHI/LycsCjEgPT4gJy9cR1xzKy8nLAoyID0+ICcvXEctPyhbMC05XXxbMS05XVswLTldKykoXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspP1xiLycsCjMgPT4gJ3tcRyIoPz5cXFxcWyJiZm5ydC9cXFxcXXxcXFxcdVthLWZBLUYwLTldezR9fFteXDAtXHgxZlxcXFwiXSsrKSorIn0nLAo0ID0+ICcvXEdcey8nLAo1ID0+ICcvXEdcfS8nLAo2ID0+ICcvXEdcWy8nLAo3ID0+ICcvXEdcXS8nLAo4ID0+ICcvXEcsLycsCjkgPT4gJy9cRzovJywKMTAgPT4gJy9cR3RydWVcYi8nLAoxMSA9PiAnL1xHZmFsc2VcYi8nLAoxMiA9PiAnL1xHbnVsbFxiLycsCjEzID0+ICcvXEckLycsCjE0ID0+ICcvXEdcL1wvLycsCjE1ID0+ICcvXEdcL1wqLycsCjE2ID0+ICcvXEdcKlwvLycsCjE3ID0+ICcvXEcuLycsCik7CgoKcHJpdmF0ZSAkaW5wdXQ7Cgpwcml2YXRlICRtb3JlOwoKcHJpdmF0ZSAkZG9uZTsKCnByaXZhdGUgJG9mZnNldDsKCnByaXZhdGUgJGZsYWdzOwoKCnB1YmxpYyAkbWF0Y2g7CgpwdWJsaWMgJHl5bGluZW5vOwoKcHVibGljICR5eWxlbmc7CgpwdWJsaWMgJHl5dGV4dDsKCnB1YmxpYyAkeXlsbG9jOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmbGFncyA9IDApCnsKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbGV4KCkKewp3aGlsZSAodHJ1ZSkgewokc3ltYm9sID0gJHRoaXMtPm5leHQoKTsKc3dpdGNoICgkc3ltYm9sKSB7CmNhc2Ugc2VsZjo6VF9TS0lQX1dISVRFU1BBQ0U6CmNhc2Ugc2VsZjo6VF9CUkVBS19MSU5FOgpicmVhazsKY2FzZSBzZWxmOjpUX0NPTU1FTlQ6CmNhc2Ugc2VsZjo6VF9PUEVOX0NPTU1FTlQ6CmlmICghKCR0aGlzLT5mbGFncyAmIEpzb25QYXJzZXI6OkFMTE9XX0NPTU1FTlRTKSkgewokdGhpcy0+cGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgLiAoJHRoaXMtPnl5bGluZW5vKzEpIC4gIi4gQ29tbWVudHMgYXJlIG5vdCBhbGxvd2VkLlxuIiAuICR0aGlzLT5zaG93UG9zaXRpb24oKSk7Cn0KJHRoaXMtPnNraXBVbnRpbCgkc3ltYm9sID09PSBzZWxmOjpUX0NPTU1FTlQgPyBzZWxmOjpUX0JSRUFLX0xJTkUgOiBzZWxmOjpUX0NMT1NFX0NPTU1FTlQpOwppZiAoJHRoaXMtPmRvbmUpIHsKCnJldHVybiAxNDsKfQpicmVhazsKY2FzZSBzZWxmOjpUX0NMT1NFX0NPTU1FTlQ6CiR0aGlzLT5wYXJzZUVycm9yKCdMZXhpY2FsIGVycm9yIG9uIGxpbmUgJyAuICgkdGhpcy0+eXlsaW5lbm8rMSkgLiAiLiBVbmV4cGVjdGVkIHRva2VuLlxuIiAuICR0aGlzLT5zaG93UG9zaXRpb24oKSk7CmRlZmF1bHQ6CnJldHVybiAkc3ltYm9sOwp9Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dCgkaW5wdXQpCnsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+bW9yZSA9IGZhbHNlOwokdGhpcy0+ZG9uZSA9IGZhbHNlOwokdGhpcy0+b2Zmc2V0ID0gMDsKJHRoaXMtPnl5bGluZW5vID0gJHRoaXMtPnl5bGVuZyA9IDA7CiR0aGlzLT55eXRleHQgPSAkdGhpcy0+bWF0Y2ggPSAnJzsKJHRoaXMtPnl5bGxvYyA9IGFycmF5KCdmaXJzdF9saW5lJyA9PiAxLCAnZmlyc3RfY29sdW1uJyA9PiAwLCAnbGFzdF9saW5lJyA9PiAxLCAnbGFzdF9jb2x1bW4nID0+IDApOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvd1Bvc2l0aW9uKCkKewokcHJlID0gc3RyX3JlcGxhY2UoIlxuIiwgJycsICR0aGlzLT5nZXRQYXN0SW5wdXQoKSk7CiRjID0gc3RyX3JlcGVhdCgnLScsIG1heCgwLCBcc3RybGVuKCRwcmUpIC0gMSkpOyAKCnJldHVybiAkcHJlIC4gc3RyX3JlcGxhY2UoIlxuIiwgJycsICR0aGlzLT5nZXRVcGNvbWluZ0lucHV0KCkpIC4gIlxuIiAuICRjIC4gIl4iOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFzdElucHV0KCkKewokcGFzdExlbmd0aCA9ICR0aGlzLT5vZmZzZXQgLSBcc3RybGVuKCR0aGlzLT5tYXRjaCk7CgpyZXR1cm4gKCRwYXN0TGVuZ3RoID4gMjAgPyAnLi4uJyA6ICcnKSAuIHN1YnN0cigkdGhpcy0+aW5wdXQsIG1heCgwLCAkcGFzdExlbmd0aCAtIDIwKSwgbWluKDIwLCAkcGFzdExlbmd0aCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBjb21pbmdJbnB1dCgpCnsKJG5leHQgPSAkdGhpcy0+bWF0Y2g7CmlmIChcc3RybGVuKCRuZXh0KSA8IDIwKSB7CiRuZXh0IC49IHN1YnN0cigkdGhpcy0+aW5wdXQsICR0aGlzLT5vZmZzZXQsIDIwIC0gXHN0cmxlbigkbmV4dCkpOwp9CgpyZXR1cm4gc3Vic3RyKCRuZXh0LCAwLCAyMCkgLiAoXHN0cmxlbigkbmV4dCkgPiAyMCA/ICcuLi4nIDogJycpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVsbFVwY29taW5nSW5wdXQoKQp7CiRuZXh0ID0gJHRoaXMtPm1hdGNoOwppZiAoc3Vic3RyKCRuZXh0LCAwLCAxKSA9PT0gJyInICYmIHN1YnN0cl9jb3VudCgkbmV4dCwgJyInKSA9PT0gMSkgewokbGVuID0gXHN0cmxlbigkdGhpcy0+aW5wdXQpOwppZiAoJGxlbiA9PT0gJHRoaXMtPm9mZnNldCkgewokc3RyRW5kID0gJGxlbjsKfSBlbHNlIHsKJHN0ckVuZCA9IG1pbihzdHJwb3MoJHRoaXMtPmlucHV0LCAnIicsICR0aGlzLT5vZmZzZXQgKyAxKSA/OiAkbGVuLCBzdHJwb3MoJHRoaXMtPmlucHV0LCAiXG4iLCAkdGhpcy0+b2Zmc2V0ICsgMSkgPzogJGxlbik7Cn0KJG5leHQgLj0gc3Vic3RyKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm9mZnNldCwgJHN0ckVuZCAtICR0aGlzLT5vZmZzZXQpOwp9IGVsc2VpZiAoXHN0cmxlbigkbmV4dCkgPCAyMCkgewokbmV4dCAuPSBzdWJzdHIoJHRoaXMtPmlucHV0LCAkdGhpcy0+b2Zmc2V0LCAyMCAtIFxzdHJsZW4oJG5leHQpKTsKfQoKcmV0dXJuICRuZXh0Owp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlRXJyb3IoJHN0cikKewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigkc3RyKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2tpcFVudGlsKCR0b2tlbikKewokc3ltYm9sID0gJHRoaXMtPm5leHQoKTsKd2hpbGUgKCRzeW1ib2wgIT09ICR0b2tlbiAmJiBmYWxzZSA9PT0gJHRoaXMtPmRvbmUpIHsKJHN5bWJvbCA9ICR0aGlzLT5uZXh0KCk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBuZXh0KCkKewppZiAoJHRoaXMtPmRvbmUpIHsKcmV0dXJuIHNlbGY6OkVPRjsKfQppZiAoJHRoaXMtPm9mZnNldCA9PT0gXHN0cmxlbigkdGhpcy0+aW5wdXQpKSB7CiR0aGlzLT5kb25lID0gdHJ1ZTsKfQoKJHRva2VuID0gbnVsbDsKJG1hdGNoID0gbnVsbDsKJGNvbCA9IG51bGw7CiRsaW5lcyA9IG51bGw7CgppZiAoISR0aGlzLT5tb3JlKSB7CiR0aGlzLT55eXRleHQgPSAnJzsKJHRoaXMtPm1hdGNoID0gJyc7Cn0KCiRydWxlc0xlbiA9IGNvdW50KCR0aGlzLT5ydWxlcyk7Cgpmb3IgKCRpPTA7ICRpIDwgJHJ1bGVzTGVuOyAkaSsrKSB7CmlmIChwcmVnX21hdGNoKCR0aGlzLT5ydWxlc1skaV0sICR0aGlzLT5pbnB1dCwgJG1hdGNoLCAwLCAkdGhpcy0+b2Zmc2V0KSkgewokbGluZXMgPSBleHBsb2RlKCJcbiIsICRtYXRjaFswXSk7CmFycmF5X3NoaWZ0KCRsaW5lcyk7CiRsaW5lQ291bnQgPSBcY291bnQoJGxpbmVzKTsKJHRoaXMtPnl5bGluZW5vICs9ICRsaW5lQ291bnQ7CiR0aGlzLT55eWxsb2MgPSBhcnJheSgKJ2ZpcnN0X2xpbmUnID0+ICR0aGlzLT55eWxsb2NbJ2xhc3RfbGluZSddLAonbGFzdF9saW5lJyA9PiAkdGhpcy0+eXlsaW5lbm8rMSwKJ2ZpcnN0X2NvbHVtbicgPT4gJHRoaXMtPnl5bGxvY1snbGFzdF9jb2x1bW4nXSwKJ2xhc3RfY29sdW1uJyA9PiAkbGluZUNvdW50ID4gMCA/IFxzdHJsZW4oJGxpbmVzWyRsaW5lQ291bnQgLSAxXSkgOiAkdGhpcy0+eXlsbG9jWydsYXN0X2NvbHVtbiddICsgXHN0cmxlbigkbWF0Y2hbMF0pLAopOwokdGhpcy0+eXl0ZXh0IC49ICRtYXRjaFswXTsKJHRoaXMtPm1hdGNoIC49ICRtYXRjaFswXTsKJHRoaXMtPnl5bGVuZyA9IFxzdHJsZW4oJHRoaXMtPnl5dGV4dCk7CiR0aGlzLT5tb3JlID0gZmFsc2U7CiR0aGlzLT5vZmZzZXQgKz0gXHN0cmxlbigkbWF0Y2hbMF0pOwpyZXR1cm4gJHRoaXMtPnBlcmZvcm1BY3Rpb24oJGkpOwp9Cn0KCmlmICgkdGhpcy0+b2Zmc2V0ID09PSBcc3RybGVuKCR0aGlzLT5pbnB1dCkpIHsKcmV0dXJuIHNlbGY6OkVPRjsKfQoKJHRoaXMtPnBhcnNlRXJyb3IoCidMZXhpY2FsIGVycm9yIG9uIGxpbmUgJyAuICgkdGhpcy0+eXlsaW5lbm8rMSkgLiAiLiBVbnJlY29nbml6ZWQgdGV4dC5cbiIgLiAkdGhpcy0+c2hvd1Bvc2l0aW9uKCkKKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbigkcnVsZSkKewpzd2l0Y2ggKCRydWxlKSB7CmNhc2UgMDoKcmV0dXJuIHNlbGY6OlRfQlJFQUtfTElORTsKY2FzZSAxOgpyZXR1cm4gc2VsZjo6VF9TS0lQX1dISVRFU1BBQ0U7CmNhc2UgMjoKcmV0dXJuIDY7CmNhc2UgMzoKJHRoaXMtPnl5dGV4dCA9IHN1YnN0cigkdGhpcy0+eXl0ZXh0LCAxLCAkdGhpcy0+eXlsZW5nLTIpOwpyZXR1cm4gNDsKY2FzZSA0OgpyZXR1cm4gMTc7CmNhc2UgNToKcmV0dXJuIDE4OwpjYXNlIDY6CnJldHVybiAyMzsKY2FzZSA3OgpyZXR1cm4gMjQ7CmNhc2UgODoKcmV0dXJuIDIyOwpjYXNlIDk6CnJldHVybiAyMTsKY2FzZSAxMDoKcmV0dXJuIDEwOwpjYXNlIDExOgpyZXR1cm4gMTE7CmNhc2UgMTI6CnJldHVybiA4OwpjYXNlIDEzOgpyZXR1cm4gMTQ7CmNhc2UgMTQ6CnJldHVybiBzZWxmOjpUX0NPTU1FTlQ7CmNhc2UgMTU6CnJldHVybiBzZWxmOjpUX09QRU5fQ09NTUVOVDsKY2FzZSAxNjoKcmV0dXJuIHNlbGY6OlRfQ0xPU0VfQ09NTUVOVDsKY2FzZSAxNzoKcmV0dXJuIHNlbGY6OlRfSU5WQUxJRDsKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVW5zdXBwb3J0ZWQgcnVsZSAnLiRydWxlKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXEpzb25MaW50OwoKY2xhc3MgUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKCgpwcm90ZWN0ZWQgJGRldGFpbHM7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlLCAkZGV0YWlscyA9IGFycmF5KCkpCnsKJHRoaXMtPmRldGFpbHMgPSAkZGV0YWlsczsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXRhaWxzKCkKewpyZXR1cm4gJHRoaXMtPmRldGFpbHM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcSnNvbkxpbnQ7CgpjbGFzcyBVbmRlZmluZWQKewp9CgpDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGkgQm9nZ2lhbm8KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcUGhhclV0aWxzOwoKY2xhc3MgTGludGVyCnsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaW50KCRwYXRoLCBhcnJheSAkZXhjbHVkZWRQYXRocyA9IGFycmF5KCkpCnsKJHBocCA9IGRlZmluZWQoJ1BIUF9CSU5BUlknKSA/IFBIUF9CSU5BUlkgOiAncGhwJzsKCmlmICgkaXNXaW5kb3dzID0gZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CiR0bXBGaWxlID0gQHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnJyk7CgppZiAoISR0bXBGaWxlIHx8ICFpc193cml0YWJsZSgkdG1wRmlsZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZScpOwp9CgokcGhwID0gc2VsZjo6ZXNjYXBlV2luZG93c1BhdGgoJHBocCk7CiR0bXBGaWxlID0gc2VsZjo6ZXNjYXBlV2luZG93c1BhdGgoJHRtcEZpbGUpOwoKCmlmIChQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewokZm9ybWF0ID0gJyVzIC1sICVzJzsKfSBlbHNlIHsKJGZvcm1hdCA9ICciJXMgLWwgJXMiJzsKfQoKJGNvbW1hbmQgPSBzcHJpbnRmKCRmb3JtYXQsICRwaHAsICR0bXBGaWxlKTsKfSBlbHNlIHsKJGNvbW1hbmQgPSAiJyIuJHBocC4iJyAtbCI7Cn0KCiRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KAowID0+IGFycmF5KCdwaXBlJywgJ3InKSwKMSA9PiBhcnJheSgncGlwZScsICd3JyksCjIgPT4gYXJyYXkoJ3BpcGUnLCAndycpCik7CgoKJGJhc2VMZW4gPSBzdHJsZW4ocmVhbHBhdGgoJHBhdGgpKSArIDcgKyAxOwpmb3JlYWNoIChuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFxQaGFyKCRwYXRoKSkgYXMgJGZpbGUpIHsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CmNvbnRpbnVlOwp9CmlmIChzdWJzdHIoJGZpbGUsIC00KSA9PT0gJy5waHAnKSB7CiRmaWxlbmFtZSA9IChzdHJpbmcpICRmaWxlOwppZiAoaW5fYXJyYXkoc3Vic3RyKCRmaWxlbmFtZSwgJGJhc2VMZW4pLCAkZXhjbHVkZWRQYXRocywgdHJ1ZSkpIHsKY29udGludWU7Cn0KaWYgKCRpc1dpbmRvd3MpIHsKZmlsZV9wdXRfY29udGVudHMoJHRtcEZpbGUsIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSkpOwp9CgokcHJvY2VzcyA9IHByb2Nfb3BlbigkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOwppZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7CmlmICghJGlzV2luZG93cykgewpmd3JpdGUoJHBpcGVzWzBdLCBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpKTsKfQpmY2xvc2UoJHBpcGVzWzBdKTsKCiRzdGRvdXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7CmZjbG9zZSgkcGlwZXNbMV0pOwokc3RkZXJyID0gc3RyZWFtX2dldF9jb250ZW50cygkcGlwZXNbMl0pOwpmY2xvc2UoJHBpcGVzWzJdKTsKCiRleGl0Q29kZSA9IHByb2NfY2xvc2UoJHByb2Nlc3MpOwoKaWYgKCRleGl0Q29kZSAhPT0gMCkgewppZiAoJGlzV2luZG93cykgewokc3RkZXJyID0gc3RyX3JlcGxhY2UoJHRtcEZpbGUsICRmaWxlbmFtZSwgJHN0ZGVycik7Cn0KdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ZhaWxlZCBsaW50aW5nICcuJGZpbGUuJzogJy4kc3RkZXJyKTsKfQp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBzdGFydCBsaW50ZXIgcHJvY2VzcycpOwp9Cn0KfQoKaWYgKCRpc1dpbmRvd3MpIHsKQHVubGluaygkdG1wRmlsZSk7Cn0KfQoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlV2luZG93c1BhdGgoJHBhdGgpCnsKCmlmIChzdHJwYnJrKCRwYXRoLCAiICgpIikgIT09IGZhbHNlKSB7CiRwYXRoID0gJyInLiRwYXRoLiciJzsKfQoKcmV0dXJuICRwYXRoOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXFBoYXJVdGlsczsKCmNsYXNzIFRpbWVzdGFtcHMKewpwcml2YXRlICRjb250ZW50czsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmlsZSkKewokdGhpcy0+Y29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlVGltZXN0YW1wcygkdGltZXN0YW1wID0gbnVsbCkKewppZiAoJHRpbWVzdGFtcCBpbnN0YW5jZW9mIFxEYXRlVGltZSB8fCAkdGltZXN0YW1wIGluc3RhbmNlb2YgXERhdGVUaW1lSW50ZXJmYWNlKSB7CiR0aW1lc3RhbXAgPSAkdGltZXN0YW1wLT5nZXRUaW1lc3RhbXAoKTsKfSBlbHNlaWYgKGlzX3N0cmluZygkdGltZXN0YW1wKSkgewokdGltZXN0YW1wID0gc3RydG90aW1lKCR0aW1lc3RhbXApOwp9IGVsc2VpZiAoIWlzX2ludCgkdGltZXN0YW1wKSkgewokdGltZXN0YW1wID0gc3RydG90aW1lKCcxOTg0LTEyLTI0VDAwOjAwOjAwWicpOwp9CgoKaWYgKCFwcmVnX21hdGNoKCd7X19IQUxUX0NPTVBJTEVSXChcKTsoPzogK1w/Pik/XHI/XG59JywgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGRldGVjdCB0aGUgc3R1YlwncyBlbmQgaW4gdGhlIHBoYXInKTsKfQoKCiRwb3MgPSAkbWF0Y2hbMF1bMV0gKyBzdHJsZW4oJG1hdGNoWzBdWzBdKTsKJHN0dWJFbmQgPSAkcG9zICsgJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQ7CgokbnVtRmlsZXMgPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNDsKCgokcG9zICs9IDI7CgoKJHBvcyArPSA0OwoKJGFsaWFzTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkYWxpYXNMZW5ndGg7CgokbWV0YWRhdGFMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRtZXRhZGF0YUxlbmd0aDsKCndoaWxlICgkcG9zIDwgJHN0dWJFbmQpIHsKJGZpbGVuYW1lTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkZmlsZW5hbWVMZW5ndGg7CgoKJHBvcyArPSA0OwoKCiR0aW1lU3RhbXBCeXRlcyA9IHBhY2soJ0wnLCAkdGltZXN0YW1wKTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAwXSA9ICR0aW1lU3RhbXBCeXRlc1swXTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAxXSA9ICR0aW1lU3RhbXBCeXRlc1sxXTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAyXSA9ICR0aW1lU3RhbXBCeXRlc1syXTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAzXSA9ICR0aW1lU3RhbXBCeXRlc1szXTsKCgokcG9zICs9IDQqNDsKCiRtZXRhZGF0YUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJG1ldGFkYXRhTGVuZ3RoOwoKJG51bUZpbGVzLS07Cn0KCmlmICgkbnVtRmlsZXMgIT09IDApIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQWxsIGZpbGVzIHdlcmUgbm90IHByb2Nlc3NlZCwgc29tZXRoaW5nIG11c3QgaGF2ZSBnb25lIHdyb25nJyk7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzYXZlKCRwYXRoLCAkc2lnbmF0dXJlQWxnbykKewokcG9zID0gJHRoaXMtPmRldGVybWluZVNpZ25hdHVyZUJlZ2luKCk7CgokYWxnb3MgPSBhcnJheSgKXFBoYXI6Ok1ENSA9PiAnbWQ1JywKXFBoYXI6OlNIQTEgPT4gJ3NoYTEnLApcUGhhcjo6U0hBMjU2ID0+ICdzaGEyNTYnLApcUGhhcjo6U0hBNTEyID0+ICdzaGE1MTInLAopOwoKaWYgKCFpc3NldCgkYWxnb3NbJHNpZ25hdHVyZUFsZ29dKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignSW52YWxpZCBoYXNoIGFsZ29yaXRobSBnaXZlbjogJy4kc2lnbmF0dXJlQWxnby4nIGV4cGVjdGVkIG9uZSBvZiBQaGFyOjpNRDUsIFBoYXI6OlNIQTEsIFBoYXI6OlNIQTI1NiBvciBQaGFyOjpTSEE1MTInKTsKfQokYWxnbyA9ICRhbGdvc1skc2lnbmF0dXJlQWxnb107CgoKCiRzaWduYXR1cmUgPSBoYXNoKCRhbGdvLCBzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAwLCAkcG9zKSwgdHJ1ZSkKCi4gcGFjaygnTCcsICRzaWduYXR1cmVBbGdvKQoKLiAnR0JNQic7CgokdGhpcy0+Y29udGVudHMgPSBzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAwLCAkcG9zKSAuICRzaWduYXR1cmU7CgpyZXR1cm4gZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICR0aGlzLT5jb250ZW50cyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVhZFVpbnQoJHBvcywgJGJ5dGVzKQp7CiRyZXMgPSB1bnBhY2soJ1YnLCBzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAkcG9zLCAkYnl0ZXMpKTsKCnJldHVybiAkcmVzWzFdOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZGV0ZXJtaW5lU2lnbmF0dXJlQmVnaW4oKQp7CgppZiAoIXByZWdfbWF0Y2goJ3tfX0hBTFRfQ09NUElMRVJcKFwpOyg/OiArXD8+KT9ccj9cbn0nLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgUFJFR19PRkZTRVRfQ0FQVFVSRSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZWN0IHRoZSBzdHViXCdzIGVuZCBpbiB0aGUgcGhhcicpOwp9CgoKJHBvcyA9ICRtYXRjaFswXVsxXSArIHN0cmxlbigkbWF0Y2hbMF1bMF0pOwokbWFuaWZlc3RFbmQgPSAkcG9zICsgNCArICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKCiRwb3MgKz0gNDsKJG51bUZpbGVzID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwoKJHBvcyArPSA0OwoKCiRwb3MgKz0gMjsKCgokcG9zICs9IDQ7CgokYWxpYXNMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRhbGlhc0xlbmd0aDsKCiRtZXRhZGF0YUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJG1ldGFkYXRhTGVuZ3RoOwoKJGNvbXByZXNzZWRTaXplcyA9IDA7CndoaWxlICgoJG51bUZpbGVzID4gMCkgJiYgKCRwb3MgPCAkbWFuaWZlc3RFbmQgLSAyNCkpIHsKJGZpbGVuYW1lTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkZmlsZW5hbWVMZW5ndGg7CgoKJHBvcyArPSAyKjQ7CgokY29tcHJlc3NlZFNpemVzICs9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKCiRwb3MgKz0gMyo0OwoKJG1ldGFkYXRhTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkbWV0YWRhdGFMZW5ndGg7CgokbnVtRmlsZXMtLTsKfQoKaWYgKCRudW1GaWxlcyAhPT0gMCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdBbGwgZmlsZXMgd2VyZSBub3QgcHJvY2Vzc2VkLCBzb21ldGhpbmcgbXVzdCBoYXZlIGdvbmUgd3JvbmcnKTsKfQoKcmV0dXJuICRtYW5pZmVzdEVuZCArICRjb21wcmVzc2VkU2l6ZXM7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDE1IEpvcmRpIEJvZ2dpYW5vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXFNpZ25hbDsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIENsb3N1cmU7CnVzZSBXZWFrUmVmZXJlbmNlOwoKCgoKZmluYWwgY2xhc3MgU2lnbmFsSGFuZGxlcgp7CgoKCgoKCgpwdWJsaWMgY29uc3QgU0lHSFVQID0gJ1NJR0hVUCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFNJR0lOVCA9ICdTSUdJTlQnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdRVUlUID0gJ1NJR1FVSVQnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdJTEwgPSAnU0lHSUxMJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1RSQVAgPSAnU0lHVFJBUCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdBQlJUID0gJ1NJR0FCUlQnOwoKcHVibGljIGNvbnN0IFNJR0lPVCA9ICdTSUdJT1QnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdCVVMgPSAnU0lHQlVTJzsKCnB1YmxpYyBjb25zdCBTSUdGUEUgPSAnU0lHRlBFJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR0tJTEwgPSAnU0lHS0lMTCc7CgoKCgpwdWJsaWMgY29uc3QgU0lHVVNSMSA9ICdTSUdVU1IxJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdVU1IyID0gJ1NJR1VTUjInOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdTRUdWID0gJ1NJR1NFR1YnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdQSVBFID0gJ1NJR1BJUEUnOwoKCgoKCgoKcHVibGljIGNvbnN0IFNJR0FMUk0gPSAnU0lHQUxSTSc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdURVJNID0gJ1NJR1RFUk0nOwoKcHVibGljIGNvbnN0IFNJR1NUS0ZMVCA9ICdTSUdTVEtGTFQnOwpwdWJsaWMgY29uc3QgU0lHQ0xEID0gJ1NJR0NMRCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdDSExEID0gJ1NJR0NITEQnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdDT05UID0gJ1NJR0NPTlQnOwoKCgoKcHVibGljIGNvbnN0IFNJR1NUT1AgPSAnU0lHU1RPUCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdUU1RQID0gJ1NJR1RTVFAnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdUVElOID0gJ1NJR1RUSU4nOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdUVE9VID0gJ1NJR1RUT1UnOwoKCgoKcHVibGljIGNvbnN0IFNJR1VSRyA9ICdTSUdVUkcnOwoKCgoKCgoKcHVibGljIGNvbnN0IFNJR1hDUFUgPSAnU0lHWENQVSc7CgoKCgpwdWJsaWMgY29uc3QgU0lHWEZTWiA9ICdTSUdYRlNaJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHVlRBTFJNID0gJ1NJR1ZUQUxSTSc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdQUk9GID0gJ1NJR1BST0YnOwoKCgoKcHVibGljIGNvbnN0IFNJR1dJTkNIID0gJ1NJR1dJTkNIJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1BPTEwgPSAnU0lHUE9MTCc7CgpwdWJsaWMgY29uc3QgU0lHSU8gPSAnU0lHSU8nOwoKCgoKcHVibGljIGNvbnN0IFNJR1BXUiA9ICdTSUdQV1InOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdTWVMgPSAnU0lHU1lTJzsKCnB1YmxpYyBjb25zdCBTSUdCQUJZID0gJ1NJR0JBQlknOwoKCgoKcHVibGljIGNvbnN0IFNJR0JSRUFLID0gJ1NJR0JSRUFLJzsKCnByaXZhdGUgY29uc3QgQUxMX1NJR05BTFMgPSBbCnNlbGY6OlNJR0hVUCwgc2VsZjo6U0lHSU5ULCBzZWxmOjpTSUdRVUlULCBzZWxmOjpTSUdJTEwsIHNlbGY6OlNJR1RSQVAsIHNlbGY6OlNJR0FCUlQsIHNlbGY6OlNJR0lPVCwgc2VsZjo6U0lHQlVTLApzZWxmOjpTSUdGUEUsIHNlbGY6OlNJR0tJTEwsIHNlbGY6OlNJR1VTUjEsIHNlbGY6OlNJR1VTUjIsIHNlbGY6OlNJR1NFR1YsIHNlbGY6OlNJR1BJUEUsIHNlbGY6OlNJR0FMUk0sIHNlbGY6OlNJR1RFUk0sCnNlbGY6OlNJR1NUS0ZMVCwgc2VsZjo6U0lHQ0xELCBzZWxmOjpTSUdDSExELCBzZWxmOjpTSUdDT05ULCBzZWxmOjpTSUdTVE9QLCBzZWxmOjpTSUdUU1RQLCBzZWxmOjpTSUdUVElOLCBzZWxmOjpTSUdUVE9VLApzZWxmOjpTSUdVUkcsIHNlbGY6OlNJR1hDUFUsIHNlbGY6OlNJR1hGU1osIHNlbGY6OlNJR1ZUQUxSTSwgc2VsZjo6U0lHUFJPRiwgc2VsZjo6U0lHV0lOQ0gsIHNlbGY6OlNJR1BPTEwsIHNlbGY6OlNJR0lPLApzZWxmOjpTSUdQV1IsIHNlbGY6OlNJR1NZUywgc2VsZjo6U0lHQkFCWSwgc2VsZjo6U0lHQlJFQUsKXTsKCgoKCnByaXZhdGUgJHRyaWdnZXJlZCA9IG51bGw7CgoKCgoKcHJpdmF0ZSAkc2lnbmFsczsKCgoKCgpwcml2YXRlICRsb2dnZXJPckNhbGxiYWNrOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGhhbmRsZXJzID0gW107CgoKcHJpdmF0ZSBzdGF0aWMgJHdpbmRvd3NIYW5kbGVyID0gbnVsbDsKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRzaWduYWxzLCAkbG9nZ2VyT3JDYWxsYmFjaykKewppZiAoIWlzX2NhbGxhYmxlKCRsb2dnZXJPckNhbGxiYWNrKSAmJiAhJGxvZ2dlck9yQ2FsbGJhY2sgaW5zdGFuY2VvZiBMb2dnZXJJbnRlcmZhY2UgJiYgJGxvZ2dlck9yQ2FsbGJhY2sgIT09IG51bGwpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRsb2dnZXJPckNhbGxiYWNrIG11c3QgYmUgYSAnLkxvZ2dlckludGVyZmFjZTo6Y2xhc3MuJyBpbnN0YW5jZSwgYSBjYWxsYWJsZSwgb3IgbnVsbCwgJy4oaXNfb2JqZWN0KCRsb2dnZXJPckNhbGxiYWNrKSA/IGdldF9jbGFzcygkbG9nZ2VyT3JDYWxsYmFjaykgOiBnZXR0eXBlKCRsb2dnZXJPckNhbGxiYWNrKSkuJyByZWNlaXZlZC4nKTsKfQoKJHRoaXMtPnNpZ25hbHMgPSAkc2lnbmFsczsKJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2sgPSAkbG9nZ2VyT3JDYWxsYmFjazsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB0cmlnZ2VyKHN0cmluZyAkc2lnbmFsTmFtZSk6IHZvaWQKewokdGhpcy0+dHJpZ2dlcmVkID0gJHNpZ25hbE5hbWU7CgppZiAoJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2sgaW5zdGFuY2VvZiBMb2dnZXJJbnRlcmZhY2UpIHsKJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2stPmluZm8oJ1JlY2VpdmVkICcuJHNpZ25hbE5hbWUpOwp9IGVsc2VpZiAoJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2sgIT09IG51bGwpIHsKKCR0aGlzLT5sb2dnZXJPckNhbGxiYWNrKSgkc2lnbmFsTmFtZSwgJHRoaXMpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVHJpZ2dlcmVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnRyaWdnZXJlZCAhPT0gbnVsbDsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4aXRXaXRoTGFzdFNpZ25hbCgpOiB2b2lkCnsKJHNpZ25hbCA9ICR0aGlzLT50cmlnZ2VyZWQgPz8gJ1NJR0lOVCc7CiRzaWduYWwgPSBkZWZpbmVkKCRzaWduYWwpID8gY29uc3RhbnQoJHNpZ25hbCkgOiAyOwoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfa2lsbCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cGlkJykpIHsKcGNudGxfc2lnbmFsKCRzaWduYWwsIFNJR19ERkwpOwpwb3NpeF9raWxsKHBvc2l4X2dldHBpZCgpLCAkc2lnbmFsKTsKfQoKCgpleGl0KDEyOCArICRzaWduYWwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CiR0aGlzLT50cmlnZ2VyZWQgPSBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCnsKJHRoaXMtPnVucmVnaXN0ZXIoKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSg/YXJyYXkgJHNpZ25hbHMgPSBudWxsLCAkbG9nZ2VyT3JDYWxsYmFjayA9IG51bGwpOiBzZWxmCnsKaWYgKCRzaWduYWxzID09PSBudWxsKSB7CiRzaWduYWxzID0gW3NlbGY6OlNJR0lOVCwgc2VsZjo6U0lHVEVSTV07Cn0KJHNpZ25hbHMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRzaWduYWwpIHsKaWYgKGlzX2ludCgkc2lnbmFsKSkgewpyZXR1cm4gc2VsZjo6Z2V0U2lnbmFsTmFtZSgkc2lnbmFsKTsKfSBlbHNlaWYgKCFpbl9hcnJheSgkc2lnbmFsLCBzZWxmOjpBTExfU0lHTkFMUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRzaWduYWxzIG11c3QgYmUgYW4gYXJyYXkgb2YgU0lHKiBjb25zdGFudHMgb3Igc2VsZjo6U0lHKiBjb25zdGFudHMsIGdvdCAnLnZhcl9leHBvcnQoJHNpZ25hbCwgdHJ1ZSkpOwp9CnJldHVybiAkc2lnbmFsOwp9LCAoYXJyYXkpICRzaWduYWxzKTsKCiRoYW5kbGVyID0gbmV3IHNlbGYoJHNpZ25hbHMsICRsb2dnZXJPckNhbGxiYWNrKTsKCmlmIChQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewphcnJheV91bnNoaWZ0KHNlbGY6OiRoYW5kbGVycywgV2Vha1JlZmVyZW5jZTo6Y3JlYXRlKCRoYW5kbGVyKSk7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoc2VsZjo6JGhhbmRsZXJzLCAkaGFuZGxlcik7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyJykgJiYgUEhQX1NBUEkgPT09ICdjbGknICYmIChpbl9hcnJheShzZWxmOjpTSUdJTlQsICRzaWduYWxzLCB0cnVlKSB8fCBpbl9hcnJheShzZWxmOjpTSUdCUkVBSywgJHNpZ25hbHMsIHRydWUpKSkgewppZiAobnVsbCA9PT0gc2VsZjo6JHdpbmRvd3NIYW5kbGVyKSB7CnNlbGY6OiR3aW5kb3dzSGFuZGxlciA9IENsb3N1cmU6OmZyb21DYWxsYWJsZShbc2VsZjo6Y2xhc3MsICdoYW5kbGVXaW5kb3dzU2lnbmFsJ10pOwpzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcihzZWxmOjokd2luZG93c0hhbmRsZXIpOwp9Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncGNudGxfYXN5bmNfc2lnbmFscycpKSB7CnBjbnRsX2FzeW5jX3NpZ25hbHModHJ1ZSk7CgpzZWxmOjpyZWdpc3RlclBjbnRsSGFuZGxlcigkc2lnbmFscyk7Cn0KCnJldHVybiAkaGFuZGxlcjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5yZWdpc3RlcigpOiB2b2lkCnsKJHNpZ25hbHMgPSAkdGhpcy0+c2lnbmFsczsKCiRpbmRleCA9IGZhbHNlOwpmb3JlYWNoIChzZWxmOjokaGFuZGxlcnMgYXMgJGtleSA9PiAkaGFuZGxlcikgewppZiAoKCRoYW5kbGVyIGluc3RhbmNlb2YgV2Vha1JlZmVyZW5jZSAmJiAkaGFuZGxlci0+Z2V0KCkgPT09ICR0aGlzKSB8fCAkaGFuZGxlciA9PT0gJHRoaXMpIHsKJGluZGV4ID0gJGtleTsKYnJlYWs7Cn0KfQppZiAoJGluZGV4ID09PSBmYWxzZSkgewoKcmV0dXJuOwp9Cgp1bnNldChzZWxmOjokaGFuZGxlcnNbJGluZGV4XSk7CgppZiAoc2VsZjo6JHdpbmRvd3NIYW5kbGVyICE9PSBudWxsICYmIChpbl9hcnJheShzZWxmOjpTSUdJTlQsICRzaWduYWxzLCB0cnVlKSB8fCBpbl9hcnJheShzZWxmOjpTSUdCUkVBSywgJHNpZ25hbHMsIHRydWUpKSkgewppZiAoc2VsZjo6Z2V0SGFuZGxlckZvcihzZWxmOjpTSUdJTlQpID09PSBudWxsICYmIHNlbGY6OmdldEhhbmRsZXJGb3Ioc2VsZjo6U0lHQlJFQUspID09PSBudWxsKSB7CnNhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyKHNlbGY6OiR3aW5kb3dzSGFuZGxlciwgZmFsc2UpOwpzZWxmOjokd2luZG93c0hhbmRsZXIgPSBudWxsOwp9Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpKSB7CmZvcmVhY2ggKCRzaWduYWxzIGFzICRzaWduYWwpIHsKCmlmICghZGVmaW5lZCgkc2lnbmFsKSkgewpjb250aW51ZTsKfQoKCmlmIChzZWxmOjpnZXRIYW5kbGVyRm9yKCRzaWduYWwpICE9PSBudWxsKSB7CmNvbnRpbnVlOwp9CgpwY250bF9zaWduYWwoY29uc3RhbnQoJHNpZ25hbCksIFNJR19ERkwpOwp9Cn0KfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVucmVnaXN0ZXJBbGwoKTogdm9pZAp7CmlmIChzZWxmOjokd2luZG93c0hhbmRsZXIgIT09IG51bGwpIHsKc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXIoc2VsZjo6JHdpbmRvd3NIYW5kbGVyLCBmYWxzZSk7CnNlbGY6OiR3aW5kb3dzSGFuZGxlciA9IG51bGw7Cn0KCmZvcmVhY2ggKHNlbGY6OiRoYW5kbGVycyBhcyAka2V5ID0+ICRoYW5kbGVyKSB7CmlmICgkaGFuZGxlciBpbnN0YW5jZW9mIFdlYWtSZWZlcmVuY2UpIHsKJGhhbmRsZXIgPSAkaGFuZGxlci0+Z2V0KCk7CmlmICgkaGFuZGxlciA9PT0gbnVsbCkgewp1bnNldChzZWxmOjokaGFuZGxlcnNbJGtleV0pOwpjb250aW51ZTsKfQp9CiRoYW5kbGVyLT51bnJlZ2lzdGVyKCk7Cn0KfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXJQY250bEhhbmRsZXIoYXJyYXkgJHNpZ25hbHMpOiB2b2lkCnsKc3RhdGljICRjYWxsYWJsZTsKaWYgKCRjYWxsYWJsZSA9PT0gbnVsbCkgewokY2FsbGFibGUgPSBDbG9zdXJlOjpmcm9tQ2FsbGFibGUoW3NlbGY6OmNsYXNzLCAnaGFuZGxlUGNudGxTaWduYWwnXSk7Cn0KZm9yZWFjaCAoJHNpZ25hbHMgYXMgJHNpZ25hbCkgewoKaWYgKCFkZWZpbmVkKCRzaWduYWwpKSB7CmNvbnRpbnVlOwp9CgpwY250bF9zaWduYWwoY29uc3RhbnQoJHNpZ25hbCksICRjYWxsYWJsZSk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlV2luZG93c1NpZ25hbChpbnQgJGV2ZW50KTogdm9pZAp7CmlmIChQSFBfV0lORE9XU19FVkVOVF9DVFJMX0MgPT09ICRldmVudCkgewpzZWxmOjpjYWxsSGFuZGxlckZvcihzZWxmOjpTSUdJTlQpOwp9IGVsc2VpZiAoUEhQX1dJTkRPV1NfRVZFTlRfQ1RSTF9CUkVBSyA9PT0gJGV2ZW50KSB7CnNlbGY6OmNhbGxIYW5kbGVyRm9yKHNlbGY6OlNJR0JSRUFLKTsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGVQY250bFNpZ25hbChpbnQgJHNpZ25hbCk6IHZvaWQKewpzZWxmOjpjYWxsSGFuZGxlckZvcihzZWxmOjpnZXRTaWduYWxOYW1lKCRzaWduYWwpKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYWxsSGFuZGxlckZvcihzdHJpbmcgJHNpZ25hbCk6IHZvaWQKewokaGFuZGxlciA9IHNlbGY6OmdldEhhbmRsZXJGb3IoJHNpZ25hbCk7CmlmICgkaGFuZGxlciAhPT0gbnVsbCkgewokaGFuZGxlci0+dHJpZ2dlcigkc2lnbmFsKTsKfQp9CgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRIYW5kbGVyRm9yKHN0cmluZyAkc2lnbmFsKTogP3NlbGYKewpmb3JlYWNoIChzZWxmOjokaGFuZGxlcnMgYXMgJGtleSA9PiAkaGFuZGxlcikgewppZiAoJGhhbmRsZXIgaW5zdGFuY2VvZiBXZWFrUmVmZXJlbmNlKSB7CiRoYW5kbGVyID0gJGhhbmRsZXItPmdldCgpOwppZiAoJGhhbmRsZXIgPT09IG51bGwpIHsKdW5zZXQoc2VsZjo6JGhhbmRsZXJzWyRrZXldKTsKY29udGludWU7Cn0KfQppZiAoaW5fYXJyYXkoJHNpZ25hbCwgJGhhbmRsZXItPnNpZ25hbHMsIHRydWUpKSB7CnJldHVybiAkaGFuZGxlcjsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U2lnbmFsTmFtZShpbnQgJHNpZ25vKTogc3RyaW5nCnsKc3RhdGljICRzaWduYWxzID0gbnVsbDsKaWYgKCRzaWduYWxzID09PSBudWxsKSB7CiRzaWduYWxzID0gW107CmZvcmVhY2ggKHNlbGY6OkFMTF9TSUdOQUxTIGFzICR2YWx1ZSkgewppZiAoZGVmaW5lZCgkdmFsdWUpKSB7CiRzaWduYWxzW2NvbnN0YW50KCR2YWx1ZSldID0gJHZhbHVlOwp9Cn0KfQoKaWYgKGlzc2V0KCRzaWduYWxzWyRzaWdub10pKSB7CnJldHVybiAkc2lnbmFsc1skc2lnbm9dOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBzaWduYWwgIycuJHNpZ25vKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21wbGV0ZUNvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcRHVtcENvbXBsZXRpb25Db21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXEhlbHBDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXExhenlDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXExpc3RDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXFNpZ25hbGFibGVDb21tYW5kSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kTG9hZGVyXENvbW1hbmRMb2FkZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUNvbW1hbmRFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUVycm9yRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVTaWduYWxFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZVRlcm1pbmF0ZUV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxEZWJ1Z0Zvcm1hdHRlckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEZvcm1hdHRlckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2Nlc3NIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJndklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcnJheUlucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEF3YXJlSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTaWduYWxSZWdpc3RyeVxTaWduYWxSZWdpc3RyeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGVcU3ltZm9ueVN0eWxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRXJyb3JIYW5kbGVyXEVycm9ySGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFJlc2V0SW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgQXBwbGljYXRpb24gaW1wbGVtZW50cyBSZXNldEludGVyZmFjZQp7CnByaXZhdGUgJGNvbW1hbmRzID0gW107CnByaXZhdGUgJHdhbnRIZWxwcyA9IGZhbHNlOwpwcml2YXRlICRydW5uaW5nQ29tbWFuZDsKcHJpdmF0ZSAkbmFtZTsKcHJpdmF0ZSAkdmVyc2lvbjsKcHJpdmF0ZSAkY29tbWFuZExvYWRlcjsKcHJpdmF0ZSAkY2F0Y2hFeGNlcHRpb25zID0gdHJ1ZTsKcHJpdmF0ZSAkYXV0b0V4aXQgPSB0cnVlOwpwcml2YXRlICRkZWZpbml0aW9uOwpwcml2YXRlICRoZWxwZXJTZXQ7CnByaXZhdGUgJGRpc3BhdGNoZXI7CnByaXZhdGUgJHRlcm1pbmFsOwpwcml2YXRlICRkZWZhdWx0Q29tbWFuZDsKcHJpdmF0ZSAkc2luZ2xlQ29tbWFuZCA9IGZhbHNlOwpwcml2YXRlICRpbml0aWFsaXplZDsKcHJpdmF0ZSAkc2lnbmFsUmVnaXN0cnk7CnByaXZhdGUgJHNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUgPSAnVU5LTk9XTicsIHN0cmluZyAkdmVyc2lvbiA9ICdVTktOT1dOJykKewokdGhpcy0+bmFtZSA9ICRuYW1lOwokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+dGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKJHRoaXMtPmRlZmF1bHRDb21tYW5kID0gJ2xpc3QnOwppZiAoXGRlZmluZWQoJ1NJR0lOVCcpICYmIFNpZ25hbFJlZ2lzdHJ5Ojppc1N1cHBvcnRlZCgpKSB7CiR0aGlzLT5zaWduYWxSZWdpc3RyeSA9IG5ldyBTaWduYWxSZWdpc3RyeSgpOwokdGhpcy0+c2lnbmFsc1RvRGlzcGF0Y2hFdmVudCA9IFtcU0lHSU5ULCBcU0lHVEVSTSwgXFNJR1VTUjEsIFxTSUdVU1IyXTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzcGF0Y2hlcihFdmVudERpc3BhdGNoZXJJbnRlcmZhY2UgJGRpc3BhdGNoZXIpCnsKJHRoaXMtPmRpc3BhdGNoZXIgPSAkZGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbW1hbmRMb2FkZXIoQ29tbWFuZExvYWRlckludGVyZmFjZSAkY29tbWFuZExvYWRlcikKewokdGhpcy0+Y29tbWFuZExvYWRlciA9ICRjb21tYW5kTG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2lnbmFsUmVnaXN0cnkoKTogU2lnbmFsUmVnaXN0cnkKewppZiAoISR0aGlzLT5zaWduYWxSZWdpc3RyeSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU2lnbmFscyBhcmUgbm90IHN1cHBvcnRlZC4gTWFrZSBzdXJlIHRoYXQgdGhlIGBwY250bGAgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhhdCAicGNudGxfKiIgZnVuY3Rpb25zIGFyZSBub3QgZGlzYWJsZWQgYnkgeW91ciBwaHAuaW5pXCdzICJkaXNhYmxlX2Z1bmN0aW9ucyIgZGlyZWN0aXZlLicpOwp9CgpyZXR1cm4gJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U2lnbmFsc1RvRGlzcGF0Y2hFdmVudChpbnQgLi4uJHNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQpCnsKJHRoaXMtPnNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQgPSAkc2lnbmFsc1RvRGlzcGF0Y2hFdmVudDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0ID0gbnVsbCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQgPSBudWxsKQp7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwdXRlbnYnKSkgewpAcHV0ZW52KCdMSU5FUz0nLiR0aGlzLT50ZXJtaW5hbC0+Z2V0SGVpZ2h0KCkpOwpAcHV0ZW52KCdDT0xVTU5TPScuJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKTsKfQoKaWYgKG51bGwgPT09ICRpbnB1dCkgewokaW5wdXQgPSBuZXcgQXJndklucHV0KCk7Cn0KCmlmIChudWxsID09PSAkb3V0cHV0KSB7CiRvdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dCgpOwp9CgokcmVuZGVyRXhjZXB0aW9uID0gZnVuY3Rpb24gKFxUaHJvd2FibGUgJGUpIHVzZSAoJG91dHB1dCkgewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJHRoaXMtPnJlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0gZWxzZSB7CiR0aGlzLT5yZW5kZXJUaHJvd2FibGUoJGUsICRvdXRwdXQpOwp9Cn07CmlmICgkcGhwSGFuZGxlciA9IHNldF9leGNlcHRpb25faGFuZGxlcigkcmVuZGVyRXhjZXB0aW9uKSkgewpyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyKCk7CmlmICghXGlzX2FycmF5KCRwaHBIYW5kbGVyKSB8fCAhJHBocEhhbmRsZXJbMF0gaW5zdGFuY2VvZiBFcnJvckhhbmRsZXIpIHsKJGVycm9ySGFuZGxlciA9IHRydWU7Cn0gZWxzZWlmICgkZXJyb3JIYW5kbGVyID0gJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIoJHJlbmRlckV4Y2VwdGlvbikpIHsKJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIoJGVycm9ySGFuZGxlcik7Cn0KfQoKJHRoaXMtPmNvbmZpZ3VyZUlPKCRpbnB1dCwgJG91dHB1dCk7Cgp0cnkgewokZXhpdENvZGUgPSAkdGhpcy0+ZG9SdW4oJGlucHV0LCAkb3V0cHV0KTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoISR0aGlzLT5jYXRjaEV4Y2VwdGlvbnMpIHsKdGhyb3cgJGU7Cn0KCiRyZW5kZXJFeGNlcHRpb24oJGUpOwoKJGV4aXRDb2RlID0gJGUtPmdldENvZGUoKTsKaWYgKGlzX251bWVyaWMoJGV4aXRDb2RlKSkgewokZXhpdENvZGUgPSAoaW50KSAkZXhpdENvZGU7CmlmICgkZXhpdENvZGUgPD0gMCkgewokZXhpdENvZGUgPSAxOwp9Cn0gZWxzZSB7CiRleGl0Q29kZSA9IDE7Cn0KfSBmaW5hbGx5IHsKCgppZiAoISRwaHBIYW5kbGVyKSB7CmlmIChzZXRfZXhjZXB0aW9uX2hhbmRsZXIoJHJlbmRlckV4Y2VwdGlvbikgPT09ICRyZW5kZXJFeGNlcHRpb24pIHsKcmVzdG9yZV9leGNlcHRpb25faGFuZGxlcigpOwp9CnJlc3RvcmVfZXhjZXB0aW9uX2hhbmRsZXIoKTsKfSBlbHNlaWYgKCEkZXJyb3JIYW5kbGVyKSB7CiRmaW5hbEhhbmRsZXIgPSAkcGhwSGFuZGxlclswXS0+c2V0RXhjZXB0aW9uSGFuZGxlcihudWxsKTsKaWYgKCRmaW5hbEhhbmRsZXIgIT09ICRyZW5kZXJFeGNlcHRpb24pIHsKJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIoJGZpbmFsSGFuZGxlcik7Cn0KfQp9CgppZiAoJHRoaXMtPmF1dG9FeGl0KSB7CmlmICgkZXhpdENvZGUgPiAyNTUpIHsKJGV4aXRDb2RlID0gMjU1Owp9CgpleGl0KCRleGl0Q29kZSk7Cn0KCnJldHVybiAkZXhpdENvZGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvUnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS12ZXJzaW9uJywgJy1WJ10sIHRydWUpKSB7CiRvdXRwdXQtPndyaXRlbG4oJHRoaXMtPmdldExvbmdWZXJzaW9uKCkpOwoKcmV0dXJuIDA7Cn0KCnRyeSB7CgokaW5wdXQtPmJpbmQoJHRoaXMtPmdldERlZmluaXRpb24oKSk7Cn0gY2F0Y2ggKEV4Y2VwdGlvbkludGVyZmFjZSAkZSkgewoKfQoKJG5hbWUgPSAkdGhpcy0+Z2V0Q29tbWFuZE5hbWUoJGlucHV0KTsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1oZWxwJywgJy1oJ10sIHRydWUpKSB7CmlmICghJG5hbWUpIHsKJG5hbWUgPSAnaGVscCc7CiRpbnB1dCA9IG5ldyBBcnJheUlucHV0KFsnY29tbWFuZF9uYW1lJyA9PiAkdGhpcy0+ZGVmYXVsdENvbW1hbmRdKTsKfSBlbHNlIHsKJHRoaXMtPndhbnRIZWxwcyA9IHRydWU7Cn0KfQoKaWYgKCEkbmFtZSkgewokbmFtZSA9ICR0aGlzLT5kZWZhdWx0Q29tbWFuZDsKJGRlZmluaXRpb24gPSAkdGhpcy0+Z2V0RGVmaW5pdGlvbigpOwokZGVmaW5pdGlvbi0+c2V0QXJndW1lbnRzKGFycmF5X21lcmdlKAokZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCksClsKJ2NvbW1hbmQnID0+IG5ldyBJbnB1dEFyZ3VtZW50KCdjb21tYW5kJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudCgnY29tbWFuZCcpLT5nZXREZXNjcmlwdGlvbigpLCAkbmFtZSksCl0KKSk7Cn0KCnRyeSB7CiR0aGlzLT5ydW5uaW5nQ29tbWFuZCA9IG51bGw7CgokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRuYW1lKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewppZiAoISgkZSBpbnN0YW5jZW9mIENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiAmJiAhJGUgaW5zdGFuY2VvZiBOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbikgfHwgMSAhPT0gXGNvdW50KCRhbHRlcm5hdGl2ZXMgPSAkZS0+Z2V0QWx0ZXJuYXRpdmVzKCkpIHx8ICEkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewppZiAobnVsbCAhPT0gJHRoaXMtPmRpc3BhdGNoZXIpIHsKJGV2ZW50ID0gbmV3IENvbnNvbGVFcnJvckV2ZW50KCRpbnB1dCwgJG91dHB1dCwgJGUpOwokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpFUlJPUik7CgppZiAoMCA9PT0gJGV2ZW50LT5nZXRFeGl0Q29kZSgpKSB7CnJldHVybiAwOwp9CgokZSA9ICRldmVudC0+Z2V0RXJyb3IoKTsKfQoKdGhyb3cgJGU7Cn0KCiRhbHRlcm5hdGl2ZSA9ICRhbHRlcm5hdGl2ZXNbMF07Cgokc3R5bGUgPSBuZXcgU3ltZm9ueVN0eWxlKCRpbnB1dCwgJG91dHB1dCk7CiRvdXRwdXQtPndyaXRlbG4oJycpOwokZm9ybWF0dGVkQmxvY2sgPSAobmV3IEZvcm1hdHRlckhlbHBlcigpKS0+Zm9ybWF0QmxvY2soc3ByaW50ZignQ29tbWFuZCAiJXMiIGlzIG5vdCBkZWZpbmVkLicsICRuYW1lKSwgJ2Vycm9yJywgdHJ1ZSk7CiRvdXRwdXQtPndyaXRlbG4oJGZvcm1hdHRlZEJsb2NrKTsKaWYgKCEkc3R5bGUtPmNvbmZpcm0oc3ByaW50ZignRG8geW91IHdhbnQgdG8gcnVuICIlcyIgaW5zdGVhZD8gJywgJGFsdGVybmF0aXZlKSwgZmFsc2UpKSB7CmlmIChudWxsICE9PSAkdGhpcy0+ZGlzcGF0Y2hlcikgewokZXZlbnQgPSBuZXcgQ29uc29sZUVycm9yRXZlbnQoJGlucHV0LCAkb3V0cHV0LCAkZSk7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OkVSUk9SKTsKCnJldHVybiAkZXZlbnQtPmdldEV4aXRDb2RlKCk7Cn0KCnJldHVybiAxOwp9CgokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRhbHRlcm5hdGl2ZSk7Cn0KCmlmICgkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kKSB7CiRjb21tYW5kID0gJGNvbW1hbmQtPmdldENvbW1hbmQoKTsKfQoKJHRoaXMtPnJ1bm5pbmdDb21tYW5kID0gJGNvbW1hbmQ7CiRleGl0Q29kZSA9ICR0aGlzLT5kb1J1bkNvbW1hbmQoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCk7CiR0aGlzLT5ydW5uaW5nQ29tbWFuZCA9IG51bGw7CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwZXJTZXQoSGVscGVyU2V0ICRoZWxwZXJTZXQpCnsKJHRoaXMtPmhlbHBlclNldCA9ICRoZWxwZXJTZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlclNldCgpCnsKaWYgKCEkdGhpcy0+aGVscGVyU2V0KSB7CiR0aGlzLT5oZWxwZXJTZXQgPSAkdGhpcy0+Z2V0RGVmYXVsdEhlbHBlclNldCgpOwp9CgpyZXR1cm4gJHRoaXMtPmhlbHBlclNldDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKQp7CiR0aGlzLT5kZWZpbml0aW9uID0gJGRlZmluaXRpb247Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlZmluaXRpb24oKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24pIHsKJHRoaXMtPmRlZmluaXRpb24gPSAkdGhpcy0+Z2V0RGVmYXVsdElucHV0RGVmaW5pdGlvbigpOwp9CgppZiAoJHRoaXMtPnNpbmdsZUNvbW1hbmQpIHsKJGlucHV0RGVmaW5pdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uOwokaW5wdXREZWZpbml0aW9uLT5zZXRBcmd1bWVudHMoKTsKCnJldHVybiAkaW5wdXREZWZpbml0aW9uOwp9CgpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CmlmICgKQ29tcGxldGlvbklucHV0OjpUWVBFX0FSR1VNRU5UX1ZBTFVFID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkKJiYgJ2NvbW1hbmQnID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25OYW1lKCkKKSB7CiRjb21tYW5kTmFtZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFsbCgpIGFzICRuYW1lID0+ICRjb21tYW5kKSB7CgppZiAoJGNvbW1hbmQtPmlzSGlkZGVuKCkgfHwgJGNvbW1hbmQtPmdldE5hbWUoKSAhPT0gJG5hbWUpIHsKY29udGludWU7Cn0KJGNvbW1hbmROYW1lc1tdID0gJGNvbW1hbmQtPmdldE5hbWUoKTsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkbmFtZSkgewokY29tbWFuZE5hbWVzW10gPSAkbmFtZTsKfQp9CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV9maWx0ZXIoJGNvbW1hbmROYW1lcykpOwoKcmV0dXJuOwp9CgppZiAoQ29tcGxldGlvbklucHV0OjpUWVBFX09QVElPTl9OQU1FID09PSAkaW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0T3B0aW9ucygkdGhpcy0+Z2V0RGVmaW5pdGlvbigpLT5nZXRPcHRpb25zKCkpOwoKcmV0dXJuOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHAoKQp7CnJldHVybiAkdGhpcy0+Z2V0TG9uZ1ZlcnNpb24oKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlRXhjZXB0aW9uc0NhdWdodCgpCnsKcmV0dXJuICR0aGlzLT5jYXRjaEV4Y2VwdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDYXRjaEV4Y2VwdGlvbnMoYm9vbCAkYm9vbGVhbikKewokdGhpcy0+Y2F0Y2hFeGNlcHRpb25zID0gJGJvb2xlYW47Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQXV0b0V4aXRFbmFibGVkKCkKewpyZXR1cm4gJHRoaXMtPmF1dG9FeGl0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b0V4aXQoYm9vbCAkYm9vbGVhbikKewokdGhpcy0+YXV0b0V4aXQgPSAkYm9vbGVhbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TmFtZShzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPm5hbWUgPSAkbmFtZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyc2lvbihzdHJpbmcgJHZlcnNpb24pCnsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9uZ1ZlcnNpb24oKQp7CmlmICgnVU5LTk9XTicgIT09ICR0aGlzLT5nZXROYW1lKCkpIHsKaWYgKCdVTktOT1dOJyAhPT0gJHRoaXMtPmdldFZlcnNpb24oKSkgewpyZXR1cm4gc3ByaW50ZignJXMgPGluZm8+JXM8L2luZm8+JywgJHRoaXMtPmdldE5hbWUoKSwgJHRoaXMtPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gJ0NvbnNvbGUgVG9vbCc7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmFkZChuZXcgQ29tbWFuZCgkbmFtZSkpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbW1hbmRzKGFycmF5ICRjb21tYW5kcykKewpmb3JlYWNoICgkY29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPmFkZCgkY29tbWFuZCk7Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKENvbW1hbmQgJGNvbW1hbmQpCnsKJHRoaXMtPmluaXQoKTsKCiRjb21tYW5kLT5zZXRBcHBsaWNhdGlvbigkdGhpcyk7CgppZiAoISRjb21tYW5kLT5pc0VuYWJsZWQoKSkgewokY29tbWFuZC0+c2V0QXBwbGljYXRpb24obnVsbCk7CgpyZXR1cm4gbnVsbDsKfQoKaWYgKCEkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kKSB7CgokY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpOwp9CgppZiAoISRjb21tYW5kLT5nZXROYW1lKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBjb21tYW5kIGRlZmluZWQgaW4gIiVzIiBjYW5ub3QgaGF2ZSBhbiBlbXB0eSBuYW1lLicsIGdldF9kZWJ1Z190eXBlKCRjb21tYW5kKSkpOwp9CgokdGhpcy0+Y29tbWFuZHNbJGNvbW1hbmQtPmdldE5hbWUoKV0gPSAkY29tbWFuZDsKCmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJGFsaWFzKSB7CiR0aGlzLT5jb21tYW5kc1skYWxpYXNdID0gJGNvbW1hbmQ7Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5pbml0KCk7CgppZiAoISR0aGlzLT5oYXMoJG5hbWUpKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignVGhlIGNvbW1hbmQgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgoKaWYgKCFpc3NldCgkdGhpcy0+Y29tbWFuZHNbJG5hbWVdKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kIGJlY2F1c2UgaXQgaXMgcmVnaXN0ZXJlZCB1bmRlciBtdWx0aXBsZSBuYW1lcy4gTWFrZSBzdXJlIHlvdSBkb25cJ3Qgc2V0IGEgZGlmZmVyZW50IG5hbWUgdmlhIGNvbnN0cnVjdG9yIG9yICJzZXROYW1lKCkiLicsICRuYW1lKSk7Cn0KCiRjb21tYW5kID0gJHRoaXMtPmNvbW1hbmRzWyRuYW1lXTsKCmlmICgkdGhpcy0+d2FudEhlbHBzKSB7CiR0aGlzLT53YW50SGVscHMgPSBmYWxzZTsKCiRoZWxwQ29tbWFuZCA9ICR0aGlzLT5nZXQoJ2hlbHAnKTsKJGhlbHBDb21tYW5kLT5zZXRDb21tYW5kKCRjb21tYW5kKTsKCnJldHVybiAkaGVscENvbW1hbmQ7Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkbmFtZSkKewokdGhpcy0+aW5pdCgpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5jb21tYW5kc1skbmFtZV0pIHx8ICgkdGhpcy0+Y29tbWFuZExvYWRlciAmJiAkdGhpcy0+Y29tbWFuZExvYWRlci0+aGFzKCRuYW1lKSAmJiAkdGhpcy0+YWRkKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXQoJG5hbWUpKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlcygpCnsKJG5hbWVzcGFjZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFsbCgpIGFzICRjb21tYW5kKSB7CmlmICgkY29tbWFuZC0+aXNIaWRkZW4oKSkgewpjb250aW51ZTsKfQoKJG5hbWVzcGFjZXNbXSA9ICR0aGlzLT5leHRyYWN0QWxsTmFtZXNwYWNlcygkY29tbWFuZC0+Z2V0TmFtZSgpKTsKCmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJGFsaWFzKSB7CiRuYW1lc3BhY2VzW10gPSAkdGhpcy0+ZXh0cmFjdEFsbE5hbWVzcGFjZXMoJGFsaWFzKTsKfQp9CgpyZXR1cm4gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZShhcnJheV9maWx0ZXIoYXJyYXlfbWVyZ2UoW10sIC4uLiRuYW1lc3BhY2VzKSkpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kTmFtZXNwYWNlKHN0cmluZyAkbmFtZXNwYWNlKQp7CiRhbGxOYW1lc3BhY2VzID0gJHRoaXMtPmdldE5hbWVzcGFjZXMoKTsKJGV4cHIgPSBpbXBsb2RlKCdbXjpdKjonLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBleHBsb2RlKCc6JywgJG5hbWVzcGFjZSkpKS4nW146XSonOwokbmFtZXNwYWNlcyA9IHByZWdfZ3JlcCgne14nLiRleHByLid9JywgJGFsbE5hbWVzcGFjZXMpOwoKaWYgKGVtcHR5KCRuYW1lc3BhY2VzKSkgewokbWVzc2FnZSA9IHNwcmludGYoJ1RoZXJlIGFyZSBubyBjb21tYW5kcyBkZWZpbmVkIGluIHRoZSAiJXMiIG5hbWVzcGFjZS4nLCAkbmFtZXNwYWNlKTsKCmlmICgkYWx0ZXJuYXRpdmVzID0gJHRoaXMtPmZpbmRBbHRlcm5hdGl2ZXMoJG5hbWVzcGFjZSwgJGFsbE5hbWVzcGFjZXMpKSB7CmlmICgxID09IFxjb3VudCgkYWx0ZXJuYXRpdmVzKSkgewokbWVzc2FnZSAuPSAiXG5cbkRpZCB5b3UgbWVhbiB0aGlzP1xuICAgICI7Cn0gZWxzZSB7CiRtZXNzYWdlIC49ICJcblxuRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT9cbiAgICAiOwp9CgokbWVzc2FnZSAuPSBpbXBsb2RlKCJcbiAgICAiLCAkYWx0ZXJuYXRpdmVzKTsKfQoKdGhyb3cgbmV3IE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uKCRtZXNzYWdlLCAkYWx0ZXJuYXRpdmVzKTsKfQoKJGV4YWN0ID0gXGluX2FycmF5KCRuYW1lc3BhY2UsICRuYW1lc3BhY2VzLCB0cnVlKTsKaWYgKFxjb3VudCgkbmFtZXNwYWNlcykgPiAxICYmICEkZXhhY3QpIHsKdGhyb3cgbmV3IE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoIlRoZSBuYW1lc3BhY2UgXCIlc1wiIGlzIGFtYmlndW91cy5cbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XG4lcy4iLCAkbmFtZXNwYWNlLCAkdGhpcy0+Z2V0QWJicmV2aWF0aW9uU3VnZ2VzdGlvbnMoYXJyYXlfdmFsdWVzKCRuYW1lc3BhY2VzKSkpLCBhcnJheV92YWx1ZXMoJG5hbWVzcGFjZXMpKTsKfQoKcmV0dXJuICRleGFjdCA/ICRuYW1lc3BhY2UgOiByZXNldCgkbmFtZXNwYWNlcyk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPmluaXQoKTsKCiRhbGlhc2VzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+Y29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkYWxpYXMpIHsKaWYgKCEkdGhpcy0+aGFzKCRhbGlhcykpIHsKJHRoaXMtPmNvbW1hbmRzWyRhbGlhc10gPSAkY29tbWFuZDsKfQp9Cn0KCmlmICgkdGhpcy0+aGFzKCRuYW1lKSkgewpyZXR1cm4gJHRoaXMtPmdldCgkbmFtZSk7Cn0KCiRhbGxDb21tYW5kcyA9ICR0aGlzLT5jb21tYW5kTG9hZGVyID8gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldE5hbWVzKCksIGFycmF5X2tleXMoJHRoaXMtPmNvbW1hbmRzKSkgOiBhcnJheV9rZXlzKCR0aGlzLT5jb21tYW5kcyk7CiRleHByID0gaW1wbG9kZSgnW146XSo6JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgZXhwbG9kZSgnOicsICRuYW1lKSkpLidbXjpdKic7CiRjb21tYW5kcyA9IHByZWdfZ3JlcCgne14nLiRleHByLid9JywgJGFsbENvbW1hbmRzKTsKCmlmIChlbXB0eSgkY29tbWFuZHMpKSB7CiRjb21tYW5kcyA9IHByZWdfZ3JlcCgne14nLiRleHByLid9aScsICRhbGxDb21tYW5kcyk7Cn0KCgppZiAoZW1wdHkoJGNvbW1hbmRzKSB8fCBcY291bnQocHJlZ19ncmVwKCd7XicuJGV4cHIuJyR9aScsICRjb21tYW5kcykpIDwgMSkgewppZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRuYW1lLCAnOicpKSB7CgokdGhpcy0+ZmluZE5hbWVzcGFjZShzdWJzdHIoJG5hbWUsIDAsICRwb3MpKTsKfQoKJG1lc3NhZ2UgPSBzcHJpbnRmKCdDb21tYW5kICIlcyIgaXMgbm90IGRlZmluZWQuJywgJG5hbWUpOwoKaWYgKCRhbHRlcm5hdGl2ZXMgPSAkdGhpcy0+ZmluZEFsdGVybmF0aXZlcygkbmFtZSwgJGFsbENvbW1hbmRzKSkgewoKJGFsdGVybmF0aXZlcyA9IGFycmF5X2ZpbHRlcigkYWx0ZXJuYXRpdmVzLCBmdW5jdGlvbiAoJG5hbWUpIHsKcmV0dXJuICEkdGhpcy0+Z2V0KCRuYW1lKS0+aXNIaWRkZW4oKTsKfSk7CgppZiAoMSA9PSBcY291bnQoJGFsdGVybmF0aXZlcykpIHsKJG1lc3NhZ2UgLj0gIlxuXG5EaWQgeW91IG1lYW4gdGhpcz9cbiAgICAiOwp9IGVsc2UgewokbWVzc2FnZSAuPSAiXG5cbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XG4gICAgIjsKfQokbWVzc2FnZSAuPSBpbXBsb2RlKCJcbiAgICAiLCAkYWx0ZXJuYXRpdmVzKTsKfQoKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbigkbWVzc2FnZSwgYXJyYXlfdmFsdWVzKCRhbHRlcm5hdGl2ZXMpKTsKfQoKCmlmIChcY291bnQoJGNvbW1hbmRzKSA+IDEpIHsKJGNvbW1hbmRMaXN0ID0gJHRoaXMtPmNvbW1hbmRMb2FkZXIgPyBhcnJheV9tZXJnZShhcnJheV9mbGlwKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXROYW1lcygpKSwgJHRoaXMtPmNvbW1hbmRzKSA6ICR0aGlzLT5jb21tYW5kczsKJGNvbW1hbmRzID0gYXJyYXlfdW5pcXVlKGFycmF5X2ZpbHRlcigkY29tbWFuZHMsIGZ1bmN0aW9uICgkbmFtZU9yQWxpYXMpIHVzZSAoJiRjb21tYW5kTGlzdCwgJGNvbW1hbmRzLCAmJGFsaWFzZXMpIHsKaWYgKCEkY29tbWFuZExpc3RbJG5hbWVPckFsaWFzXSBpbnN0YW5jZW9mIENvbW1hbmQpIHsKJGNvbW1hbmRMaXN0WyRuYW1lT3JBbGlhc10gPSAkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0KCRuYW1lT3JBbGlhcyk7Cn0KCiRjb21tYW5kTmFtZSA9ICRjb21tYW5kTGlzdFskbmFtZU9yQWxpYXNdLT5nZXROYW1lKCk7CgokYWxpYXNlc1skbmFtZU9yQWxpYXNdID0gJGNvbW1hbmROYW1lOwoKcmV0dXJuICRjb21tYW5kTmFtZSA9PT0gJG5hbWVPckFsaWFzIHx8ICFcaW5fYXJyYXkoJGNvbW1hbmROYW1lLCAkY29tbWFuZHMpOwp9KSk7Cn0KCmlmIChcY291bnQoJGNvbW1hbmRzKSA+IDEpIHsKJHVzYWJsZVdpZHRoID0gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpIC0gMTA7CiRhYmJyZXZzID0gYXJyYXlfdmFsdWVzKCRjb21tYW5kcyk7CiRtYXhMZW4gPSAwOwpmb3JlYWNoICgkYWJicmV2cyBhcyAkYWJicmV2KSB7CiRtYXhMZW4gPSBtYXgoSGVscGVyOjp3aWR0aCgkYWJicmV2KSwgJG1heExlbik7Cn0KJGFiYnJldnMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRjbWQpIHVzZSAoJGNvbW1hbmRMaXN0LCAkdXNhYmxlV2lkdGgsICRtYXhMZW4sICYkY29tbWFuZHMpIHsKaWYgKCRjb21tYW5kTGlzdFskY21kXS0+aXNIaWRkZW4oKSkgewp1bnNldCgkY29tbWFuZHNbYXJyYXlfc2VhcmNoKCRjbWQsICRjb21tYW5kcyldKTsKCnJldHVybiBmYWxzZTsKfQoKJGFiYnJldiA9IHN0cl9wYWQoJGNtZCwgJG1heExlbiwgJyAnKS4nICcuJGNvbW1hbmRMaXN0WyRjbWRdLT5nZXREZXNjcmlwdGlvbigpOwoKcmV0dXJuIEhlbHBlcjo6d2lkdGgoJGFiYnJldikgPiAkdXNhYmxlV2lkdGggPyBIZWxwZXI6OnN1YnN0cigkYWJicmV2LCAwLCAkdXNhYmxlV2lkdGggLSAzKS4nLi4uJyA6ICRhYmJyZXY7Cn0sIGFycmF5X3ZhbHVlcygkY29tbWFuZHMpKTsKCmlmIChcY291bnQoJGNvbW1hbmRzKSA+IDEpIHsKJHN1Z2dlc3Rpb25zID0gJHRoaXMtPmdldEFiYnJldmlhdGlvblN1Z2dlc3Rpb25zKGFycmF5X2ZpbHRlcigkYWJicmV2cykpOwoKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCJDb21tYW5kIFwiJXNcIiBpcyBhbWJpZ3VvdXMuXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xuJXMuIiwgJG5hbWUsICRzdWdnZXN0aW9ucyksIGFycmF5X3ZhbHVlcygkY29tbWFuZHMpKTsKfQp9CgokY29tbWFuZCA9ICR0aGlzLT5nZXQocmVzZXQoJGNvbW1hbmRzKSk7CgppZiAoJGNvbW1hbmQtPmlzSGlkZGVuKCkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgY29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGwoc3RyaW5nICRuYW1lc3BhY2UgPSBudWxsKQp7CiR0aGlzLT5pbml0KCk7CgppZiAobnVsbCA9PT0gJG5hbWVzcGFjZSkgewppZiAoISR0aGlzLT5jb21tYW5kTG9hZGVyKSB7CnJldHVybiAkdGhpcy0+Y29tbWFuZHM7Cn0KCiRjb21tYW5kcyA9ICR0aGlzLT5jb21tYW5kczsKZm9yZWFjaCAoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKCFpc3NldCgkY29tbWFuZHNbJG5hbWVdKSAmJiAkdGhpcy0+aGFzKCRuYW1lKSkgewokY29tbWFuZHNbJG5hbWVdID0gJHRoaXMtPmdldCgkbmFtZSk7Cn0KfQoKcmV0dXJuICRjb21tYW5kczsKfQoKJGNvbW1hbmRzID0gW107CmZvcmVhY2ggKCR0aGlzLT5jb21tYW5kcyBhcyAkbmFtZSA9PiAkY29tbWFuZCkgewppZiAoJG5hbWVzcGFjZSA9PT0gJHRoaXMtPmV4dHJhY3ROYW1lc3BhY2UoJG5hbWUsIHN1YnN0cl9jb3VudCgkbmFtZXNwYWNlLCAnOicpICsgMSkpIHsKJGNvbW1hbmRzWyRuYW1lXSA9ICRjb21tYW5kOwp9Cn0KCmlmICgkdGhpcy0+Y29tbWFuZExvYWRlcikgewpmb3JlYWNoICgkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoIWlzc2V0KCRjb21tYW5kc1skbmFtZV0pICYmICRuYW1lc3BhY2UgPT09ICR0aGlzLT5leHRyYWN0TmFtZXNwYWNlKCRuYW1lLCBzdWJzdHJfY291bnQoJG5hbWVzcGFjZSwgJzonKSArIDEpICYmICR0aGlzLT5oYXMoJG5hbWUpKSB7CiRjb21tYW5kc1skbmFtZV0gPSAkdGhpcy0+Z2V0KCRuYW1lKTsKfQp9Cn0KCnJldHVybiAkY29tbWFuZHM7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBYmJyZXZpYXRpb25zKGFycmF5ICRuYW1lcykKewokYWJicmV2cyA9IFtdOwpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKZm9yICgkbGVuID0gXHN0cmxlbigkbmFtZSk7ICRsZW4gPiAwOyAtLSRsZW4pIHsKJGFiYnJldiA9IHN1YnN0cigkbmFtZSwgMCwgJGxlbik7CiRhYmJyZXZzWyRhYmJyZXZdW10gPSAkbmFtZTsKfQp9CgpyZXR1cm4gJGFiYnJldnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW5kZXJUaHJvd2FibGUoXFRocm93YWJsZSAkZSwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJG91dHB1dC0+d3JpdGVsbignJywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwoKJHRoaXMtPmRvUmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0KTsKCmlmIChudWxsICE9PSAkdGhpcy0+cnVubmluZ0NvbW1hbmQpIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZShzcHJpbnRmKCR0aGlzLT5ydW5uaW5nQ29tbWFuZC0+Z2V0U3lub3BzaXMoKSwgJHRoaXMtPmdldE5hbWUoKSkpKSwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwokb3V0cHV0LT53cml0ZWxuKCcnLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvUmVuZGVyVGhyb3dhYmxlKFxUaHJvd2FibGUgJGUsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CmRvIHsKJG1lc3NhZ2UgPSB0cmltKCRlLT5nZXRNZXNzYWdlKCkpOwppZiAoJycgPT09ICRtZXNzYWdlIHx8IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJGNsYXNzID0gZ2V0X2RlYnVnX3R5cGUoJGUpOwokdGl0bGUgPSBzcHJpbnRmKCcgIFslcyVzXSAgJywgJGNsYXNzLCAwICE9PSAoJGNvZGUgPSAkZS0+Z2V0Q29kZSgpKSA/ICcgKCcuJGNvZGUuJyknIDogJycpOwokbGVuID0gSGVscGVyOjp3aWR0aCgkdGl0bGUpOwp9IGVsc2UgewokbGVuID0gMDsKfQoKaWYgKHN0cl9jb250YWlucygkbWVzc2FnZSwgIkBhbm9ueW1vdXNcMCIpKSB7CiRtZXNzYWdlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvW2EtekEtWl9ceDdmLVx4ZmZdW1xcXFxhLXpBLVowLTlfXHg3Zi1ceGZmXSorQGFub255bW91c1x4MDAuKj9cLnBocCg/OjB4P3w6WzAtOV0rK1wkKVswLTlhLWZBLUZdKysvJywgZnVuY3Rpb24gKCRtKSB7CnJldHVybiBjbGFzc19leGlzdHMoJG1bMF0sIGZhbHNlKSA/IChnZXRfcGFyZW50X2NsYXNzKCRtWzBdKSA/OiBrZXkoY2xhc3NfaW1wbGVtZW50cygkbVswXSkpID86ICdjbGFzcycpLidAYW5vbnltb3VzJyA6ICRtWzBdOwp9LCAkbWVzc2FnZSk7Cn0KCiR3aWR0aCA9ICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSA/ICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSAtIDEgOiBcUEhQX0lOVF9NQVg7CiRsaW5lcyA9IFtdOwpmb3JlYWNoICgnJyAhPT0gJG1lc3NhZ2UgPyBwcmVnX3NwbGl0KCcvXHI/XG4vJywgJG1lc3NhZ2UpIDogW10gYXMgJGxpbmUpIHsKZm9yZWFjaCAoJHRoaXMtPnNwbGl0U3RyaW5nQnlXaWR0aCgkbGluZSwgJHdpZHRoIC0gNCkgYXMgJGxpbmUpIHsKCiRsaW5lTGVuZ3RoID0gSGVscGVyOjp3aWR0aCgkbGluZSkgKyA0OwokbGluZXNbXSA9IFskbGluZSwgJGxpbmVMZW5ndGhdOwoKJGxlbiA9IG1heCgkbGluZUxlbmd0aCwgJGxlbik7Cn0KfQoKJG1lc3NhZ2VzID0gW107CmlmICghJGUgaW5zdGFuY2VvZiBFeGNlcHRpb25JbnRlcmZhY2UgfHwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokbWVzc2FnZXNbXSA9IHNwcmludGYoJzxjb21tZW50PiVzPC9jb21tZW50PicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKHNwcmludGYoJ0luICVzIGxpbmUgJXM6JywgYmFzZW5hbWUoJGUtPmdldEZpbGUoKSkgPzogJ24vYScsICRlLT5nZXRMaW5lKCkgPzogJ24vYScpKSk7Cn0KJG1lc3NhZ2VzW10gPSAkZW1wdHlMaW5lID0gc3ByaW50ZignPGVycm9yPiVzPC9lcnJvcj4nLCBzdHJfcmVwZWF0KCcgJywgJGxlbikpOwppZiAoJycgPT09ICRtZXNzYWdlIHx8IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG1lc3NhZ2VzW10gPSBzcHJpbnRmKCc8ZXJyb3I+JXMlczwvZXJyb3I+JywgJHRpdGxlLCBzdHJfcmVwZWF0KCcgJywgbWF4KDAsICRsZW4gLSBIZWxwZXI6OndpZHRoKCR0aXRsZSkpKSk7Cn0KZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiRtZXNzYWdlc1tdID0gc3ByaW50ZignPGVycm9yPiAgJXMgICVzPC9lcnJvcj4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbGluZVswXSksIHN0cl9yZXBlYXQoJyAnLCAkbGVuIC0gJGxpbmVbMV0pKTsKfQokbWVzc2FnZXNbXSA9ICRlbXB0eUxpbmU7CiRtZXNzYWdlc1tdID0gJyc7Cgokb3V0cHV0LT53cml0ZWxuKCRtZXNzYWdlcywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwoKaWYgKE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG91dHB1dC0+d3JpdGVsbignPGNvbW1lbnQ+RXhjZXB0aW9uIHRyYWNlOjwvY29tbWVudD4nLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7CgoKJHRyYWNlID0gJGUtPmdldFRyYWNlKCk7CgphcnJheV91bnNoaWZ0KCR0cmFjZSwgWwonZnVuY3Rpb24nID0+ICcnLAonZmlsZScgPT4gJGUtPmdldEZpbGUoKSA/OiAnbi9hJywKJ2xpbmUnID0+ICRlLT5nZXRMaW5lKCkgPzogJ24vYScsCidhcmdzJyA9PiBbXSwKXSk7Cgpmb3IgKCRpID0gMCwgJGNvdW50ID0gXGNvdW50KCR0cmFjZSk7ICRpIDwgJGNvdW50OyArKyRpKSB7CiRjbGFzcyA9ICR0cmFjZVskaV1bJ2NsYXNzJ10gPz8gJyc7CiR0eXBlID0gJHRyYWNlWyRpXVsndHlwZSddID8/ICcnOwokZnVuY3Rpb24gPSAkdHJhY2VbJGldWydmdW5jdGlvbiddID8/ICcnOwokZmlsZSA9ICR0cmFjZVskaV1bJ2ZpbGUnXSA/PyAnbi9hJzsKJGxpbmUgPSAkdHJhY2VbJGldWydsaW5lJ10gPz8gJ24vYSc7Cgokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJyAlcyVzIGF0IDxpbmZvPiVzOiVzPC9pbmZvPicsICRjbGFzcywgJGZ1bmN0aW9uID8gJHR5cGUuJGZ1bmN0aW9uLicoKScgOiAnJywgJGZpbGUsICRsaW5lKSwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwp9Cgokb3V0cHV0LT53cml0ZWxuKCcnLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7Cn0KfSB3aGlsZSAoJGUgPSAkZS0+Z2V0UHJldmlvdXMoKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmVJTyhJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tYW5zaSddLCB0cnVlKSkgewokb3V0cHV0LT5zZXREZWNvcmF0ZWQodHJ1ZSk7Cn0gZWxzZWlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tbm8tYW5zaSddLCB0cnVlKSkgewokb3V0cHV0LT5zZXREZWNvcmF0ZWQoZmFsc2UpOwp9CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLW5vLWludGVyYWN0aW9uJywgJy1uJ10sIHRydWUpKSB7CiRpbnB1dC0+c2V0SW50ZXJhY3RpdmUoZmFsc2UpOwp9Cgpzd2l0Y2ggKCRzaGVsbFZlcmJvc2l0eSA9IChpbnQpIGdldGVudignU0hFTExfVkVSQk9TSVRZJykpIHsKY2FzZSAtMToKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKYnJlYWs7CmNhc2UgMToKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UpOwpicmVhazsKY2FzZSAyOgokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFKTsKYnJlYWs7CmNhc2UgMzoKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX0RFQlVHKTsKYnJlYWs7CmRlZmF1bHQ6CiRzaGVsbFZlcmJvc2l0eSA9IDA7CmJyZWFrOwp9CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLXF1aWV0JywgJy1xJ10sIHRydWUpKSB7CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7CiRzaGVsbFZlcmJvc2l0eSA9IC0xOwp9IGVsc2UgewppZiAoJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy12dnYnLCB0cnVlKSB8fCAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS12ZXJib3NlPTMnLCB0cnVlKSB8fCAzID09PSAkaW5wdXQtPmdldFBhcmFtZXRlck9wdGlvbignLS12ZXJib3NlJywgZmFsc2UsIHRydWUpKSB7CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRyk7CiRzaGVsbFZlcmJvc2l0eSA9IDM7Cn0gZWxzZWlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLXZ2JywgdHJ1ZSkgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZT0yJywgdHJ1ZSkgfHwgMiA9PT0gJGlucHV0LT5nZXRQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZScsIGZhbHNlLCB0cnVlKSkgewokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFKTsKJHNoZWxsVmVyYm9zaXR5ID0gMjsKfSBlbHNlaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctdicsIHRydWUpIHx8ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2U9MScsIHRydWUpIHx8ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2UnLCB0cnVlKSB8fCAkaW5wdXQtPmdldFBhcmFtZXRlck9wdGlvbignLS12ZXJib3NlJywgZmFsc2UsIHRydWUpKSB7CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFKTsKJHNoZWxsVmVyYm9zaXR5ID0gMTsKfQp9CgppZiAoLTEgPT09ICRzaGVsbFZlcmJvc2l0eSkgewokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKfQoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3B1dGVudicpKSB7CkBwdXRlbnYoJ1NIRUxMX1ZFUkJPU0lUWT0nLiRzaGVsbFZlcmJvc2l0eSk7Cn0KJF9FTlZbJ1NIRUxMX1ZFUkJPU0lUWSddID0gJHNoZWxsVmVyYm9zaXR5OwokX1NFUlZFUlsnU0hFTExfVkVSQk9TSVRZJ10gPSAkc2hlbGxWZXJib3NpdHk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvUnVuQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CmZvcmVhY2ggKCRjb21tYW5kLT5nZXRIZWxwZXJTZXQoKSBhcyAkaGVscGVyKSB7CmlmICgkaGVscGVyIGluc3RhbmNlb2YgSW5wdXRBd2FyZUludGVyZmFjZSkgewokaGVscGVyLT5zZXRJbnB1dCgkaW5wdXQpOwp9Cn0KCmlmICgkdGhpcy0+c2lnbmFsc1RvRGlzcGF0Y2hFdmVudCkgewokY29tbWFuZFNpZ25hbHMgPSAkY29tbWFuZCBpbnN0YW5jZW9mIFNpZ25hbGFibGVDb21tYW5kSW50ZXJmYWNlID8gJGNvbW1hbmQtPmdldFN1YnNjcmliZWRTaWduYWxzKCkgOiBbXTsKCmlmICgkY29tbWFuZFNpZ25hbHMgfHwgbnVsbCAhPT0gJHRoaXMtPmRpc3BhdGNoZXIpIHsKaWYgKCEkdGhpcy0+c2lnbmFsUmVnaXN0cnkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBzdWJzY3JpYmUgdG8gc2lnbmFsIGV2ZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhlIGBwY250bGAgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhhdCAicGNudGxfKiIgZnVuY3Rpb25zIGFyZSBub3QgZGlzYWJsZWQgYnkgeW91ciBwaHAuaW5pXCdzICJkaXNhYmxlX2Z1bmN0aW9ucyIgZGlyZWN0aXZlLicpOwp9CgppZiAoVGVybWluYWw6Omhhc1N0dHlBdmFpbGFibGUoKSkgewokc3R0eU1vZGUgPSBzaGVsbF9leGVjKCdzdHR5IC1nJyk7Cgpmb3JlYWNoIChbXFNJR0lOVCwgXFNJR1RFUk1dIGFzICRzaWduYWwpIHsKJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5LT5yZWdpc3Rlcigkc2lnbmFsLCBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkc3R0eU1vZGUpIHsKc2hlbGxfZXhlYygnc3R0eSAnLiRzdHR5TW9kZSk7Cn0pOwp9Cn0KfQoKaWYgKG51bGwgIT09ICR0aGlzLT5kaXNwYXRjaGVyKSB7CmZvcmVhY2ggKCR0aGlzLT5zaWduYWxzVG9EaXNwYXRjaEV2ZW50IGFzICRzaWduYWwpIHsKJGV2ZW50ID0gbmV3IENvbnNvbGVTaWduYWxFdmVudCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0LCAkc2lnbmFsKTsKCiR0aGlzLT5zaWduYWxSZWdpc3RyeS0+cmVnaXN0ZXIoJHNpZ25hbCwgZnVuY3Rpb24gKCRzaWduYWwsICRoYXNOZXh0KSB1c2UgKCRldmVudCkgewokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpTSUdOQUwpOwoKCmlmICghJGhhc05leHQpIHsKaWYgKCFcaW5fYXJyYXkoJHNpZ25hbCwgW1xTSUdVU1IxLCBcU0lHVVNSMl0sIHRydWUpKSB7CmV4aXQoMCk7Cn0KfQp9KTsKfQp9Cgpmb3JlYWNoICgkY29tbWFuZFNpZ25hbHMgYXMgJHNpZ25hbCkgewokdGhpcy0+c2lnbmFsUmVnaXN0cnktPnJlZ2lzdGVyKCRzaWduYWwsIFskY29tbWFuZCwgJ2hhbmRsZVNpZ25hbCddKTsKfQp9CgppZiAobnVsbCA9PT0gJHRoaXMtPmRpc3BhdGNoZXIpIHsKcmV0dXJuICRjb21tYW5kLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKCnRyeSB7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbigpOwokaW5wdXQtPmJpbmQoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKSk7Cn0gY2F0Y2ggKEV4Y2VwdGlvbkludGVyZmFjZSAkZSkgewoKfQoKJGV2ZW50ID0gbmV3IENvbnNvbGVDb21tYW5kRXZlbnQoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCk7CiRlID0gbnVsbDsKCnRyeSB7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OkNPTU1BTkQpOwoKaWYgKCRldmVudC0+Y29tbWFuZFNob3VsZFJ1bigpKSB7CiRleGl0Q29kZSA9ICRjb21tYW5kLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfSBlbHNlIHsKJGV4aXRDb2RlID0gQ29uc29sZUNvbW1hbmRFdmVudDo6UkVUVVJOX0NPREVfRElTQUJMRUQ7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokZXZlbnQgPSBuZXcgQ29uc29sZUVycm9yRXZlbnQoJGlucHV0LCAkb3V0cHV0LCAkZSwgJGNvbW1hbmQpOwokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpFUlJPUik7CiRlID0gJGV2ZW50LT5nZXRFcnJvcigpOwoKaWYgKDAgPT09ICRleGl0Q29kZSA9ICRldmVudC0+Z2V0RXhpdENvZGUoKSkgewokZSA9IG51bGw7Cn0KfQoKJGV2ZW50ID0gbmV3IENvbnNvbGVUZXJtaW5hdGVFdmVudCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0LCAkZXhpdENvZGUpOwokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpURVJNSU5BVEUpOwoKaWYgKG51bGwgIT09ICRlKSB7CnRocm93ICRlOwp9CgpyZXR1cm4gJGV2ZW50LT5nZXRFeGl0Q29kZSgpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21tYW5kTmFtZShJbnB1dEludGVyZmFjZSAkaW5wdXQpCnsKcmV0dXJuICR0aGlzLT5zaW5nbGVDb21tYW5kID8gJHRoaXMtPmRlZmF1bHRDb21tYW5kIDogJGlucHV0LT5nZXRGaXJzdEFyZ3VtZW50KCk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRJbnB1dERlZmluaXRpb24oKQp7CnJldHVybiBuZXcgSW5wdXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ2NvbW1hbmQnLCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJ1RoZSBjb21tYW5kIHRvIGV4ZWN1dGUnKSwKbmV3IElucHV0T3B0aW9uKCctLWhlbHAnLCAnLWgnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgaGVscCBmb3IgdGhlIGdpdmVuIGNvbW1hbmQuIFdoZW4gbm8gY29tbWFuZCBpcyBnaXZlbiBkaXNwbGF5IGhlbHAgZm9yIHRoZSA8aW5mbz4nLiR0aGlzLT5kZWZhdWx0Q29tbWFuZC4nPC9pbmZvPiBjb21tYW5kJyksCm5ldyBJbnB1dE9wdGlvbignLS1xdWlldCcsICctcScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBhbnkgbWVzc2FnZScpLApuZXcgSW5wdXRPcHRpb24oJy0tdmVyYm9zZScsICctdnx2dnx2dnYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0luY3JlYXNlIHRoZSB2ZXJib3NpdHkgb2YgbWVzc2FnZXM6IDEgZm9yIG5vcm1hbCBvdXRwdXQsIDIgZm9yIG1vcmUgdmVyYm9zZSBvdXRwdXQgYW5kIDMgZm9yIGRlYnVnJyksCm5ldyBJbnB1dE9wdGlvbignLS12ZXJzaW9uJywgJy1WJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5IHRoaXMgYXBwbGljYXRpb24gdmVyc2lvbicpLApuZXcgSW5wdXRPcHRpb24oJy0tYW5zaScsICcnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTkVHQVRBQkxFLCAnRm9yY2UgKG9yIGRpc2FibGUgLS1uby1hbnNpKSBBTlNJIG91dHB1dCcsIG51bGwpLApuZXcgSW5wdXRPcHRpb24oJy0tbm8taW50ZXJhY3Rpb24nLCAnLW4nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBhc2sgYW55IGludGVyYWN0aXZlIHF1ZXN0aW9uJyksCl0pOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0Q29tbWFuZHMoKQp7CnJldHVybiBbbmV3IEhlbHBDb21tYW5kKCksIG5ldyBMaXN0Q29tbWFuZCgpLCBuZXcgQ29tcGxldGVDb21tYW5kKCksIG5ldyBEdW1wQ29tcGxldGlvbkNvbW1hbmQoKV07Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRIZWxwZXJTZXQoKQp7CnJldHVybiBuZXcgSGVscGVyU2V0KFsKbmV3IEZvcm1hdHRlckhlbHBlcigpLApuZXcgRGVidWdGb3JtYXR0ZXJIZWxwZXIoKSwKbmV3IFByb2Nlc3NIZWxwZXIoKSwKbmV3IFF1ZXN0aW9uSGVscGVyKCksCl0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEFiYnJldmlhdGlvblN1Z2dlc3Rpb25zKGFycmF5ICRhYmJyZXZzKTogc3RyaW5nCnsKcmV0dXJuICcgICAgJy5pbXBsb2RlKCJcbiAgICAiLCAkYWJicmV2cyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdE5hbWVzcGFjZShzdHJpbmcgJG5hbWUsIGludCAkbGltaXQgPSBudWxsKQp7CiRwYXJ0cyA9IGV4cGxvZGUoJzonLCAkbmFtZSwgLTEpOwoKcmV0dXJuIGltcGxvZGUoJzonLCBudWxsID09PSAkbGltaXQgPyAkcGFydHMgOiBcYXJyYXlfc2xpY2UoJHBhcnRzLCAwLCAkbGltaXQpKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kQWx0ZXJuYXRpdmVzKHN0cmluZyAkbmFtZSwgaXRlcmFibGUgJGNvbGxlY3Rpb24pOiBhcnJheQp7CiR0aHJlc2hvbGQgPSAxZTM7CiRhbHRlcm5hdGl2ZXMgPSBbXTsKCiRjb2xsZWN0aW9uUGFydHMgPSBbXTsKZm9yZWFjaCAoJGNvbGxlY3Rpb24gYXMgJGl0ZW0pIHsKJGNvbGxlY3Rpb25QYXJ0c1skaXRlbV0gPSBleHBsb2RlKCc6JywgJGl0ZW0pOwp9Cgpmb3JlYWNoIChleHBsb2RlKCc6JywgJG5hbWUpIGFzICRpID0+ICRzdWJuYW1lKSB7CmZvcmVhY2ggKCRjb2xsZWN0aW9uUGFydHMgYXMgJGNvbGxlY3Rpb25OYW1lID0+ICRwYXJ0cykgewokZXhpc3RzID0gaXNzZXQoJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdKTsKaWYgKCFpc3NldCgkcGFydHNbJGldKSAmJiAkZXhpc3RzKSB7CiRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSArPSAkdGhyZXNob2xkOwpjb250aW51ZTsKfSBlbHNlaWYgKCFpc3NldCgkcGFydHNbJGldKSkgewpjb250aW51ZTsKfQoKJGxldiA9IGxldmVuc2h0ZWluKCRzdWJuYW1lLCAkcGFydHNbJGldKTsKaWYgKCRsZXYgPD0gXHN0cmxlbigkc3VibmFtZSkgLyAzIHx8ICcnICE9PSAkc3VibmFtZSAmJiBzdHJfY29udGFpbnMoJHBhcnRzWyRpXSwgJHN1Ym5hbWUpKSB7CiRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSA9ICRleGlzdHMgPyAkYWx0ZXJuYXRpdmVzWyRjb2xsZWN0aW9uTmFtZV0gKyAkbGV2IDogJGxldjsKfSBlbHNlaWYgKCRleGlzdHMpIHsKJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdICs9ICR0aHJlc2hvbGQ7Cn0KfQp9Cgpmb3JlYWNoICgkY29sbGVjdGlvbiBhcyAkaXRlbSkgewokbGV2ID0gbGV2ZW5zaHRlaW4oJG5hbWUsICRpdGVtKTsKaWYgKCRsZXYgPD0gXHN0cmxlbigkbmFtZSkgLyAzIHx8IHN0cl9jb250YWlucygkaXRlbSwgJG5hbWUpKSB7CiRhbHRlcm5hdGl2ZXNbJGl0ZW1dID0gaXNzZXQoJGFsdGVybmF0aXZlc1skaXRlbV0pID8gJGFsdGVybmF0aXZlc1skaXRlbV0gLSAkbGV2IDogJGxldjsKfQp9CgokYWx0ZXJuYXRpdmVzID0gYXJyYXlfZmlsdGVyKCRhbHRlcm5hdGl2ZXMsIGZ1bmN0aW9uICgkbGV2KSB1c2UgKCR0aHJlc2hvbGQpIHsgcmV0dXJuICRsZXYgPCAyICogJHRocmVzaG9sZDsgfSk7Cmtzb3J0KCRhbHRlcm5hdGl2ZXMsIFxTT1JUX05BVFVSQUwgfCBcU09SVF9GTEFHX0NBU0UpOwoKcmV0dXJuIGFycmF5X2tleXMoJGFsdGVybmF0aXZlcyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHRDb21tYW5kKHN0cmluZyAkY29tbWFuZE5hbWUsIGJvb2wgJGlzU2luZ2xlQ29tbWFuZCA9IGZhbHNlKQp7CiR0aGlzLT5kZWZhdWx0Q29tbWFuZCA9IGV4cGxvZGUoJ3wnLCBsdHJpbSgkY29tbWFuZE5hbWUsICd8JykpWzBdOwoKaWYgKCRpc1NpbmdsZUNvbW1hbmQpIHsKCiR0aGlzLT5maW5kKCRjb21tYW5kTmFtZSk7CgokdGhpcy0+c2luZ2xlQ29tbWFuZCA9IHRydWU7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU2luZ2xlQ29tbWFuZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5zaW5nbGVDb21tYW5kOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNwbGl0U3RyaW5nQnlXaWR0aChzdHJpbmcgJHN0cmluZywgaW50ICR3aWR0aCk6IGFycmF5CnsKCgoKaWYgKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIHN0cl9zcGxpdCgkc3RyaW5nLCAkd2lkdGgpOwp9CgokdXRmOFN0cmluZyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJ3V0ZjgnLCAkZW5jb2RpbmcpOwokbGluZXMgPSBbXTsKJGxpbmUgPSAnJzsKCiRvZmZzZXQgPSAwOwp3aGlsZSAocHJlZ19tYXRjaCgnLy57MSwxMDAwMH0vdScsICR1dGY4U3RyaW5nLCAkbSwgMCwgJG9mZnNldCkpIHsKJG9mZnNldCArPSBcc3RybGVuKCRtWzBdKTsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJy8vdScsICRtWzBdKSBhcyAkY2hhcikgewoKaWYgKG1iX3N0cndpZHRoKCRsaW5lLiRjaGFyLCAndXRmOCcpIDw9ICR3aWR0aCkgewokbGluZSAuPSAkY2hhcjsKY29udGludWU7Cn0KCiRsaW5lc1tdID0gc3RyX3BhZCgkbGluZSwgJHdpZHRoKTsKJGxpbmUgPSAkY2hhcjsKfQp9CgokbGluZXNbXSA9IFxjb3VudCgkbGluZXMpID8gc3RyX3BhZCgkbGluZSwgJHdpZHRoKSA6ICRsaW5lOwoKbWJfY29udmVydF92YXJpYWJsZXMoJGVuY29kaW5nLCAndXRmOCcsICRsaW5lcyk7CgpyZXR1cm4gJGxpbmVzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEFsbE5hbWVzcGFjZXMoc3RyaW5nICRuYW1lKTogYXJyYXkKewoKJHBhcnRzID0gZXhwbG9kZSgnOicsICRuYW1lLCAtMSk7CiRuYW1lc3BhY2VzID0gW107Cgpmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKaWYgKFxjb3VudCgkbmFtZXNwYWNlcykpIHsKJG5hbWVzcGFjZXNbXSA9IGVuZCgkbmFtZXNwYWNlcykuJzonLiRwYXJ0Owp9IGVsc2UgewokbmFtZXNwYWNlc1tdID0gJHBhcnQ7Cn0KfQoKcmV0dXJuICRuYW1lc3BhY2VzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGluaXQoKQp7CmlmICgkdGhpcy0+aW5pdGlhbGl6ZWQpIHsKcmV0dXJuOwp9CiR0aGlzLT5pbml0aWFsaXplZCA9IHRydWU7Cgpmb3JlYWNoICgkdGhpcy0+Z2V0RGVmYXVsdENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPmFkZCgkY29tbWFuZCk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBdHRyaWJ1dGU7CgoKCgojW1xBdHRyaWJ1dGUoXEF0dHJpYnV0ZTo6VEFSR0VUX0NMQVNTKV0KY2xhc3MgQXNDb21tYW5kCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KApwdWJsaWMgc3RyaW5nICRuYW1lLApwdWJsaWMgP3N0cmluZyAkZGVzY3JpcHRpb24gPSBudWxsLAphcnJheSAkYWxpYXNlcyA9IFtdLApib29sICRoaWRkZW4gPSBmYWxzZSwKKSB7CmlmICghJGhpZGRlbiAmJiAhJGFsaWFzZXMpIHsKcmV0dXJuOwp9CgokbmFtZSA9IGV4cGxvZGUoJ3wnLCAkbmFtZSk7CiRuYW1lID0gYXJyYXlfbWVyZ2UoJG5hbWUsICRhbGlhc2VzKTsKCmlmICgkaGlkZGVuICYmICcnICE9PSAkbmFtZVswXSkgewphcnJheV91bnNoaWZ0KCRuYW1lLCAnJyk7Cn0KCiR0aGlzLT5uYW1lID0gaW1wbG9kZSgnfCcsICRuYW1lKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDSTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEdpdGh1YkFjdGlvblJlcG9ydGVyCnsKcHJpdmF0ZSAkb3V0cHV0OwoKCgoKcHJpdmF0ZSBjb25zdCBFU0NBUEVEX0RBVEEgPSBbCiclJyA9PiAnJTI1JywKIlxyIiA9PiAnJTBEJywKIlxuIiA9PiAnJTBBJywKXTsKCgoKCnByaXZhdGUgY29uc3QgRVNDQVBFRF9QUk9QRVJUSUVTID0gWwonJScgPT4gJyUyNScsCiJcciIgPT4gJyUwRCcsCiJcbiIgPT4gJyUwQScsCic6JyA9PiAnJTNBJywKJywnID0+ICclMkMnLApdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzR2l0aHViQWN0aW9uRW52aXJvbm1lbnQoKTogYm9vbAp7CnJldHVybiBmYWxzZSAhPT0gZ2V0ZW52KCdHSVRIVUJfQUNUSU9OUycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcihzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkZmlsZSA9IG51bGwsIGludCAkbGluZSA9IG51bGwsIGludCAkY29sID0gbnVsbCk6IHZvaWQKewokdGhpcy0+bG9nKCdlcnJvcicsICRtZXNzYWdlLCAkZmlsZSwgJGxpbmUsICRjb2wpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRmaWxlID0gbnVsbCwgaW50ICRsaW5lID0gbnVsbCwgaW50ICRjb2wgPSBudWxsKTogdm9pZAp7CiR0aGlzLT5sb2coJ3dhcm5pbmcnLCAkbWVzc2FnZSwgJGZpbGUsICRsaW5lLCAkY29sKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVidWcoc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJGZpbGUgPSBudWxsLCBpbnQgJGxpbmUgPSBudWxsLCBpbnQgJGNvbCA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPmxvZygnZGVidWcnLCAkbWVzc2FnZSwgJGZpbGUsICRsaW5lLCAkY29sKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBsb2coc3RyaW5nICR0eXBlLCBzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkZmlsZSA9IG51bGwsIGludCAkbGluZSA9IG51bGwsIGludCAkY29sID0gbnVsbCk6IHZvaWQKewoKJG1lc3NhZ2UgPSBzdHJ0cigkbWVzc2FnZSwgc2VsZjo6RVNDQVBFRF9EQVRBKTsKCmlmICghJGZpbGUpIHsKCiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oc3ByaW50ZignOjolczo6JXMnLCAkdHlwZSwgJG1lc3NhZ2UpKTsKCnJldHVybjsKfQoKJHRoaXMtPm91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc6OiVzIGZpbGU9JXMsbGluZT0lcyxjb2w9JXM6OiVzJywgJHR5cGUsIHN0cnRyKCRmaWxlLCBzZWxmOjpFU0NBUEVEX1BST1BFUlRJRVMpLCBzdHJ0cigkbGluZSA/PyAxLCBzZWxmOjpFU0NBUEVEX1BST1BFUlRJRVMpLCBzdHJ0cigkY29sID8/IDAsIHNlbGY6OkVTQ0FQRURfUFJPUEVSVElFUyksICRtZXNzYWdlKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKZmluYWwgY2xhc3MgQ29sb3IKewpwcml2YXRlIGNvbnN0IENPTE9SUyA9IFsKJ2JsYWNrJyA9PiAwLAoncmVkJyA9PiAxLAonZ3JlZW4nID0+IDIsCid5ZWxsb3cnID0+IDMsCidibHVlJyA9PiA0LAonbWFnZW50YScgPT4gNSwKJ2N5YW4nID0+IDYsCid3aGl0ZScgPT4gNywKJ2RlZmF1bHQnID0+IDksCl07Cgpwcml2YXRlIGNvbnN0IEJSSUdIVF9DT0xPUlMgPSBbCidncmF5JyA9PiAwLAonYnJpZ2h0LXJlZCcgPT4gMSwKJ2JyaWdodC1ncmVlbicgPT4gMiwKJ2JyaWdodC15ZWxsb3cnID0+IDMsCidicmlnaHQtYmx1ZScgPT4gNCwKJ2JyaWdodC1tYWdlbnRhJyA9PiA1LAonYnJpZ2h0LWN5YW4nID0+IDYsCidicmlnaHQtd2hpdGUnID0+IDcsCl07Cgpwcml2YXRlIGNvbnN0IEFWQUlMQUJMRV9PUFRJT05TID0gWwonYm9sZCcgPT4gWydzZXQnID0+IDEsICd1bnNldCcgPT4gMjJdLAondW5kZXJzY29yZScgPT4gWydzZXQnID0+IDQsICd1bnNldCcgPT4gMjRdLAonYmxpbmsnID0+IFsnc2V0JyA9PiA1LCAndW5zZXQnID0+IDI1XSwKJ3JldmVyc2UnID0+IFsnc2V0JyA9PiA3LCAndW5zZXQnID0+IDI3XSwKJ2NvbmNlYWwnID0+IFsnc2V0JyA9PiA4LCAndW5zZXQnID0+IDI4XSwKXTsKCnByaXZhdGUgJGZvcmVncm91bmQ7CnByaXZhdGUgJGJhY2tncm91bmQ7CnByaXZhdGUgJG9wdGlvbnMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGZvcmVncm91bmQgPSAnJywgc3RyaW5nICRiYWNrZ3JvdW5kID0gJycsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPmZvcmVncm91bmQgPSAkdGhpcy0+cGFyc2VDb2xvcigkZm9yZWdyb3VuZCk7CiR0aGlzLT5iYWNrZ3JvdW5kID0gJHRoaXMtPnBhcnNlQ29sb3IoJGJhY2tncm91bmQsIHRydWUpOwoKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewppZiAoIWlzc2V0KHNlbGY6OkFWQUlMQUJMRV9PUFRJT05TWyRvcHRpb25dKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgb3B0aW9uIHNwZWNpZmllZDogIiVzIi4gRXhwZWN0ZWQgb25lIG9mICglcykuJywgJG9wdGlvbiwgaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKHNlbGY6OkFWQUlMQUJMRV9PUFRJT05TKSkpKTsKfQoKJHRoaXMtPm9wdGlvbnNbJG9wdGlvbl0gPSBzZWxmOjpBVkFJTEFCTEVfT1BUSU9OU1skb3B0aW9uXTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gYXBwbHkoc3RyaW5nICR0ZXh0KTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zZXQoKS4kdGV4dC4kdGhpcy0+dW5zZXQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldCgpOiBzdHJpbmcKewokc2V0Q29kZXMgPSBbXTsKaWYgKCcnICE9PSAkdGhpcy0+Zm9yZWdyb3VuZCkgewokc2V0Q29kZXNbXSA9ICR0aGlzLT5mb3JlZ3JvdW5kOwp9CmlmICgnJyAhPT0gJHRoaXMtPmJhY2tncm91bmQpIHsKJHNldENvZGVzW10gPSAkdGhpcy0+YmFja2dyb3VuZDsKfQpmb3JlYWNoICgkdGhpcy0+b3B0aW9ucyBhcyAkb3B0aW9uKSB7CiRzZXRDb2Rlc1tdID0gJG9wdGlvblsnc2V0J107Cn0KaWYgKDAgPT09IFxjb3VudCgkc2V0Q29kZXMpKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuIHNwcmludGYoIlwwMzNbJXNtIiwgaW1wbG9kZSgnOycsICRzZXRDb2RlcykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdW5zZXQoKTogc3RyaW5nCnsKJHVuc2V0Q29kZXMgPSBbXTsKaWYgKCcnICE9PSAkdGhpcy0+Zm9yZWdyb3VuZCkgewokdW5zZXRDb2Rlc1tdID0gMzk7Cn0KaWYgKCcnICE9PSAkdGhpcy0+YmFja2dyb3VuZCkgewokdW5zZXRDb2Rlc1tdID0gNDk7Cn0KZm9yZWFjaCAoJHRoaXMtPm9wdGlvbnMgYXMgJG9wdGlvbikgewokdW5zZXRDb2Rlc1tdID0gJG9wdGlvblsndW5zZXQnXTsKfQppZiAoMCA9PT0gXGNvdW50KCR1bnNldENvZGVzKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiBzcHJpbnRmKCJcMDMzWyVzbSIsIGltcGxvZGUoJzsnLCAkdW5zZXRDb2RlcykpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQ29sb3Ioc3RyaW5nICRjb2xvciwgYm9vbCAkYmFja2dyb3VuZCA9IGZhbHNlKTogc3RyaW5nCnsKaWYgKCcnID09PSAkY29sb3IpIHsKcmV0dXJuICcnOwp9CgppZiAoJyMnID09PSAkY29sb3JbMF0pIHsKJGNvbG9yID0gc3Vic3RyKCRjb2xvciwgMSk7CgppZiAoMyA9PT0gXHN0cmxlbigkY29sb3IpKSB7CiRjb2xvciA9ICRjb2xvclswXS4kY29sb3JbMF0uJGNvbG9yWzFdLiRjb2xvclsxXS4kY29sb3JbMl0uJGNvbG9yWzJdOwp9CgppZiAoNiAhPT0gXHN0cmxlbigkY29sb3IpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCAiJXMiIGNvbG9yLicsICRjb2xvcikpOwp9CgpyZXR1cm4gKCRiYWNrZ3JvdW5kID8gJzQnIDogJzMnKS4kdGhpcy0+Y29udmVydEhleENvbG9yVG9BbnNpKGhleGRlYygkY29sb3IpKTsKfQoKaWYgKGlzc2V0KHNlbGY6OkNPTE9SU1skY29sb3JdKSkgewpyZXR1cm4gKCRiYWNrZ3JvdW5kID8gJzQnIDogJzMnKS5zZWxmOjpDT0xPUlNbJGNvbG9yXTsKfQoKaWYgKGlzc2V0KHNlbGY6OkJSSUdIVF9DT0xPUlNbJGNvbG9yXSkpIHsKcmV0dXJuICgkYmFja2dyb3VuZCA/ICcxMCcgOiAnOScpLnNlbGY6OkJSSUdIVF9DT0xPUlNbJGNvbG9yXTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkICIlcyIgY29sb3I7IGV4cGVjdGVkIG9uZSBvZiAoJXMpLicsICRjb2xvciwgaW1wbG9kZSgnLCAnLCBhcnJheV9tZXJnZShhcnJheV9rZXlzKHNlbGY6OkNPTE9SUyksIGFycmF5X2tleXMoc2VsZjo6QlJJR0hUX0NPTE9SUykpKSkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNvbnZlcnRIZXhDb2xvclRvQW5zaShpbnQgJGNvbG9yKTogc3RyaW5nCnsKJHIgPSAoJGNvbG9yID4+IDE2KSAmIDI1NTsKJGcgPSAoJGNvbG9yID4+IDgpICYgMjU1OwokYiA9ICRjb2xvciAmIDI1NTsKCgppZiAoJ3RydWVjb2xvcicgIT09IGdldGVudignQ09MT1JURVJNJykpIHsKcmV0dXJuIChzdHJpbmcpICR0aGlzLT5kZWdyYWRlSGV4Q29sb3JUb0Fuc2koJHIsICRnLCAkYik7Cn0KCnJldHVybiBzcHJpbnRmKCc4OzI7JWQ7JWQ7JWQnLCAkciwgJGcsICRiKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkZWdyYWRlSGV4Q29sb3JUb0Fuc2koaW50ICRyLCBpbnQgJGcsIGludCAkYik6IGludAp7CmlmICgwID09PSByb3VuZCgkdGhpcy0+Z2V0U2F0dXJhdGlvbigkciwgJGcsICRiKSAvIDUwKSkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIChyb3VuZCgkYiAvIDI1NSkgPDwgMikgfCAocm91bmQoJGcgLyAyNTUpIDw8IDEpIHwgcm91bmQoJHIgLyAyNTUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFNhdHVyYXRpb24oaW50ICRyLCBpbnQgJGcsIGludCAkYik6IGludAp7CiRyID0gJHIgLyAyNTU7CiRnID0gJGcgLyAyNTU7CiRiID0gJGIgLyAyNTU7CiR2ID0gbWF4KCRyLCAkZywgJGIpOwoKaWYgKDAgPT09ICRkaWZmID0gJHYgLSBtaW4oJHIsICRnLCAkYikpIHsKcmV0dXJuIDA7Cn0KCnJldHVybiAoaW50KSAkZGlmZiAqIDEwMCAvICR2Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXR0cmlidXRlXEFzQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBDb21tYW5kCnsKCnB1YmxpYyBjb25zdCBTVUNDRVNTID0gMDsKcHVibGljIGNvbnN0IEZBSUxVUkUgPSAxOwpwdWJsaWMgY29uc3QgSU5WQUxJRCA9IDI7CgoKCgpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0TmFtZTsKCgoKCnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHREZXNjcmlwdGlvbjsKCnByaXZhdGUgJGFwcGxpY2F0aW9uOwpwcml2YXRlICRuYW1lOwpwcml2YXRlICRwcm9jZXNzVGl0bGU7CnByaXZhdGUgJGFsaWFzZXMgPSBbXTsKcHJpdmF0ZSAkZGVmaW5pdGlvbjsKcHJpdmF0ZSAkaGlkZGVuID0gZmFsc2U7CnByaXZhdGUgJGhlbHAgPSAnJzsKcHJpdmF0ZSAkZGVzY3JpcHRpb24gPSAnJzsKcHJpdmF0ZSAkZnVsbERlZmluaXRpb247CnByaXZhdGUgJGlnbm9yZVZhbGlkYXRpb25FcnJvcnMgPSBmYWxzZTsKcHJpdmF0ZSAkY29kZTsKcHJpdmF0ZSAkc3lub3BzaXMgPSBbXTsKcHJpdmF0ZSAkdXNhZ2VzID0gW107CnByaXZhdGUgJGhlbHBlclNldDsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVmYXVsdE5hbWUoKQp7CiRjbGFzcyA9IHN0YXRpYzo6Y2xhc3M7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwICYmICRhdHRyaWJ1dGUgPSAobmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKSktPmdldEF0dHJpYnV0ZXMoQXNDb21tYW5kOjpjbGFzcykpIHsKcmV0dXJuICRhdHRyaWJ1dGVbMF0tPm5ld0luc3RhbmNlKCktPm5hbWU7Cn0KCiRyID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJGNsYXNzLCAnZGVmYXVsdE5hbWUnKTsKCnJldHVybiAkY2xhc3MgPT09ICRyLT5jbGFzcyA/IHN0YXRpYzo6JGRlZmF1bHROYW1lIDogbnVsbDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXREZWZhdWx0RGVzY3JpcHRpb24oKTogP3N0cmluZwp7CiRjbGFzcyA9IHN0YXRpYzo6Y2xhc3M7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwICYmICRhdHRyaWJ1dGUgPSAobmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKSktPmdldEF0dHJpYnV0ZXMoQXNDb21tYW5kOjpjbGFzcykpIHsKcmV0dXJuICRhdHRyaWJ1dGVbMF0tPm5ld0luc3RhbmNlKCktPmRlc2NyaXB0aW9uOwp9CgokciA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCRjbGFzcywgJ2RlZmF1bHREZXNjcmlwdGlvbicpOwoKcmV0dXJuICRjbGFzcyA9PT0gJHItPmNsYXNzID8gc3RhdGljOjokZGVmYXVsdERlc2NyaXB0aW9uIDogbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lID0gbnVsbCkKewokdGhpcy0+ZGVmaW5pdGlvbiA9IG5ldyBJbnB1dERlZmluaXRpb24oKTsKCmlmIChudWxsID09PSAkbmFtZSAmJiBudWxsICE9PSAkbmFtZSA9IHN0YXRpYzo6Z2V0RGVmYXVsdE5hbWUoKSkgewokYWxpYXNlcyA9IGV4cGxvZGUoJ3wnLCAkbmFtZSk7CgppZiAoJycgPT09ICRuYW1lID0gYXJyYXlfc2hpZnQoJGFsaWFzZXMpKSB7CiR0aGlzLT5zZXRIaWRkZW4odHJ1ZSk7CiRuYW1lID0gYXJyYXlfc2hpZnQoJGFsaWFzZXMpOwp9CgokdGhpcy0+c2V0QWxpYXNlcygkYWxpYXNlcyk7Cn0KCmlmIChudWxsICE9PSAkbmFtZSkgewokdGhpcy0+c2V0TmFtZSgkbmFtZSk7Cn0KCmlmICgnJyA9PT0gJHRoaXMtPmRlc2NyaXB0aW9uKSB7CiR0aGlzLT5zZXREZXNjcmlwdGlvbihzdGF0aWM6OmdldERlZmF1bHREZXNjcmlwdGlvbigpID8/ICcnKTsKfQoKJHRoaXMtPmNvbmZpZ3VyZSgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVWYWxpZGF0aW9uRXJyb3JzKCkKewokdGhpcy0+aWdub3JlVmFsaWRhdGlvbkVycm9ycyA9IHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24gPSBudWxsKQp7CiR0aGlzLT5hcHBsaWNhdGlvbiA9ICRhcHBsaWNhdGlvbjsKaWYgKCRhcHBsaWNhdGlvbikgewokdGhpcy0+c2V0SGVscGVyU2V0KCRhcHBsaWNhdGlvbi0+Z2V0SGVscGVyU2V0KCkpOwp9IGVsc2UgewokdGhpcy0+aGVscGVyU2V0ID0gbnVsbDsKfQoKJHRoaXMtPmZ1bGxEZWZpbml0aW9uID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldChIZWxwZXJTZXQgJGhlbHBlclNldCkKewokdGhpcy0+aGVscGVyU2V0ID0gJGhlbHBlclNldDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyU2V0KCkKewpyZXR1cm4gJHRoaXMtPmhlbHBlclNldDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb24oKQp7CnJldHVybiAkdGhpcy0+YXBwbGljYXRpb247Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRW5hYmxlZCgpCnsKcmV0dXJuIHRydWU7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1lvdSBtdXN0IG92ZXJyaWRlIHRoZSBleGVjdXRlKCkgbWV0aG9kIGluIHRoZSBjb25jcmV0ZSBjb21tYW5kIGNsYXNzLicpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGludGVyYWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKfQoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKCiR0aGlzLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbigpOwoKCnRyeSB7CiRpbnB1dC0+YmluZCgkdGhpcy0+Z2V0RGVmaW5pdGlvbigpKTsKfSBjYXRjaCAoRXhjZXB0aW9uSW50ZXJmYWNlICRlKSB7CmlmICghJHRoaXMtPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMpIHsKdGhyb3cgJGU7Cn0KfQoKJHRoaXMtPmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKCmlmIChudWxsICE9PSAkdGhpcy0+cHJvY2Vzc1RpdGxlKSB7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdjbGlfc2V0X3Byb2Nlc3NfdGl0bGUnKSkgewppZiAoIUBjbGlfc2V0X3Byb2Nlc3NfdGl0bGUoJHRoaXMtPnByb2Nlc3NUaXRsZSkpIHsKaWYgKCdEYXJ3aW4nID09PSBcUEhQX09TKSB7CiRvdXRwdXQtPndyaXRlbG4oJzxjb21tZW50PlJ1bm5pbmcgImNsaV9zZXRfcHJvY2Vzc190aXRsZSIgYXMgYW4gdW5wcml2aWxlZ2VkIHVzZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBNYWNPUy48L2NvbW1lbnQ+JywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFKTsKfSBlbHNlIHsKY2xpX3NldF9wcm9jZXNzX3RpdGxlKCR0aGlzLT5wcm9jZXNzVGl0bGUpOwp9Cn0KfSBlbHNlaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3NldHByb2N0aXRsZScpKSB7CnNldHByb2N0aXRsZSgkdGhpcy0+cHJvY2Vzc1RpdGxlKTsKfSBlbHNlaWYgKE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSA9PT0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG91dHB1dC0+d3JpdGVsbignPGNvbW1lbnQ+SW5zdGFsbCB0aGUgcHJvY3RpdGxlIFBFQ0wgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHByb2Nlc3MgdGl0bGUuPC9jb21tZW50PicpOwp9Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+aW50ZXJhY3QoJGlucHV0LCAkb3V0cHV0KTsKfQoKCgoKaWYgKCRpbnB1dC0+aGFzQXJndW1lbnQoJ2NvbW1hbmQnKSAmJiBudWxsID09PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdjb21tYW5kJykpIHsKJGlucHV0LT5zZXRBcmd1bWVudCgnY29tbWFuZCcsICR0aGlzLT5nZXROYW1lKCkpOwp9CgokaW5wdXQtPnZhbGlkYXRlKCk7CgppZiAoJHRoaXMtPmNvZGUpIHsKJHN0YXR1c0NvZGUgPSAoJHRoaXMtPmNvZGUpKCRpbnB1dCwgJG91dHB1dCk7Cn0gZWxzZSB7CiRzdGF0dXNDb2RlID0gJHRoaXMtPmV4ZWN1dGUoJGlucHV0LCAkb3V0cHV0KTsKCmlmICghXGlzX2ludCgkc3RhdHVzQ29kZSkpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignUmV0dXJuIHZhbHVlIG9mICIlczo6ZXhlY3V0ZSgpIiBtdXN0IGJlIG9mIHRoZSB0eXBlIGludCwgIiVzIiByZXR1cm5lZC4nLCBzdGF0aWM6OmNsYXNzLCBnZXRfZGVidWdfdHlwZSgkc3RhdHVzQ29kZSkpKTsKfQp9CgpyZXR1cm4gaXNfbnVtZXJpYygkc3RhdHVzQ29kZSkgPyAoaW50KSAkc3RhdHVzQ29kZSA6IDA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvZGUoY2FsbGFibGUgJGNvZGUpCnsKaWYgKCRjb2RlIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKJHIgPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkY29kZSk7CmlmIChudWxsID09PSAkci0+Z2V0Q2xvc3VyZVRoaXMoKSkgewpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCkge30pOwp0cnkgewppZiAoJGMgPSBcQ2xvc3VyZTo6YmluZCgkY29kZSwgJHRoaXMpKSB7CiRjb2RlID0gJGM7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KfQp9CgokdGhpcy0+Y29kZSA9ICRjb2RlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oYm9vbCAkbWVyZ2VBcmdzID0gdHJ1ZSkKewppZiAobnVsbCA9PT0gJHRoaXMtPmFwcGxpY2F0aW9uKSB7CnJldHVybjsKfQoKJHRoaXMtPmZ1bGxEZWZpbml0aW9uID0gbmV3IElucHV0RGVmaW5pdGlvbigpOwokdGhpcy0+ZnVsbERlZmluaXRpb24tPnNldE9wdGlvbnMoJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbnMoKSk7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+YWRkT3B0aW9ucygkdGhpcy0+YXBwbGljYXRpb24tPmdldERlZmluaXRpb24oKS0+Z2V0T3B0aW9ucygpKTsKCmlmICgkbWVyZ2VBcmdzKSB7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+c2V0QXJndW1lbnRzKCR0aGlzLT5hcHBsaWNhdGlvbi0+Z2V0RGVmaW5pdGlvbigpLT5nZXRBcmd1bWVudHMoKSk7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+YWRkQXJndW1lbnRzKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSk7Cn0gZWxzZSB7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+c2V0QXJndW1lbnRzKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSk7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZpbml0aW9uKCRkZWZpbml0aW9uKQp7CmlmICgkZGVmaW5pdGlvbiBpbnN0YW5jZW9mIElucHV0RGVmaW5pdGlvbikgewokdGhpcy0+ZGVmaW5pdGlvbiA9ICRkZWZpbml0aW9uOwp9IGVsc2UgewokdGhpcy0+ZGVmaW5pdGlvbi0+c2V0RGVmaW5pdGlvbigkZGVmaW5pdGlvbik7Cn0KCiR0aGlzLT5mdWxsRGVmaW5pdGlvbiA9IG51bGw7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlZmluaXRpb24oKQp7CnJldHVybiAkdGhpcy0+ZnVsbERlZmluaXRpb24gPz8gJHRoaXMtPmdldE5hdGl2ZURlZmluaXRpb24oKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYXRpdmVEZWZpbml0aW9uKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmRlZmluaXRpb24pIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgY2xhc3MgIiVzIiBpcyBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkLiBZb3UgcHJvYmFibHkgZm9yZ290IHRvIGNhbGwgdGhlIHBhcmVudCBjb25zdHJ1Y3Rvci4nLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbjsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBcmd1bWVudChzdHJpbmcgJG5hbWUsIGludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKQp7CiR0aGlzLT5kZWZpbml0aW9uLT5hZGRBcmd1bWVudChuZXcgSW5wdXRBcmd1bWVudCgkbmFtZSwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpKTsKaWYgKG51bGwgIT09ICR0aGlzLT5mdWxsRGVmaW5pdGlvbikgewokdGhpcy0+ZnVsbERlZmluaXRpb24tPmFkZEFyZ3VtZW50KG5ldyBJbnB1dEFyZ3VtZW50KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCkpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE9wdGlvbihzdHJpbmcgJG5hbWUsICRzaG9ydGN1dCA9IG51bGwsIGludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKQp7CiR0aGlzLT5kZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KSk7CmlmIChudWxsICE9PSAkdGhpcy0+ZnVsbERlZmluaXRpb24pIHsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE5hbWUoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT52YWxpZGF0ZU5hbWUoJG5hbWUpOwoKJHRoaXMtPm5hbWUgPSAkbmFtZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvY2Vzc1RpdGxlKHN0cmluZyAkdGl0bGUpCnsKJHRoaXMtPnByb2Nlc3NUaXRsZSA9ICR0aXRsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIaWRkZW4oYm9vbCAkaGlkZGVuICkKewokdGhpcy0+aGlkZGVuID0gJGhpZGRlbjsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSGlkZGVuKCkKewpyZXR1cm4gJHRoaXMtPmhpZGRlbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVzY3JpcHRpb24oc3RyaW5nICRkZXNjcmlwdGlvbikKewokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCkKewpyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwKHN0cmluZyAkaGVscCkKewokdGhpcy0+aGVscCA9ICRoZWxwOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCkKewpyZXR1cm4gJHRoaXMtPmhlbHA7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzZWRIZWxwKCkKewokbmFtZSA9ICR0aGlzLT5uYW1lOwokaXNTaW5nbGVDb21tYW5kID0gJHRoaXMtPmFwcGxpY2F0aW9uICYmICR0aGlzLT5hcHBsaWNhdGlvbi0+aXNTaW5nbGVDb21tYW5kKCk7CgokcGxhY2Vob2xkZXJzID0gWwonJWNvbW1hbmQubmFtZSUnLAonJWNvbW1hbmQuZnVsbF9uYW1lJScsCl07CiRyZXBsYWNlbWVudHMgPSBbCiRuYW1lLAokaXNTaW5nbGVDb21tYW5kID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnUEhQX1NFTEYnXS4nICcuJG5hbWUsCl07CgpyZXR1cm4gc3RyX3JlcGxhY2UoJHBsYWNlaG9sZGVycywgJHJlcGxhY2VtZW50cywgJHRoaXMtPmdldEhlbHAoKSA/OiAkdGhpcy0+Z2V0RGVzY3JpcHRpb24oKSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBbGlhc2VzKGl0ZXJhYmxlICRhbGlhc2VzKQp7CiRsaXN0ID0gW107Cgpmb3JlYWNoICgkYWxpYXNlcyBhcyAkYWxpYXMpIHsKJHRoaXMtPnZhbGlkYXRlTmFtZSgkYWxpYXMpOwokbGlzdFtdID0gJGFsaWFzOwp9CgokdGhpcy0+YWxpYXNlcyA9IFxpc19hcnJheSgkYWxpYXNlcykgPyAkYWxpYXNlcyA6ICRsaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzZXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3lub3BzaXMoYm9vbCAkc2hvcnQgPSBmYWxzZSkKewoka2V5ID0gJHNob3J0ID8gJ3Nob3J0JyA6ICdsb25nJzsKCmlmICghaXNzZXQoJHRoaXMtPnN5bm9wc2lzWyRrZXldKSkgewokdGhpcy0+c3lub3BzaXNbJGtleV0gPSB0cmltKHNwcmludGYoJyVzICVzJywgJHRoaXMtPm5hbWUsICR0aGlzLT5kZWZpbml0aW9uLT5nZXRTeW5vcHNpcygkc2hvcnQpKSk7Cn0KCnJldHVybiAkdGhpcy0+c3lub3BzaXNbJGtleV07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFVzYWdlKHN0cmluZyAkdXNhZ2UpCnsKaWYgKCFzdHJfc3RhcnRzX3dpdGgoJHVzYWdlLCAkdGhpcy0+bmFtZSkpIHsKJHVzYWdlID0gc3ByaW50ZignJXMgJXMnLCAkdGhpcy0+bmFtZSwgJHVzYWdlKTsKfQoKJHRoaXMtPnVzYWdlc1tdID0gJHVzYWdlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVc2FnZXMoKQp7CnJldHVybiAkdGhpcy0+dXNhZ2VzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXIoc3RyaW5nICRuYW1lKQp7CmlmIChudWxsID09PSAkdGhpcy0+aGVscGVyU2V0KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgcmV0cmlldmUgaGVscGVyICIlcyIgYmVjYXVzZSB0aGVyZSBpcyBubyBIZWxwZXJTZXQgZGVmaW5lZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHlvdXIgY29tbWFuZCB0byB0aGUgYXBwbGljYXRpb24gb3IgdG8gc2V0IHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgY29tbWFuZCB1c2luZyB0aGUgc2V0QXBwbGljYXRpb24oKSBtZXRob2Q/IFlvdSBjYW4gYWxzbyBzZXQgdGhlIEhlbHBlclNldCBkaXJlY3RseSB1c2luZyB0aGUgc2V0SGVscGVyU2V0KCkgbWV0aG9kLicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJG5hbWUpOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZU5hbWUoc3RyaW5nICRuYW1lKQp7CmlmICghcHJlZ19tYXRjaCgnL15bXlw6XSsrKFw6W15cOl0rKykqJC8nLCAkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kIG5hbWUgIiVzIiBpcyBpbnZhbGlkLicsICRuYW1lKSk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXE91dHB1dFxCYXNoQ29tcGxldGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxPdXRwdXRcQ29tcGxldGlvbk91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpmaW5hbCBjbGFzcyBDb21wbGV0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdE5hbWUgPSAnfF9jb21wbGV0ZSc7CnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHREZXNjcmlwdGlvbiA9ICdJbnRlcm5hbCBjb21tYW5kIHRvIHByb3ZpZGUgc2hlbGwgY29tcGxldGlvbiBzdWdnZXN0aW9ucyc7Cgpwcml2YXRlICRjb21wbGV0aW9uT3V0cHV0czsKCnByaXZhdGUgJGlzRGVidWcgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29tcGxldGlvbk91dHB1dHMgPSBbXSkKewoKJHRoaXMtPmNvbXBsZXRpb25PdXRwdXRzID0gJGNvbXBsZXRpb25PdXRwdXRzICsgWydiYXNoJyA9PiBCYXNoQ29tcGxldGlvbk91dHB1dDo6Y2xhc3NdOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPmFkZE9wdGlvbignc2hlbGwnLCAncycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSBzaGVsbCB0eXBlICgiJy5pbXBsb2RlKCciLCAiJywgYXJyYXlfa2V5cygkdGhpcy0+Y29tcGxldGlvbk91dHB1dHMpKS4nIiknKQotPmFkZE9wdGlvbignaW5wdXQnLCAnaScsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0FuIGFycmF5IG9mIGlucHV0IHRva2VucyAoZS5nLiBDT01QX1dPUkRTIG9yIGFyZ3YpJykKLT5hZGRPcHRpb24oJ2N1cnJlbnQnLCAnYycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSBpbmRleCBvZiB0aGUgImlucHV0IiBhcnJheSB0aGF0IHRoZSBjdXJzb3IgaXMgaW4gKGUuZy4gQ09NUF9DV09SRCknKQotPmFkZE9wdGlvbignc3ltZm9ueScsICdTJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIHZlcnNpb24gb2YgdGhlIGNvbXBsZXRpb24gc2NyaXB0JykKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5pc0RlYnVnID0gZmlsdGVyX3ZhcihnZXRlbnYoJ1NZTUZPTllfQ09NUExFVElPTl9ERUJVRycpLCBcRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKdHJ5IHsKCgoKCgoKCgoKCgokc2hlbGwgPSAkaW5wdXQtPmdldE9wdGlvbignc2hlbGwnKTsKaWYgKCEkc2hlbGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgIi0tc2hlbGwiIG9wdGlvbiBtdXN0IGJlIHNldC4nKTsKfQoKaWYgKCEkY29tcGxldGlvbk91dHB1dCA9ICR0aGlzLT5jb21wbGV0aW9uT3V0cHV0c1skc2hlbGxdID8/IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdTaGVsbCBjb21wbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgc2hlbGw6ICIlcyIgKHN1cHBvcnRlZDogIiVzIikuJywgJHNoZWxsLCBpbXBsb2RlKCciLCAiJywgYXJyYXlfa2V5cygkdGhpcy0+Y29tcGxldGlvbk91dHB1dHMpKSkpOwp9CgokY29tcGxldGlvbklucHV0ID0gJHRoaXMtPmNyZWF0ZUNvbXBsZXRpb25JbnB1dCgkaW5wdXQpOwokc3VnZ2VzdGlvbnMgPSBuZXcgQ29tcGxldGlvblN1Z2dlc3Rpb25zKCk7CgokdGhpcy0+bG9nKFsKJycsCic8Y29tbWVudD4nLmRhdGUoJ1ktbS1kIEg6aTpzJykuJzwvPicsCic8aW5mbz5JbnB1dDo8Lz4gPGNvbW1lbnQ+KCJ8IiBpbmRpY2F0ZXMgdGhlIGN1cnNvciBwb3NpdGlvbik8Lz4nLAonICAnLihzdHJpbmcpICRjb21wbGV0aW9uSW5wdXQsCic8aW5mbz5Db21tYW5kOjwvPicsCicgICcuKHN0cmluZykgaW1wbG9kZSgnICcsICRfU0VSVkVSWydhcmd2J10pLAonPGluZm8+TWVzc2FnZXM6PC8+JywKXSk7CgokY29tbWFuZCA9ICR0aGlzLT5maW5kQ29tbWFuZCgkY29tcGxldGlvbklucHV0LCAkb3V0cHV0KTsKaWYgKG51bGwgPT09ICRjb21tYW5kKSB7CiR0aGlzLT5sb2coJyAgTm8gY29tbWFuZCBmb3VuZCwgY29tcGxldGluZyB1c2luZyB0aGUgQXBwbGljYXRpb24gY2xhc3MuJyk7CgokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Y29tcGxldGUoJGNvbXBsZXRpb25JbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfSBlbHNlaWYgKAokY29tcGxldGlvbklucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCdjb21tYW5kJykKJiYgJGNvbW1hbmQtPmdldE5hbWUoKSAhPT0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkKJiYgIVxpbl9hcnJheSgkY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgdHJ1ZSkKKSB7CiR0aGlzLT5sb2coJyAgTm8gY29tbWFuZCBmb3VuZCwgY29tcGxldGluZyB1c2luZyB0aGUgQXBwbGljYXRpb24gY2xhc3MuJyk7CgoKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X2ZpbHRlcihhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldE5hbWUoKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCkpKSk7Cn0gZWxzZSB7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbigpOwokY29tcGxldGlvbklucHV0LT5iaW5kKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwoKaWYgKENvbXBsZXRpb25JbnB1dDo6VFlQRV9PUFRJT05fTkFNRSA9PT0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKSkgewokdGhpcy0+bG9nKCcgIENvbXBsZXRpbmcgb3B0aW9uIG5hbWVzIGZvciB0aGUgPGNvbW1lbnQ+Jy5cZ2V0X2NsYXNzKCRjb21tYW5kIGluc3RhbmNlb2YgTGF6eUNvbW1hbmQgPyAkY29tbWFuZC0+Z2V0Q29tbWFuZCgpIDogJGNvbW1hbmQpLic8Lz4gY29tbWFuZC4nKTsKCiRzdWdnZXN0aW9ucy0+c3VnZ2VzdE9wdGlvbnMoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKS0+Z2V0T3B0aW9ucygpKTsKfSBlbHNlIHsKJHRoaXMtPmxvZyhbCicgIENvbXBsZXRpbmcgdXNpbmcgdGhlIDxjb21tZW50PicuXGdldF9jbGFzcygkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kID8gJGNvbW1hbmQtPmdldENvbW1hbmQoKSA6ICRjb21tYW5kKS4nPC8+IGNsYXNzLicsCicgIENvbXBsZXRpbmcgPGNvbW1lbnQ+Jy4kY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpLic8Lz4gZm9yIDxjb21tZW50PicuJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvbk5hbWUoKS4nPC8+JywKXSk7CmlmIChudWxsICE9PSAkY29tcHZhbCA9ICRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpKSB7CiR0aGlzLT5sb2coJyAgQ3VycmVudCB2YWx1ZTogPGNvbW1lbnQ+Jy4kY29tcHZhbC4nPC8+Jyk7Cn0KCiRjb21tYW5kLT5jb21wbGV0ZSgkY29tcGxldGlvbklucHV0LCAkc3VnZ2VzdGlvbnMpOwp9Cn0KCgokY29tcGxldGlvbk91dHB1dCA9IG5ldyAkY29tcGxldGlvbk91dHB1dCgpOwoKJHRoaXMtPmxvZygnPGluZm8+U3VnZ2VzdGlvbnM6PC8+Jyk7CmlmICgkb3B0aW9ucyA9ICRzdWdnZXN0aW9ucy0+Z2V0T3B0aW9uU3VnZ2VzdGlvbnMoKSkgewokdGhpcy0+bG9nKCcgIC0tJy5pbXBsb2RlKCcgLS0nLCBhcnJheV9tYXAoZnVuY3Rpb24gKCRvKSB7IHJldHVybiAkby0+Z2V0TmFtZSgpOyB9LCAkb3B0aW9ucykpKTsKfSBlbHNlaWYgKCR2YWx1ZXMgPSAkc3VnZ2VzdGlvbnMtPmdldFZhbHVlU3VnZ2VzdGlvbnMoKSkgewokdGhpcy0+bG9nKCcgICcuaW1wbG9kZSgnICcsICR2YWx1ZXMpKTsKfSBlbHNlIHsKJHRoaXMtPmxvZygnICA8Y29tbWVudD5ObyBzdWdnZXN0aW9ucyB3ZXJlIHByb3ZpZGVkPC8+Jyk7Cn0KCiRjb21wbGV0aW9uT3V0cHV0LT53cml0ZSgkc3VnZ2VzdGlvbnMsICRvdXRwdXQpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiR0aGlzLT5sb2coWwonPGVycm9yPkVycm9yITwvZXJyb3I+JywKKHN0cmluZykgJGUsCl0pOwoKaWYgKCRvdXRwdXQtPmlzRGVidWcoKSkgewp0aHJvdyAkZTsKfQoKcmV0dXJuIDI7Cn0KCnJldHVybiAwOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXRpb25JbnB1dChJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBDb21wbGV0aW9uSW5wdXQKewokY3VycmVudEluZGV4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2N1cnJlbnQnKTsKaWYgKCEkY3VycmVudEluZGV4IHx8ICFjdHlwZV9kaWdpdCgkY3VycmVudEluZGV4KSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAiLS1jdXJyZW50IiBvcHRpb24gbXVzdCBiZSBzZXQgYW5kIGl0IG11c3QgYmUgYW4gaW50ZWdlci4nKTsKfQoKJGNvbXBsZXRpb25JbnB1dCA9IENvbXBsZXRpb25JbnB1dDo6ZnJvbVRva2VucygkaW5wdXQtPmdldE9wdGlvbignaW5wdXQnKSwgKGludCkgJGN1cnJlbnRJbmRleCk7Cgp0cnkgewokY29tcGxldGlvbklucHV0LT5iaW5kKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKfQoKcmV0dXJuICRjb21wbGV0aW9uSW5wdXQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZmluZENvbW1hbmQoQ29tcGxldGlvbklucHV0ICRjb21wbGV0aW9uSW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogP0NvbW1hbmQKewp0cnkgewokaW5wdXROYW1lID0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Rmlyc3RBcmd1bWVudCgpOwppZiAobnVsbCA9PT0gJGlucHV0TmFtZSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCRpbnB1dE5hbWUpOwp9IGNhdGNoIChDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJGUpIHsKfQoKcmV0dXJuIG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbG9nKCRtZXNzYWdlcyk6IHZvaWQKewppZiAoISR0aGlzLT5pc0RlYnVnKSB7CnJldHVybjsKfQoKJGNvbW1hbmROYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ2FyZ3YnXVswXSk7CmZpbGVfcHV0X2NvbnRlbnRzKHN5c19nZXRfdGVtcF9kaXIoKS4nL3NmXycuJGNvbW1hbmROYW1lLicubG9nJywgaW1wbG9kZShcUEhQX0VPTCwgKGFycmF5KSAkbWVzc2FnZXMpLlxQSFBfRU9MLCBcRklMRV9BUFBFTkQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmZpbmFsIGNsYXNzIER1bXBDb21wbGV0aW9uQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKewpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0TmFtZSA9ICdjb21wbGV0aW9uJzsKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdERlc2NyaXB0aW9uID0gJ0R1bXAgdGhlIHNoZWxsIGNvbXBsZXRpb24gc2NyaXB0JzsKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CmlmICgkaW5wdXQtPm11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3IoJ3NoZWxsJykpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR0aGlzLT5nZXRTdXBwb3J0ZWRTaGVsbHMoKSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJGZ1bGxDb21tYW5kID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ107CiRjb21tYW5kTmFtZSA9IGJhc2VuYW1lKCRmdWxsQ29tbWFuZCk7CiRmdWxsQ29tbWFuZCA9IEByZWFscGF0aCgkZnVsbENvbW1hbmQpID86ICRmdWxsQ29tbWFuZDsKCiR0aGlzCi0+c2V0SGVscCg8PDxFT0gKVGhlIDxpbmZvPiVjb21tYW5kLm5hbWUlPC8+IGNvbW1hbmQgZHVtcHMgdGhlIHNoZWxsIGNvbXBsZXRpb24gc2NyaXB0IHJlcXVpcmVkCnRvIHVzZSBzaGVsbCBhdXRvY29tcGxldGlvbiAoY3VycmVudGx5IG9ubHkgYmFzaCBjb21wbGV0aW9uIGlzIHN1cHBvcnRlZCkuCgo8Y29tbWVudD5TdGF0aWMgaW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS08Lz4KCkR1bXAgdGhlIHNjcmlwdCB0byBhIGdsb2JhbCBjb21wbGV0aW9uIGZpbGUgYW5kIHJlc3RhcnQgeW91ciBzaGVsbDoKCiAgICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIGJhc2ggfCBzdWRvIHRlZSAvZXRjL2Jhc2hfY29tcGxldGlvbi5kL3skY29tbWFuZE5hbWV9PC8+CgpPciBkdW1wIHRoZSBzY3JpcHQgdG8gYSBsb2NhbCBmaWxlIGFuZCBzb3VyY2UgaXQ6CgogICAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSBiYXNoID4gY29tcGxldGlvbi5zaDwvPgoKICAgIDxjb21tZW50PiMgc291cmNlIHRoZSBmaWxlIHdoZW5ldmVyIHlvdSB1c2UgdGhlIHByb2plY3Q8Lz4KICAgIDxpbmZvPnNvdXJjZSBjb21wbGV0aW9uLnNoPC8+CgogICAgPGNvbW1lbnQ+IyBvciBhZGQgdGhpcyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciAifi8uYmFzaHJjIiBmaWxlOjwvPgogICAgPGluZm8+c291cmNlIC9wYXRoL3RvL2NvbXBsZXRpb24uc2g8Lz4KCjxjb21tZW50PkR5bmFtaWMgaW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tPC8+CgpBZGQgdGhpcyB0byB0aGUgZW5kIG9mIHlvdXIgc2hlbGwgY29uZmlndXJhdGlvbiBmaWxlIChlLmcuIDxpbmZvPiJ+Ly5iYXNocmMiPC8+KToKCiAgICA8aW5mbz5ldmFsICIkKHskZnVsbENvbW1hbmR9IGNvbXBsZXRpb24gYmFzaCkiPC8+CkVPSAopCi0+YWRkQXJndW1lbnQoJ3NoZWxsJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgc2hlbGwgdHlwZSAoZS5nLiAiYmFzaCIpLCB0aGUgdmFsdWUgb2YgdGhlICIkU0hFTEwiIGVudiB2YXIgd2lsbCBiZSB1c2VkIGlmIHRoaXMgaXMgbm90IGdpdmVuJykKLT5hZGRPcHRpb24oJ2RlYnVnJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdUYWlsIHRoZSBjb21wbGV0aW9uIGRlYnVnIGxvZycpCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21tYW5kTmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydhcmd2J11bMF0pOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkZWJ1ZycpKSB7CiR0aGlzLT50YWlsRGVidWdMb2coJGNvbW1hbmROYW1lLCAkb3V0cHV0KTsKCnJldHVybiAwOwp9Cgokc2hlbGwgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzaGVsbCcpID8/IHNlbGY6Omd1ZXNzU2hlbGwoKTsKJGNvbXBsZXRpb25GaWxlID0gX19ESVJfXy4nLy4uL1Jlc291cmNlcy9jb21wbGV0aW9uLicuJHNoZWxsOwppZiAoIWZpbGVfZXhpc3RzKCRjb21wbGV0aW9uRmlsZSkpIHsKJHN1cHBvcnRlZFNoZWxscyA9ICR0aGlzLT5nZXRTdXBwb3J0ZWRTaGVsbHMoKTsKCmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQppZiAoJHNoZWxsKSB7CiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignPGVycm9yPkRldGVjdGVkIHNoZWxsICIlcyIsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU3ltZm9ueSBzaGVsbCBjb21wbGV0aW9uIChzdXBwb3J0ZWQgc2hlbGxzOiAiJXMiKS48Lz4nLCAkc2hlbGwsIGltcGxvZGUoJyIsICInLCAkc3VwcG9ydGVkU2hlbGxzKSkpOwp9IGVsc2Ugewokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzxlcnJvcj5TaGVsbCBub3QgZGV0ZWN0ZWQsIFN5bWZvbnkgc2hlbGwgY29tcGxldGlvbiBvbmx5IHN1cHBvcnRzICIlcyIpLjwvPicsIGltcGxvZGUoJyIsICInLCAkc3VwcG9ydGVkU2hlbGxzKSkpOwp9CgpyZXR1cm4gMjsKfQoKJG91dHB1dC0+d3JpdGUoc3RyX3JlcGxhY2UoWyd7eyBDT01NQU5EX05BTUUgfX0nLCAne3sgVkVSU0lPTiB9fSddLCBbJGNvbW1hbmROYW1lLCAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0VmVyc2lvbigpXSwgZmlsZV9nZXRfY29udGVudHMoJGNvbXBsZXRpb25GaWxlKSkpOwoKcmV0dXJuIDA7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGd1ZXNzU2hlbGwoKTogc3RyaW5nCnsKcmV0dXJuIGJhc2VuYW1lKCRfU0VSVkVSWydTSEVMTCddID8/ICcnKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB0YWlsRGVidWdMb2coc3RyaW5nICRjb21tYW5kTmFtZSwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJGRlYnVnRmlsZSA9IHN5c19nZXRfdGVtcF9kaXIoKS4nL3NmXycuJGNvbW1hbmROYW1lLicubG9nJzsKaWYgKCFmaWxlX2V4aXN0cygkZGVidWdGaWxlKSkgewp0b3VjaCgkZGVidWdGaWxlKTsKfQokcHJvY2VzcyA9IG5ldyBQcm9jZXNzKFsndGFpbCcsICctZicsICRkZWJ1Z0ZpbGVdLCBudWxsLCBudWxsLCBudWxsLCAwKTsKJHByb2Nlc3MtPnJ1bihmdW5jdGlvbiAoc3RyaW5nICR0eXBlLCBzdHJpbmcgJGxpbmUpIHVzZSAoJG91dHB1dCk6IHZvaWQgewokb3V0cHV0LT53cml0ZSgkbGluZSk7Cn0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFN1cHBvcnRlZFNoZWxscygpOiBhcnJheQp7CiRzaGVsbHMgPSBbXTsKCmZvcmVhY2ggKG5ldyBcRGlyZWN0b3J5SXRlcmF0b3IoX19ESVJfXy4nLy4uL1Jlc291cmNlcy8nKSBhcyAkZmlsZSkgewppZiAoc3RyX3N0YXJ0c193aXRoKCRmaWxlLT5nZXRCYXNlbmFtZSgpLCAnY29tcGxldGlvbi4nKSAmJiAkZmlsZS0+aXNGaWxlKCkpIHsKJHNoZWxsc1tdID0gJGZpbGUtPmdldEV4dGVuc2lvbigpOwp9Cn0KCnJldHVybiAkc2hlbGxzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXERlc2NyaXB0b3JIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgSGVscENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJpdmF0ZSAkY29tbWFuZDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzLT5pZ25vcmVWYWxpZGF0aW9uRXJyb3JzKCk7CgokdGhpcwotPnNldE5hbWUoJ2hlbHAnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnY29tbWFuZF9uYW1lJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgY29tbWFuZCBuYW1lJywgJ2hlbHAnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUaGUgb3V0cHV0IGZvcm1hdCAodHh0LCB4bWwsIGpzb24sIG9yIG1kKScsICd0eHQnKSwKbmV3IElucHV0T3B0aW9uKCdyYXcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RvIG91dHB1dCByYXcgY29tbWFuZCBoZWxwJyksCl0pCi0+c2V0RGVzY3JpcHRpb24oJ0Rpc3BsYXkgaGVscCBmb3IgYSBjb21tYW5kJykKLT5zZXRIZWxwKDw8PCdFT0YnClRoZSA8aW5mbz4lY29tbWFuZC5uYW1lJTwvaW5mbz4gY29tbWFuZCBkaXNwbGF5cyBoZWxwIGZvciBhIGdpdmVuIGNvbW1hbmQ6CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgbGlzdDwvaW5mbz4KCllvdSBjYW4gYWxzbyBvdXRwdXQgdGhlIGhlbHAgaW4gb3RoZXIgZm9ybWF0cyBieSB1c2luZyB0aGUgPGNvbW1lbnQ+LS1mb3JtYXQ8L2NvbW1lbnQ+IG9wdGlvbjoKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWZvcm1hdD14bWwgbGlzdDwvaW5mbz4KClRvIGRpc3BsYXkgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLCBwbGVhc2UgdXNlIHRoZSA8aW5mbz5saXN0PC9pbmZvPiBjb21tYW5kLgpFT0YKKQo7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQpCnsKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmNvbW1hbmQpIHsKJHRoaXMtPmNvbW1hbmQgPSAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+ZmluZCgkaW5wdXQtPmdldEFyZ3VtZW50KCdjb21tYW5kX25hbWUnKSk7Cn0KCiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokaGVscGVyLT5kZXNjcmliZSgkb3V0cHV0LCAkdGhpcy0+Y29tbWFuZCwgWwonZm9ybWF0JyA9PiAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0JyksCidyYXdfdGV4dCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ3JhdycpLApdKTsKCiR0aGlzLT5jb21tYW5kID0gbnVsbDsKCnJldHVybiAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCdjb21tYW5kX25hbWUnKSkgewokZGVzY3JpcHRvciA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpKTsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X2tleXMoJGRlc2NyaXB0b3ItPmdldENvbW1hbmRzKCkpKTsKCnJldHVybjsKfQoKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RPcHRpb25WYWx1ZXNGb3IoJ2Zvcm1hdCcpKSB7CiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoJGhlbHBlci0+Z2V0Rm9ybWF0cygpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyU2V0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKZmluYWwgY2xhc3MgTGF6eUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJpdmF0ZSAkY29tbWFuZDsKcHJpdmF0ZSAkaXNFbmFibGVkOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgYXJyYXkgJGFsaWFzZXMsIHN0cmluZyAkZGVzY3JpcHRpb24sIGJvb2wgJGlzSGlkZGVuLCBcQ2xvc3VyZSAkY29tbWFuZEZhY3RvcnksID9ib29sICRpc0VuYWJsZWQgPSB0cnVlKQp7CiR0aGlzLT5zZXROYW1lKCRuYW1lKQotPnNldEFsaWFzZXMoJGFsaWFzZXMpCi0+c2V0SGlkZGVuKCRpc0hpZGRlbikKLT5zZXREZXNjcmlwdGlvbigkZGVzY3JpcHRpb24pOwoKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZEZhY3Rvcnk7CiR0aGlzLT5pc0VuYWJsZWQgPSAkaXNFbmFibGVkOwp9CgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlVmFsaWRhdGlvbkVycm9ycygpOiB2b2lkCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+aWdub3JlVmFsaWRhdGlvbkVycm9ycygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uID0gbnVsbCk6IHZvaWQKewppZiAoJHRoaXMtPmNvbW1hbmQgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHRoaXMtPmNvbW1hbmQtPnNldEFwcGxpY2F0aW9uKCRhcHBsaWNhdGlvbik7Cn0KCnBhcmVudDo6c2V0QXBwbGljYXRpb24oJGFwcGxpY2F0aW9uKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldChIZWxwZXJTZXQgJGhlbHBlclNldCk6IHZvaWQKewppZiAoJHRoaXMtPmNvbW1hbmQgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHRoaXMtPmNvbW1hbmQtPnNldEhlbHBlclNldCgkaGVscGVyU2V0KTsKfQoKcGFyZW50OjpzZXRIZWxwZXJTZXQoJGhlbHBlclNldCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aXNFbmFibGVkID8/ICR0aGlzLT5nZXRDb21tYW5kKCktPmlzRW5hYmxlZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvZGUoY2FsbGFibGUgJGNvZGUpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+c2V0Q29kZSgkY29kZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihib29sICRtZXJnZUFyZ3MgPSB0cnVlKTogdm9pZAp7CiR0aGlzLT5nZXRDb21tYW5kKCktPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKCRtZXJnZUFyZ3MpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmaW5pdGlvbigkZGVmaW5pdGlvbik6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5zZXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlZmluaXRpb24oKTogSW5wdXREZWZpbml0aW9uCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldERlZmluaXRpb24oKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE5hdGl2ZURlZmluaXRpb24oKTogSW5wdXREZWZpbml0aW9uCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldE5hdGl2ZURlZmluaXRpb24oKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEFyZ3VtZW50KHN0cmluZyAkbmFtZSwgaW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+YWRkQXJndW1lbnQoJG5hbWUsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE9wdGlvbihzdHJpbmcgJG5hbWUsICRzaG9ydGN1dCA9IG51bGwsIGludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmFkZE9wdGlvbigkbmFtZSwgJHNob3J0Y3V0LCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9jZXNzVGl0bGUoc3RyaW5nICR0aXRsZSk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5zZXRQcm9jZXNzVGl0bGUoJHRpdGxlKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHAoc3RyaW5nICRoZWxwKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPnNldEhlbHAoJGhlbHApOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0SGVscCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc2VkSGVscCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0UHJvY2Vzc2VkSGVscCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3lub3BzaXMoYm9vbCAkc2hvcnQgPSBmYWxzZSk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXRTeW5vcHNpcygkc2hvcnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkVXNhZ2Uoc3RyaW5nICR1c2FnZSk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5hZGRVc2FnZSgkdXNhZ2UpOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXNhZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldFVzYWdlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0SGVscGVyKCRuYW1lKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmQoKTogcGFyZW50CnsKaWYgKCEkdGhpcy0+Y29tbWFuZCBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CnJldHVybiAkdGhpcy0+Y29tbWFuZDsKfQoKJGNvbW1hbmQgPSAkdGhpcy0+Y29tbWFuZCA9ICgkdGhpcy0+Y29tbWFuZCkoKTsKJGNvbW1hbmQtPnNldEFwcGxpY2F0aW9uKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpKTsKCmlmIChudWxsICE9PSAkdGhpcy0+Z2V0SGVscGVyU2V0KCkpIHsKJGNvbW1hbmQtPnNldEhlbHBlclNldCgkdGhpcy0+Z2V0SGVscGVyU2V0KCkpOwp9CgokY29tbWFuZC0+c2V0TmFtZSgkdGhpcy0+Z2V0TmFtZSgpKQotPnNldEFsaWFzZXMoJHRoaXMtPmdldEFsaWFzZXMoKSkKLT5zZXRIaWRkZW4oJHRoaXMtPmlzSGlkZGVuKCkpCi0+c2V0RGVzY3JpcHRpb24oJHRoaXMtPmdldERlc2NyaXB0aW9uKCkpOwoKCiRjb21tYW5kLT5nZXREZWZpbml0aW9uKCk7CgpyZXR1cm4gJGNvbW1hbmQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxBcHBsaWNhdGlvbkRlc2NyaXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcRGVzY3JpcHRvckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBMaXN0Q29tbWFuZCBleHRlbmRzIENvbW1hbmQKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2xpc3QnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnbmFtZXNwYWNlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgbmFtZXNwYWNlIG5hbWUnKSwKbmV3IElucHV0T3B0aW9uKCdyYXcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RvIG91dHB1dCByYXcgY29tbWFuZCBsaXN0JyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIG91dHB1dCBmb3JtYXQgKHR4dCwgeG1sLCBqc29uLCBvciBtZCknLCAndHh0JyksCm5ldyBJbnB1dE9wdGlvbignc2hvcnQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RvIHNraXAgZGVzY3JpYmluZyBjb21tYW5kc1wnIGFyZ3VtZW50cycpLApdKQotPnNldERlc2NyaXB0aW9uKCdMaXN0IGNvbW1hbmRzJykKLT5zZXRIZWxwKDw8PCdFT0YnClRoZSA8aW5mbz4lY29tbWFuZC5uYW1lJTwvaW5mbz4gY29tbWFuZCBsaXN0cyBhbGwgY29tbWFuZHM6CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSU8L2luZm8+CgpZb3UgY2FuIGFsc28gZGlzcGxheSB0aGUgY29tbWFuZHMgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIHRlc3Q8L2luZm8+CgpZb3UgY2FuIGFsc28gb3V0cHV0IHRoZSBpbmZvcm1hdGlvbiBpbiBvdGhlciBmb3JtYXRzIGJ5IHVzaW5nIHRoZSA8Y29tbWVudD4tLWZvcm1hdDwvY29tbWVudD4gb3B0aW9uOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIC0tZm9ybWF0PXhtbDwvaW5mbz4KCkl0J3MgYWxzbyBwb3NzaWJsZSB0byBnZXQgcmF3IGxpc3Qgb2YgY29tbWFuZHMgKHVzZWZ1bCBmb3IgZW1iZWRkaW5nIGNvbW1hbmQgcnVubmVyKToKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLXJhdzwvaW5mbz4KRU9GCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokaGVscGVyLT5kZXNjcmliZSgkb3V0cHV0LCAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKSwgWwonZm9ybWF0JyA9PiAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0JyksCidyYXdfdGV4dCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ3JhdycpLAonbmFtZXNwYWNlJyA9PiAkaW5wdXQtPmdldEFyZ3VtZW50KCduYW1lc3BhY2UnKSwKJ3Nob3J0JyA9PiAkaW5wdXQtPmdldE9wdGlvbignc2hvcnQnKSwKXSk7CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcignbmFtZXNwYWNlJykpIHsKJGRlc2NyaXB0b3IgPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkdGhpcy0+Z2V0QXBwbGljYXRpb24oKSk7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV9rZXlzKCRkZXNjcmlwdG9yLT5nZXROYW1lc3BhY2VzKCkpKTsKCnJldHVybjsKfQoKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RPcHRpb25WYWx1ZXNGb3IoJ2Zvcm1hdCcpKSB7CiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoJGhlbHBlci0+Z2V0Rm9ybWF0cygpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxMb2NrXExvY2tGYWN0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xMb2NrSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xTdG9yZVxGbG9ja1N0b3JlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xTdG9yZVxTZW1hcGhvcmVTdG9yZTsKCgoKCgoKdHJhaXQgTG9ja2FibGVUcmFpdAp7Cgpwcml2YXRlICRsb2NrOwoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2NrKHN0cmluZyAkbmFtZSA9IG51bGwsIGJvb2wgJGJsb2NraW5nID0gZmFsc2UpOiBib29sCnsKaWYgKCFjbGFzc19leGlzdHMoU2VtYXBob3JlU3RvcmU6OmNsYXNzKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1RvIGVuYWJsZSB0aGUgbG9ja2luZyBmZWF0dXJlIHlvdSBtdXN0IGluc3RhbGwgdGhlIHN5bWZvbnkvbG9jayBjb21wb25lbnQuJyk7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+bG9jaykgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0EgbG9jayBpcyBhbHJlYWR5IGluIHBsYWNlLicpOwp9CgppZiAoU2VtYXBob3JlU3RvcmU6OmlzU3VwcG9ydGVkKCkpIHsKJHN0b3JlID0gbmV3IFNlbWFwaG9yZVN0b3JlKCk7Cn0gZWxzZSB7CiRzdG9yZSA9IG5ldyBGbG9ja1N0b3JlKCk7Cn0KCiR0aGlzLT5sb2NrID0gKG5ldyBMb2NrRmFjdG9yeSgkc3RvcmUpKS0+Y3JlYXRlTG9jaygkbmFtZSA/OiAkdGhpcy0+Z2V0TmFtZSgpKTsKaWYgKCEkdGhpcy0+bG9jay0+YWNxdWlyZSgkYmxvY2tpbmcpKSB7CiR0aGlzLT5sb2NrID0gbnVsbDsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVsZWFzZSgpCnsKaWYgKCR0aGlzLT5sb2NrKSB7CiR0aGlzLT5sb2NrLT5yZWxlYXNlKCk7CiR0aGlzLT5sb2NrID0gbnVsbDsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7CgoKCgoKCmludGVyZmFjZSBTaWduYWxhYmxlQ29tbWFuZEludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdWJzY3JpYmVkU2lnbmFscygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYW5kbGVTaWduYWwoaW50ICRzaWduYWwpOiB2b2lkOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kTG9hZGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwoKCgoKaW50ZXJmYWNlIENvbW1hbmRMb2FkZXJJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG5hbWUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkbmFtZSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXMoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZExvYWRlcjsKCnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgQ29udGFpbmVyQ29tbWFuZExvYWRlciBpbXBsZW1lbnRzIENvbW1hbmRMb2FkZXJJbnRlcmZhY2UKewpwcml2YXRlICRjb250YWluZXI7CnByaXZhdGUgJGNvbW1hbmRNYXA7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29udGFpbmVySW50ZXJmYWNlICRjb250YWluZXIsIGFycmF5ICRjb21tYW5kTWFwKQp7CiR0aGlzLT5jb250YWluZXIgPSAkY29udGFpbmVyOwokdGhpcy0+Y29tbWFuZE1hcCA9ICRjb21tYW5kTWFwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkbmFtZSkKewppZiAoISR0aGlzLT5oYXMoJG5hbWUpKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignQ29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+Y29udGFpbmVyLT5nZXQoJHRoaXMtPmNvbW1hbmRNYXBbJG5hbWVdKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5jb21tYW5kTWFwWyRuYW1lXSkgJiYgJHRoaXMtPmNvbnRhaW5lci0+aGFzKCR0aGlzLT5jb21tYW5kTWFwWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcygpCnsKcmV0dXJuIGFycmF5X2tleXMoJHRoaXMtPmNvbW1hbmRNYXApOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRMb2FkZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBGYWN0b3J5Q29tbWFuZExvYWRlciBpbXBsZW1lbnRzIENvbW1hbmRMb2FkZXJJbnRlcmZhY2UKewpwcml2YXRlICRmYWN0b3JpZXM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGZhY3RvcmllcykKewokdGhpcy0+ZmFjdG9yaWVzID0gJGZhY3RvcmllczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJG5hbWVdKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG5hbWUpCnsKaWYgKCFpc3NldCgkdGhpcy0+ZmFjdG9yaWVzWyRuYW1lXSkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJGZhY3RvcnkgPSAkdGhpcy0+ZmFjdG9yaWVzWyRuYW1lXTsKCnJldHVybiAkZmFjdG9yeSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXMoKQp7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5mYWN0b3JpZXMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJndklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKCgoKCgpmaW5hbCBjbGFzcyBDb21wbGV0aW9uSW5wdXQgZXh0ZW5kcyBBcmd2SW5wdXQKewpwdWJsaWMgY29uc3QgVFlQRV9BUkdVTUVOVF9WQUxVRSA9ICdhcmd1bWVudF92YWx1ZSc7CnB1YmxpYyBjb25zdCBUWVBFX09QVElPTl9WQUxVRSA9ICdvcHRpb25fdmFsdWUnOwpwdWJsaWMgY29uc3QgVFlQRV9PUFRJT05fTkFNRSA9ICdvcHRpb25fbmFtZSc7CnB1YmxpYyBjb25zdCBUWVBFX05PTkUgPSAnbm9uZSc7Cgpwcml2YXRlICR0b2tlbnM7CnByaXZhdGUgJGN1cnJlbnRJbmRleDsKcHJpdmF0ZSAkY29tcGxldGlvblR5cGU7CnByaXZhdGUgJGNvbXBsZXRpb25OYW1lID0gbnVsbDsKcHJpdmF0ZSAkY29tcGxldGlvblZhbHVlID0gJyc7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVN0cmluZyhzdHJpbmcgJGlucHV0U3RyLCBpbnQgJGN1cnJlbnRJbmRleCk6IHNlbGYKewpwcmVnX21hdGNoX2FsbCgnLyg/PD1efFxzKShbXCciXT8pKC4rPykoPzwhXFxcXClcMSg/PSR8XHMpLycsICRpbnB1dFN0ciwgJHRva2Vucyk7CgpyZXR1cm4gc2VsZjo6ZnJvbVRva2VucygkdG9rZW5zWzBdLCAkY3VycmVudEluZGV4KTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tVG9rZW5zKGFycmF5ICR0b2tlbnMsIGludCAkY3VycmVudEluZGV4KTogc2VsZgp7CiRpbnB1dCA9IG5ldyBzZWxmKCR0b2tlbnMpOwokaW5wdXQtPnRva2VucyA9ICR0b2tlbnM7CiRpbnB1dC0+Y3VycmVudEluZGV4ID0gJGN1cnJlbnRJbmRleDsKCnJldHVybiAkaW5wdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBiaW5kKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbik6IHZvaWQKewpwYXJlbnQ6OmJpbmQoJGRlZmluaXRpb24pOwoKJHJlbGV2YW50VG9rZW4gPSAkdGhpcy0+Z2V0UmVsZXZhbnRUb2tlbigpOwppZiAoJy0nID09PSAkcmVsZXZhbnRUb2tlblswXSkgewoKWyRvcHRpb25Ub2tlbiwgJG9wdGlvblZhbHVlXSA9IGV4cGxvZGUoJz0nLCAkcmVsZXZhbnRUb2tlbiwgMikgKyBbJycsICcnXTsKCiRvcHRpb24gPSAkdGhpcy0+Z2V0T3B0aW9uRnJvbVRva2VuKCRvcHRpb25Ub2tlbik7CmlmIChudWxsID09PSAkb3B0aW9uICYmICEkdGhpcy0+aXNDdXJzb3JGcmVlKCkpIHsKJHRoaXMtPmNvbXBsZXRpb25UeXBlID0gc2VsZjo6VFlQRV9PUFRJT05fTkFNRTsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICRyZWxldmFudFRva2VuOwoKcmV0dXJuOwp9CgppZiAobnVsbCAhPT0gJG9wdGlvbiAmJiAkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiR0aGlzLT5jb21wbGV0aW9uVHlwZSA9IHNlbGY6OlRZUEVfT1BUSU9OX1ZBTFVFOwokdGhpcy0+Y29tcGxldGlvbk5hbWUgPSAkb3B0aW9uLT5nZXROYW1lKCk7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAkb3B0aW9uVmFsdWUgPzogKCFzdHJfc3RhcnRzX3dpdGgoJG9wdGlvblRva2VuLCAnLS0nKSA/IHN1YnN0cigkb3B0aW9uVG9rZW4sIDIpIDogJycpOwoKcmV0dXJuOwp9Cn0KCiRwcmV2aW91c1Rva2VuID0gJHRoaXMtPnRva2Vuc1skdGhpcy0+Y3VycmVudEluZGV4IC0gMV07CmlmICgnLScgPT09ICRwcmV2aW91c1Rva2VuWzBdICYmICcnICE9PSB0cmltKCRwcmV2aW91c1Rva2VuLCAnLScpKSB7CgokcHJldmlvdXNPcHRpb24gPSAkdGhpcy0+Z2V0T3B0aW9uRnJvbVRva2VuKCRwcmV2aW91c1Rva2VuKTsKaWYgKG51bGwgIT09ICRwcmV2aW91c09wdGlvbiAmJiAkcHJldmlvdXNPcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHRoaXMtPmNvbXBsZXRpb25UeXBlID0gc2VsZjo6VFlQRV9PUFRJT05fVkFMVUU7CiR0aGlzLT5jb21wbGV0aW9uTmFtZSA9ICRwcmV2aW91c09wdGlvbi0+Z2V0TmFtZSgpOwokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJHJlbGV2YW50VG9rZW47CgpyZXR1cm47Cn0KfQoKCiR0aGlzLT5jb21wbGV0aW9uVHlwZSA9IHNlbGY6OlRZUEVfQVJHVU1FTlRfVkFMVUU7Cgpmb3JlYWNoICgkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50TmFtZSA9PiAkYXJndW1lbnQpIHsKaWYgKCFpc3NldCgkdGhpcy0+YXJndW1lbnRzWyRhcmd1bWVudE5hbWVdKSkgewpicmVhazsKfQoKJGFyZ3VtZW50VmFsdWUgPSAkdGhpcy0+YXJndW1lbnRzWyRhcmd1bWVudE5hbWVdOwokdGhpcy0+Y29tcGxldGlvbk5hbWUgPSAkYXJndW1lbnROYW1lOwppZiAoXGlzX2FycmF5KCRhcmd1bWVudFZhbHVlKSkgewokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJGFyZ3VtZW50VmFsdWUgPyAkYXJndW1lbnRWYWx1ZVthcnJheV9rZXlfbGFzdCgkYXJndW1lbnRWYWx1ZSldIDogbnVsbDsKfSBlbHNlIHsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICRhcmd1bWVudFZhbHVlOwp9Cn0KCmlmICgkdGhpcy0+Y3VycmVudEluZGV4ID49IFxjb3VudCgkdGhpcy0+dG9rZW5zKSkgewppZiAoIWlzc2V0KCR0aGlzLT5hcmd1bWVudHNbJGFyZ3VtZW50TmFtZV0pIHx8ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkYXJndW1lbnROYW1lKS0+aXNBcnJheSgpKSB7CiR0aGlzLT5jb21wbGV0aW9uTmFtZSA9ICRhcmd1bWVudE5hbWU7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAnJzsKfSBlbHNlIHsKCiR0aGlzLT5jb21wbGV0aW9uVHlwZSA9IHNlbGY6OlRZUEVfTk9ORTsKJHRoaXMtPmNvbXBsZXRpb25OYW1lID0gbnVsbDsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICcnOwp9Cn0KfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wbGV0aW9uVHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbXBsZXRpb25UeXBlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wbGV0aW9uTmFtZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jb21wbGV0aW9uTmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBsZXRpb25WYWx1ZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbXBsZXRpb25WYWx1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIG11c3RTdWdnZXN0T3B0aW9uVmFsdWVzRm9yKHN0cmluZyAkb3B0aW9uTmFtZSk6IGJvb2wKewpyZXR1cm4gc2VsZjo6VFlQRV9PUFRJT05fVkFMVUUgPT09ICR0aGlzLT5nZXRDb21wbGV0aW9uVHlwZSgpICYmICRvcHRpb25OYW1lID09PSAkdGhpcy0+Z2V0Q29tcGxldGlvbk5hbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIG11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3Ioc3RyaW5nICRhcmd1bWVudE5hbWUpOiBib29sCnsKcmV0dXJuIHNlbGY6OlRZUEVfQVJHVU1FTlRfVkFMVUUgPT09ICR0aGlzLT5nZXRDb21wbGV0aW9uVHlwZSgpICYmICRhcmd1bWVudE5hbWUgPT09ICR0aGlzLT5nZXRDb21wbGV0aW9uTmFtZSgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VUb2tlbihzdHJpbmcgJHRva2VuLCBib29sICRwYXJzZU9wdGlvbnMpOiBib29sCnsKdHJ5IHsKcmV0dXJuIHBhcmVudDo6cGFyc2VUb2tlbigkdG9rZW4sICRwYXJzZU9wdGlvbnMpOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9CgpyZXR1cm4gJHBhcnNlT3B0aW9uczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRPcHRpb25Gcm9tVG9rZW4oc3RyaW5nICRvcHRpb25Ub2tlbik6ID9JbnB1dE9wdGlvbgp7CiRvcHRpb25OYW1lID0gbHRyaW0oJG9wdGlvblRva2VuLCAnLScpOwppZiAoISRvcHRpb25OYW1lKSB7CnJldHVybiBudWxsOwp9CgppZiAoJy0nID09PSAoJG9wdGlvblRva2VuWzFdID8/ICcgJykpIHsKCnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRvcHRpb25OYW1lKSA/ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb24oJG9wdGlvbk5hbWUpIDogbnVsbDsKfQoKCnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJG9wdGlvbk5hbWVbMF0pID8gJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbkZvclNob3J0Y3V0KCRvcHRpb25OYW1lWzBdKSA6IG51bGw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVsZXZhbnRUb2tlbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnRva2Vuc1skdGhpcy0+aXNDdXJzb3JGcmVlKCkgPyAkdGhpcy0+Y3VycmVudEluZGV4IC0gMSA6ICR0aGlzLT5jdXJyZW50SW5kZXhdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzQ3Vyc29yRnJlZSgpOiBib29sCnsKJG5yT2ZUb2tlbnMgPSBcY291bnQoJHRoaXMtPnRva2Vucyk7CmlmICgkdGhpcy0+Y3VycmVudEluZGV4ID4gJG5yT2ZUb2tlbnMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ3VycmVudCBpbmRleCBpcyBpbnZhbGlkLCBpdCBtdXN0IGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgdG9rZW5zIG9yIG9uZSBtb3JlLicpOwp9CgpyZXR1cm4gJHRoaXMtPmN1cnJlbnRJbmRleCA+PSAkbnJPZlRva2VuczsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CiRzdHIgPSAnJzsKZm9yZWFjaCAoJHRoaXMtPnRva2VucyBhcyAkaSA9PiAkdG9rZW4pIHsKJHN0ciAuPSAkdG9rZW47CgppZiAoJHRoaXMtPmN1cnJlbnRJbmRleCA9PT0gJGkpIHsKJHN0ciAuPSAnfCc7Cn0KCiRzdHIgLj0gJyAnOwp9CgppZiAoJHRoaXMtPmN1cnJlbnRJbmRleCA+ICRpKSB7CiRzdHIgLj0gJ3wnOwp9CgpyZXR1cm4gcnRyaW0oJHN0cik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKCgpmaW5hbCBjbGFzcyBDb21wbGV0aW9uU3VnZ2VzdGlvbnMKewpwcml2YXRlICR2YWx1ZVN1Z2dlc3Rpb25zID0gW107CnByaXZhdGUgJG9wdGlvblN1Z2dlc3Rpb25zID0gW107CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1Z2dlc3RWYWx1ZSgkdmFsdWUpOiBzZWxmCnsKJHRoaXMtPnZhbHVlU3VnZ2VzdGlvbnNbXSA9ICEkdmFsdWUgaW5zdGFuY2VvZiBTdWdnZXN0aW9uID8gbmV3IFN1Z2dlc3Rpb24oJHZhbHVlKSA6ICR2YWx1ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWdnZXN0VmFsdWVzKGFycmF5ICR2YWx1ZXMpOiBzZWxmCnsKZm9yZWFjaCAoJHZhbHVlcyBhcyAkdmFsdWUpIHsKJHRoaXMtPnN1Z2dlc3RWYWx1ZSgkdmFsdWUpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1Z2dlc3RPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbik6IHNlbGYKewokdGhpcy0+b3B0aW9uU3VnZ2VzdGlvbnNbXSA9ICRvcHRpb247CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VnZ2VzdE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiBzZWxmCnsKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewokdGhpcy0+c3VnZ2VzdE9wdGlvbigkb3B0aW9uKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9uU3VnZ2VzdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPm9wdGlvblN1Z2dlc3Rpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVTdWdnZXN0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dmFsdWVTdWdnZXN0aW9uczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgQmFzaENvbXBsZXRpb25PdXRwdXQgaW1wbGVtZW50cyBDb21wbGV0aW9uT3V0cHV0SW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIHdyaXRlKENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiR2YWx1ZXMgPSAkc3VnZ2VzdGlvbnMtPmdldFZhbHVlU3VnZ2VzdGlvbnMoKTsKZm9yZWFjaCAoJHN1Z2dlc3Rpb25zLT5nZXRPcHRpb25TdWdnZXN0aW9ucygpIGFzICRvcHRpb24pIHsKJHZhbHVlc1tdID0gJy0tJy4kb3B0aW9uLT5nZXROYW1lKCk7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiR2YWx1ZXNbXSA9ICctLW5vLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwp9Cn0KJG91dHB1dC0+d3JpdGVsbihpbXBsb2RlKCJcbiIsICR2YWx1ZXMpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgQ29tcGxldGlvbk91dHB1dEludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiB3cml0ZShDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQ7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb247CgoKCgoKCmNsYXNzIFN1Z2dlc3Rpb24Kewpwcml2YXRlICR2YWx1ZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHZhbHVlKQp7CiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dmFsdWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0VmFsdWUoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVDb21tYW5kRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVFcnJvckV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlU2lnbmFsRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVUZXJtaW5hdGVFdmVudDsKCgoKCgoKZmluYWwgY2xhc3MgQ29uc29sZUV2ZW50cwp7CgoKCgoKCgpwdWJsaWMgY29uc3QgQ09NTUFORCA9ICdjb25zb2xlLmNvbW1hbmQnOwoKCgoKCgoKcHVibGljIGNvbnN0IFNJR05BTCA9ICdjb25zb2xlLnNpZ25hbCc7CgoKCgoKCgpwdWJsaWMgY29uc3QgVEVSTUlOQVRFID0gJ2NvbnNvbGUudGVybWluYXRlJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IEVSUk9SID0gJ2NvbnNvbGUuZXJyb3InOwoKCgoKCgpwdWJsaWMgY29uc3QgQUxJQVNFUyA9IFsKQ29uc29sZUNvbW1hbmRFdmVudDo6Y2xhc3MgPT4gc2VsZjo6Q09NTUFORCwKQ29uc29sZUVycm9yRXZlbnQ6OmNsYXNzID0+IHNlbGY6OkVSUk9SLApDb25zb2xlU2lnbmFsRXZlbnQ6OmNsYXNzID0+IHNlbGY6OlNJR05BTCwKQ29uc29sZVRlcm1pbmF0ZUV2ZW50OjpjbGFzcyA9PiBzZWxmOjpURVJNSU5BVEUsCl07Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmZpbmFsIGNsYXNzIEN1cnNvcgp7CnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkaW5wdXQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsICRpbnB1dCA9IG51bGwpCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dCA/PyAoXGRlZmluZWQoJ1NURElOJykgPyBcU1RESU4gOiBmb3BlbigncGhwOi8vaW5wdXQnLCAncisnKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlVXAoaW50ICRsaW5lcyA9IDEpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3ByaW50ZigiXHgxYlslZEEiLCAkbGluZXMpKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVEb3duKGludCAkbGluZXMgPSAxKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHNwcmludGYoIlx4MWJbJWRCIiwgJGxpbmVzKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlUmlnaHQoaW50ICRjb2x1bW5zID0gMSk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZShzcHJpbnRmKCJceDFiWyVkQyIsICRjb2x1bW5zKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlTGVmdChpbnQgJGNvbHVtbnMgPSAxKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHNwcmludGYoIlx4MWJbJWREIiwgJGNvbHVtbnMpKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVUb0NvbHVtbihpbnQgJGNvbHVtbik6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZShzcHJpbnRmKCJceDFiWyVkRyIsICRjb2x1bW4pKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVUb1Bvc2l0aW9uKGludCAkY29sdW1uLCBpbnQgJHJvdyk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZShzcHJpbnRmKCJceDFiWyVkOyVkSCIsICRyb3cgKyAxLCAkY29sdW1uKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzYXZlUG9zaXRpb24oKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiNyIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzdG9yZVBvc2l0aW9uKCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYjgiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhpZGUoKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiWz8yNWwiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiWz8yNWhceDFiWz8wYyIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhckxpbmUoKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiWzJLIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhckxpbmVBZnRlcigpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWJbSyIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhck91dHB1dCgpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWJbMEoiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJTY3JlZW4oKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiWzJKIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50UG9zaXRpb24oKTogYXJyYXkKewpzdGF0aWMgJGlzVHR5U3VwcG9ydGVkOwoKaWYgKG51bGwgPT09ICRpc1R0eVN1cHBvcnRlZCAmJiBcZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewokaXNUdHlTdXBwb3J0ZWQgPSAoYm9vbCkgQHByb2Nfb3BlbignZWNobyAxID4vZGV2L251bGwnLCBbWydmaWxlJywgJy9kZXYvdHR5JywgJ3InXSwgWydmaWxlJywgJy9kZXYvdHR5JywgJ3cnXSwgWydmaWxlJywgJy9kZXYvdHR5JywgJ3cnXV0sICRwaXBlcyk7Cn0KCmlmICghJGlzVHR5U3VwcG9ydGVkKSB7CnJldHVybiBbMSwgMV07Cn0KCiRzdHR5TW9kZSA9IHNoZWxsX2V4ZWMoJ3N0dHkgLWcnKTsKc2hlbGxfZXhlYygnc3R0eSAtaWNhbm9uIC1lY2hvJyk7CgpAZndyaXRlKCR0aGlzLT5pbnB1dCwgIlwwMzNbNm4iKTsKCiRjb2RlID0gdHJpbShmcmVhZCgkdGhpcy0+aW5wdXQsIDEwMjQpKTsKCnNoZWxsX2V4ZWMoc3ByaW50Zignc3R0eSAlcycsICRzdHR5TW9kZSkpOwoKc3NjYW5mKCRjb2RlLCAiXDAzM1slZDslZFIiLCAkcm93LCAkY29sKTsKCnJldHVybiBbJGNvbCwgJHJvd107Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVwZW5kZW5jeUluamVjdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxMYXp5Q29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZExvYWRlclxDb250YWluZXJDb21tYW5kTG9hZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxBcmd1bWVudFxTZXJ2aWNlQ2xvc3VyZUFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxDb21waWxlclxDb21waWxlclBhc3NJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXENvbXBpbGVyXFNlcnZpY2VMb2NhdG9yVGFnUGFzczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cQ29udGFpbmVyQnVpbGRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cUmVmZXJlbmNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxUeXBlZFJlZmVyZW5jZTsKCgoKCgoKY2xhc3MgQWRkQ29uc29sZUNvbW1hbmRQYXNzIGltcGxlbWVudHMgQ29tcGlsZXJQYXNzSW50ZXJmYWNlCnsKcHJpdmF0ZSAkY29tbWFuZExvYWRlclNlcnZpY2VJZDsKcHJpdmF0ZSAkY29tbWFuZFRhZzsKcHJpdmF0ZSAkbm9QcmVsb2FkVGFnOwpwcml2YXRlICRwcml2YXRlVGFnTmFtZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbW1hbmRMb2FkZXJTZXJ2aWNlSWQgPSAnY29uc29sZS5jb21tYW5kX2xvYWRlcicsIHN0cmluZyAkY29tbWFuZFRhZyA9ICdjb25zb2xlLmNvbW1hbmQnLCBzdHJpbmcgJG5vUHJlbG9hZFRhZyA9ICdjb250YWluZXIubm9fcHJlbG9hZCcsIHN0cmluZyAkcHJpdmF0ZVRhZ05hbWUgPSAnY29udGFpbmVyLnByaXZhdGUnKQp7CmlmICgwIDwgXGZ1bmNfbnVtX2FyZ3MoKSkgewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2NvbnNvbGUnLCAnNS4zJywgJ0NvbmZpZ3VyaW5nICIlcyIgaXMgZGVwcmVjYXRlZC4nLCBfX0NMQVNTX18pOwp9CgokdGhpcy0+Y29tbWFuZExvYWRlclNlcnZpY2VJZCA9ICRjb21tYW5kTG9hZGVyU2VydmljZUlkOwokdGhpcy0+Y29tbWFuZFRhZyA9ICRjb21tYW5kVGFnOwokdGhpcy0+bm9QcmVsb2FkVGFnID0gJG5vUHJlbG9hZFRhZzsKJHRoaXMtPnByaXZhdGVUYWdOYW1lID0gJHByaXZhdGVUYWdOYW1lOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhDb250YWluZXJCdWlsZGVyICRjb250YWluZXIpCnsKJGNvbW1hbmRTZXJ2aWNlcyA9ICRjb250YWluZXItPmZpbmRUYWdnZWRTZXJ2aWNlSWRzKCR0aGlzLT5jb21tYW5kVGFnLCB0cnVlKTsKJGxhenlDb21tYW5kTWFwID0gW107CiRsYXp5Q29tbWFuZFJlZnMgPSBbXTsKJHNlcnZpY2VJZHMgPSBbXTsKCmZvcmVhY2ggKCRjb21tYW5kU2VydmljZXMgYXMgJGlkID0+ICR0YWdzKSB7CiRkZWZpbml0aW9uID0gJGNvbnRhaW5lci0+Z2V0RGVmaW5pdGlvbigkaWQpOwokZGVmaW5pdGlvbi0+YWRkVGFnKCR0aGlzLT5ub1ByZWxvYWRUYWcpOwokY2xhc3MgPSAkY29udGFpbmVyLT5nZXRQYXJhbWV0ZXJCYWcoKS0+cmVzb2x2ZVZhbHVlKCRkZWZpbml0aW9uLT5nZXRDbGFzcygpKTsKCmlmIChpc3NldCgkdGFnc1swXVsnY29tbWFuZCddKSkgewokYWxpYXNlcyA9ICR0YWdzWzBdWydjb21tYW5kJ107Cn0gZWxzZSB7CmlmICghJHIgPSAkY29udGFpbmVyLT5nZXRSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0NsYXNzICIlcyIgdXNlZCBmb3Igc2VydmljZSAiJXMiIGNhbm5vdCBiZSBmb3VuZC4nLCAkY2xhc3MsICRpZCkpOwp9CmlmICghJHItPmlzU3ViY2xhc3NPZihDb21tYW5kOjpjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgc2VydmljZSAiJXMiIHRhZ2dlZCAiJXMiIG11c3QgYmUgYSBzdWJjbGFzcyBvZiAiJXMiLicsICRpZCwgJHRoaXMtPmNvbW1hbmRUYWcsIENvbW1hbmQ6OmNsYXNzKSk7Cn0KJGFsaWFzZXMgPSBzdHJfcmVwbGFjZSgnJScsICclJScsICRjbGFzczo6Z2V0RGVmYXVsdE5hbWUoKSA/PyAnJyk7Cn0KCiRhbGlhc2VzID0gZXhwbG9kZSgnfCcsICRhbGlhc2VzID8/ICcnKTsKJGNvbW1hbmROYW1lID0gYXJyYXlfc2hpZnQoJGFsaWFzZXMpOwoKaWYgKCRpc0hpZGRlbiA9ICcnID09PSAkY29tbWFuZE5hbWUpIHsKJGNvbW1hbmROYW1lID0gYXJyYXlfc2hpZnQoJGFsaWFzZXMpOwp9CgppZiAobnVsbCA9PT0gJGNvbW1hbmROYW1lKSB7CmlmICghJGRlZmluaXRpb24tPmlzUHVibGljKCkgfHwgJGRlZmluaXRpb24tPmlzUHJpdmF0ZSgpIHx8ICRkZWZpbml0aW9uLT5oYXNUYWcoJHRoaXMtPnByaXZhdGVUYWdOYW1lKSkgewokY29tbWFuZElkID0gJ2NvbnNvbGUuY29tbWFuZC5wdWJsaWNfYWxpYXMuJy4kaWQ7CiRjb250YWluZXItPnNldEFsaWFzKCRjb21tYW5kSWQsICRpZCktPnNldFB1YmxpYyh0cnVlKTsKJGlkID0gJGNvbW1hbmRJZDsKfQokc2VydmljZUlkc1tdID0gJGlkOwoKY29udGludWU7Cn0KCiRkZXNjcmlwdGlvbiA9ICR0YWdzWzBdWydkZXNjcmlwdGlvbiddID8/IG51bGw7Cgp1bnNldCgkdGFnc1swXSk7CiRsYXp5Q29tbWFuZE1hcFskY29tbWFuZE5hbWVdID0gJGlkOwokbGF6eUNvbW1hbmRSZWZzWyRpZF0gPSBuZXcgVHlwZWRSZWZlcmVuY2UoJGlkLCAkY2xhc3MpOwoKZm9yZWFjaCAoJGFsaWFzZXMgYXMgJGFsaWFzKSB7CiRsYXp5Q29tbWFuZE1hcFskYWxpYXNdID0gJGlkOwp9Cgpmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7CmlmIChpc3NldCgkdGFnWydjb21tYW5kJ10pKSB7CiRhbGlhc2VzW10gPSAkdGFnWydjb21tYW5kJ107CiRsYXp5Q29tbWFuZE1hcFskdGFnWydjb21tYW5kJ11dID0gJGlkOwp9CgokZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb24gPz8gJHRhZ1snZGVzY3JpcHRpb24nXSA/PyBudWxsOwp9CgokZGVmaW5pdGlvbi0+YWRkTWV0aG9kQ2FsbCgnc2V0TmFtZScsIFskY29tbWFuZE5hbWVdKTsKCmlmICgkYWxpYXNlcykgewokZGVmaW5pdGlvbi0+YWRkTWV0aG9kQ2FsbCgnc2V0QWxpYXNlcycsIFskYWxpYXNlc10pOwp9CgppZiAoJGlzSGlkZGVuKSB7CiRkZWZpbml0aW9uLT5hZGRNZXRob2RDYWxsKCdzZXRIaWRkZW4nLCBbdHJ1ZV0pOwp9CgppZiAoISRkZXNjcmlwdGlvbikgewppZiAoISRyID0gJGNvbnRhaW5lci0+Z2V0UmVmbGVjdGlvbkNsYXNzKCRjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDbGFzcyAiJXMiIHVzZWQgZm9yIHNlcnZpY2UgIiVzIiBjYW5ub3QgYmUgZm91bmQuJywgJGNsYXNzLCAkaWQpKTsKfQppZiAoISRyLT5pc1N1YmNsYXNzT2YoQ29tbWFuZDo6Y2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIHNlcnZpY2UgIiVzIiB0YWdnZWQgIiVzIiBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgIiVzIi4nLCAkaWQsICR0aGlzLT5jb21tYW5kVGFnLCBDb21tYW5kOjpjbGFzcykpOwp9CiRkZXNjcmlwdGlvbiA9IHN0cl9yZXBsYWNlKCclJywgJyUlJywgJGNsYXNzOjpnZXREZWZhdWx0RGVzY3JpcHRpb24oKSA/PyAnJyk7Cn0KCmlmICgkZGVzY3JpcHRpb24pIHsKJGRlZmluaXRpb24tPmFkZE1ldGhvZENhbGwoJ3NldERlc2NyaXB0aW9uJywgWyRkZXNjcmlwdGlvbl0pOwoKJGNvbnRhaW5lci0+cmVnaXN0ZXIoJy4nLiRpZC4nLmxhenknLCBMYXp5Q29tbWFuZDo6Y2xhc3MpCi0+c2V0QXJndW1lbnRzKFskY29tbWFuZE5hbWUsICRhbGlhc2VzLCAkZGVzY3JpcHRpb24sICRpc0hpZGRlbiwgbmV3IFNlcnZpY2VDbG9zdXJlQXJndW1lbnQoJGxhenlDb21tYW5kUmVmc1skaWRdKV0pOwoKJGxhenlDb21tYW5kUmVmc1skaWRdID0gbmV3IFJlZmVyZW5jZSgnLicuJGlkLicubGF6eScpOwp9Cn0KCiRjb250YWluZXIKLT5yZWdpc3RlcigkdGhpcy0+Y29tbWFuZExvYWRlclNlcnZpY2VJZCwgQ29udGFpbmVyQ29tbWFuZExvYWRlcjo6Y2xhc3MpCi0+c2V0UHVibGljKHRydWUpCi0+YWRkVGFnKCR0aGlzLT5ub1ByZWxvYWRUYWcpCi0+c2V0QXJndW1lbnRzKFtTZXJ2aWNlTG9jYXRvclRhZ1Bhc3M6OnJlZ2lzdGVyKCRjb250YWluZXIsICRsYXp5Q29tbWFuZFJlZnMpLCAkbGF6eUNvbW1hbmRNYXBdKTsKCiRjb250YWluZXItPnNldFBhcmFtZXRlcignY29uc29sZS5jb21tYW5kLmlkcycsICRzZXJ2aWNlSWRzKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgQXBwbGljYXRpb25EZXNjcmlwdGlvbgp7CnB1YmxpYyBjb25zdCBHTE9CQUxfTkFNRVNQQUNFID0gJ19nbG9iYWwnOwoKcHJpdmF0ZSAkYXBwbGljYXRpb247CnByaXZhdGUgJG5hbWVzcGFjZTsKcHJpdmF0ZSAkc2hvd0hpZGRlbjsKCgoKCnByaXZhdGUgJG5hbWVzcGFjZXM7CgoKCgpwcml2YXRlICRjb21tYW5kczsKCgoKCnByaXZhdGUgJGFsaWFzZXM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBzdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwsIGJvb2wgJHNob3dIaWRkZW4gPSBmYWxzZSkKewokdGhpcy0+YXBwbGljYXRpb24gPSAkYXBwbGljYXRpb247CiR0aGlzLT5uYW1lc3BhY2UgPSAkbmFtZXNwYWNlOwokdGhpcy0+c2hvd0hpZGRlbiA9ICRzaG93SGlkZGVuOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+bmFtZXNwYWNlcykgewokdGhpcy0+aW5zcGVjdEFwcGxpY2F0aW9uKCk7Cn0KCnJldHVybiAkdGhpcy0+bmFtZXNwYWNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmRzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5jb21tYW5kcykgewokdGhpcy0+aW5zcGVjdEFwcGxpY2F0aW9uKCk7Cn0KCnJldHVybiAkdGhpcy0+Y29tbWFuZHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKHN0cmluZyAkbmFtZSk6IENvbW1hbmQKewppZiAoIWlzc2V0KCR0aGlzLT5jb21tYW5kc1skbmFtZV0pICYmICFpc3NldCgkdGhpcy0+YWxpYXNlc1skbmFtZV0pKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignQ29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+Y29tbWFuZHNbJG5hbWVdID8/ICR0aGlzLT5hbGlhc2VzWyRuYW1lXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpbnNwZWN0QXBwbGljYXRpb24oKQp7CiR0aGlzLT5jb21tYW5kcyA9IFtdOwokdGhpcy0+bmFtZXNwYWNlcyA9IFtdOwoKJGFsbCA9ICR0aGlzLT5hcHBsaWNhdGlvbi0+YWxsKCR0aGlzLT5uYW1lc3BhY2UgPyAkdGhpcy0+YXBwbGljYXRpb24tPmZpbmROYW1lc3BhY2UoJHRoaXMtPm5hbWVzcGFjZSkgOiBudWxsKTsKZm9yZWFjaCAoJHRoaXMtPnNvcnRDb21tYW5kcygkYWxsKSBhcyAkbmFtZXNwYWNlID0+ICRjb21tYW5kcykgewokbmFtZXMgPSBbXTsKCgpmb3JlYWNoICgkY29tbWFuZHMgYXMgJG5hbWUgPT4gJGNvbW1hbmQpIHsKaWYgKCEkY29tbWFuZC0+Z2V0TmFtZSgpIHx8ICghJHRoaXMtPnNob3dIaWRkZW4gJiYgJGNvbW1hbmQtPmlzSGlkZGVuKCkpKSB7CmNvbnRpbnVlOwp9CgppZiAoJGNvbW1hbmQtPmdldE5hbWUoKSA9PT0gJG5hbWUpIHsKJHRoaXMtPmNvbW1hbmRzWyRuYW1lXSA9ICRjb21tYW5kOwp9IGVsc2UgewokdGhpcy0+YWxpYXNlc1skbmFtZV0gPSAkY29tbWFuZDsKfQoKJG5hbWVzW10gPSAkbmFtZTsKfQoKJHRoaXMtPm5hbWVzcGFjZXNbJG5hbWVzcGFjZV0gPSBbJ2lkJyA9PiAkbmFtZXNwYWNlLCAnY29tbWFuZHMnID0+ICRuYW1lc107Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBzb3J0Q29tbWFuZHMoYXJyYXkgJGNvbW1hbmRzKTogYXJyYXkKewokbmFtZXNwYWNlZENvbW1hbmRzID0gW107CiRnbG9iYWxDb21tYW5kcyA9IFtdOwokc29ydGVkQ29tbWFuZHMgPSBbXTsKZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRuYW1lID0+ICRjb21tYW5kKSB7CiRrZXkgPSAkdGhpcy0+YXBwbGljYXRpb24tPmV4dHJhY3ROYW1lc3BhY2UoJG5hbWUsIDEpOwppZiAoXGluX2FycmF5KCRrZXksIFsnJywgc2VsZjo6R0xPQkFMX05BTUVTUEFDRV0sIHRydWUpKSB7CiRnbG9iYWxDb21tYW5kc1skbmFtZV0gPSAkY29tbWFuZDsKfSBlbHNlIHsKJG5hbWVzcGFjZWRDb21tYW5kc1ska2V5XVskbmFtZV0gPSAkY29tbWFuZDsKfQp9CgppZiAoJGdsb2JhbENvbW1hbmRzKSB7Cmtzb3J0KCRnbG9iYWxDb21tYW5kcyk7CiRzb3J0ZWRDb21tYW5kc1tzZWxmOjpHTE9CQUxfTkFNRVNQQUNFXSA9ICRnbG9iYWxDb21tYW5kczsKfQoKaWYgKCRuYW1lc3BhY2VkQ29tbWFuZHMpIHsKa3NvcnQoJG5hbWVzcGFjZWRDb21tYW5kcywgXFNPUlRfU1RSSU5HKTsKZm9yZWFjaCAoJG5hbWVzcGFjZWRDb21tYW5kcyBhcyAka2V5ID0+ICRjb21tYW5kc1NldCkgewprc29ydCgkY29tbWFuZHNTZXQpOwokc29ydGVkQ29tbWFuZHNbJGtleV0gPSAkY29tbWFuZHNTZXQ7Cn0KfQoKcmV0dXJuICRzb3J0ZWRDb21tYW5kczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRvciBpbXBsZW1lbnRzIERlc2NyaXB0b3JJbnRlcmZhY2UKewoKCgpwcm90ZWN0ZWQgJG91dHB1dDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZXNjcmliZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgb2JqZWN0ICRvYmplY3QsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cgpzd2l0Y2ggKHRydWUpIHsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgSW5wdXRBcmd1bWVudDoKJHRoaXMtPmRlc2NyaWJlSW5wdXRBcmd1bWVudCgkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBJbnB1dE9wdGlvbjoKJHRoaXMtPmRlc2NyaWJlSW5wdXRPcHRpb24oJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgSW5wdXREZWZpbml0aW9uOgokdGhpcy0+ZGVzY3JpYmVJbnB1dERlZmluaXRpb24oJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgQ29tbWFuZDoKJHRoaXMtPmRlc2NyaWJlQ29tbWFuZCgkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbjoKJHRoaXMtPmRlc2NyaWJlQXBwbGljYXRpb24oJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdPYmplY3Qgb2YgdHlwZSAiJXMiIGlzIG5vdCBkZXNjcmliYWJsZS4nLCBnZXRfZGVidWdfdHlwZSgkb2JqZWN0KSkpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZShzdHJpbmcgJGNvbnRlbnQsIGJvb2wgJGRlY29yYXRlZCA9IGZhbHNlKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCRjb250ZW50LCBmYWxzZSwgJGRlY29yYXRlZCA/IE91dHB1dEludGVyZmFjZTo6T1VUUFVUX05PUk1BTCA6IE91dHB1dEludGVyZmFjZTo6T1VUUFVUX1JBVyk7Cn0KCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pOwoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIERlc2NyaXB0b3JJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gZGVzY3JpYmUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIG9iamVjdCAkb2JqZWN0LCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgoKCgoKY2xhc3MgSnNvbkRlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5nZXRJbnB1dEFyZ3VtZW50RGF0YSgkYXJndW1lbnQpLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0SW5wdXRPcHRpb25EYXRhKCRvcHRpb24pLCAkb3B0aW9ucyk7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldElucHV0T3B0aW9uRGF0YSgkb3B0aW9uLCB0cnVlKSwgJG9wdGlvbnMpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0SW5wdXREZWZpbml0aW9uRGF0YSgkZGVmaW5pdGlvbiksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldENvbW1hbmREYXRhKCRjb21tYW5kLCAkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRkZXNjcmliZWROYW1lc3BhY2UgPSAkb3B0aW9uc1snbmFtZXNwYWNlJ10gPz8gbnVsbDsKJGRlc2NyaXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJGFwcGxpY2F0aW9uLCAkZGVzY3JpYmVkTmFtZXNwYWNlLCB0cnVlKTsKJGNvbW1hbmRzID0gW107Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJGNvbW1hbmRzW10gPSAkdGhpcy0+Z2V0Q29tbWFuZERhdGEoJGNvbW1hbmQsICRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKTsKfQoKJGRhdGEgPSBbXTsKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXROYW1lKCkpIHsKJGRhdGFbJ2FwcGxpY2F0aW9uJ11bJ25hbWUnXSA9ICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpOwppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSkgewokZGF0YVsnYXBwbGljYXRpb24nXVsndmVyc2lvbiddID0gJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCk7Cn0KfQoKJGRhdGFbJ2NvbW1hbmRzJ10gPSAkY29tbWFuZHM7CgppZiAoJGRlc2NyaWJlZE5hbWVzcGFjZSkgewokZGF0YVsnbmFtZXNwYWNlJ10gPSAkZGVzY3JpYmVkTmFtZXNwYWNlOwp9IGVsc2UgewokZGF0YVsnbmFtZXNwYWNlcyddID0gYXJyYXlfdmFsdWVzKCRkZXNjcmlwdGlvbi0+Z2V0TmFtZXNwYWNlcygpKTsKfQoKJHRoaXMtPndyaXRlRGF0YSgkZGF0YSwgJG9wdGlvbnMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlRGF0YShhcnJheSAkZGF0YSwgYXJyYXkgJG9wdGlvbnMpCnsKJGZsYWdzID0gJG9wdGlvbnNbJ2pzb25fZW5jb2RpbmcnXSA/PyAwOwoKJHRoaXMtPndyaXRlKGpzb25fZW5jb2RlKCRkYXRhLCAkZmxhZ3MpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dEFyZ3VtZW50RGF0YShJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCk6IGFycmF5CnsKcmV0dXJuIFsKJ25hbWUnID0+ICRhcmd1bWVudC0+Z2V0TmFtZSgpLAonaXNfcmVxdWlyZWQnID0+ICRhcmd1bWVudC0+aXNSZXF1aXJlZCgpLAonaXNfYXJyYXknID0+ICRhcmd1bWVudC0+aXNBcnJheSgpLAonZGVzY3JpcHRpb24nID0+IHByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAnICcsICRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSksCidkZWZhdWx0JyA9PiBcSU5GID09PSAkYXJndW1lbnQtPmdldERlZmF1bHQoKSA/ICdJTkYnIDogJGFyZ3VtZW50LT5nZXREZWZhdWx0KCksCl07Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXRPcHRpb25EYXRhKElucHV0T3B0aW9uICRvcHRpb24sIGJvb2wgJG5lZ2F0ZWQgPSBmYWxzZSk6IGFycmF5CnsKcmV0dXJuICRuZWdhdGVkID8gWwonbmFtZScgPT4gJy0tbm8tJy4kb3B0aW9uLT5nZXROYW1lKCksCidzaG9ydGN1dCcgPT4gJycsCidhY2NlcHRfdmFsdWUnID0+IGZhbHNlLAonaXNfdmFsdWVfcmVxdWlyZWQnID0+IGZhbHNlLAonaXNfbXVsdGlwbGUnID0+IGZhbHNlLAonZGVzY3JpcHRpb24nID0+ICdOZWdhdGUgdGhlICItLScuJG9wdGlvbi0+Z2V0TmFtZSgpLiciIG9wdGlvbicsCidkZWZhdWx0JyA9PiBmYWxzZSwKXSA6IFsKJ25hbWUnID0+ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpLAonc2hvcnRjdXQnID0+ICRvcHRpb24tPmdldFNob3J0Y3V0KCkgPyAnLScuc3RyX3JlcGxhY2UoJ3wnLCAnfC0nLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSA6ICcnLAonYWNjZXB0X3ZhbHVlJyA9PiAkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpLAonaXNfdmFsdWVfcmVxdWlyZWQnID0+ICRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpLAonaXNfbXVsdGlwbGUnID0+ICRvcHRpb24tPmlzQXJyYXkoKSwKJ2Rlc2NyaXB0aW9uJyA9PiBwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgJyAnLCAkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpKSwKJ2RlZmF1bHQnID0+IFxJTkYgPT09ICRvcHRpb24tPmdldERlZmF1bHQoKSA/ICdJTkYnIDogJG9wdGlvbi0+Z2V0RGVmYXVsdCgpLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldElucHV0RGVmaW5pdGlvbkRhdGEoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKTogYXJyYXkKewokaW5wdXRBcmd1bWVudHMgPSBbXTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRuYW1lID0+ICRhcmd1bWVudCkgewokaW5wdXRBcmd1bWVudHNbJG5hbWVdID0gJHRoaXMtPmdldElucHV0QXJndW1lbnREYXRhKCRhcmd1bWVudCk7Cn0KCiRpbnB1dE9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSBhcyAkbmFtZSA9PiAkb3B0aW9uKSB7CiRpbnB1dE9wdGlvbnNbJG5hbWVdID0gJHRoaXMtPmdldElucHV0T3B0aW9uRGF0YSgkb3B0aW9uKTsKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJGlucHV0T3B0aW9uc1snbm8tJy4kbmFtZV0gPSAkdGhpcy0+Z2V0SW5wdXRPcHRpb25EYXRhKCRvcHRpb24sIHRydWUpOwp9Cn0KCnJldHVybiBbJ2FyZ3VtZW50cycgPT4gJGlucHV0QXJndW1lbnRzLCAnb3B0aW9ucycgPT4gJGlucHV0T3B0aW9uc107Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tbWFuZERhdGEoQ29tbWFuZCAkY29tbWFuZCwgYm9vbCAkc2hvcnQgPSBmYWxzZSk6IGFycmF5CnsKJGRhdGEgPSBbCiduYW1lJyA9PiAkY29tbWFuZC0+Z2V0TmFtZSgpLAonZGVzY3JpcHRpb24nID0+ICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpLApdOwoKaWYgKCRzaG9ydCkgewokZGF0YSArPSBbCid1c2FnZScgPT4gJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwKXTsKfSBlbHNlIHsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCiRkYXRhICs9IFsKJ3VzYWdlJyA9PiBhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldFN5bm9wc2lzKCldLCAkY29tbWFuZC0+Z2V0VXNhZ2VzKCksICRjb21tYW5kLT5nZXRBbGlhc2VzKCkpLAonaGVscCcgPT4gJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKSwKJ2RlZmluaXRpb24nID0+ICR0aGlzLT5nZXRJbnB1dERlZmluaXRpb25EYXRhKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpLApdOwp9CgokZGF0YVsnaGlkZGVuJ10gPSAkY29tbWFuZC0+aXNIaWRkZW4oKTsKCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCgpjbGFzcyBNYXJrZG93bkRlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yCnsKCgoKcHVibGljIGZ1bmN0aW9uIGRlc2NyaWJlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBvYmplY3QgJG9iamVjdCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokZGVjb3JhdGVkID0gJG91dHB1dC0+aXNEZWNvcmF0ZWQoKTsKJG91dHB1dC0+c2V0RGVjb3JhdGVkKGZhbHNlKTsKCnBhcmVudDo6ZGVzY3JpYmUoJG91dHB1dCwgJG9iamVjdCwgJG9wdGlvbnMpOwoKJG91dHB1dC0+c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRjb250ZW50LCBib29sICRkZWNvcmF0ZWQgPSB0cnVlKQp7CnBhcmVudDo6d3JpdGUoJGNvbnRlbnQsICRkZWNvcmF0ZWQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZSgKJyMjIyMgYCcuKCRhcmd1bWVudC0+Z2V0TmFtZSgpID86ICc8bm9uZT4nKS4iYFxuXG4iCi4oJGFyZ3VtZW50LT5nZXREZXNjcmlwdGlvbigpID8gcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIsICRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSkuIlxuXG4iIDogJycpCi4nKiBJcyByZXF1aXJlZDogJy4oJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIGFycmF5OiAnLigkYXJndW1lbnQtPmlzQXJyYXkoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogRGVmYXVsdDogYCcuc3RyX3JlcGxhY2UoIlxuIiwgJycsIHZhcl9leHBvcnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCksIHRydWUpKS4nYCcKKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokbmFtZSA9ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokbmFtZSAuPSAnfC0tbm8tJy4kb3B0aW9uLT5nZXROYW1lKCk7Cn0KaWYgKCRvcHRpb24tPmdldFNob3J0Y3V0KCkpIHsKJG5hbWUgLj0gJ3wtJy5zdHJfcmVwbGFjZSgnfCcsICd8LScsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpLicnOwp9CgokdGhpcy0+d3JpdGUoCicjIyMjIGAnLiRuYW1lLidgJy4iXG5cbiIKLigkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpID8gcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIsICRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpLiJcblxuIiA6ICcnKQouJyogQWNjZXB0IHZhbHVlOiAnLigkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBJcyB2YWx1ZSByZXF1aXJlZDogJy4oJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIG11bHRpcGxlOiAnLigkb3B0aW9uLT5pc0FycmF5KCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIG5lZ2F0YWJsZTogJy4oJG9wdGlvbi0+aXNOZWdhdGFibGUoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogRGVmYXVsdDogYCcuc3RyX3JlcGxhY2UoIlxuIiwgJycsIHZhcl9leHBvcnQoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpLCB0cnVlKSkuJ2AnCik7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCRzaG93QXJndW1lbnRzID0gXGNvdW50KCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgPiAwKSB7CiR0aGlzLT53cml0ZSgnIyMjIEFyZ3VtZW50cycpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwppZiAobnVsbCAhPT0gJGRlc2NyaWJlSW5wdXRBcmd1bWVudCA9ICR0aGlzLT5kZXNjcmliZUlucHV0QXJndW1lbnQoJGFyZ3VtZW50KSkgewokdGhpcy0+d3JpdGUoJGRlc2NyaWJlSW5wdXRBcmd1bWVudCk7Cn0KfQp9CgppZiAoXGNvdW50KCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkpID4gMCkgewppZiAoJHNob3dBcmd1bWVudHMpIHsKJHRoaXMtPndyaXRlKCJcblxuIik7Cn0KCiR0aGlzLT53cml0ZSgnIyMjIE9wdGlvbnMnKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSBhcyAkb3B0aW9uKSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwppZiAobnVsbCAhPT0gJGRlc2NyaWJlSW5wdXRPcHRpb24gPSAkdGhpcy0+ZGVzY3JpYmVJbnB1dE9wdGlvbigkb3B0aW9uKSkgewokdGhpcy0+d3JpdGUoJGRlc2NyaWJlSW5wdXRPcHRpb24pOwp9Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKSB7CiR0aGlzLT53cml0ZSgKJ2AnLiRjb21tYW5kLT5nZXROYW1lKCkuImBcbiIKLnN0cl9yZXBlYXQoJy0nLCBIZWxwZXI6OndpZHRoKCRjb21tYW5kLT5nZXROYW1lKCkpICsgMikuIlxuXG4iCi4oJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkgPyAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKS4iXG5cbiIgOiAnJykKLicjIyMgVXNhZ2UnLiJcblxuIgouYXJyYXlfcmVkdWNlKCRjb21tYW5kLT5nZXRBbGlhc2VzKCksIGZ1bmN0aW9uICgkY2FycnksICR1c2FnZSkgewpyZXR1cm4gJGNhcnJ5LicqIGAnLiR1c2FnZS4nYCcuIlxuIjsKfSkKKTsKCnJldHVybjsKfQoKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCiR0aGlzLT53cml0ZSgKJ2AnLiRjb21tYW5kLT5nZXROYW1lKCkuImBcbiIKLnN0cl9yZXBlYXQoJy0nLCBIZWxwZXI6OndpZHRoKCRjb21tYW5kLT5nZXROYW1lKCkpICsgMikuIlxuXG4iCi4oJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkgPyAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKS4iXG5cbiIgOiAnJykKLicjIyMgVXNhZ2UnLiJcblxuIgouYXJyYXlfcmVkdWNlKGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0U3lub3BzaXMoKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCksICRjb21tYW5kLT5nZXRVc2FnZXMoKSksIGZ1bmN0aW9uICgkY2FycnksICR1c2FnZSkgewpyZXR1cm4gJGNhcnJ5LicqIGAnLiR1c2FnZS4nYCcuIlxuIjsKfSkKKTsKCmlmICgkaGVscCA9ICRjb21tYW5kLT5nZXRQcm9jZXNzZWRIZWxwKCkpIHsKJHRoaXMtPndyaXRlKCJcbiIpOwokdGhpcy0+d3JpdGUoJGhlbHApOwp9CgokZGVmaW5pdGlvbiA9ICRjb21tYW5kLT5nZXREZWZpbml0aW9uKCk7CmlmICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIHx8ICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGRlc2NyaWJlZE5hbWVzcGFjZSA9ICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsOwokZGVzY3JpcHRpb24gPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkYXBwbGljYXRpb24sICRkZXNjcmliZWROYW1lc3BhY2UpOwokdGl0bGUgPSAkdGhpcy0+Z2V0QXBwbGljYXRpb25UaXRsZSgkYXBwbGljYXRpb24pOwoKJHRoaXMtPndyaXRlKCR0aXRsZS4iXG4iLnN0cl9yZXBlYXQoJz0nLCBIZWxwZXI6OndpZHRoKCR0aXRsZSkpKTsKCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0TmFtZXNwYWNlcygpIGFzICRuYW1lc3BhY2UpIHsKaWYgKEFwcGxpY2F0aW9uRGVzY3JpcHRpb246OkdMT0JBTF9OQU1FU1BBQ0UgIT09ICRuYW1lc3BhY2VbJ2lkJ10pIHsKJHRoaXMtPndyaXRlKCJcblxuIik7CiR0aGlzLT53cml0ZSgnKionLiRuYW1lc3BhY2VbJ2lkJ10uJzoqKicpOwp9CgokdGhpcy0+d3JpdGUoIlxuXG4iKTsKJHRoaXMtPndyaXRlKGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKGZ1bmN0aW9uICgkY29tbWFuZE5hbWUpIHVzZSAoJGRlc2NyaXB0aW9uKSB7CnJldHVybiBzcHJpbnRmKCcqIFtgJXNgXSgjJXMpJywgJGNvbW1hbmROYW1lLCBzdHJfcmVwbGFjZSgnOicsICcnLCAkZGVzY3JpcHRpb24tPmdldENvbW1hbmQoJGNvbW1hbmROYW1lKS0+Z2V0TmFtZSgpKSk7Cn0sICRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10pKSk7Cn0KCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKaWYgKG51bGwgIT09ICRkZXNjcmliZUNvbW1hbmQgPSAkdGhpcy0+ZGVzY3JpYmVDb21tYW5kKCRjb21tYW5kLCAkb3B0aW9ucykpIHsKJHRoaXMtPndyaXRlKCRkZXNjcmliZUNvbW1hbmQpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvblRpdGxlKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbik6IHN0cmluZwp7CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpKSB7CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpKSB7CnJldHVybiBzcHJpbnRmKCclcyAlcycsICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpLCAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSk7Cn0KCnJldHVybiAkYXBwbGljYXRpb24tPmdldE5hbWUoKTsKfQoKcmV0dXJuICdDb25zb2xlIFRvb2wnOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKCgoKCmNsYXNzIFRleHREZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvcgp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKG51bGwgIT09ICRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpICYmICghXGlzX2FycmF5KCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpKSB8fCBcY291bnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpKSkgewokZGVmYXVsdCA9IHNwcmludGYoJzxjb21tZW50PiBbZGVmYXVsdDogJXNdPC9jb21tZW50PicsICR0aGlzLT5mb3JtYXREZWZhdWx0VmFsdWUoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpKTsKfSBlbHNlIHsKJGRlZmF1bHQgPSAnJzsKfQoKJHRvdGFsV2lkdGggPSAkb3B0aW9uc1sndG90YWxfd2lkdGgnXSA/PyBIZWxwZXI6OndpZHRoKCRhcmd1bWVudC0+Z2V0TmFtZSgpKTsKJHNwYWNpbmdXaWR0aCA9ICR0b3RhbFdpZHRoIC0gXHN0cmxlbigkYXJndW1lbnQtPmdldE5hbWUoKSk7CgokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoJyAgPGluZm8+JXM8L2luZm8+ICAlcyVzJXMnLAokYXJndW1lbnQtPmdldE5hbWUoKSwKc3RyX3JlcGVhdCgnICcsICRzcGFjaW5nV2lkdGgpLAoKcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIuc3RyX3JlcGVhdCgnICcsICR0b3RhbFdpZHRoICsgNCksICRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSksCiRkZWZhdWx0CiksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSAmJiBudWxsICE9PSAkb3B0aW9uLT5nZXREZWZhdWx0KCkgJiYgKCFcaXNfYXJyYXkoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSB8fCBcY291bnQoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSkpIHsKJGRlZmF1bHQgPSBzcHJpbnRmKCc8Y29tbWVudD4gW2RlZmF1bHQ6ICVzXTwvY29tbWVudD4nLCAkdGhpcy0+Zm9ybWF0RGVmYXVsdFZhbHVlKCRvcHRpb24tPmdldERlZmF1bHQoKSkpOwp9IGVsc2UgewokZGVmYXVsdCA9ICcnOwp9CgokdmFsdWUgPSAnJzsKaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHZhbHVlID0gJz0nLnN0cnRvdXBwZXIoJG9wdGlvbi0+Z2V0TmFtZSgpKTsKCmlmICgkb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSkgewokdmFsdWUgPSAnWycuJHZhbHVlLiddJzsKfQp9CgokdG90YWxXaWR0aCA9ICRvcHRpb25zWyd0b3RhbF93aWR0aCddID8/ICR0aGlzLT5jYWxjdWxhdGVUb3RhbFdpZHRoRm9yT3B0aW9ucyhbJG9wdGlvbl0pOwokc3lub3BzaXMgPSBzcHJpbnRmKCclcyVzJywKJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/IHNwcmludGYoJy0lcywgJywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgOiAnICAgICcsCnNwcmludGYoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSA/ICctLSUxJHN8LS1uby0lMSRzJyA6ICctLSUxJHMlMiRzJywgJG9wdGlvbi0+Z2V0TmFtZSgpLCAkdmFsdWUpCik7Cgokc3BhY2luZ1dpZHRoID0gJHRvdGFsV2lkdGggLSBIZWxwZXI6OndpZHRoKCRzeW5vcHNpcyk7CgokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoJyAgPGluZm8+JXM8L2luZm8+ICAlcyVzJXMlcycsCiRzeW5vcHNpcywKc3RyX3JlcGVhdCgnICcsICRzcGFjaW5nV2lkdGgpLAoKcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICJcbiIuc3RyX3JlcGVhdCgnICcsICR0b3RhbFdpZHRoICsgNCksICRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpLAokZGVmYXVsdCwKJG9wdGlvbi0+aXNBcnJheSgpID8gJzxjb21tZW50PiAobXVsdGlwbGUgdmFsdWVzIGFsbG93ZWQpPC9jb21tZW50PicgOiAnJwopLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRvdGFsV2lkdGggPSAkdGhpcy0+Y2FsY3VsYXRlVG90YWxXaWR0aEZvck9wdGlvbnMoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnQpIHsKJHRvdGFsV2lkdGggPSBtYXgoJHRvdGFsV2lkdGgsIEhlbHBlcjo6d2lkdGgoJGFyZ3VtZW50LT5nZXROYW1lKCkpKTsKfQoKaWYgKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgewokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5Bcmd1bWVudHM6PC9jb21tZW50PicsICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudCkgewokdGhpcy0+ZGVzY3JpYmVJbnB1dEFyZ3VtZW50KCRhcmd1bWVudCwgYXJyYXlfbWVyZ2UoJG9wdGlvbnMsIFsndG90YWxfd2lkdGgnID0+ICR0b3RhbFdpZHRoXSkpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9Cn0KCmlmICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgJiYgJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSkgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9CgppZiAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSkgewokbGF0ZXJPcHRpb25zID0gW107CgokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5PcHRpb25zOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgYXMgJG9wdGlvbikgewppZiAoXHN0cmxlbigkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8/ICcnKSA+IDEpIHsKJGxhdGVyT3B0aW9uc1tdID0gJG9wdGlvbjsKY29udGludWU7Cn0KJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXRPcHRpb24oJG9wdGlvbiwgYXJyYXlfbWVyZ2UoJG9wdGlvbnMsIFsndG90YWxfd2lkdGgnID0+ICR0b3RhbFdpZHRoXSkpOwp9CmZvcmVhY2ggKCRsYXRlck9wdGlvbnMgYXMgJG9wdGlvbikgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+ZGVzY3JpYmVJbnB1dE9wdGlvbigkb3B0aW9uLCBhcnJheV9tZXJnZSgkb3B0aW9ucywgWyd0b3RhbF93aWR0aCcgPT4gJHRvdGFsV2lkdGhdKSk7Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCmlmICgkZGVzY3JpcHRpb24gPSAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSkgewokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5EZXNjcmlwdGlvbjo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCcgICcuJGRlc2NyaXB0aW9uKTsKJHRoaXMtPndyaXRlVGV4dCgiXG5cbiIpOwp9CgokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5Vc2FnZTo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwpmb3JlYWNoIChhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldFN5bm9wc2lzKHRydWUpXSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgJGNvbW1hbmQtPmdldFVzYWdlcygpKSBhcyAkdXNhZ2UpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnICAnLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCR1c2FnZSksICRvcHRpb25zKTsKfQokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwoKJGRlZmluaXRpb24gPSAkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpOwppZiAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSB8fCAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKCRkZWZpbml0aW9uLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KCiRoZWxwID0gJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKTsKaWYgKCRoZWxwICYmICRoZWxwICE9PSAkZGVzY3JpcHRpb24pIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+SGVscDo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCcgICcuc3RyX3JlcGxhY2UoIlxuIiwgIlxuICAiLCAkaGVscCksICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGRlc2NyaWJlZE5hbWVzcGFjZSA9ICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsOwokZGVzY3JpcHRpb24gPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkYXBwbGljYXRpb24sICRkZXNjcmliZWROYW1lc3BhY2UpOwoKaWYgKGlzc2V0KCRvcHRpb25zWydyYXdfdGV4dCddKSAmJiAkb3B0aW9uc1sncmF3X3RleHQnXSkgewokd2lkdGggPSAkdGhpcy0+Z2V0Q29sdW1uV2lkdGgoJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpKTsKCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoIiUteyR3aWR0aH1zICVzIiwgJGNvbW1hbmQtPmdldE5hbWUoKSwgJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KfSBlbHNlIHsKaWYgKCcnICE9ICRoZWxwID0gJGFwcGxpY2F0aW9uLT5nZXRIZWxwKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgiJGhlbHBcblxuIiwgJG9wdGlvbnMpOwp9CgokdGhpcy0+d3JpdGVUZXh0KCI8Y29tbWVudD5Vc2FnZTo8L2NvbW1lbnQ+XG4iLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIiAgY29tbWFuZCBbb3B0aW9uc10gW2FyZ3VtZW50c11cblxuIiwgJG9wdGlvbnMpOwoKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKG5ldyBJbnB1dERlZmluaXRpb24oJGFwcGxpY2F0aW9uLT5nZXREZWZpbml0aW9uKCktPmdldE9wdGlvbnMoKSksICRvcHRpb25zKTsKCiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CgokY29tbWFuZHMgPSAkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCk7CiRuYW1lc3BhY2VzID0gJGRlc2NyaXB0aW9uLT5nZXROYW1lc3BhY2VzKCk7CmlmICgkZGVzY3JpYmVkTmFtZXNwYWNlICYmICRuYW1lc3BhY2VzKSB7CgokZGVzY3JpYmVkTmFtZXNwYWNlSW5mbyA9IHJlc2V0KCRuYW1lc3BhY2VzKTsKZm9yZWFjaCAoJGRlc2NyaWJlZE5hbWVzcGFjZUluZm9bJ2NvbW1hbmRzJ10gYXMgJG5hbWUpIHsKJGNvbW1hbmRzWyRuYW1lXSA9ICRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZCgkbmFtZSk7Cn0KfQoKCiR3aWR0aCA9ICR0aGlzLT5nZXRDb2x1bW5XaWR0aChhcnJheV9tZXJnZSguLi5hcnJheV92YWx1ZXMoYXJyYXlfbWFwKGZ1bmN0aW9uICgkbmFtZXNwYWNlKSB1c2UgKCRjb21tYW5kcykgewpyZXR1cm4gYXJyYXlfaW50ZXJzZWN0KCRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10sIGFycmF5X2tleXMoJGNvbW1hbmRzKSk7Cn0sIGFycmF5X3ZhbHVlcygkbmFtZXNwYWNlcykpKSkpOwoKaWYgKCRkZXNjcmliZWROYW1lc3BhY2UpIHsKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCc8Y29tbWVudD5BdmFpbGFibGUgY29tbWFuZHMgZm9yIHRoZSAiJXMiIG5hbWVzcGFjZTo8L2NvbW1lbnQ+JywgJGRlc2NyaWJlZE5hbWVzcGFjZSksICRvcHRpb25zKTsKfSBlbHNlIHsKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+QXZhaWxhYmxlIGNvbW1hbmRzOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7Cn0KCmZvcmVhY2ggKCRuYW1lc3BhY2VzIGFzICRuYW1lc3BhY2UpIHsKJG5hbWVzcGFjZVsnY29tbWFuZHMnXSA9IGFycmF5X2ZpbHRlcigkbmFtZXNwYWNlWydjb21tYW5kcyddLCBmdW5jdGlvbiAoJG5hbWUpIHVzZSAoJGNvbW1hbmRzKSB7CnJldHVybiBpc3NldCgkY29tbWFuZHNbJG5hbWVdKTsKfSk7CgppZiAoISRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10pIHsKY29udGludWU7Cn0KCmlmICghJGRlc2NyaWJlZE5hbWVzcGFjZSAmJiBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uOjpHTE9CQUxfTkFNRVNQQUNFICE9PSAkbmFtZXNwYWNlWydpZCddKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoJyA8Y29tbWVudD4nLiRuYW1lc3BhY2VbJ2lkJ10uJzwvY29tbWVudD4nLCAkb3B0aW9ucyk7Cn0KCmZvcmVhY2ggKCRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10gYXMgJG5hbWUpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHNwYWNpbmdXaWR0aCA9ICR3aWR0aCAtIEhlbHBlcjo6d2lkdGgoJG5hbWUpOwokY29tbWFuZCA9ICRjb21tYW5kc1skbmFtZV07CiRjb21tYW5kQWxpYXNlcyA9ICRuYW1lID09PSAkY29tbWFuZC0+Z2V0TmFtZSgpID8gJHRoaXMtPmdldENvbW1hbmRBbGlhc2VzVGV4dCgkY29tbWFuZCkgOiAnJzsKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCcgIDxpbmZvPiVzPC9pbmZvPiVzJXMnLCAkbmFtZSwgc3RyX3JlcGVhdCgnICcsICRzcGFjaW5nV2lkdGgpLCAkY29tbWFuZEFsaWFzZXMuJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpLCAkb3B0aW9ucyk7Cn0KfQoKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlVGV4dChzdHJpbmcgJGNvbnRlbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlKAppc3NldCgkb3B0aW9uc1sncmF3X3RleHQnXSkgJiYgJG9wdGlvbnNbJ3Jhd190ZXh0J10gPyBzdHJpcF90YWdzKCRjb250ZW50KSA6ICRjb250ZW50LAppc3NldCgkb3B0aW9uc1sncmF3X291dHB1dCddKSA/ICEkb3B0aW9uc1sncmF3X291dHB1dCddIDogdHJ1ZQopOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbW1hbmRBbGlhc2VzVGV4dChDb21tYW5kICRjb21tYW5kKTogc3RyaW5nCnsKJHRleHQgPSAnJzsKJGFsaWFzZXMgPSAkY29tbWFuZC0+Z2V0QWxpYXNlcygpOwoKaWYgKCRhbGlhc2VzKSB7CiR0ZXh0ID0gJ1snLmltcGxvZGUoJ3wnLCAkYWxpYXNlcykuJ10gJzsKfQoKcmV0dXJuICR0ZXh0Owp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZm9ybWF0RGVmYXVsdFZhbHVlKCRkZWZhdWx0KTogc3RyaW5nCnsKaWYgKFxJTkYgPT09ICRkZWZhdWx0KSB7CnJldHVybiAnSU5GJzsKfQoKaWYgKFxpc19zdHJpbmcoJGRlZmF1bHQpKSB7CiRkZWZhdWx0ID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGRlZmF1bHQpOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRkZWZhdWx0KSkgewpmb3JlYWNoICgkZGVmYXVsdCBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoXGlzX3N0cmluZygkdmFsdWUpKSB7CiRkZWZhdWx0WyRrZXldID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHZhbHVlKTsKfQp9Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgnXFxcXCcsICdcXCcsIGpzb25fZW5jb2RlKCRkZWZhdWx0LCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IFxKU09OX1VORVNDQVBFRF9VTklDT0RFKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29sdW1uV2lkdGgoYXJyYXkgJGNvbW1hbmRzKTogaW50CnsKJHdpZHRocyA9IFtdOwoKZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRjb21tYW5kKSB7CmlmICgkY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmQpIHsKJHdpZHRoc1tdID0gSGVscGVyOjp3aWR0aCgkY29tbWFuZC0+Z2V0TmFtZSgpKTsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkYWxpYXMpIHsKJHdpZHRoc1tdID0gSGVscGVyOjp3aWR0aCgkYWxpYXMpOwp9Cn0gZWxzZSB7CiR3aWR0aHNbXSA9IEhlbHBlcjo6d2lkdGgoJGNvbW1hbmQpOwp9Cn0KCnJldHVybiAkd2lkdGhzID8gbWF4KCR3aWR0aHMpICsgMiA6IDA7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlVG90YWxXaWR0aEZvck9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiBpbnQKewokdG90YWxXaWR0aCA9IDA7CmZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24pIHsKCiRuYW1lTGVuZ3RoID0gMSArIG1heChIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldFNob3J0Y3V0KCkpLCAxKSArIDQgKyBIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldE5hbWUoKSk7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiRuYW1lTGVuZ3RoICs9IDYgKyBIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldE5hbWUoKSk7IAp9IGVsc2VpZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdmFsdWVMZW5ndGggPSAxICsgSGVscGVyOjp3aWR0aCgkb3B0aW9uLT5nZXROYW1lKCkpOyAKJHZhbHVlTGVuZ3RoICs9ICRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpID8gMiA6IDA7IAoKJG5hbWVMZW5ndGggKz0gJHZhbHVlTGVuZ3RoOwp9CiR0b3RhbFdpZHRoID0gbWF4KCR0b3RhbFdpZHRoLCAkbmFtZUxlbmd0aCk7Cn0KCnJldHVybiAkdG90YWxXaWR0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCgoKCgpjbGFzcyBYbWxEZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvcgp7CnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dERlZmluaXRpb25Eb2N1bWVudChJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CiRkb20tPmFwcGVuZENoaWxkKCRkZWZpbml0aW9uWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmaW5pdGlvbicpKTsKCiRkZWZpbml0aW9uWE1MLT5hcHBlbmRDaGlsZCgkYXJndW1lbnRzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnYXJndW1lbnRzJykpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiR0aGlzLT5hcHBlbmREb2N1bWVudCgkYXJndW1lbnRzWE1MLCAkdGhpcy0+Z2V0SW5wdXRBcmd1bWVudERvY3VtZW50KCRhcmd1bWVudCkpOwp9CgokZGVmaW5pdGlvblhNTC0+YXBwZW5kQ2hpbGQoJG9wdGlvbnNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdvcHRpb25zJykpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIGFzICRvcHRpb24pIHsKJHRoaXMtPmFwcGVuZERvY3VtZW50KCRvcHRpb25zWE1MLCAkdGhpcy0+Z2V0SW5wdXRPcHRpb25Eb2N1bWVudCgkb3B0aW9uKSk7Cn0KCnJldHVybiAkZG9tOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZERvY3VtZW50KENvbW1hbmQgJGNvbW1hbmQsIGJvb2wgJHNob3J0ID0gZmFsc2UpOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CiRkb20tPmFwcGVuZENoaWxkKCRjb21tYW5kWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnY29tbWFuZCcpKTsKCiRjb21tYW5kWE1MLT5zZXRBdHRyaWJ1dGUoJ2lkJywgJGNvbW1hbmQtPmdldE5hbWUoKSk7CiRjb21tYW5kWE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAkY29tbWFuZC0+Z2V0TmFtZSgpKTsKJGNvbW1hbmRYTUwtPnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJGNvbW1hbmQtPmlzSGlkZGVuKCkgPyAxIDogMCk7CgokY29tbWFuZFhNTC0+YXBwZW5kQ2hpbGQoJHVzYWdlc1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ3VzYWdlcycpKTsKCiRjb21tYW5kWE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZShzdHJfcmVwbGFjZSgiXG4iLCAiXG4gIiwgJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpKSk7CgppZiAoJHNob3J0KSB7CmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJHVzYWdlKSB7CiR1c2FnZXNYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ3VzYWdlJywgJHVzYWdlKSk7Cn0KfSBlbHNlIHsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGZhbHNlKTsKCmZvcmVhY2ggKGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0U3lub3BzaXMoKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCksICRjb21tYW5kLT5nZXRVc2FnZXMoKSkgYXMgJHVzYWdlKSB7CiR1c2FnZXNYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ3VzYWdlJywgJHVzYWdlKSk7Cn0KCiRjb21tYW5kWE1MLT5hcHBlbmRDaGlsZCgkaGVscFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2hlbHAnKSk7CiRoZWxwWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZShzdHJfcmVwbGFjZSgiXG4iLCAiXG4gIiwgJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKSkpKTsKCiRkZWZpbml0aW9uWE1MID0gJHRoaXMtPmdldElucHV0RGVmaW5pdGlvbkRvY3VtZW50KCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwokdGhpcy0+YXBwZW5kRG9jdW1lbnQoJGNvbW1hbmRYTUwsICRkZWZpbml0aW9uWE1MLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGVmaW5pdGlvbicpLT5pdGVtKDApKTsKfQoKcmV0dXJuICRkb207Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvbkRvY3VtZW50KEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgc3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCBib29sICRzaG9ydCA9IGZhbHNlKTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwokZG9tLT5hcHBlbmRDaGlsZCgkcm9vdFhtbCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ3N5bWZvbnknKSk7CgppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldE5hbWUoKSkgewokcm9vdFhtbC0+c2V0QXR0cmlidXRlKCduYW1lJywgJGFwcGxpY2F0aW9uLT5nZXROYW1lKCkpOwppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSkgewokcm9vdFhtbC0+c2V0QXR0cmlidXRlKCd2ZXJzaW9uJywgJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCkpOwp9Cn0KCiRyb290WG1sLT5hcHBlbmRDaGlsZCgkY29tbWFuZHNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdjb21tYW5kcycpKTsKCiRkZXNjcmlwdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCRhcHBsaWNhdGlvbiwgJG5hbWVzcGFjZSwgdHJ1ZSk7CgppZiAoJG5hbWVzcGFjZSkgewokY29tbWFuZHNYTUwtPnNldEF0dHJpYnV0ZSgnbmFtZXNwYWNlJywgJG5hbWVzcGFjZSk7Cn0KCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+YXBwZW5kRG9jdW1lbnQoJGNvbW1hbmRzWE1MLCAkdGhpcy0+Z2V0Q29tbWFuZERvY3VtZW50KCRjb21tYW5kLCAkc2hvcnQpKTsKfQoKaWYgKCEkbmFtZXNwYWNlKSB7CiRyb290WG1sLT5hcHBlbmRDaGlsZCgkbmFtZXNwYWNlc1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ25hbWVzcGFjZXMnKSk7Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldE5hbWVzcGFjZXMoKSBhcyAkbmFtZXNwYWNlRGVzY3JpcHRpb24pIHsKJG5hbWVzcGFjZXNYTUwtPmFwcGVuZENoaWxkKCRuYW1lc3BhY2VBcnJheVhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ25hbWVzcGFjZScpKTsKJG5hbWVzcGFjZUFycmF5WE1MLT5zZXRBdHRyaWJ1dGUoJ2lkJywgJG5hbWVzcGFjZURlc2NyaXB0aW9uWydpZCddKTsKCmZvcmVhY2ggKCRuYW1lc3BhY2VEZXNjcmlwdGlvblsnY29tbWFuZHMnXSBhcyAkbmFtZSkgewokbmFtZXNwYWNlQXJyYXlYTUwtPmFwcGVuZENoaWxkKCRjb21tYW5kWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnY29tbWFuZCcpKTsKJGNvbW1hbmRYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRuYW1lKSk7Cn0KfQp9CgpyZXR1cm4gJGRvbTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0SW5wdXRBcmd1bWVudERvY3VtZW50KCRhcmd1bWVudCkpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRJbnB1dE9wdGlvbkRvY3VtZW50KCRvcHRpb24pKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0SW5wdXREZWZpbml0aW9uRG9jdW1lbnQoJGRlZmluaXRpb24pKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRDb21tYW5kRG9jdW1lbnQoJGNvbW1hbmQsICRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0QXBwbGljYXRpb25Eb2N1bWVudCgkYXBwbGljYXRpb24sICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsLCAkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZERvY3VtZW50KFxET01Ob2RlICRwYXJlbnROb2RlLCBcRE9NTm9kZSAkaW1wb3J0ZWRQYXJlbnQpCnsKZm9yZWFjaCAoJGltcG9ydGVkUGFyZW50LT5jaGlsZE5vZGVzIGFzICRjaGlsZE5vZGUpIHsKJHBhcmVudE5vZGUtPmFwcGVuZENoaWxkKCRwYXJlbnROb2RlLT5vd25lckRvY3VtZW50LT5pbXBvcnROb2RlKCRjaGlsZE5vZGUsIHRydWUpKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlRG9jdW1lbnQoXERPTURvY3VtZW50ICRkb20pCnsKJGRvbS0+Zm9ybWF0T3V0cHV0ID0gdHJ1ZTsKJHRoaXMtPndyaXRlKCRkb20tPnNhdmVYTUwoKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXRBcmd1bWVudERvY3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50KTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwoKJGRvbS0+YXBwZW5kQ2hpbGQoJG9iamVjdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2FyZ3VtZW50JykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAkYXJndW1lbnQtPmdldE5hbWUoKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfcmVxdWlyZWQnLCAkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSA/IDEgOiAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc19hcnJheScsICRhcmd1bWVudC0+aXNBcnJheSgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkYXJndW1lbnQtPmdldERlc2NyaXB0aW9uKCkpKTsKCiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0c1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHRzJykpOwokZGVmYXVsdHMgPSBcaXNfYXJyYXkoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpID8gJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkgOiAoXGlzX2Jvb2woJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpID8gW3Zhcl9leHBvcnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCksIHRydWUpXSA6ICgkYXJndW1lbnQtPmdldERlZmF1bHQoKSA/IFskYXJndW1lbnQtPmdldERlZmF1bHQoKV0gOiBbXSkpOwpmb3JlYWNoICgkZGVmYXVsdHMgYXMgJGRlZmF1bHQpIHsKJGRlZmF1bHRzWE1MLT5hcHBlbmRDaGlsZCgkZGVmYXVsdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHQnKSk7CiRkZWZhdWx0WE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkZGVmYXVsdCkpOwp9CgpyZXR1cm4gJGRvbTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dE9wdGlvbkRvY3VtZW50KElucHV0T3B0aW9uICRvcHRpb24pOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CgokZG9tLT5hcHBlbmRDaGlsZCgkb2JqZWN0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnb3B0aW9uJykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnLS0nLiRvcHRpb24tPmdldE5hbWUoKSk7CiRwb3MgPSBzdHJwb3MoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/PyAnJywgJ3wnKTsKaWYgKGZhbHNlICE9PSAkcG9zKSB7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXQnLCAnLScuc3Vic3RyKCRvcHRpb24tPmdldFNob3J0Y3V0KCksIDAsICRwb3MpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdzaG9ydGN1dHMnLCAnLScuc3RyX3JlcGxhY2UoJ3wnLCAnfC0nLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSk7Cn0gZWxzZSB7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXQnLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8gJy0nLiRvcHRpb24tPmdldFNob3J0Y3V0KCkgOiAnJyk7Cn0KJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdhY2NlcHRfdmFsdWUnLCAkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX3ZhbHVlX3JlcXVpcmVkJywgJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfbXVsdGlwbGUnLCAkb3B0aW9uLT5pc0FycmF5KCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZXNjcmlwdGlvblhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2Rlc2NyaXB0aW9uJykpOwokZGVzY3JpcHRpb25YTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpKTsKCmlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiRkZWZhdWx0cyA9IFxpc19hcnJheSgkb3B0aW9uLT5nZXREZWZhdWx0KCkpID8gJG9wdGlvbi0+Z2V0RGVmYXVsdCgpIDogKFxpc19ib29sKCRvcHRpb24tPmdldERlZmF1bHQoKSkgPyBbdmFyX2V4cG9ydCgkb3B0aW9uLT5nZXREZWZhdWx0KCksIHRydWUpXSA6ICgkb3B0aW9uLT5nZXREZWZhdWx0KCkgPyBbJG9wdGlvbi0+Z2V0RGVmYXVsdCgpXSA6IFtdKSk7CiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0c1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHRzJykpOwoKaWYgKCFlbXB0eSgkZGVmYXVsdHMpKSB7CmZvcmVhY2ggKCRkZWZhdWx0cyBhcyAkZGVmYXVsdCkgewokZGVmYXVsdHNYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmYXVsdCcpKTsKJGRlZmF1bHRYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRkZWZhdWx0KSk7Cn0KfQp9CgppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokZG9tLT5hcHBlbmRDaGlsZCgkb2JqZWN0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnb3B0aW9uJykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnLS1uby0nLiRvcHRpb24tPmdldE5hbWUoKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXQnLCAnJyk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnYWNjZXB0X3ZhbHVlJywgMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfdmFsdWVfcmVxdWlyZWQnLCAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc19tdWx0aXBsZScsIDApOwokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgnTmVnYXRlIHRoZSAiLS0nLiRvcHRpb24tPmdldE5hbWUoKS4nIiBvcHRpb24nKSk7Cn0KCnJldHVybiAkZG9tOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKCgoKCgpmaW5hbCBjbGFzcyBDb25zb2xlQ29tbWFuZEV2ZW50IGV4dGVuZHMgQ29uc29sZUV2ZW50CnsKCgoKcHVibGljIGNvbnN0IFJFVFVSTl9DT0RFX0RJU0FCTEVEID0gMTEzOwoKCgoKcHJpdmF0ZSAkY29tbWFuZFNob3VsZFJ1biA9IHRydWU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZUNvbW1hbmQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y29tbWFuZFNob3VsZFJ1biA9IGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlQ29tbWFuZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kU2hvdWxkUnVuID0gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbW1hbmRTaG91bGRSdW4oKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y29tbWFuZFNob3VsZFJ1bjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVFcnJvckV2ZW50IGV4dGVuZHMgQ29uc29sZUV2ZW50CnsKcHJpdmF0ZSAkZXJyb3I7CnByaXZhdGUgJGV4aXRDb2RlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFxUaHJvd2FibGUgJGVycm9yLCBDb21tYW5kICRjb21tYW5kID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQpOwoKJHRoaXMtPmVycm9yID0gJGVycm9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3IoKTogXFRocm93YWJsZQp7CnJldHVybiAkdGhpcy0+ZXJyb3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvcihcVGhyb3dhYmxlICRlcnJvcik6IHZvaWQKewokdGhpcy0+ZXJyb3IgPSAkZXJyb3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFeGl0Q29kZShpbnQgJGV4aXRDb2RlKTogdm9pZAp7CiR0aGlzLT5leGl0Q29kZSA9ICRleGl0Q29kZTsKCiRyID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJHRoaXMtPmVycm9yLCAnY29kZScpOwokci0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHItPnNldFZhbHVlKCR0aGlzLT5lcnJvciwgJHRoaXMtPmV4aXRDb2RlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlKCk6IGludAp7CnJldHVybiAkdGhpcy0+ZXhpdENvZGUgPz8gKFxpc19pbnQoJHRoaXMtPmVycm9yLT5nZXRDb2RlKCkpICYmIDAgIT09ICR0aGlzLT5lcnJvci0+Z2V0Q29kZSgpID8gJHRoaXMtPmVycm9yLT5nZXRDb2RlKCkgOiAxKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbnRyYWN0c1xFdmVudERpc3BhdGNoZXJcRXZlbnQ7CgoKCgoKCmNsYXNzIENvbnNvbGVFdmVudCBleHRlbmRzIEV2ZW50CnsKcHJvdGVjdGVkICRjb21tYW5kOwoKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJG91dHB1dDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/Q29tbWFuZCAkY29tbWFuZCwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKCkKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCkKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVTaWduYWxFdmVudCBleHRlbmRzIENvbnNvbGVFdmVudAp7CnByaXZhdGUgJGhhbmRsaW5nU2lnbmFsOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbW1hbmQgJGNvbW1hbmQsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGludCAkaGFuZGxpbmdTaWduYWwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKJHRoaXMtPmhhbmRsaW5nU2lnbmFsID0gJGhhbmRsaW5nU2lnbmFsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGFuZGxpbmdTaWduYWwoKTogaW50CnsKcmV0dXJuICR0aGlzLT5oYW5kbGluZ1NpZ25hbDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVUZXJtaW5hdGVFdmVudCBleHRlbmRzIENvbnNvbGVFdmVudAp7CnByaXZhdGUgJGV4aXRDb2RlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbW1hbmQgJGNvbW1hbmQsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGludCAkZXhpdENvZGUpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKCiR0aGlzLT5zZXRFeGl0Q29kZSgkZXhpdENvZGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RXhpdENvZGUoaW50ICRleGl0Q29kZSk6IHZvaWQKewokdGhpcy0+ZXhpdENvZGUgPSAkZXhpdENvZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGl0Q29kZSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmV4aXRDb2RlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50TGlzdGVuZXI7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbnNvbGVFdmVudHM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVFcnJvckV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVUZXJtaW5hdGVFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEV2ZW50RGlzcGF0Y2hlclxFdmVudFN1YnNjcmliZXJJbnRlcmZhY2U7CgoKCgoKY2xhc3MgRXJyb3JMaXN0ZW5lciBpbXBsZW1lbnRzIEV2ZW50U3Vic2NyaWJlckludGVyZmFjZQp7CnByaXZhdGUgJGxvZ2dlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBvbkNvbnNvbGVFcnJvcihDb25zb2xlRXJyb3JFdmVudCAkZXZlbnQpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5sb2dnZXIpIHsKcmV0dXJuOwp9CgokZXJyb3IgPSAkZXZlbnQtPmdldEVycm9yKCk7CgppZiAoISRpbnB1dFN0cmluZyA9ICR0aGlzLT5nZXRJbnB1dFN0cmluZygkZXZlbnQpKSB7CiR0aGlzLT5sb2dnZXItPmNyaXRpY2FsKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB1c2luZyB0aGUgY29uc29sZS4gTWVzc2FnZTogInttZXNzYWdlfSInLCBbJ2V4Y2VwdGlvbicgPT4gJGVycm9yLCAnbWVzc2FnZScgPT4gJGVycm9yLT5nZXRNZXNzYWdlKCldKTsKCnJldHVybjsKfQoKJHRoaXMtPmxvZ2dlci0+Y3JpdGljYWwoJ0Vycm9yIHRocm93biB3aGlsZSBydW5uaW5nIGNvbW1hbmQgIntjb21tYW5kfSIuIE1lc3NhZ2U6ICJ7bWVzc2FnZX0iJywgWydleGNlcHRpb24nID0+ICRlcnJvciwgJ2NvbW1hbmQnID0+ICRpbnB1dFN0cmluZywgJ21lc3NhZ2UnID0+ICRlcnJvci0+Z2V0TWVzc2FnZSgpXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBvbkNvbnNvbGVUZXJtaW5hdGUoQ29uc29sZVRlcm1pbmF0ZUV2ZW50ICRldmVudCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxvZ2dlcikgewpyZXR1cm47Cn0KCiRleGl0Q29kZSA9ICRldmVudC0+Z2V0RXhpdENvZGUoKTsKCmlmICgwID09PSAkZXhpdENvZGUpIHsKcmV0dXJuOwp9CgppZiAoISRpbnB1dFN0cmluZyA9ICR0aGlzLT5nZXRJbnB1dFN0cmluZygkZXZlbnQpKSB7CiR0aGlzLT5sb2dnZXItPmRlYnVnKCdUaGUgY29uc29sZSBleGl0ZWQgd2l0aCBjb2RlICJ7Y29kZX0iJywgWydjb2RlJyA9PiAkZXhpdENvZGVdKTsKCnJldHVybjsKfQoKJHRoaXMtPmxvZ2dlci0+ZGVidWcoJ0NvbW1hbmQgIntjb21tYW5kfSIgZXhpdGVkIHdpdGggY29kZSAie2NvZGV9IicsIFsnY29tbWFuZCcgPT4gJGlucHV0U3RyaW5nLCAnY29kZScgPT4gJGV4aXRDb2RlXSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZEV2ZW50cygpCnsKcmV0dXJuIFsKQ29uc29sZUV2ZW50czo6RVJST1IgPT4gWydvbkNvbnNvbGVFcnJvcicsIC0xMjhdLApDb25zb2xlRXZlbnRzOjpURVJNSU5BVEUgPT4gWydvbkNvbnNvbGVUZXJtaW5hdGUnLCAtMTI4XSwKXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5wdXRTdHJpbmcoQ29uc29sZUV2ZW50ICRldmVudCk6ID9zdHJpbmcKewokY29tbWFuZE5hbWUgPSAkZXZlbnQtPmdldENvbW1hbmQoKSA/ICRldmVudC0+Z2V0Q29tbWFuZCgpLT5nZXROYW1lKCkgOiBudWxsOwokaW5wdXQgPSAkZXZlbnQtPmdldElucHV0KCk7CgppZiAobWV0aG9kX2V4aXN0cygkaW5wdXQsICdfX3RvU3RyaW5nJykpIHsKaWYgKCRjb21tYW5kTmFtZSkgewpyZXR1cm4gc3RyX3JlcGxhY2UoWyInJGNvbW1hbmROYW1lJyIsICJcIiRjb21tYW5kTmFtZVwiIl0sICRjb21tYW5kTmFtZSwgKHN0cmluZykgJGlucHV0KTsKfQoKcmV0dXJuIChzdHJpbmcpICRpbnB1dDsKfQoKcmV0dXJuICRjb21tYW5kTmFtZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewpwcml2YXRlICRhbHRlcm5hdGl2ZXM7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlLCBhcnJheSAkYWx0ZXJuYXRpdmVzID0gW10sIGludCAkY29kZSA9IDAsIFxUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzKTsKCiR0aGlzLT5hbHRlcm5hdGl2ZXMgPSAkYWx0ZXJuYXRpdmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWx0ZXJuYXRpdmVzKCkKewpyZXR1cm4gJHRoaXMtPmFsdGVybmF0aXZlczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSW52YWxpZE9wdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgpjbGFzcyBMb2dpY0V4Y2VwdGlvbiBleHRlbmRzIFxMb2dpY0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgTWlzc2luZ0lucHV0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgpmaW5hbCBjbGFzcyBOdWxsT3V0cHV0Rm9ybWF0dGVyIGltcGxlbWVudHMgT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlCnsKcHJpdmF0ZSAkc3R5bGU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0KD9zdHJpbmcgJG1lc3NhZ2UpOiA/c3RyaW5nCnsKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZShzdHJpbmcgJG5hbWUpOiBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZQp7CgpyZXR1cm4gJHRoaXMtPnN0eWxlID8/ICR0aGlzLT5zdHlsZSA9IG5ldyBOdWxsT3V0cHV0Rm9ybWF0dGVyU3R5bGUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1N0eWxlKHN0cmluZyAkbmFtZSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCk6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0eWxlKHN0cmluZyAkbmFtZSwgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKTogdm9pZAp7Cgp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCgoKCmZpbmFsIGNsYXNzIE51bGxPdXRwdXRGb3JtYXR0ZXJTdHlsZSBpbXBsZW1lbnRzIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGx5KHN0cmluZyAkdGV4dCk6IHN0cmluZwp7CnJldHVybiAkdGV4dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJhY2tncm91bmQoc3RyaW5nICRjb2xvciA9IG51bGwpOiB2b2lkCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JlZ3JvdW5kKHN0cmluZyAkY29sb3IgPSBudWxsKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTogdm9pZAp7Cgp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Cgp1c2UgZnVuY3Rpb24gU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXGI7CgoKCgoKCgpjbGFzcyBPdXRwdXRGb3JtYXR0ZXIgaW1wbGVtZW50cyBXcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UKewpwcml2YXRlICRkZWNvcmF0ZWQ7CnByaXZhdGUgJHN0eWxlcyA9IFtdOwpwcml2YXRlICRzdHlsZVN0YWNrOwoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5zdHlsZVN0YWNrID0gY2xvbmUgJHRoaXMtPnN0eWxlU3RhY2s7CmZvcmVhY2ggKCR0aGlzLT5zdHlsZXMgYXMgJGtleSA9PiAkdmFsdWUpIHsKJHRoaXMtPnN0eWxlc1ska2V5XSA9IGNsb25lICR2YWx1ZTsKfQp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlKHN0cmluZyAkdGV4dCkKewokdGV4dCA9IHByZWdfcmVwbGFjZSgnLyhbXlxcXFxdfF4pKFs8Pl0pLycsICckMVxcXFwkMicsICR0ZXh0KTsKCnJldHVybiBzZWxmOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkdGV4dCk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGVUcmFpbGluZ0JhY2tzbGFzaChzdHJpbmcgJHRleHQpOiBzdHJpbmcKewppZiAoc3RyX2VuZHNfd2l0aCgkdGV4dCwgJ1xcJykpIHsKJGxlbiA9IFxzdHJsZW4oJHRleHQpOwokdGV4dCA9IHJ0cmltKCR0ZXh0LCAnXFwnKTsKJHRleHQgPSBzdHJfcmVwbGFjZSgiXDAiLCAnJywgJHRleHQpOwokdGV4dCAuPSBzdHJfcmVwZWF0KCJcMCIsICRsZW4gLSBcc3RybGVuKCR0ZXh0KSk7Cn0KCnJldHVybiAkdGV4dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkZGVjb3JhdGVkID0gZmFsc2UsIGFycmF5ICRzdHlsZXMgPSBbXSkKewokdGhpcy0+ZGVjb3JhdGVkID0gJGRlY29yYXRlZDsKCiR0aGlzLT5zZXRTdHlsZSgnZXJyb3InLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ3doaXRlJywgJ3JlZCcpKTsKJHRoaXMtPnNldFN0eWxlKCdpbmZvJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdncmVlbicpKTsKJHRoaXMtPnNldFN0eWxlKCdjb21tZW50JywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCd5ZWxsb3cnKSk7CiR0aGlzLT5zZXRTdHlsZSgncXVlc3Rpb24nLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2JsYWNrJywgJ2N5YW4nKSk7Cgpmb3JlYWNoICgkc3R5bGVzIGFzICRuYW1lID0+ICRzdHlsZSkgewokdGhpcy0+c2V0U3R5bGUoJG5hbWUsICRzdHlsZSk7Cn0KCiR0aGlzLT5zdHlsZVN0YWNrID0gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlU3RhY2soKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpCnsKJHRoaXMtPmRlY29yYXRlZCA9ICRkZWNvcmF0ZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5kZWNvcmF0ZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHlsZShzdHJpbmcgJG5hbWUsIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRzdHlsZSkKewokdGhpcy0+c3R5bGVzW3N0cnRvbG93ZXIoJG5hbWUpXSA9ICRzdHlsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1N0eWxlKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPnN0eWxlc1tzdHJ0b2xvd2VyKCRuYW1lKV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmhhc1N0eWxlKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1VuZGVmaW5lZCBzdHlsZTogIiVzIi4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPnN0eWxlc1tzdHJ0b2xvd2VyKCRuYW1lKV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoP3N0cmluZyAkbWVzc2FnZSkKewpyZXR1cm4gJHRoaXMtPmZvcm1hdEFuZFdyYXAoJG1lc3NhZ2UsIDApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0QW5kV3JhcCg/c3RyaW5nICRtZXNzYWdlLCBpbnQgJHdpZHRoKQp7CmlmIChudWxsID09PSAkbWVzc2FnZSkgewpyZXR1cm4gJyc7Cn0KCiRvZmZzZXQgPSAwOwokb3V0cHV0ID0gJyc7CiRvcGVuVGFnUmVnZXggPSAnW2Etel0oPzpbXlxcXFw8Pl0qKyB8IFxcXFwuKSonOwokY2xvc2VUYWdSZWdleCA9ICdbYS16XVtePD5dKisnOwokY3VycmVudExpbmVMZW5ndGggPSAwOwpwcmVnX21hdGNoX2FsbCgiIzwoKCRvcGVuVGFnUmVnZXgpIHwgLygkY2xvc2VUYWdSZWdleCk/KT4jaXgiLCAkbWVzc2FnZSwgJG1hdGNoZXMsIFxQUkVHX09GRlNFVF9DQVBUVVJFKTsKZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJGkgPT4gJG1hdGNoKSB7CiRwb3MgPSAkbWF0Y2hbMV07CiR0ZXh0ID0gJG1hdGNoWzBdOwoKaWYgKDAgIT0gJHBvcyAmJiAnXFwnID09ICRtZXNzYWdlWyRwb3MgLSAxXSkgewpjb250aW51ZTsKfQoKCiRvdXRwdXQgLj0gJHRoaXMtPmFwcGx5Q3VycmVudFN0eWxlKHN1YnN0cigkbWVzc2FnZSwgJG9mZnNldCwgJHBvcyAtICRvZmZzZXQpLCAkb3V0cHV0LCAkd2lkdGgsICRjdXJyZW50TGluZUxlbmd0aCk7CiRvZmZzZXQgPSAkcG9zICsgXHN0cmxlbigkdGV4dCk7CgoKaWYgKCRvcGVuID0gJy8nICE9ICR0ZXh0WzFdKSB7CiR0YWcgPSAkbWF0Y2hlc1sxXVskaV1bMF07Cn0gZWxzZSB7CiR0YWcgPSAkbWF0Y2hlc1szXVskaV1bMF0gPz8gJyc7Cn0KCmlmICghJG9wZW4gJiYgISR0YWcpIHsKCiR0aGlzLT5zdHlsZVN0YWNrLT5wb3AoKTsKfSBlbHNlaWYgKG51bGwgPT09ICRzdHlsZSA9ICR0aGlzLT5jcmVhdGVTdHlsZUZyb21TdHJpbmcoJHRhZykpIHsKJG91dHB1dCAuPSAkdGhpcy0+YXBwbHlDdXJyZW50U3R5bGUoJHRleHQsICRvdXRwdXQsICR3aWR0aCwgJGN1cnJlbnRMaW5lTGVuZ3RoKTsKfSBlbHNlaWYgKCRvcGVuKSB7CiR0aGlzLT5zdHlsZVN0YWNrLT5wdXNoKCRzdHlsZSk7Cn0gZWxzZSB7CiR0aGlzLT5zdHlsZVN0YWNrLT5wb3AoJHN0eWxlKTsKfQp9Cgokb3V0cHV0IC49ICR0aGlzLT5hcHBseUN1cnJlbnRTdHlsZShzdWJzdHIoJG1lc3NhZ2UsICRvZmZzZXQpLCAkb3V0cHV0LCAkd2lkdGgsICRjdXJyZW50TGluZUxlbmd0aCk7CgpyZXR1cm4gc3RydHIoJG91dHB1dCwgWyJcMCIgPT4gJ1xcJywgJ1xcPCcgPT4gJzwnLCAnXFw+JyA9PiAnPiddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlU3RhY2soKQp7CnJldHVybiAkdGhpcy0+c3R5bGVTdGFjazsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVTdHlsZUZyb21TdHJpbmcoc3RyaW5nICRzdHJpbmcpOiA/T3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewppZiAoaXNzZXQoJHRoaXMtPnN0eWxlc1skc3RyaW5nXSkpIHsKcmV0dXJuICR0aGlzLT5zdHlsZXNbJHN0cmluZ107Cn0KCmlmICghcHJlZ19tYXRjaF9hbGwoJy8oW149XSspPShbXjtdKykoO3wkKS8nLCAkc3RyaW5nLCAkbWF0Y2hlcywgXFBSRUdfU0VUX09SREVSKSkgewpyZXR1cm4gbnVsbDsKfQoKJHN0eWxlID0gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCk7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaCkgewphcnJheV9zaGlmdCgkbWF0Y2gpOwokbWF0Y2hbMF0gPSBzdHJ0b2xvd2VyKCRtYXRjaFswXSk7CgppZiAoJ2ZnJyA9PSAkbWF0Y2hbMF0pIHsKJHN0eWxlLT5zZXRGb3JlZ3JvdW5kKHN0cnRvbG93ZXIoJG1hdGNoWzFdKSk7Cn0gZWxzZWlmICgnYmcnID09ICRtYXRjaFswXSkgewokc3R5bGUtPnNldEJhY2tncm91bmQoc3RydG9sb3dlcigkbWF0Y2hbMV0pKTsKfSBlbHNlaWYgKCdocmVmJyA9PT0gJG1hdGNoWzBdKSB7CiR1cmwgPSBwcmVnX3JlcGxhY2UoJ3tcXFxcKFs8Pl0pfScsICckMScsICRtYXRjaFsxXSk7CiRzdHlsZS0+c2V0SHJlZigkdXJsKTsKfSBlbHNlaWYgKCdvcHRpb25zJyA9PT0gJG1hdGNoWzBdKSB7CnByZWdfbWF0Y2hfYWxsKCcoW14sO10rKScsIHN0cnRvbG93ZXIoJG1hdGNoWzFdKSwgJG9wdGlvbnMpOwokb3B0aW9ucyA9IGFycmF5X3NoaWZ0KCRvcHRpb25zKTsKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewokc3R5bGUtPnNldE9wdGlvbigkb3B0aW9uKTsKfQp9IGVsc2UgewpyZXR1cm4gbnVsbDsKfQp9CgpyZXR1cm4gJHN0eWxlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGx5Q3VycmVudFN0eWxlKHN0cmluZyAkdGV4dCwgc3RyaW5nICRjdXJyZW50LCBpbnQgJHdpZHRoLCBpbnQgJiRjdXJyZW50TGluZUxlbmd0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHRleHQpIHsKcmV0dXJuICcnOwp9CgppZiAoISR3aWR0aCkgewpyZXR1cm4gJHRoaXMtPmlzRGVjb3JhdGVkKCkgPyAkdGhpcy0+c3R5bGVTdGFjay0+Z2V0Q3VycmVudCgpLT5hcHBseSgkdGV4dCkgOiAkdGV4dDsKfQoKaWYgKCEkY3VycmVudExpbmVMZW5ndGggJiYgJycgIT09ICRjdXJyZW50KSB7CiR0ZXh0ID0gbHRyaW0oJHRleHQpOwp9CgppZiAoJGN1cnJlbnRMaW5lTGVuZ3RoKSB7CiRwcmVmaXggPSBzdWJzdHIoJHRleHQsIDAsICRpID0gJHdpZHRoIC0gJGN1cnJlbnRMaW5lTGVuZ3RoKS4iXG4iOwokdGV4dCA9IHN1YnN0cigkdGV4dCwgJGkpOwp9IGVsc2UgewokcHJlZml4ID0gJyc7Cn0KCnByZWdfbWF0Y2goJ34oXFxuKSR+JywgJHRleHQsICRtYXRjaGVzKTsKJHRleHQgPSAkcHJlZml4LiR0aGlzLT5hZGRMaW5lQnJlYWtzKCR0ZXh0LCAkd2lkdGgpOwokdGV4dCA9IHJ0cmltKCR0ZXh0LCAiXG4iKS4oJG1hdGNoZXNbMV0gPz8gJycpOwoKaWYgKCEkY3VycmVudExpbmVMZW5ndGggJiYgJycgIT09ICRjdXJyZW50ICYmICJcbiIgIT09IHN1YnN0cigkY3VycmVudCwgLTEpKSB7CiR0ZXh0ID0gIlxuIi4kdGV4dDsKfQoKJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkdGV4dCk7Cgpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKJGN1cnJlbnRMaW5lTGVuZ3RoICs9IFxzdHJsZW4oJGxpbmUpOwppZiAoJHdpZHRoIDw9ICRjdXJyZW50TGluZUxlbmd0aCkgewokY3VycmVudExpbmVMZW5ndGggPSAwOwp9Cn0KCmlmICgkdGhpcy0+aXNEZWNvcmF0ZWQoKSkgewpmb3JlYWNoICgkbGluZXMgYXMgJGkgPT4gJGxpbmUpIHsKJGxpbmVzWyRpXSA9ICR0aGlzLT5zdHlsZVN0YWNrLT5nZXRDdXJyZW50KCktPmFwcGx5KCRsaW5lKTsKfQp9CgpyZXR1cm4gaW1wbG9kZSgiXG4iLCAkbGluZXMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGFkZExpbmVCcmVha3Moc3RyaW5nICR0ZXh0LCBpbnQgJHdpZHRoKTogc3RyaW5nCnsKJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCR0ZXh0LCBudWxsLCB0cnVlKSA/OiAnVVRGLTgnOwoKcmV0dXJuIGIoJHRleHQpLT50b0NvZGVQb2ludFN0cmluZygkZW5jb2RpbmcpLT53b3Jkd3JhcCgkd2lkdGgsICJcbiIsIHRydWUpLT50b0J5dGVTdHJpbmcoJGVuY29kaW5nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgoKCmludGVyZmFjZSBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0eWxlKHN0cmluZyAkbmFtZSwgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1N0eWxlKHN0cmluZyAkbmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlKHN0cmluZyAkbmFtZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoP3N0cmluZyAkbWVzc2FnZSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbG9yOwoKCgoKCgpjbGFzcyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSBpbXBsZW1lbnRzIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKcHJpdmF0ZSAkY29sb3I7CnByaXZhdGUgJGZvcmVncm91bmQ7CnByaXZhdGUgJGJhY2tncm91bmQ7CnByaXZhdGUgJG9wdGlvbnM7CnByaXZhdGUgJGhyZWY7CnByaXZhdGUgJGhhbmRsZXNIcmVmR3JhY2VmdWxseTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGZvcmVncm91bmQgPSBudWxsLCBzdHJpbmcgJGJhY2tncm91bmQgPSBudWxsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCA9ICRmb3JlZ3JvdW5kID86ICcnLCAkdGhpcy0+YmFja2dyb3VuZCA9ICRiYWNrZ3JvdW5kID86ICcnLCAkdGhpcy0+b3B0aW9ucyA9ICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcmVncm91bmQoc3RyaW5nICRjb2xvciA9IG51bGwpCnsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kID0gJGNvbG9yID86ICcnLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFja2dyb3VuZChzdHJpbmcgJGNvbG9yID0gbnVsbCkKewokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQsICR0aGlzLT5iYWNrZ3JvdW5kID0gJGNvbG9yID86ICcnLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIcmVmKHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5ocmVmID0gJHVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG9wdGlvbikKewokdGhpcy0+b3B0aW9uc1tdID0gJG9wdGlvbjsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5zZXRPcHRpb24oc3RyaW5nICRvcHRpb24pCnsKJHBvcyA9IGFycmF5X3NlYXJjaCgkb3B0aW9uLCAkdGhpcy0+b3B0aW9ucyk7CmlmIChmYWxzZSAhPT0gJHBvcykgewp1bnNldCgkdGhpcy0+b3B0aW9uc1skcG9zXSk7Cn0KCiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCwgJHRoaXMtPmJhY2tncm91bmQsICR0aGlzLT5vcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBseShzdHJpbmcgJHRleHQpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5oYW5kbGVzSHJlZkdyYWNlZnVsbHkpIHsKJHRoaXMtPmhhbmRsZXNIcmVmR3JhY2VmdWxseSA9ICdKZXRCcmFpbnMtSmVkaVRlcm0nICE9PSBnZXRlbnYoJ1RFUk1JTkFMX0VNVUxBVE9SJykKJiYgKCFnZXRlbnYoJ0tPTlNPTEVfVkVSU0lPTicpIHx8IChpbnQpIGdldGVudignS09OU09MRV9WRVJTSU9OJykgPiAyMDExMDApCiYmICFpc3NldCgkX1NFUlZFUlsnSURFQV9JTklUSUFMX0RJUkVDVE9SWSddKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5ocmVmICYmICR0aGlzLT5oYW5kbGVzSHJlZkdyYWNlZnVsbHkpIHsKJHRleHQgPSAiXDAzM104OzskdGhpcy0+aHJlZlwwMzNcXCR0ZXh0XDAzM104OztcMDMzXFwiOwp9CgpyZXR1cm4gJHRoaXMtPmNvbG9yLT5hcHBseSgkdGV4dCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKCgoKCgppbnRlcmZhY2UgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9yZWdyb3VuZChzdHJpbmcgJGNvbG9yID0gbnVsbCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFja2dyb3VuZChzdHJpbmcgJGNvbG9yID0gbnVsbCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnNldE9wdGlvbihzdHJpbmcgJG9wdGlvbik7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBseShzdHJpbmcgJHRleHQpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxSZXNldEludGVyZmFjZTsKCgoKCmNsYXNzIE91dHB1dEZvcm1hdHRlclN0eWxlU3RhY2sgaW1wbGVtZW50cyBSZXNldEludGVyZmFjZQp7CgoKCnByaXZhdGUgJHN0eWxlczsKCnByaXZhdGUgJGVtcHR5U3R5bGU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJGVtcHR5U3R5bGUgPSBudWxsKQp7CiR0aGlzLT5lbXB0eVN0eWxlID0gJGVtcHR5U3R5bGUgPz8gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCk7CiR0aGlzLT5yZXNldCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7CiR0aGlzLT5zdHlsZXMgPSBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHB1c2goT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKQp7CiR0aGlzLT5zdHlsZXNbXSA9ICRzdHlsZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwb3AoT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlID0gbnVsbCkKewppZiAoZW1wdHkoJHRoaXMtPnN0eWxlcykpIHsKcmV0dXJuICR0aGlzLT5lbXB0eVN0eWxlOwp9CgppZiAobnVsbCA9PT0gJHN0eWxlKSB7CnJldHVybiBhcnJheV9wb3AoJHRoaXMtPnN0eWxlcyk7Cn0KCmZvcmVhY2ggKGFycmF5X3JldmVyc2UoJHRoaXMtPnN0eWxlcywgdHJ1ZSkgYXMgJGluZGV4ID0+ICRzdGFja2VkU3R5bGUpIHsKaWYgKCRzdHlsZS0+YXBwbHkoJycpID09PSAkc3RhY2tlZFN0eWxlLT5hcHBseSgnJykpIHsKJHRoaXMtPnN0eWxlcyA9IFxhcnJheV9zbGljZSgkdGhpcy0+c3R5bGVzLCAwLCAkaW5kZXgpOwoKcmV0dXJuICRzdGFja2VkU3R5bGU7Cn0KfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW5jb3JyZWN0bHkgbmVzdGVkIHN0eWxlIHRhZyBmb3VuZC4nKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudCgpCnsKaWYgKGVtcHR5KCR0aGlzLT5zdHlsZXMpKSB7CnJldHVybiAkdGhpcy0+ZW1wdHlTdHlsZTsKfQoKcmV0dXJuICR0aGlzLT5zdHlsZXNbXGNvdW50KCR0aGlzLT5zdHlsZXMpIC0gMV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFbXB0eVN0eWxlKE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRlbXB0eVN0eWxlKQp7CiR0aGlzLT5lbXB0eVN0eWxlID0gJGVtcHR5U3R5bGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFbXB0eVN0eWxlKCkKewpyZXR1cm4gJHRoaXMtPmVtcHR5U3R5bGU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKCgoKCgppbnRlcmZhY2UgV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlIGV4dGVuZHMgT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdEFuZFdyYXAoP3N0cmluZyAkbWVzc2FnZSwgaW50ICR3aWR0aCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCgoKCgoKCgpjbGFzcyBEZWJ1Z0Zvcm1hdHRlckhlbHBlciBleHRlbmRzIEhlbHBlcgp7CnByaXZhdGUgY29uc3QgQ09MT1JTID0gWydibGFjaycsICdyZWQnLCAnZ3JlZW4nLCAneWVsbG93JywgJ2JsdWUnLCAnbWFnZW50YScsICdjeWFuJywgJ3doaXRlJywgJ2RlZmF1bHQnXTsKcHJpdmF0ZSAkc3RhcnRlZCA9IFtdOwpwcml2YXRlICRjb3VudCA9IC0xOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnQoc3RyaW5nICRpZCwgc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJHByZWZpeCA9ICdSVU4nKQp7CiR0aGlzLT5zdGFydGVkWyRpZF0gPSBbJ2JvcmRlcicgPT4gKyskdGhpcy0+Y291bnQgJSBcY291bnQoc2VsZjo6Q09MT1JTKV07CgpyZXR1cm4gc3ByaW50ZigiJXM8Ymc9Ymx1ZTtmZz13aGl0ZT4gJXMgPC8+IDxmZz1ibHVlPiVzPC8+XG4iLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRwcmVmaXgsICRtZXNzYWdlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3Moc3RyaW5nICRpZCwgc3RyaW5nICRidWZmZXIsIGJvb2wgJGVycm9yID0gZmFsc2UsIHN0cmluZyAkcHJlZml4ID0gJ09VVCcsIHN0cmluZyAkZXJyb3JQcmVmaXggPSAnRVJSJykKewokbWVzc2FnZSA9ICcnOwoKaWYgKCRlcnJvcikgewppZiAoaXNzZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnb3V0J10pKSB7CiRtZXNzYWdlIC49ICJcbiI7CnVuc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ291dCddKTsKfQppZiAoIWlzc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ2VyciddKSkgewokbWVzc2FnZSAuPSBzcHJpbnRmKCclczxiZz1yZWQ7Zmc9d2hpdGU+ICVzIDwvPiAnLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRlcnJvclByZWZpeCk7CiR0aGlzLT5zdGFydGVkWyRpZF1bJ2VyciddID0gdHJ1ZTsKfQoKJG1lc3NhZ2UgLj0gc3RyX3JlcGxhY2UoIlxuIiwgc3ByaW50ZigiXG4lczxiZz1yZWQ7Zmc9d2hpdGU+ICVzIDwvPiAiLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRlcnJvclByZWZpeCksICRidWZmZXIpOwp9IGVsc2UgewppZiAoaXNzZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnZXJyJ10pKSB7CiRtZXNzYWdlIC49ICJcbiI7CnVuc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ2VyciddKTsKfQppZiAoIWlzc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ291dCddKSkgewokbWVzc2FnZSAuPSBzcHJpbnRmKCclczxiZz1ncmVlbjtmZz13aGl0ZT4gJXMgPC8+ICcsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJHByZWZpeCk7CiR0aGlzLT5zdGFydGVkWyRpZF1bJ291dCddID0gdHJ1ZTsKfQoKJG1lc3NhZ2UgLj0gc3RyX3JlcGxhY2UoIlxuIiwgc3ByaW50ZigiXG4lczxiZz1ncmVlbjtmZz13aGl0ZT4gJXMgPC8+ICIsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJHByZWZpeCksICRidWZmZXIpOwp9CgpyZXR1cm4gJG1lc3NhZ2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN0b3Aoc3RyaW5nICRpZCwgc3RyaW5nICRtZXNzYWdlLCBib29sICRzdWNjZXNzZnVsLCBzdHJpbmcgJHByZWZpeCA9ICdSRVMnKQp7CiR0cmFpbGluZ0VPTCA9IGlzc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ291dCddKSB8fCBpc3NldCgkdGhpcy0+c3RhcnRlZFskaWRdWydlcnInXSkgPyAiXG4iIDogJyc7CgppZiAoJHN1Y2Nlc3NmdWwpIHsKcmV0dXJuIHNwcmludGYoIiVzJXM8Ymc9Z3JlZW47Zmc9d2hpdGU+ICVzIDwvPiA8Zmc9Z3JlZW4+JXM8Lz5cbiIsICR0cmFpbGluZ0VPTCwgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkcHJlZml4LCAkbWVzc2FnZSk7Cn0KCiRtZXNzYWdlID0gc3ByaW50ZigiJXMlczxiZz1yZWQ7Zmc9d2hpdGU+ICVzIDwvPiA8Zmc9cmVkPiVzPC8+XG4iLCAkdHJhaWxpbmdFT0wsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJHByZWZpeCwgJG1lc3NhZ2UpOwoKdW5zZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnb3V0J10sICR0aGlzLT5zdGFydGVkWyRpZF1bJ2VyciddKTsKCnJldHVybiAkbWVzc2FnZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRCb3JkZXIoc3RyaW5nICRpZCk6IHN0cmluZwp7CnJldHVybiBzcHJpbnRmKCc8Ymc9JXM+IDwvPicsIHNlbGY6OkNPTE9SU1skdGhpcy0+c3RhcnRlZFskaWRdWydib3JkZXInXV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICdkZWJ1Z19mb3JtYXR0ZXInOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcRGVzY3JpcHRvckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxKc29uRGVzY3JpcHRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxNYXJrZG93bkRlc2NyaXB0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcVGV4dERlc2NyaXB0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcWG1sRGVzY3JpcHRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgRGVzY3JpcHRvckhlbHBlciBleHRlbmRzIEhlbHBlcgp7CgoKCnByaXZhdGUgJGRlc2NyaXB0b3JzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzCi0+cmVnaXN0ZXIoJ3R4dCcsIG5ldyBUZXh0RGVzY3JpcHRvcigpKQotPnJlZ2lzdGVyKCd4bWwnLCBuZXcgWG1sRGVzY3JpcHRvcigpKQotPnJlZ2lzdGVyKCdqc29uJywgbmV3IEpzb25EZXNjcmlwdG9yKCkpCi0+cmVnaXN0ZXIoJ21kJywgbmV3IE1hcmtkb3duRGVzY3JpcHRvcigpKQo7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZXNjcmliZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgP29iamVjdCAkb2JqZWN0LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRvcHRpb25zID0gYXJyYXlfbWVyZ2UoWwoncmF3X3RleHQnID0+IGZhbHNlLAonZm9ybWF0JyA9PiAndHh0JywKXSwgJG9wdGlvbnMpOwoKaWYgKCFpc3NldCgkdGhpcy0+ZGVzY3JpcHRvcnNbJG9wdGlvbnNbJ2Zvcm1hdCddXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4nLCAkb3B0aW9uc1snZm9ybWF0J10pKTsKfQoKJGRlc2NyaXB0b3IgPSAkdGhpcy0+ZGVzY3JpcHRvcnNbJG9wdGlvbnNbJ2Zvcm1hdCddXTsKJGRlc2NyaXB0b3ItPmRlc2NyaWJlKCRvdXRwdXQsICRvYmplY3QsICRvcHRpb25zKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoc3RyaW5nICRmb3JtYXQsIERlc2NyaXB0b3JJbnRlcmZhY2UgJGRlc2NyaXB0b3IpCnsKJHRoaXMtPmRlc2NyaXB0b3JzWyRmb3JtYXRdID0gJGRlc2NyaXB0b3I7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJ2Rlc2NyaXB0b3InOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0cygpOiBhcnJheQp7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5kZXNjcmlwdG9ycyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFZhckR1bXBlclxDbG9uZXJcQ2xvbmVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcVmFyRHVtcGVyXENsb25lclxWYXJDbG9uZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxWYXJEdW1wZXJcRHVtcGVyXENsaUR1bXBlcjsKCgoKCmZpbmFsIGNsYXNzIER1bXBlcgp7CnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkZHVtcGVyOwpwcml2YXRlICRjbG9uZXI7CnByaXZhdGUgJGhhbmRsZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIENsaUR1bXBlciAkZHVtcGVyID0gbnVsbCwgQ2xvbmVySW50ZXJmYWNlICRjbG9uZXIgPSBudWxsKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwokdGhpcy0+ZHVtcGVyID0gJGR1bXBlcjsKJHRoaXMtPmNsb25lciA9ICRjbG9uZXI7CgppZiAoY2xhc3NfZXhpc3RzKENsaUR1bXBlcjo6Y2xhc3MpKSB7CiR0aGlzLT5oYW5kbGVyID0gZnVuY3Rpb24gKCR2YXIpOiBzdHJpbmcgewokZHVtcGVyID0gJHRoaXMtPmR1bXBlciA/PyAkdGhpcy0+ZHVtcGVyID0gbmV3IENsaUR1bXBlcihudWxsLCBudWxsLCBDbGlEdW1wZXI6OkRVTVBfTElHSFRfQVJSQVkgfCBDbGlEdW1wZXI6OkRVTVBfQ09NTUFfU0VQQVJBVE9SKTsKJGR1bXBlci0+c2V0Q29sb3JzKCR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpOwoKcmV0dXJuIHJ0cmltKCRkdW1wZXItPmR1bXAoKCR0aGlzLT5jbG9uZXIgPz8gJHRoaXMtPmNsb25lciA9IG5ldyBWYXJDbG9uZXIoKSktPmNsb25lVmFyKCR2YXIpLT53aXRoUmVmSGFuZGxlcyhmYWxzZSksIHRydWUpKTsKfTsKfSBlbHNlIHsKJHRoaXMtPmhhbmRsZXIgPSBmdW5jdGlvbiAoJHZhcik6IHN0cmluZyB7CnN3aXRjaCAodHJ1ZSkgewpjYXNlIG51bGwgPT09ICR2YXI6CnJldHVybiAnbnVsbCc7CmNhc2UgdHJ1ZSA9PT0gJHZhcjoKcmV0dXJuICd0cnVlJzsKY2FzZSBmYWxzZSA9PT0gJHZhcjoKcmV0dXJuICdmYWxzZSc7CmNhc2UgXGlzX3N0cmluZygkdmFyKToKcmV0dXJuICciJy4kdmFyLiciJzsKZGVmYXVsdDoKcmV0dXJuIHJ0cmltKHByaW50X3IoJHZhciwgdHJ1ZSkpOwp9Cn07Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9faW52b2tlKCR2YXIpOiBzdHJpbmcKewpyZXR1cm4gKCR0aGlzLT5oYW5kbGVyKSgkdmFyKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwoKCgoKCgpjbGFzcyBGb3JtYXR0ZXJIZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXRTZWN0aW9uKHN0cmluZyAkc2VjdGlvbiwgc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJHN0eWxlID0gJ2luZm8nKQp7CnJldHVybiBzcHJpbnRmKCc8JXM+WyVzXTwvJXM+ICVzJywgJHN0eWxlLCAkc2VjdGlvbiwgJHN0eWxlLCAkbWVzc2FnZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0QmxvY2soJG1lc3NhZ2VzLCBzdHJpbmcgJHN0eWxlLCBib29sICRsYXJnZSA9IGZhbHNlKQp7CmlmICghXGlzX2FycmF5KCRtZXNzYWdlcykpIHsKJG1lc3NhZ2VzID0gWyRtZXNzYWdlc107Cn0KCiRsZW4gPSAwOwokbGluZXMgPSBbXTsKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRtZXNzYWdlKSB7CiRtZXNzYWdlID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJG1lc3NhZ2UpOwokbGluZXNbXSA9IHNwcmludGYoJGxhcmdlID8gJyAgJXMgICcgOiAnICVzICcsICRtZXNzYWdlKTsKJGxlbiA9IG1heChzZWxmOjp3aWR0aCgkbWVzc2FnZSkgKyAoJGxhcmdlID8gNCA6IDIpLCAkbGVuKTsKfQoKJG1lc3NhZ2VzID0gJGxhcmdlID8gW3N0cl9yZXBlYXQoJyAnLCAkbGVuKV0gOiBbXTsKZm9yICgkaSA9IDA7IGlzc2V0KCRsaW5lc1skaV0pOyArKyRpKSB7CiRtZXNzYWdlc1tdID0gJGxpbmVzWyRpXS5zdHJfcmVwZWF0KCcgJywgJGxlbiAtIHNlbGY6OndpZHRoKCRsaW5lc1skaV0pKTsKfQppZiAoJGxhcmdlKSB7CiRtZXNzYWdlc1tdID0gc3RyX3JlcGVhdCgnICcsICRsZW4pOwp9Cgpmb3IgKCRpID0gMDsgaXNzZXQoJG1lc3NhZ2VzWyRpXSk7ICsrJGkpIHsKJG1lc3NhZ2VzWyRpXSA9IHNwcmludGYoJzwlcz4lczwvJXM+JywgJHN0eWxlLCAkbWVzc2FnZXNbJGldLCAkc3R5bGUpOwp9CgpyZXR1cm4gaW1wbG9kZSgiXG4iLCAkbWVzc2FnZXMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcgJG1lc3NhZ2UsIGludCAkbGVuZ3RoLCBzdHJpbmcgJHN1ZmZpeCA9ICcuLi4nKQp7CiRjb21wdXRlZExlbmd0aCA9ICRsZW5ndGggLSBzZWxmOjp3aWR0aCgkc3VmZml4KTsKCmlmICgkY29tcHV0ZWRMZW5ndGggPiBzZWxmOjp3aWR0aCgkbWVzc2FnZSkpIHsKcmV0dXJuICRtZXNzYWdlOwp9CgpyZXR1cm4gc2VsZjo6c3Vic3RyKCRtZXNzYWdlLCAwLCAkbGVuZ3RoKS4kc3VmZml4Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICdmb3JtYXR0ZXInOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcVW5pY29kZVN0cmluZzsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgSGVscGVyIGltcGxlbWVudHMgSGVscGVySW50ZXJmYWNlCnsKcHJvdGVjdGVkICRoZWxwZXJTZXQgPSBudWxsOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldChIZWxwZXJTZXQgJGhlbHBlclNldCA9IG51bGwpCnsKJHRoaXMtPmhlbHBlclNldCA9ICRoZWxwZXJTZXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXJTZXQoKQp7CnJldHVybiAkdGhpcy0+aGVscGVyU2V0Owp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW4oP3N0cmluZyAkc3RyaW5nKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjMnLCAnTWV0aG9kICIlcygpIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gU3ltZm9ueSA2LjAuIFVzZSBIZWxwZXI6OndpZHRoKCkgb3IgSGVscGVyOjpsZW5ndGgoKSBpbnN0ZWFkLicsIF9fTUVUSE9EX18pOwoKcmV0dXJuIHNlbGY6OndpZHRoKCRzdHJpbmcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aWR0aCg/c3RyaW5nICRzdHJpbmcpOiBpbnQKewokc3RyaW5nID8/ICRzdHJpbmcgPSAnJzsKCmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSkgewpyZXR1cm4gKG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcpKS0+d2lkdGgoZmFsc2UpOwp9CgppZiAoZmFsc2UgPT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCBudWxsLCB0cnVlKSkgewpyZXR1cm4gXHN0cmxlbigkc3RyaW5nKTsKfQoKcmV0dXJuIG1iX3N0cndpZHRoKCRzdHJpbmcsICRlbmNvZGluZyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlbmd0aCg/c3RyaW5nICRzdHJpbmcpOiBpbnQKewokc3RyaW5nID8/ICRzdHJpbmcgPSAnJzsKCmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSkgewpyZXR1cm4gKG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcpKS0+bGVuZ3RoKCk7Cn0KCmlmIChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBcc3RybGVuKCRzdHJpbmcpOwp9CgpyZXR1cm4gbWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdWJzdHIoP3N0cmluZyAkc3RyaW5nLCBpbnQgJGZyb20sIGludCAkbGVuZ3RoID0gbnVsbCkKewokc3RyaW5nID8/ICRzdHJpbmcgPSAnJzsKCmlmIChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBzdWJzdHIoJHN0cmluZywgJGZyb20sICRsZW5ndGgpOwp9CgpyZXR1cm4gbWJfc3Vic3RyKCRzdHJpbmcsICRmcm9tLCAkbGVuZ3RoLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdFRpbWUoJHNlY3MpCnsKc3RhdGljICR0aW1lRm9ybWF0cyA9IFsKWzAsICc8IDEgc2VjJ10sClsxLCAnMSBzZWMnXSwKWzIsICdzZWNzJywgMV0sCls2MCwgJzEgbWluJ10sClsxMjAsICdtaW5zJywgNjBdLApbMzYwMCwgJzEgaHInXSwKWzcyMDAsICdocnMnLCAzNjAwXSwKWzg2NDAwLCAnMSBkYXknXSwKWzE3MjgwMCwgJ2RheXMnLCA4NjQwMF0sCl07Cgpmb3JlYWNoICgkdGltZUZvcm1hdHMgYXMgJGluZGV4ID0+ICRmb3JtYXQpIHsKaWYgKCRzZWNzID49ICRmb3JtYXRbMF0pIHsKaWYgKChpc3NldCgkdGltZUZvcm1hdHNbJGluZGV4ICsgMV0pICYmICRzZWNzIDwgJHRpbWVGb3JtYXRzWyRpbmRleCArIDFdWzBdKQp8fCAkaW5kZXggPT0gXGNvdW50KCR0aW1lRm9ybWF0cykgLSAxCikgewppZiAoMiA9PSBcY291bnQoJGZvcm1hdCkpIHsKcmV0dXJuICRmb3JtYXRbMV07Cn0KCnJldHVybiBmbG9vcigkc2VjcyAvICRmb3JtYXRbMl0pLicgJy4kZm9ybWF0WzFdOwp9Cn0KfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdE1lbW9yeShpbnQgJG1lbW9yeSkKewppZiAoJG1lbW9yeSA+PSAxMDI0ICogMTAyNCAqIDEwMjQpIHsKcmV0dXJuIHNwcmludGYoJyUuMWYgR2lCJywgJG1lbW9yeSAvIDEwMjQgLyAxMDI0IC8gMTAyNCk7Cn0KCmlmICgkbWVtb3J5ID49IDEwMjQgKiAxMDI0KSB7CnJldHVybiBzcHJpbnRmKCclLjFmIE1pQicsICRtZW1vcnkgLyAxMDI0IC8gMTAyNCk7Cn0KCmlmICgkbWVtb3J5ID49IDEwMjQpIHsKcmV0dXJuIHNwcmludGYoJyVkIEtpQicsICRtZW1vcnkgLyAxMDI0KTsKfQoKcmV0dXJuIHNwcmludGYoJyVkIEInLCAkbWVtb3J5KTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW5XaXRob3V0RGVjb3JhdGlvbihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciwgP3N0cmluZyAkc3RyaW5nKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjMnLCAnTWV0aG9kICIlcygpIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gU3ltZm9ueSA2LjAuIFVzZSBIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oKSBpbnN0ZWFkLicsIF9fTUVUSE9EX18pOwoKcmV0dXJuIHNlbGY6OndpZHRoKHNlbGY6OnJlbW92ZURlY29yYXRpb24oJGZvcm1hdHRlciwgJHN0cmluZykpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZURlY29yYXRpb24oT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIsID9zdHJpbmcgJHN0cmluZykKewokaXNEZWNvcmF0ZWQgPSAkZm9ybWF0dGVyLT5pc0RlY29yYXRlZCgpOwokZm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoZmFsc2UpOwoKJHN0cmluZyA9ICRmb3JtYXR0ZXItPmZvcm1hdCgkc3RyaW5nID8/ICcnKTsKCiRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoIi9cMDMzXFtbXm1dKm0vIiwgJycsICRzdHJpbmcgPz8gJycpOwoKJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xcMDMzXTg7W147XSo7W15cXDAzM10qXFwwMzNcXFxcLycsICcnLCAkc3RyaW5nID8/ICcnKTsKJGZvcm1hdHRlci0+c2V0RGVjb3JhdGVkKCRpc0RlY29yYXRlZCk7CgpyZXR1cm4gJHN0cmluZzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7CgoKCgoKCmludGVyZmFjZSBIZWxwZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscGVyU2V0KEhlbHBlclNldCAkaGVscGVyU2V0ID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXJTZXQoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIEhlbHBlclNldCBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7Cgpwcml2YXRlICRoZWxwZXJzID0gW107CnByaXZhdGUgJGNvbW1hbmQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGhlbHBlcnMgPSBbXSkKewpmb3JlYWNoICgkaGVscGVycyBhcyAkYWxpYXMgPT4gJGhlbHBlcikgewokdGhpcy0+c2V0KCRoZWxwZXIsIFxpc19pbnQoJGFsaWFzKSA/IG51bGwgOiAkYWxpYXMpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXQoSGVscGVySW50ZXJmYWNlICRoZWxwZXIsIHN0cmluZyAkYWxpYXMgPSBudWxsKQp7CiR0aGlzLT5oZWxwZXJzWyRoZWxwZXItPmdldE5hbWUoKV0gPSAkaGVscGVyOwppZiAobnVsbCAhPT0gJGFsaWFzKSB7CiR0aGlzLT5oZWxwZXJzWyRhbGlhc10gPSAkaGVscGVyOwp9CgokaGVscGVyLT5zZXRIZWxwZXJTZXQoJHRoaXMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+aGVscGVyc1skbmFtZV0pOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBoZWxwZXIgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPmhlbHBlcnNbJG5hbWVdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29tbWFuZChDb21tYW5kICRjb21tYW5kID0gbnVsbCkKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2NvbnNvbGUnLCAnNS40JywgJ01ldGhvZCAiJXMoKSIgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKTsKCiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9jb25zb2xlJywgJzUuNCcsICdNZXRob2QgIiVzKCkiIGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyk7CgpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKQp7CnJldHVybiBuZXcgXEFycmF5SXRlcmF0b3IoJHRoaXMtPmhlbHBlcnMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXdhcmVJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBJbnB1dEF3YXJlSGVscGVyIGV4dGVuZHMgSGVscGVyIGltcGxlbWVudHMgSW5wdXRBd2FyZUludGVyZmFjZQp7CnByb3RlY3RlZCAkaW5wdXQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NGYWlsZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCgoKY2xhc3MgUHJvY2Vzc0hlbHBlciBleHRlbmRzIEhlbHBlcgp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCAkY21kLCBzdHJpbmcgJGVycm9yID0gbnVsbCwgY2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UpOiBQcm9jZXNzCnsKaWYgKCFjbGFzc19leGlzdHMoUHJvY2Vzczo6Y2xhc3MpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBQcm9jZXNzSGVscGVyIGNhbm5vdCBiZSBydW4gYXMgdGhlIFByb2Nlc3MgY29tcG9uZW50IGlzIG5vdCBpbnN0YWxsZWQuIFRyeSBydW5uaW5nICJjb21wb3NlIHJlcXVpcmUgc3ltZm9ueS9wcm9jZXNzIi4nKTsKfQoKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgokZm9ybWF0dGVyID0gJHRoaXMtPmdldEhlbHBlclNldCgpLT5nZXQoJ2RlYnVnX2Zvcm1hdHRlcicpOwoKaWYgKCRjbWQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7CiRjbWQgPSBbJGNtZF07Cn0KCmlmICghXGlzX2FycmF5KCRjbWQpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ1RoZSAiY29tbWFuZCIgYXJndW1lbnQgb2YgIiVzKCkiIG11c3QgYmUgYW4gYXJyYXkgb3IgYSAiJXMiIGluc3RhbmNlLCAiJXMiIGdpdmVuLicsIF9fTUVUSE9EX18sIFByb2Nlc3M6OmNsYXNzLCBnZXRfZGVidWdfdHlwZSgkY21kKSkpOwp9CgppZiAoXGlzX3N0cmluZygkY21kWzBdID8/IG51bGwpKSB7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJGNtZCk7CiRjbWQgPSBbXTsKfSBlbHNlaWYgKCgkY21kWzBdID8/IG51bGwpIGluc3RhbmNlb2YgUHJvY2VzcykgewokcHJvY2VzcyA9ICRjbWRbMF07CnVuc2V0KCRjbWRbMF0pOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIGNvbW1hbmQgcHJvdmlkZWQgdG8gIiVzKCkiOiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYW4gYXJyYXkgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBlaXRoZXIgdGhlIHBhdGggdG8gdGhlIGJpbmFyeSB0byBydW4gb3IgYSAiUHJvY2VzcyIgb2JqZWN0LicsIF9fTUVUSE9EX18pKTsKfQoKaWYgKCR2ZXJib3NpdHkgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG91dHB1dC0+d3JpdGUoJGZvcm1hdHRlci0+c3RhcnQoc3BsX29iamVjdF9oYXNoKCRwcm9jZXNzKSwgJHRoaXMtPmVzY2FwZVN0cmluZygkcHJvY2Vzcy0+Z2V0Q29tbWFuZExpbmUoKSkpKTsKfQoKaWYgKCRvdXRwdXQtPmlzRGVidWcoKSkgewokY2FsbGJhY2sgPSAkdGhpcy0+d3JhcENhbGxiYWNrKCRvdXRwdXQsICRwcm9jZXNzLCAkY2FsbGJhY2spOwp9CgokcHJvY2Vzcy0+cnVuKCRjYWxsYmFjaywgJGNtZCk7CgppZiAoJHZlcmJvc2l0eSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokbWVzc2FnZSA9ICRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSA/ICdDb21tYW5kIHJhbiBzdWNjZXNzZnVsbHknIDogc3ByaW50ZignJXMgQ29tbWFuZCBkaWQgbm90IHJ1biBzdWNjZXNzZnVsbHknLCAkcHJvY2Vzcy0+Z2V0RXhpdENvZGUoKSk7CiRvdXRwdXQtPndyaXRlKCRmb3JtYXR0ZXItPnN0b3Aoc3BsX29iamVjdF9oYXNoKCRwcm9jZXNzKSwgJG1lc3NhZ2UsICRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkpOwp9CgppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSAmJiBudWxsICE9PSAkZXJyb3IpIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8ZXJyb3I+JXM8L2Vycm9yPicsICR0aGlzLT5lc2NhcGVTdHJpbmcoJGVycm9yKSkpOwp9CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG11c3RSdW4oT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsICRjbWQsIHN0cmluZyAkZXJyb3IgPSBudWxsLCBjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKTogUHJvY2Vzcwp7CiRwcm9jZXNzID0gJHRoaXMtPnJ1bigkb3V0cHV0LCAkY21kLCAkZXJyb3IsICRjYWxsYmFjayk7CgppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewp0aHJvdyBuZXcgUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbigkcHJvY2Vzcyk7Cn0KCnJldHVybiAkcHJvY2VzczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyYXBDYWxsYmFjayhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUHJvY2VzcyAkcHJvY2VzcywgY2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCk6IGNhbGxhYmxlCnsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgokZm9ybWF0dGVyID0gJHRoaXMtPmdldEhlbHBlclNldCgpLT5nZXQoJ2RlYnVnX2Zvcm1hdHRlcicpOwoKcmV0dXJuIGZ1bmN0aW9uICgkdHlwZSwgJGJ1ZmZlcikgdXNlICgkb3V0cHV0LCAkcHJvY2VzcywgJGNhbGxiYWNrLCAkZm9ybWF0dGVyKSB7CiRvdXRwdXQtPndyaXRlKCRmb3JtYXR0ZXItPnByb2dyZXNzKHNwbF9vYmplY3RfaGFzaCgkcHJvY2VzcyksICR0aGlzLT5lc2NhcGVTdHJpbmcoJGJ1ZmZlciksIFByb2Nlc3M6OkVSUiA9PT0gJHR5cGUpKTsKCmlmIChudWxsICE9PSAkY2FsbGJhY2spIHsKJGNhbGxiYWNrKCR0eXBlLCAkYnVmZmVyKTsKfQp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHJpbmcgJHN0cik6IHN0cmluZwp7CnJldHVybiBzdHJfcmVwbGFjZSgnPCcsICdcXDwnLCAkc3RyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdwcm9jZXNzJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDdXJzb3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlU2VjdGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVybWluYWw7CgoKCgoKCgpmaW5hbCBjbGFzcyBQcm9ncmVzc0Jhcgp7CnB1YmxpYyBjb25zdCBGT1JNQVRfVkVSQk9TRSA9ICd2ZXJib3NlJzsKcHVibGljIGNvbnN0IEZPUk1BVF9WRVJZX1ZFUkJPU0UgPSAndmVyeV92ZXJib3NlJzsKcHVibGljIGNvbnN0IEZPUk1BVF9ERUJVRyA9ICdkZWJ1Zyc7CnB1YmxpYyBjb25zdCBGT1JNQVRfTk9STUFMID0gJ25vcm1hbCc7Cgpwcml2YXRlIGNvbnN0IEZPUk1BVF9WRVJCT1NFX05PTUFYID0gJ3ZlcmJvc2Vfbm9tYXgnOwpwcml2YXRlIGNvbnN0IEZPUk1BVF9WRVJZX1ZFUkJPU0VfTk9NQVggPSAndmVyeV92ZXJib3NlX25vbWF4JzsKcHJpdmF0ZSBjb25zdCBGT1JNQVRfREVCVUdfTk9NQVggPSAnZGVidWdfbm9tYXgnOwpwcml2YXRlIGNvbnN0IEZPUk1BVF9OT1JNQUxfTk9NQVggPSAnbm9ybWFsX25vbWF4JzsKCnByaXZhdGUgJGJhcldpZHRoID0gMjg7CnByaXZhdGUgJGJhckNoYXI7CnByaXZhdGUgJGVtcHR5QmFyQ2hhciA9ICctJzsKcHJpdmF0ZSAkcHJvZ3Jlc3NDaGFyID0gJz4nOwpwcml2YXRlICRmb3JtYXQ7CnByaXZhdGUgJGludGVybmFsRm9ybWF0Owpwcml2YXRlICRyZWRyYXdGcmVxID0gMTsKcHJpdmF0ZSAkd3JpdGVDb3VudDsKcHJpdmF0ZSAkbGFzdFdyaXRlVGltZTsKcHJpdmF0ZSAkbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzID0gMDsKcHJpdmF0ZSAkbWF4U2Vjb25kc0JldHdlZW5SZWRyYXdzID0gMTsKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRzdGVwID0gMDsKcHJpdmF0ZSAkbWF4Owpwcml2YXRlICRzdGFydFRpbWU7CnByaXZhdGUgJHN0ZXBXaWR0aDsKcHJpdmF0ZSAkcGVyY2VudCA9IDAuMDsKcHJpdmF0ZSAkbWVzc2FnZXMgPSBbXTsKcHJpdmF0ZSAkb3ZlcndyaXRlID0gdHJ1ZTsKcHJpdmF0ZSAkdGVybWluYWw7CnByaXZhdGUgJHByZXZpb3VzTWVzc2FnZTsKcHJpdmF0ZSAkY3Vyc29yOwoKcHJpdmF0ZSBzdGF0aWMgJGZvcm1hdHRlcnM7CnByaXZhdGUgc3RhdGljICRmb3JtYXRzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBpbnQgJG1heCA9IDAsIGZsb2F0ICRtaW5TZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAxIC8gMjUpCnsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKJHRoaXMtPnNldE1heFN0ZXBzKCRtYXgpOwokdGhpcy0+dGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKCmlmICgwIDwgJG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cykgewokdGhpcy0+cmVkcmF3RnJlcSA9IG51bGw7CiR0aGlzLT5taW5TZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAkbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzOwp9CgppZiAoISR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpIHsKCiR0aGlzLT5vdmVyd3JpdGUgPSBmYWxzZTsKCgokdGhpcy0+cmVkcmF3RnJlcSA9IG51bGw7Cn0KCiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7CiR0aGlzLT5jdXJzb3IgPSBuZXcgQ3Vyc29yKCRvdXRwdXQpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKHN0cmluZyAkbmFtZSwgY2FsbGFibGUgJGNhbGxhYmxlKTogdm9pZAp7CmlmICghc2VsZjo6JGZvcm1hdHRlcnMpIHsKc2VsZjo6JGZvcm1hdHRlcnMgPSBzZWxmOjppbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk7Cn0KCnNlbGY6OiRmb3JtYXR0ZXJzWyRuYW1lXSA9ICRjYWxsYWJsZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUpOiA/Y2FsbGFibGUKewppZiAoIXNlbGY6OiRmb3JtYXR0ZXJzKSB7CnNlbGY6OiRmb3JtYXR0ZXJzID0gc2VsZjo6aW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOwp9CgpyZXR1cm4gc2VsZjo6JGZvcm1hdHRlcnNbJG5hbWVdID8/IG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRGb3JtYXREZWZpbml0aW9uKHN0cmluZyAkbmFtZSwgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKaWYgKCFzZWxmOjokZm9ybWF0cykgewpzZWxmOjokZm9ybWF0cyA9IHNlbGY6OmluaXRGb3JtYXRzKCk7Cn0KCnNlbGY6OiRmb3JtYXRzWyRuYW1lXSA9ICRmb3JtYXQ7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGb3JtYXREZWZpbml0aW9uKHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewppZiAoIXNlbGY6OiRmb3JtYXRzKSB7CnNlbGY6OiRmb3JtYXRzID0gc2VsZjo6aW5pdEZvcm1hdHMoKTsKfQoKcmV0dXJuIHNlbGY6OiRmb3JtYXRzWyRuYW1lXSA/PyBudWxsOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1lc3NhZ2Uoc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJG5hbWUgPSAnbWVzc2FnZScpCnsKJHRoaXMtPm1lc3NhZ2VzWyRuYW1lXSA9ICRtZXNzYWdlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWVzc2FnZShzdHJpbmcgJG5hbWUgPSAnbWVzc2FnZScpCnsKcmV0dXJuICR0aGlzLT5tZXNzYWdlc1skbmFtZV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydFRpbWUoKTogaW50CnsKcmV0dXJuICR0aGlzLT5zdGFydFRpbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXhTdGVwcygpOiBpbnQKewpyZXR1cm4gJHRoaXMtPm1heDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2dyZXNzKCk6IGludAp7CnJldHVybiAkdGhpcy0+c3RlcDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTdGVwV2lkdGgoKTogaW50CnsKcmV0dXJuICR0aGlzLT5zdGVwV2lkdGg7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9ncmVzc1BlcmNlbnQoKTogZmxvYXQKewpyZXR1cm4gJHRoaXMtPnBlcmNlbnQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCYXJPZmZzZXQoKTogZmxvYXQKewpyZXR1cm4gZmxvb3IoJHRoaXMtPm1heCA/ICR0aGlzLT5wZXJjZW50ICogJHRoaXMtPmJhcldpZHRoIDogKG51bGwgPT09ICR0aGlzLT5yZWRyYXdGcmVxID8gKGludCkgKG1pbig1LCAkdGhpcy0+YmFyV2lkdGggLyAxNSkgKiAkdGhpcy0+d3JpdGVDb3VudCkgOiAkdGhpcy0+c3RlcCkgJSAkdGhpcy0+YmFyV2lkdGgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXN0aW1hdGVkKCk6IGZsb2F0CnsKaWYgKCEkdGhpcy0+c3RlcCkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIHJvdW5kKCh0aW1lKCkgLSAkdGhpcy0+c3RhcnRUaW1lKSAvICR0aGlzLT5zdGVwICogJHRoaXMtPm1heCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZW1haW5pbmcoKTogZmxvYXQKewppZiAoISR0aGlzLT5zdGVwKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gcm91bmQoKHRpbWUoKSAtICR0aGlzLT5zdGFydFRpbWUpIC8gJHRoaXMtPnN0ZXAgKiAoJHRoaXMtPm1heCAtICR0aGlzLT5zdGVwKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRCYXJXaWR0aChpbnQgJHNpemUpCnsKJHRoaXMtPmJhcldpZHRoID0gbWF4KDEsICRzaXplKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJhcldpZHRoKCk6IGludAp7CnJldHVybiAkdGhpcy0+YmFyV2lkdGg7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRCYXJDaGFyYWN0ZXIoc3RyaW5nICRjaGFyKQp7CiR0aGlzLT5iYXJDaGFyID0gJGNoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCYXJDaGFyYWN0ZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5iYXJDaGFyID8/ICgkdGhpcy0+bWF4ID8gJz0nIDogJHRoaXMtPmVtcHR5QmFyQ2hhcik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFbXB0eUJhckNoYXJhY3RlcihzdHJpbmcgJGNoYXIpCnsKJHRoaXMtPmVtcHR5QmFyQ2hhciA9ICRjaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW1wdHlCYXJDaGFyYWN0ZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5lbXB0eUJhckNoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9ncmVzc0NoYXJhY3RlcihzdHJpbmcgJGNoYXIpCnsKJHRoaXMtPnByb2dyZXNzQ2hhciA9ICRjaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wcm9ncmVzc0NoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXQoc3RyaW5nICRmb3JtYXQpCnsKJHRoaXMtPmZvcm1hdCA9IG51bGw7CiR0aGlzLT5pbnRlcm5hbEZvcm1hdCA9ICRmb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlZHJhd0ZyZXF1ZW5jeSg/aW50ICRmcmVxKQp7CiR0aGlzLT5yZWRyYXdGcmVxID0gbnVsbCAhPT0gJGZyZXEgPyBtYXgoMSwgJGZyZXEpIDogbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cyhmbG9hdCAkc2Vjb25kcyk6IHZvaWQKewokdGhpcy0+bWluU2Vjb25kc0JldHdlZW5SZWRyYXdzID0gJHNlY29uZHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtYXhTZWNvbmRzQmV0d2VlblJlZHJhd3MoZmxvYXQgJHNlY29uZHMpOiB2b2lkCnsKJHRoaXMtPm1heFNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9ICRzZWNvbmRzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpdGVyYXRlKGl0ZXJhYmxlICRpdGVyYWJsZSwgaW50ICRtYXggPSBudWxsKTogaXRlcmFibGUKewokdGhpcy0+c3RhcnQoJG1heCA/PyAoaXNfY291bnRhYmxlKCRpdGVyYWJsZSkgPyBcY291bnQoJGl0ZXJhYmxlKSA6IDApKTsKCmZvcmVhY2ggKCRpdGVyYWJsZSBhcyAka2V5ID0+ICR2YWx1ZSkgewp5aWVsZCAka2V5ID0+ICR2YWx1ZTsKCiR0aGlzLT5hZHZhbmNlKCk7Cn0KCiR0aGlzLT5maW5pc2goKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnQoaW50ICRtYXggPSBudWxsKQp7CiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7CiR0aGlzLT5zdGVwID0gMDsKJHRoaXMtPnBlcmNlbnQgPSAwLjA7CgppZiAobnVsbCAhPT0gJG1heCkgewokdGhpcy0+c2V0TWF4U3RlcHMoJG1heCk7Cn0KCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkdmFuY2UoaW50ICRzdGVwID0gMSkKewokdGhpcy0+c2V0UHJvZ3Jlc3MoJHRoaXMtPnN0ZXAgKyAkc3RlcCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPdmVyd3JpdGUoYm9vbCAkb3ZlcndyaXRlKQp7CiR0aGlzLT5vdmVyd3JpdGUgPSAkb3ZlcndyaXRlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvZ3Jlc3MoaW50ICRzdGVwKQp7CmlmICgkdGhpcy0+bWF4ICYmICRzdGVwID4gJHRoaXMtPm1heCkgewokdGhpcy0+bWF4ID0gJHN0ZXA7Cn0gZWxzZWlmICgkc3RlcCA8IDApIHsKJHN0ZXAgPSAwOwp9CgokcmVkcmF3RnJlcSA9ICR0aGlzLT5yZWRyYXdGcmVxID8/ICgoJHRoaXMtPm1heCA/OiAxMCkgLyAxMCk7CiRwcmV2UGVyaW9kID0gKGludCkgKCR0aGlzLT5zdGVwIC8gJHJlZHJhd0ZyZXEpOwokY3VyclBlcmlvZCA9IChpbnQpICgkc3RlcCAvICRyZWRyYXdGcmVxKTsKJHRoaXMtPnN0ZXAgPSAkc3RlcDsKJHRoaXMtPnBlcmNlbnQgPSAkdGhpcy0+bWF4ID8gKGZsb2F0KSAkdGhpcy0+c3RlcCAvICR0aGlzLT5tYXggOiAwOwokdGltZUludGVydmFsID0gbWljcm90aW1lKHRydWUpIC0gJHRoaXMtPmxhc3RXcml0ZVRpbWU7CgoKaWYgKCR0aGlzLT5tYXggPT09ICRzdGVwKSB7CiR0aGlzLT5kaXNwbGF5KCk7CgpyZXR1cm47Cn0KCgppZiAoJHRpbWVJbnRlcnZhbCA8ICR0aGlzLT5taW5TZWNvbmRzQmV0d2VlblJlZHJhd3MpIHsKcmV0dXJuOwp9CgoKaWYgKCRwcmV2UGVyaW9kICE9PSAkY3VyclBlcmlvZCB8fCAkdGltZUludGVydmFsID49ICR0aGlzLT5tYXhTZWNvbmRzQmV0d2VlblJlZHJhd3MpIHsKJHRoaXMtPmRpc3BsYXkoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TWF4U3RlcHMoaW50ICRtYXgpCnsKJHRoaXMtPmZvcm1hdCA9IG51bGw7CiR0aGlzLT5tYXggPSBtYXgoMCwgJG1heCk7CiR0aGlzLT5zdGVwV2lkdGggPSAkdGhpcy0+bWF4ID8gSGVscGVyOjp3aWR0aCgoc3RyaW5nKSAkdGhpcy0+bWF4KSA6IDQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5pc2goKTogdm9pZAp7CmlmICghJHRoaXMtPm1heCkgewokdGhpcy0+bWF4ID0gJHRoaXMtPnN0ZXA7Cn0KCmlmICgkdGhpcy0+c3RlcCA9PT0gJHRoaXMtPm1heCAmJiAhJHRoaXMtPm92ZXJ3cml0ZSkgewoKcmV0dXJuOwp9CgokdGhpcy0+c2V0UHJvZ3Jlc3MoJHRoaXMtPm1heCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwbGF5KCk6IHZvaWQKewppZiAoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQgPT09ICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CnJldHVybjsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5mb3JtYXQpIHsKJHRoaXMtPnNldFJlYWxGb3JtYXQoJHRoaXMtPmludGVybmFsRm9ybWF0ID86ICR0aGlzLT5kZXRlcm1pbmVCZXN0Rm9ybWF0KCkpOwp9CgokdGhpcy0+b3ZlcndyaXRlKCR0aGlzLT5idWlsZExpbmUoKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKTogdm9pZAp7CmlmICghJHRoaXMtPm92ZXJ3cml0ZSkgewpyZXR1cm47Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Zm9ybWF0KSB7CiR0aGlzLT5zZXRSZWFsRm9ybWF0KCR0aGlzLT5pbnRlcm5hbEZvcm1hdCA/OiAkdGhpcy0+ZGV0ZXJtaW5lQmVzdEZvcm1hdCgpKTsKfQoKJHRoaXMtPm92ZXJ3cml0ZSgnJyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2V0UmVhbEZvcm1hdChzdHJpbmcgJGZvcm1hdCkKewoKaWYgKCEkdGhpcy0+bWF4ICYmIG51bGwgIT09IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdC4nX25vbWF4JykpIHsKJHRoaXMtPmZvcm1hdCA9IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdC4nX25vbWF4Jyk7Cn0gZWxzZWlmIChudWxsICE9PSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQpKSB7CiR0aGlzLT5mb3JtYXQgPSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQpOwp9IGVsc2UgewokdGhpcy0+Zm9ybWF0ID0gJGZvcm1hdDsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG92ZXJ3cml0ZShzdHJpbmcgJG1lc3NhZ2UpOiB2b2lkCnsKaWYgKCR0aGlzLT5wcmV2aW91c01lc3NhZ2UgPT09ICRtZXNzYWdlKSB7CnJldHVybjsKfQoKJG9yaWdpbmFsTWVzc2FnZSA9ICRtZXNzYWdlOwoKaWYgKCR0aGlzLT5vdmVyd3JpdGUpIHsKaWYgKG51bGwgIT09ICR0aGlzLT5wcmV2aW91c01lc3NhZ2UpIHsKaWYgKCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlU2VjdGlvbk91dHB1dCkgewokbWVzc2FnZUxpbmVzID0gZXhwbG9kZSgiXG4iLCAkdGhpcy0+cHJldmlvdXNNZXNzYWdlKTsKJGxpbmVDb3VudCA9IFxjb3VudCgkbWVzc2FnZUxpbmVzKTsKZm9yZWFjaCAoJG1lc3NhZ2VMaW5lcyBhcyAkbWVzc2FnZUxpbmUpIHsKJG1lc3NhZ2VMaW5lTGVuZ3RoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlTGluZSkpOwppZiAoJG1lc3NhZ2VMaW5lTGVuZ3RoID4gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKSB7CiRsaW5lQ291bnQgKz0gZmxvb3IoJG1lc3NhZ2VMaW5lTGVuZ3RoIC8gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKTsKfQp9CiR0aGlzLT5vdXRwdXQtPmNsZWFyKCRsaW5lQ291bnQpOwp9IGVsc2UgewokbGluZUNvdW50ID0gc3Vic3RyX2NvdW50KCR0aGlzLT5wcmV2aW91c01lc3NhZ2UsICJcbiIpOwpmb3IgKCRpID0gMDsgJGkgPCAkbGluZUNvdW50OyArKyRpKSB7CiR0aGlzLT5jdXJzb3ItPm1vdmVUb0NvbHVtbigxKTsKJHRoaXMtPmN1cnNvci0+Y2xlYXJMaW5lKCk7CiR0aGlzLT5jdXJzb3ItPm1vdmVVcCgpOwp9CgokdGhpcy0+Y3Vyc29yLT5tb3ZlVG9Db2x1bW4oMSk7CiR0aGlzLT5jdXJzb3ItPmNsZWFyTGluZSgpOwp9Cn0KfSBlbHNlaWYgKCR0aGlzLT5zdGVwID4gMCkgewokbWVzc2FnZSA9IFxQSFBfRU9MLiRtZXNzYWdlOwp9CgokdGhpcy0+cHJldmlvdXNNZXNzYWdlID0gJG9yaWdpbmFsTWVzc2FnZTsKJHRoaXMtPmxhc3RXcml0ZVRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7CgokdGhpcy0+b3V0cHV0LT53cml0ZSgkbWVzc2FnZSk7CisrJHRoaXMtPndyaXRlQ291bnQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGV0ZXJtaW5lQmVzdEZvcm1hdCgpOiBzdHJpbmcKewpzd2l0Y2ggKCR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CgpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0U6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX1ZFUkJPU0UgOiBzZWxmOjpGT1JNQVRfVkVSQk9TRV9OT01BWDsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0U6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX1ZFUllfVkVSQk9TRSA6IHNlbGY6OkZPUk1BVF9WRVJZX1ZFUkJPU0VfTk9NQVg7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUc6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX0RFQlVHIDogc2VsZjo6Rk9STUFUX0RFQlVHX05PTUFYOwpkZWZhdWx0OgpyZXR1cm4gJHRoaXMtPm1heCA/IHNlbGY6OkZPUk1BVF9OT1JNQUwgOiBzZWxmOjpGT1JNQVRfTk9STUFMX05PTUFYOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTogYXJyYXkKewpyZXR1cm4gWwonYmFyJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkgewokY29tcGxldGVCYXJzID0gJGJhci0+Z2V0QmFyT2Zmc2V0KCk7CiRkaXNwbGF5ID0gc3RyX3JlcGVhdCgkYmFyLT5nZXRCYXJDaGFyYWN0ZXIoKSwgJGNvbXBsZXRlQmFycyk7CmlmICgkY29tcGxldGVCYXJzIDwgJGJhci0+Z2V0QmFyV2lkdGgoKSkgewokZW1wdHlCYXJzID0gJGJhci0+Z2V0QmFyV2lkdGgoKSAtICRjb21wbGV0ZUJhcnMgLSBIZWxwZXI6Omxlbmd0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJG91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRiYXItPmdldFByb2dyZXNzQ2hhcmFjdGVyKCkpKTsKJGRpc3BsYXkgLj0gJGJhci0+Z2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoKS5zdHJfcmVwZWF0KCRiYXItPmdldEVtcHR5QmFyQ2hhcmFjdGVyKCksICRlbXB0eUJhcnMpOwp9CgpyZXR1cm4gJGRpc3BsYXk7Cn0sCidlbGFwc2VkJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiBIZWxwZXI6OmZvcm1hdFRpbWUodGltZSgpIC0gJGJhci0+Z2V0U3RhcnRUaW1lKCkpOwp9LAoncmVtYWluaW5nJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CmlmICghJGJhci0+Z2V0TWF4U3RlcHMoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1VuYWJsZSB0byBkaXNwbGF5IHRoZSByZW1haW5pbmcgdGltZSBpZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgaXMgbm90IHNldC4nKTsKfQoKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0VGltZSgkYmFyLT5nZXRSZW1haW5pbmcoKSk7Cn0sCidlc3RpbWF0ZWQnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKaWYgKCEkYmFyLT5nZXRNYXhTdGVwcygpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVW5hYmxlIHRvIGRpc3BsYXkgdGhlIGVzdGltYXRlZCB0aW1lIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyBpcyBub3Qgc2V0LicpOwp9CgpyZXR1cm4gSGVscGVyOjpmb3JtYXRUaW1lKCRiYXItPmdldEVzdGltYXRlZCgpKTsKfSwKJ21lbW9yeScgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gSGVscGVyOjpmb3JtYXRNZW1vcnkobWVtb3J5X2dldF91c2FnZSh0cnVlKSk7Cn0sCidjdXJyZW50JyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiBzdHJfcGFkKCRiYXItPmdldFByb2dyZXNzKCksICRiYXItPmdldFN0ZXBXaWR0aCgpLCAnICcsIFxTVFJfUEFEX0xFRlQpOwp9LAonbWF4JyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiAkYmFyLT5nZXRNYXhTdGVwcygpOwp9LAoncGVyY2VudCcgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gZmxvb3IoJGJhci0+Z2V0UHJvZ3Jlc3NQZXJjZW50KCkgKiAxMDApOwp9LApdOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0Rm9ybWF0cygpOiBhcnJheQp7CnJldHVybiBbCnNlbGY6OkZPUk1BVF9OT1JNQUwgPT4gJyAlY3VycmVudCUvJW1heCUgWyViYXIlXSAlcGVyY2VudDozcyUlJywKc2VsZjo6Rk9STUFUX05PUk1BTF9OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdJywKCnNlbGY6OkZPUk1BVF9WRVJCT1NFID0+ICcgJWN1cnJlbnQlLyVtYXglIFslYmFyJV0gJXBlcmNlbnQ6M3MlJSAlZWxhcHNlZDo2cyUnLApzZWxmOjpGT1JNQVRfVkVSQk9TRV9OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdICVlbGFwc2VkOjZzJScsCgpzZWxmOjpGT1JNQVRfVkVSWV9WRVJCT1NFID0+ICcgJWN1cnJlbnQlLyVtYXglIFslYmFyJV0gJXBlcmNlbnQ6M3MlJSAlZWxhcHNlZDo2cyUvJWVzdGltYXRlZDotNnMlJywKc2VsZjo6Rk9STUFUX1ZFUllfVkVSQk9TRV9OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdICVlbGFwc2VkOjZzJScsCgpzZWxmOjpGT1JNQVRfREVCVUcgPT4gJyAlY3VycmVudCUvJW1heCUgWyViYXIlXSAlcGVyY2VudDozcyUlICVlbGFwc2VkOjZzJS8lZXN0aW1hdGVkOi02cyUgJW1lbW9yeTo2cyUnLApzZWxmOjpGT1JNQVRfREVCVUdfTk9NQVggPT4gJyAlY3VycmVudCUgWyViYXIlXSAlZWxhcHNlZDo2cyUgJW1lbW9yeTo2cyUnLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkTGluZSgpOiBzdHJpbmcKewokcmVnZXggPSAieyUoW2EtelwtX10rKSg/Olw6KFteJV0rKSk/JX1pIjsKJGNhbGxiYWNrID0gZnVuY3Rpb24gKCRtYXRjaGVzKSB7CmlmICgkZm9ybWF0dGVyID0gJHRoaXM6OmdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbigkbWF0Y2hlc1sxXSkpIHsKJHRleHQgPSAkZm9ybWF0dGVyKCR0aGlzLCAkdGhpcy0+b3V0cHV0KTsKfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlc1skbWF0Y2hlc1sxXV0pKSB7CiR0ZXh0ID0gJHRoaXMtPm1lc3NhZ2VzWyRtYXRjaGVzWzFdXTsKfSBlbHNlIHsKcmV0dXJuICRtYXRjaGVzWzBdOwp9CgppZiAoaXNzZXQoJG1hdGNoZXNbMl0pKSB7CiR0ZXh0ID0gc3ByaW50ZignJScuJG1hdGNoZXNbMl0sICR0ZXh0KTsKfQoKcmV0dXJuICR0ZXh0Owp9OwokbGluZSA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcmVnZXgsICRjYWxsYmFjaywgJHRoaXMtPmZvcm1hdCk7CgoKJGxpbmVzTGVuZ3RoID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkc3ViTGluZSkgewpyZXR1cm4gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksIHJ0cmltKCRzdWJMaW5lLCAiXHIiKSkpOwp9LCBleHBsb2RlKCJcbiIsICRsaW5lKSk7CgokbGluZXNXaWR0aCA9IG1heCgkbGluZXNMZW5ndGgpOwoKJHRlcm1pbmFsV2lkdGggPSAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCk7CmlmICgkbGluZXNXaWR0aCA8PSAkdGVybWluYWxXaWR0aCkgewpyZXR1cm4gJGxpbmU7Cn0KCiR0aGlzLT5zZXRCYXJXaWR0aCgkdGhpcy0+YmFyV2lkdGggLSAkbGluZXNXaWR0aCArICR0ZXJtaW5hbFdpZHRoKTsKCnJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHJlZ2V4LCAkY2FsbGJhY2ssICR0aGlzLT5mb3JtYXQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFByb2dyZXNzSW5kaWNhdG9yCnsKcHJpdmF0ZSBjb25zdCBGT1JNQVRTID0gWwonbm9ybWFsJyA9PiAnICVpbmRpY2F0b3IlICVtZXNzYWdlJScsCidub3JtYWxfbm9fYW5zaScgPT4gJyAlbWVzc2FnZSUnLAoKJ3ZlcmJvc2UnID0+ICcgJWluZGljYXRvciUgJW1lc3NhZ2UlICglZWxhcHNlZDo2cyUpJywKJ3ZlcmJvc2Vfbm9fYW5zaScgPT4gJyAlbWVzc2FnZSUgKCVlbGFwc2VkOjZzJSknLAoKJ3ZlcnlfdmVyYm9zZScgPT4gJyAlaW5kaWNhdG9yJSAlbWVzc2FnZSUgKCVlbGFwc2VkOjZzJSwgJW1lbW9yeTo2cyUpJywKJ3ZlcnlfdmVyYm9zZV9ub19hbnNpJyA9PiAnICVtZXNzYWdlJSAoJWVsYXBzZWQ6NnMlLCAlbWVtb3J5OjZzJSknLApdOwoKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRzdGFydFRpbWU7CnByaXZhdGUgJGZvcm1hdDsKcHJpdmF0ZSAkbWVzc2FnZTsKcHJpdmF0ZSAkaW5kaWNhdG9yVmFsdWVzOwpwcml2YXRlICRpbmRpY2F0b3JDdXJyZW50Owpwcml2YXRlICRpbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbDsKcHJpdmF0ZSAkaW5kaWNhdG9yVXBkYXRlVGltZTsKcHJpdmF0ZSAkc3RhcnRlZCA9IGZhbHNlOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGZvcm1hdHRlcnM7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBzdHJpbmcgJGZvcm1hdCA9IG51bGwsIGludCAkaW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWwgPSAxMDAsIGFycmF5ICRpbmRpY2F0b3JWYWx1ZXMgPSBudWxsKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwoKaWYgKG51bGwgPT09ICRmb3JtYXQpIHsKJGZvcm1hdCA9ICR0aGlzLT5kZXRlcm1pbmVCZXN0Rm9ybWF0KCk7Cn0KCmlmIChudWxsID09PSAkaW5kaWNhdG9yVmFsdWVzKSB7CiRpbmRpY2F0b3JWYWx1ZXMgPSBbJy0nLCAnXFwnLCAnfCcsICcvJ107Cn0KCiRpbmRpY2F0b3JWYWx1ZXMgPSBhcnJheV92YWx1ZXMoJGluZGljYXRvclZhbHVlcyk7CgppZiAoMiA+IFxjb3VudCgkaW5kaWNhdG9yVmFsdWVzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdNdXN0IGhhdmUgYXQgbGVhc3QgMiBpbmRpY2F0b3IgdmFsdWUgY2hhcmFjdGVycy4nKTsKfQoKJHRoaXMtPmZvcm1hdCA9IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdCk7CiR0aGlzLT5pbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbCA9ICRpbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbDsKJHRoaXMtPmluZGljYXRvclZhbHVlcyA9ICRpbmRpY2F0b3JWYWx1ZXM7CiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNZXNzYWdlKD9zdHJpbmcgJG1lc3NhZ2UpCnsKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydChzdHJpbmcgJG1lc3NhZ2UpCnsKaWYgKCR0aGlzLT5zdGFydGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUHJvZ3Jlc3MgaW5kaWNhdG9yIGFscmVhZHkgc3RhcnRlZC4nKTsKfQoKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKJHRoaXMtPnN0YXJ0ZWQgPSB0cnVlOwokdGhpcy0+c3RhcnRUaW1lID0gdGltZSgpOwokdGhpcy0+aW5kaWNhdG9yVXBkYXRlVGltZSA9ICR0aGlzLT5nZXRDdXJyZW50VGltZUluTWlsbGlzZWNvbmRzKCkgKyAkdGhpcy0+aW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWw7CiR0aGlzLT5pbmRpY2F0b3JDdXJyZW50ID0gMDsKCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZHZhbmNlKCkKewppZiAoISR0aGlzLT5zdGFydGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUHJvZ3Jlc3MgaW5kaWNhdG9yIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZC4nKTsKfQoKaWYgKCEkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKSB7CnJldHVybjsKfQoKJGN1cnJlbnRUaW1lID0gJHRoaXMtPmdldEN1cnJlbnRUaW1lSW5NaWxsaXNlY29uZHMoKTsKCmlmICgkY3VycmVudFRpbWUgPCAkdGhpcy0+aW5kaWNhdG9yVXBkYXRlVGltZSkgewpyZXR1cm47Cn0KCiR0aGlzLT5pbmRpY2F0b3JVcGRhdGVUaW1lID0gJGN1cnJlbnRUaW1lICsgJHRoaXMtPmluZGljYXRvckNoYW5nZUludGVydmFsOworKyR0aGlzLT5pbmRpY2F0b3JDdXJyZW50OwoKJHRoaXMtPmRpc3BsYXkoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluaXNoKHN0cmluZyAkbWVzc2FnZSkKewppZiAoISR0aGlzLT5zdGFydGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUHJvZ3Jlc3MgaW5kaWNhdG9yIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZC4nKTsKfQoKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKJHRoaXMtPmRpc3BsYXkoKTsKJHRoaXMtPm91dHB1dC0+d3JpdGVsbignJyk7CiR0aGlzLT5zdGFydGVkID0gZmFsc2U7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGb3JtYXREZWZpbml0aW9uKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gc2VsZjo6Rk9STUFUU1skbmFtZV0gPz8gbnVsbDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUsIGNhbGxhYmxlICRjYWxsYWJsZSkKewppZiAoIXNlbGY6OiRmb3JtYXR0ZXJzKSB7CnNlbGY6OiRmb3JtYXR0ZXJzID0gc2VsZjo6aW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOwp9CgpzZWxmOjokZm9ybWF0dGVyc1skbmFtZV0gPSAkY2FsbGFibGU7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oc3RyaW5nICRuYW1lKQp7CmlmICghc2VsZjo6JGZvcm1hdHRlcnMpIHsKc2VsZjo6JGZvcm1hdHRlcnMgPSBzZWxmOjppbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk7Cn0KCnJldHVybiBzZWxmOjokZm9ybWF0dGVyc1skbmFtZV0gPz8gbnVsbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkaXNwbGF5KCkKewppZiAoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQgPT09ICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CnJldHVybjsKfQoKJHRoaXMtPm92ZXJ3cml0ZShwcmVnX3JlcGxhY2VfY2FsbGJhY2soInslKFthLXpcLV9dKykoPzpcOihbXiVdKykpPyV9aSIsIGZ1bmN0aW9uICgkbWF0Y2hlcykgewppZiAoJGZvcm1hdHRlciA9IHNlbGY6OmdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbigkbWF0Y2hlc1sxXSkpIHsKcmV0dXJuICRmb3JtYXR0ZXIoJHRoaXMpOwp9CgpyZXR1cm4gJG1hdGNoZXNbMF07Cn0sICR0aGlzLT5mb3JtYXQgPz8gJycpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkZXRlcm1pbmVCZXN0Rm9ybWF0KCk6IHN0cmluZwp7CnN3aXRjaCAoJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKCmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRToKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkgPyAndmVyYm9zZScgOiAndmVyYm9zZV9ub19hbnNpJzsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0U6CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUc6CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpID8gJ3ZlcnlfdmVyYm9zZScgOiAndmVyeV92ZXJib3NlX25vX2Fuc2knOwpkZWZhdWx0OgpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSA/ICdub3JtYWwnIDogJ25vcm1hbF9ub19hbnNpJzsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG92ZXJ3cml0ZShzdHJpbmcgJG1lc3NhZ2UpCnsKaWYgKCR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpIHsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MERceDFCWzJLIik7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dC0+d3JpdGVsbigkbWVzc2FnZSk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDdXJyZW50VGltZUluTWlsbGlzZWNvbmRzKCk6IGZsb2F0CnsKcmV0dXJuIHJvdW5kKG1pY3JvdGltZSh0cnVlKSAqIDEwMDApOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk6IGFycmF5CnsKcmV0dXJuIFsKJ2luZGljYXRvcicgPT4gZnVuY3Rpb24gKHNlbGYgJGluZGljYXRvcikgewpyZXR1cm4gJGluZGljYXRvci0+aW5kaWNhdG9yVmFsdWVzWyRpbmRpY2F0b3ItPmluZGljYXRvckN1cnJlbnQgJSBcY291bnQoJGluZGljYXRvci0+aW5kaWNhdG9yVmFsdWVzKV07Cn0sCidtZXNzYWdlJyA9PiBmdW5jdGlvbiAoc2VsZiAkaW5kaWNhdG9yKSB7CnJldHVybiAkaW5kaWNhdG9yLT5tZXNzYWdlOwp9LAonZWxhcHNlZCcgPT4gZnVuY3Rpb24gKHNlbGYgJGluZGljYXRvcikgewpyZXR1cm4gSGVscGVyOjpmb3JtYXRUaW1lKHRpbWUoKSAtICRpbmRpY2F0b3ItPnN0YXJ0VGltZSk7Cn0sCidtZW1vcnknID0+IGZ1bmN0aW9uICgpIHsKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0TWVtb3J5KG1lbW9yeV9nZXRfdXNhZ2UodHJ1ZSkpOwp9LApdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEN1cnNvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXE1pc3NpbmdJbnB1dEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJTdHlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XFN0cmVhbWFibGVJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlU2VjdGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ2hvaWNlUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXFF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCnVzZSBmdW5jdGlvbiBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcczsKCgoKCgoKY2xhc3MgUXVlc3Rpb25IZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewoKCgpwcml2YXRlICRpbnB1dFN0cmVhbTsKCnByaXZhdGUgc3RhdGljICRzdHR5ID0gdHJ1ZTsKcHJpdmF0ZSBzdGF0aWMgJHN0ZGluSXNJbnRlcmFjdGl2ZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KCmlmICghJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKcmV0dXJuICR0aGlzLT5nZXREZWZhdWx0QW5zd2VyKCRxdWVzdGlvbik7Cn0KCmlmICgkaW5wdXQgaW5zdGFuY2VvZiBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UgJiYgJHN0cmVhbSA9ICRpbnB1dC0+Z2V0U3RyZWFtKCkpIHsKJHRoaXMtPmlucHV0U3RyZWFtID0gJHN0cmVhbTsKfQoKdHJ5IHsKaWYgKCEkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpKSB7CnJldHVybiAkdGhpcy0+ZG9Bc2soJG91dHB1dCwgJHF1ZXN0aW9uKTsKfQoKJGludGVydmlld2VyID0gZnVuY3Rpb24gKCkgdXNlICgkb3V0cHV0LCAkcXVlc3Rpb24pIHsKcmV0dXJuICR0aGlzLT5kb0Fzaygkb3V0cHV0LCAkcXVlc3Rpb24pOwp9OwoKcmV0dXJuICR0aGlzLT52YWxpZGF0ZUF0dGVtcHRzKCRpbnRlcnZpZXdlciwgJG91dHB1dCwgJHF1ZXN0aW9uKTsKfSBjYXRjaCAoTWlzc2luZ0lucHV0RXhjZXB0aW9uICRleGNlcHRpb24pIHsKJGlucHV0LT5zZXRJbnRlcmFjdGl2ZShmYWxzZSk7CgppZiAobnVsbCA9PT0gJGZhbGxiYWNrT3V0cHV0ID0gJHRoaXMtPmdldERlZmF1bHRBbnN3ZXIoJHF1ZXN0aW9uKSkgewp0aHJvdyAkZXhjZXB0aW9uOwp9CgpyZXR1cm4gJGZhbGxiYWNrT3V0cHV0Owp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJ3F1ZXN0aW9uJzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkaXNhYmxlU3R0eSgpCnsKc2VsZjo6JHN0dHkgPSBmYWxzZTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9Bc2soT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewokdGhpcy0+d3JpdGVQcm9tcHQoJG91dHB1dCwgJHF1ZXN0aW9uKTsKCiRpbnB1dFN0cmVhbSA9ICR0aGlzLT5pbnB1dFN0cmVhbSA/OiBcU1RESU47CiRhdXRvY29tcGxldGUgPSAkcXVlc3Rpb24tPmdldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygpOwoKaWYgKG51bGwgPT09ICRhdXRvY29tcGxldGUgfHwgIXNlbGY6OiRzdHR5IHx8ICFUZXJtaW5hbDo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CiRyZXQgPSBmYWxzZTsKaWYgKCRxdWVzdGlvbi0+aXNIaWRkZW4oKSkgewp0cnkgewokaGlkZGVuUmVzcG9uc2UgPSAkdGhpcy0+Z2V0SGlkZGVuUmVzcG9uc2UoJG91dHB1dCwgJGlucHV0U3RyZWFtLCAkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkpOwokcmV0ID0gJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpID8gdHJpbSgkaGlkZGVuUmVzcG9uc2UpIDogJGhpZGRlblJlc3BvbnNlOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICghJHF1ZXN0aW9uLT5pc0hpZGRlbkZhbGxiYWNrKCkpIHsKdGhyb3cgJGU7Cn0KfQp9CgppZiAoZmFsc2UgPT09ICRyZXQpIHsKJGlzQmxvY2tlZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRpbnB1dFN0cmVhbSlbJ2Jsb2NrZWQnXSA/PyB0cnVlOwoKaWYgKCEkaXNCbG9ja2VkKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJGlucHV0U3RyZWFtLCB0cnVlKTsKfQoKJHJldCA9ICR0aGlzLT5yZWFkSW5wdXQoJGlucHV0U3RyZWFtLCAkcXVlc3Rpb24pOwoKaWYgKCEkaXNCbG9ja2VkKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJGlucHV0U3RyZWFtLCBmYWxzZSk7Cn0KCmlmIChmYWxzZSA9PT0gJHJldCkgewp0aHJvdyBuZXcgTWlzc2luZ0lucHV0RXhjZXB0aW9uKCdBYm9ydGVkLicpOwp9CmlmICgkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkpIHsKJHJldCA9IHRyaW0oJHJldCk7Cn0KfQp9IGVsc2UgewokYXV0b2NvbXBsZXRlID0gJHRoaXMtPmF1dG9jb21wbGV0ZSgkb3V0cHV0LCAkcXVlc3Rpb24sICRpbnB1dFN0cmVhbSwgJGF1dG9jb21wbGV0ZSk7CiRyZXQgPSAkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkgPyB0cmltKCRhdXRvY29tcGxldGUpIDogJGF1dG9jb21wbGV0ZTsKfQoKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlU2VjdGlvbk91dHB1dCkgewokb3V0cHV0LT5hZGRDb250ZW50KCRyZXQpOwp9CgokcmV0ID0gXHN0cmxlbigkcmV0KSA+IDAgPyAkcmV0IDogJHF1ZXN0aW9uLT5nZXREZWZhdWx0KCk7CgppZiAoJG5vcm1hbGl6ZXIgPSAkcXVlc3Rpb24tPmdldE5vcm1hbGl6ZXIoKSkgewpyZXR1cm4gJG5vcm1hbGl6ZXIoJHJldCk7Cn0KCnJldHVybiAkcmV0Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRBbnN3ZXIoUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CiRkZWZhdWx0ID0gJHF1ZXN0aW9uLT5nZXREZWZhdWx0KCk7CgppZiAobnVsbCA9PT0gJGRlZmF1bHQpIHsKcmV0dXJuICRkZWZhdWx0Owp9CgppZiAoJHZhbGlkYXRvciA9ICRxdWVzdGlvbi0+Z2V0VmFsaWRhdG9yKCkpIHsKcmV0dXJuIFxjYWxsX3VzZXJfZnVuYygkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpLCAkZGVmYXVsdCk7Cn0gZWxzZWlmICgkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbikgewokY2hvaWNlcyA9ICRxdWVzdGlvbi0+Z2V0Q2hvaWNlcygpOwoKaWYgKCEkcXVlc3Rpb24tPmlzTXVsdGlzZWxlY3QoKSkgewpyZXR1cm4gJGNob2ljZXNbJGRlZmF1bHRdID8/ICRkZWZhdWx0Owp9CgokZGVmYXVsdCA9IGV4cGxvZGUoJywnLCAkZGVmYXVsdCk7CmZvcmVhY2ggKCRkZWZhdWx0IGFzICRrID0+ICR2KSB7CiR2ID0gJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpID8gdHJpbSgkdikgOiAkdjsKJGRlZmF1bHRbJGtdID0gJGNob2ljZXNbJHZdID8/ICR2Owp9Cn0KCnJldHVybiAkZGVmYXVsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlUHJvbXB0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJG1lc3NhZ2UgPSAkcXVlc3Rpb24tPmdldFF1ZXN0aW9uKCk7CgppZiAoJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb24pIHsKJG91dHB1dC0+d3JpdGVsbihhcnJheV9tZXJnZShbCiRxdWVzdGlvbi0+Z2V0UXVlc3Rpb24oKSwKXSwgJHRoaXMtPmZvcm1hdENob2ljZVF1ZXN0aW9uQ2hvaWNlcygkcXVlc3Rpb24sICdpbmZvJykpKTsKCiRtZXNzYWdlID0gJHF1ZXN0aW9uLT5nZXRQcm9tcHQoKTsKfQoKJG91dHB1dC0+d3JpdGUoJG1lc3NhZ2UpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0Q2hvaWNlUXVlc3Rpb25DaG9pY2VzKENob2ljZVF1ZXN0aW9uICRxdWVzdGlvbiwgc3RyaW5nICR0YWcpCnsKJG1lc3NhZ2VzID0gW107CgokbWF4V2lkdGggPSBtYXgoYXJyYXlfbWFwKFtfX0NMQVNTX18sICd3aWR0aCddLCBhcnJheV9rZXlzKCRjaG9pY2VzID0gJHF1ZXN0aW9uLT5nZXRDaG9pY2VzKCkpKSk7Cgpmb3JlYWNoICgkY2hvaWNlcyBhcyAka2V5ID0+ICR2YWx1ZSkgewokcGFkZGluZyA9IHN0cl9yZXBlYXQoJyAnLCAkbWF4V2lkdGggLSBzZWxmOjp3aWR0aCgka2V5KSk7CgokbWVzc2FnZXNbXSA9IHNwcmludGYoIiAgWzwkdGFnPiVzJHBhZGRpbmc8LyR0YWc+XSAlcyIsICRrZXksICR2YWx1ZSk7Cn0KCnJldHVybiAkbWVzc2FnZXM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZUVycm9yKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBcRXhjZXB0aW9uICRlcnJvcikKewppZiAobnVsbCAhPT0gJHRoaXMtPmdldEhlbHBlclNldCgpICYmICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+aGFzKCdmb3JtYXR0ZXInKSkgewokbWVzc2FnZSA9ICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+Z2V0KCdmb3JtYXR0ZXInKS0+Zm9ybWF0QmxvY2soJGVycm9yLT5nZXRNZXNzYWdlKCksICdlcnJvcicpOwp9IGVsc2UgewokbWVzc2FnZSA9ICc8ZXJyb3I+Jy4kZXJyb3ItPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nOwp9Cgokb3V0cHV0LT53cml0ZWxuKCRtZXNzYWdlKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGF1dG9jb21wbGV0ZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uLCAkaW5wdXRTdHJlYW0sIGNhbGxhYmxlICRhdXRvY29tcGxldGUpOiBzdHJpbmcKewokY3Vyc29yID0gbmV3IEN1cnNvcigkb3V0cHV0LCAkaW5wdXRTdHJlYW0pOwoKJGZ1bGxDaG9pY2UgPSAnJzsKJHJldCA9ICcnOwoKJGkgPSAwOwokb2ZzID0gLTE7CiRtYXRjaGVzID0gJGF1dG9jb21wbGV0ZSgkcmV0KTsKJG51bU1hdGNoZXMgPSBcY291bnQoJG1hdGNoZXMpOwoKJHN0dHlNb2RlID0gc2hlbGxfZXhlYygnc3R0eSAtZycpOwokaXNTdGRpbiA9ICdwaHA6Ly9zdGRpbicgPT09IChzdHJlYW1fZ2V0X21ldGFfZGF0YSgkaW5wdXRTdHJlYW0pWyd1cmknXSA/PyBudWxsKTsKJHIgPSBbJGlucHV0U3RyZWFtXTsKJHcgPSBbXTsKCgpzaGVsbF9leGVjKCdzdHR5IC1pY2Fub24gLWVjaG8nKTsKCgokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJ2hsJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdibGFjaycsICd3aGl0ZScpKTsKCgp3aGlsZSAoIWZlb2YoJGlucHV0U3RyZWFtKSkgewp3aGlsZSAoJGlzU3RkaW4gJiYgMCA9PT0gQHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkdywgMCwgMTAwKSkgewoKJHIgPSBbJGlucHV0U3RyZWFtXTsKfQokYyA9IGZyZWFkKCRpbnB1dFN0cmVhbSwgMSk7CgoKaWYgKGZhbHNlID09PSAkYyB8fCAoJycgPT09ICRyZXQgJiYgJycgPT09ICRjICYmIG51bGwgPT09ICRxdWVzdGlvbi0+Z2V0RGVmYXVsdCgpKSkgewpzaGVsbF9leGVjKCdzdHR5ICcuJHN0dHlNb2RlKTsKdGhyb3cgbmV3IE1pc3NpbmdJbnB1dEV4Y2VwdGlvbignQWJvcnRlZC4nKTsKfSBlbHNlaWYgKCJcMTc3IiA9PT0gJGMpIHsgCmlmICgwID09PSAkbnVtTWF0Y2hlcyAmJiAwICE9PSAkaSkgewotLSRpOwokY3Vyc29yLT5tb3ZlTGVmdChzKCRmdWxsQ2hvaWNlKS0+c2xpY2UoLTEpLT53aWR0aChmYWxzZSkpOwoKJGZ1bGxDaG9pY2UgPSBzZWxmOjpzdWJzdHIoJGZ1bGxDaG9pY2UsIDAsICRpKTsKfQoKaWYgKDAgPT09ICRpKSB7CiRvZnMgPSAtMTsKJG1hdGNoZXMgPSAkYXV0b2NvbXBsZXRlKCRyZXQpOwokbnVtTWF0Y2hlcyA9IFxjb3VudCgkbWF0Y2hlcyk7Cn0gZWxzZSB7CiRudW1NYXRjaGVzID0gMDsKfQoKCiRyZXQgPSBzZWxmOjpzdWJzdHIoJHJldCwgMCwgJGkpOwp9IGVsc2VpZiAoIlwwMzMiID09PSAkYykgewoKJGMgLj0gZnJlYWQoJGlucHV0U3RyZWFtLCAyKTsKCgppZiAoaXNzZXQoJGNbMl0pICYmICgnQScgPT09ICRjWzJdIHx8ICdCJyA9PT0gJGNbMl0pKSB7CmlmICgnQScgPT09ICRjWzJdICYmIC0xID09PSAkb2ZzKSB7CiRvZnMgPSAwOwp9CgppZiAoMCA9PT0gJG51bU1hdGNoZXMpIHsKY29udGludWU7Cn0KCiRvZnMgKz0gKCdBJyA9PT0gJGNbMl0pID8gLTEgOiAxOwokb2ZzID0gKCRudW1NYXRjaGVzICsgJG9mcykgJSAkbnVtTWF0Y2hlczsKfQp9IGVsc2VpZiAoXG9yZCgkYykgPCAzMikgewppZiAoIlx0IiA9PT0gJGMgfHwgIlxuIiA9PT0gJGMpIHsKaWYgKCRudW1NYXRjaGVzID4gMCAmJiAtMSAhPT0gJG9mcykgewokcmV0ID0gKHN0cmluZykgJG1hdGNoZXNbJG9mc107CgokcmVtYWluaW5nQ2hhcmFjdGVycyA9IHN1YnN0cigkcmV0LCBcc3RybGVuKHRyaW0oJHRoaXMtPm1vc3RSZWNlbnRseUVudGVyZWRWYWx1ZSgkZnVsbENob2ljZSkpKSk7CiRvdXRwdXQtPndyaXRlKCRyZW1haW5pbmdDaGFyYWN0ZXJzKTsKJGZ1bGxDaG9pY2UgLj0gJHJlbWFpbmluZ0NoYXJhY3RlcnM7CiRpID0gKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJGZ1bGxDaG9pY2UsIG51bGwsIHRydWUpKSA/IFxzdHJsZW4oJGZ1bGxDaG9pY2UpIDogbWJfc3RybGVuKCRmdWxsQ2hvaWNlLCAkZW5jb2RpbmcpOwoKJG1hdGNoZXMgPSBhcnJheV9maWx0ZXIoCiRhdXRvY29tcGxldGUoJHJldCksCmZ1bmN0aW9uICgkbWF0Y2gpIHVzZSAoJHJldCkgewpyZXR1cm4gJycgPT09ICRyZXQgfHwgc3RyX3N0YXJ0c193aXRoKCRtYXRjaCwgJHJldCk7Cn0KKTsKJG51bU1hdGNoZXMgPSBcY291bnQoJG1hdGNoZXMpOwokb2ZzID0gLTE7Cn0KCmlmICgiXG4iID09PSAkYykgewokb3V0cHV0LT53cml0ZSgkYyk7CmJyZWFrOwp9CgokbnVtTWF0Y2hlcyA9IDA7Cn0KCmNvbnRpbnVlOwp9IGVsc2UgewppZiAoIlx4ODAiIDw9ICRjKSB7CiRjIC49IGZyZWFkKCRpbnB1dFN0cmVhbSwgWyJceEMwIiA9PiAxLCAiXHhEMCIgPT4gMSwgIlx4RTAiID0+IDIsICJceEYwIiA9PiAzXVskYyAmICJceEYwIl0pOwp9Cgokb3V0cHV0LT53cml0ZSgkYyk7CiRyZXQgLj0gJGM7CiRmdWxsQ2hvaWNlIC49ICRjOworKyRpOwoKJHRlbXBSZXQgPSAkcmV0OwoKaWYgKCRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uICYmICRxdWVzdGlvbi0+aXNNdWx0aXNlbGVjdCgpKSB7CiR0ZW1wUmV0ID0gJHRoaXMtPm1vc3RSZWNlbnRseUVudGVyZWRWYWx1ZSgkZnVsbENob2ljZSk7Cn0KCiRudW1NYXRjaGVzID0gMDsKJG9mcyA9IDA7Cgpmb3JlYWNoICgkYXV0b2NvbXBsZXRlKCRyZXQpIGFzICR2YWx1ZSkgewoKaWYgKHN0cl9zdGFydHNfd2l0aCgkdmFsdWUsICR0ZW1wUmV0KSkgewokbWF0Y2hlc1skbnVtTWF0Y2hlcysrXSA9ICR2YWx1ZTsKfQp9Cn0KCiRjdXJzb3ItPmNsZWFyTGluZUFmdGVyKCk7CgppZiAoJG51bU1hdGNoZXMgPiAwICYmIC0xICE9PSAkb2ZzKSB7CiRjdXJzb3ItPnNhdmVQb3NpdGlvbigpOwoKJGNoYXJhY3RlcnNFbnRlcmVkID0gXHN0cmxlbih0cmltKCR0aGlzLT5tb3N0UmVjZW50bHlFbnRlcmVkVmFsdWUoJGZ1bGxDaG9pY2UpKSk7CiRvdXRwdXQtPndyaXRlKCc8aGw+Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKHN1YnN0cigkbWF0Y2hlc1skb2ZzXSwgJGNoYXJhY3RlcnNFbnRlcmVkKSkuJzwvaGw+Jyk7CiRjdXJzb3ItPnJlc3RvcmVQb3NpdGlvbigpOwp9Cn0KCgpzaGVsbF9leGVjKCdzdHR5ICcuJHN0dHlNb2RlKTsKCnJldHVybiAkZnVsbENob2ljZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtb3N0UmVjZW50bHlFbnRlcmVkVmFsdWUoc3RyaW5nICRlbnRlcmVkKTogc3RyaW5nCnsKCmlmICghc3RyX2NvbnRhaW5zKCRlbnRlcmVkLCAnLCcpKSB7CnJldHVybiAkZW50ZXJlZDsKfQoKJGNob2ljZXMgPSBleHBsb2RlKCcsJywgJGVudGVyZWQpOwppZiAoJycgIT09ICRsYXN0Q2hvaWNlID0gdHJpbSgkY2hvaWNlc1tcY291bnQoJGNob2ljZXMpIC0gMV0pKSB7CnJldHVybiAkbGFzdENob2ljZTsKfQoKcmV0dXJuICRlbnRlcmVkOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0SGlkZGVuUmVzcG9uc2UoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsICRpbnB1dFN0cmVhbSwgYm9vbCAkdHJpbW1hYmxlID0gdHJ1ZSk6IHN0cmluZwp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokZXhlID0gX19ESVJfXy4nLy4uL1Jlc291cmNlcy9iaW4vaGlkZGVuaW5wdXQuZXhlJzsKCgppZiAoJ3BoYXI6JyA9PT0gc3Vic3RyKF9fRklMRV9fLCAwLCA1KSkgewokdG1wRXhlID0gc3lzX2dldF90ZW1wX2RpcigpLicvaGlkZGVuaW5wdXQuZXhlJzsKY29weSgkZXhlLCAkdG1wRXhlKTsKJGV4ZSA9ICR0bXBFeGU7Cn0KCiRzRXhlYyA9IHNoZWxsX2V4ZWMoJyInLiRleGUuJyInKTsKJHZhbHVlID0gJHRyaW1tYWJsZSA/IHJ0cmltKCRzRXhlYykgOiAkc0V4ZWM7CiRvdXRwdXQtPndyaXRlbG4oJycpOwoKaWYgKGlzc2V0KCR0bXBFeGUpKSB7CnVubGluaygkdG1wRXhlKTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKaWYgKHNlbGY6OiRzdHR5ICYmIFRlcm1pbmFsOjpoYXNTdHR5QXZhaWxhYmxlKCkpIHsKJHN0dHlNb2RlID0gc2hlbGxfZXhlYygnc3R0eSAtZycpOwpzaGVsbF9leGVjKCdzdHR5IC1lY2hvJyk7Cn0gZWxzZWlmICgkdGhpcy0+aXNJbnRlcmFjdGl2ZUlucHV0KCRpbnB1dFN0cmVhbSkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBoaWRlIHRoZSByZXNwb25zZS4nKTsKfQoKJHZhbHVlID0gZmdldHMoJGlucHV0U3RyZWFtLCA0MDk2KTsKCmlmIChzZWxmOjokc3R0eSAmJiBUZXJtaW5hbDo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CnNoZWxsX2V4ZWMoJ3N0dHkgJy4kc3R0eU1vZGUpOwp9CgppZiAoZmFsc2UgPT09ICR2YWx1ZSkgewp0aHJvdyBuZXcgTWlzc2luZ0lucHV0RXhjZXB0aW9uKCdBYm9ydGVkLicpOwp9CmlmICgkdHJpbW1hYmxlKSB7CiR2YWx1ZSA9IHRyaW0oJHZhbHVlKTsKfQokb3V0cHV0LT53cml0ZWxuKCcnKTsKCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVBdHRlbXB0cyhjYWxsYWJsZSAkaW50ZXJ2aWV3ZXIsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJGVycm9yID0gbnVsbDsKJGF0dGVtcHRzID0gJHF1ZXN0aW9uLT5nZXRNYXhBdHRlbXB0cygpOwoKd2hpbGUgKG51bGwgPT09ICRhdHRlbXB0cyB8fCAkYXR0ZW1wdHMtLSkgewppZiAobnVsbCAhPT0gJGVycm9yKSB7CiR0aGlzLT53cml0ZUVycm9yKCRvdXRwdXQsICRlcnJvcik7Cn0KCnRyeSB7CnJldHVybiAkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpKCRpbnRlcnZpZXdlcigpKTsKfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyAkZTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZXJyb3IpIHsKfQp9Cgp0aHJvdyAkZXJyb3I7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZUlucHV0KCRpbnB1dFN0cmVhbSk6IGJvb2wKewppZiAoJ3BocDovL3N0ZGluJyAhPT0gKHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRpbnB1dFN0cmVhbSlbJ3VyaSddID8/IG51bGwpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKG51bGwgIT09IHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmUpIHsKcmV0dXJuIHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmU7Cn0KCmlmIChcZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1faXNhdHR5JykpIHsKcmV0dXJuIHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmUgPSBAc3RyZWFtX2lzYXR0eShmb3BlbigncGhwOi8vc3RkaW4nLCAncicpKTsKfQoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2lzYXR0eScpKSB7CnJldHVybiBzZWxmOjokc3RkaW5Jc0ludGVyYWN0aXZlID0gQHBvc2l4X2lzYXR0eShmb3BlbigncGhwOi8vc3RkaW4nLCAncicpKTsKfQoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKcmV0dXJuIHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmUgPSB0cnVlOwp9CgpyZXR1cm4gc2VsZjo6JHN0ZGluSXNJbnRlcmFjdGl2ZSA9IChib29sKSBzaGVsbF9leGVjKCdzdHR5IDI+ICcuKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gJ05VTCcgOiAnL2Rldi9udWxsJykpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZElucHV0KCRpbnB1dFN0cmVhbSwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CmlmICghJHF1ZXN0aW9uLT5pc011bHRpbGluZSgpKSB7CiRjcCA9ICR0aGlzLT5zZXRJT0NvZGVwYWdlKCk7CiRyZXQgPSBmZ2V0cygkaW5wdXRTdHJlYW0sIDQwOTYpOwoKcmV0dXJuICR0aGlzLT5yZXNldElPQ29kZXBhZ2UoJGNwLCAkcmV0KTsKfQoKJG11bHRpTGluZVN0cmVhbVJlYWRlciA9ICR0aGlzLT5jbG9uZUlucHV0U3RyZWFtKCRpbnB1dFN0cmVhbSk7CmlmIChudWxsID09PSAkbXVsdGlMaW5lU3RyZWFtUmVhZGVyKSB7CnJldHVybiBmYWxzZTsKfQoKJHJldCA9ICcnOwokY3AgPSAkdGhpcy0+c2V0SU9Db2RlcGFnZSgpOwp3aGlsZSAoZmFsc2UgIT09ICgkY2hhciA9IGZnZXRjKCRtdWx0aUxpbmVTdHJlYW1SZWFkZXIpKSkgewppZiAoXFBIUF9FT0wgPT09ICJ7JHJldH17JGNoYXJ9IikgewpicmVhazsKfQokcmV0IC49ICRjaGFyOwp9CgpyZXR1cm4gJHRoaXMtPnJlc2V0SU9Db2RlcGFnZSgkY3AsICRyZXQpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0SU9Db2RlcGFnZSgpOiBpbnQKewppZiAoXGZ1bmN0aW9uX2V4aXN0cygnc2FwaV93aW5kb3dzX2NwX3NldCcpKSB7CiRjcCA9IHNhcGlfd2luZG93c19jcF9nZXQoKTsKc2FwaV93aW5kb3dzX2NwX3NldChzYXBpX3dpbmRvd3NfY3BfZ2V0KCdvZW0nKSk7CgpyZXR1cm4gJGNwOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzZXRJT0NvZGVwYWdlKGludCAkY3AsICRpbnB1dCkKewppZiAoMCAhPT0gJGNwKSB7CnNhcGlfd2luZG93c19jcF9zZXQoJGNwKTsKCmlmIChmYWxzZSAhPT0gJGlucHV0ICYmICcnICE9PSAkaW5wdXQpIHsKJGlucHV0ID0gc2FwaV93aW5kb3dzX2NwX2NvbnYoc2FwaV93aW5kb3dzX2NwX2dldCgnb2VtJyksICRjcCwgJGlucHV0KTsKfQp9CgpyZXR1cm4gJGlucHV0Owp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY2xvbmVJbnB1dFN0cmVhbSgkaW5wdXRTdHJlYW0pCnsKJHN0cmVhbU1ldGFEYXRhID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJGlucHV0U3RyZWFtKTsKJHNlZWthYmxlID0gJHN0cmVhbU1ldGFEYXRhWydzZWVrYWJsZSddID8/IGZhbHNlOwokbW9kZSA9ICRzdHJlYW1NZXRhRGF0YVsnbW9kZSddID8/ICdyYic7CiR1cmkgPSAkc3RyZWFtTWV0YURhdGFbJ3VyaSddID8/IG51bGw7CgppZiAobnVsbCA9PT0gJHVyaSkgewpyZXR1cm4gbnVsbDsKfQoKJGNsb25lU3RyZWFtID0gZm9wZW4oJHVyaSwgJG1vZGUpOwoKCgppZiAodHJ1ZSA9PT0gJHNlZWthYmxlICYmICFcaW5fYXJyYXkoJG1vZGUsIFsncicsICdyYicsICdydCddKSkgewokb2Zmc2V0ID0gZnRlbGwoJGlucHV0U3RyZWFtKTsKcmV3aW5kKCRpbnB1dFN0cmVhbSk7CnN0cmVhbV9jb3B5X3RvX3N0cmVhbSgkaW5wdXRTdHJlYW0sICRjbG9uZVN0cmVhbSk7CmZzZWVrKCRpbnB1dFN0cmVhbSwgJG9mZnNldCk7CmZzZWVrKCRjbG9uZVN0cmVhbSwgJG9mZnNldCk7Cn0KCnJldHVybiAkY2xvbmVTdHJlYW07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ2hvaWNlUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENvbmZpcm1hdGlvblF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGVcU3ltZm9ueVN0eWxlOwoKCgoKCgpjbGFzcyBTeW1mb255UXVlc3Rpb25IZWxwZXIgZXh0ZW5kcyBRdWVzdGlvbkhlbHBlcgp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZVByb21wdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CiR0ZXh0ID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkcXVlc3Rpb24tPmdldFF1ZXN0aW9uKCkpOwokZGVmYXVsdCA9ICRxdWVzdGlvbi0+Z2V0RGVmYXVsdCgpOwoKaWYgKCRxdWVzdGlvbi0+aXNNdWx0aWxpbmUoKSkgewokdGV4dCAuPSBzcHJpbnRmKCcgKHByZXNzICVzIHRvIGNvbnRpbnVlKScsICR0aGlzLT5nZXRFb2ZTaG9ydGN1dCgpKTsKfQoKc3dpdGNoICh0cnVlKSB7CmNhc2UgbnVsbCA9PT0gJGRlZmF1bHQ6CiR0ZXh0ID0gc3ByaW50ZignIDxpbmZvPiVzPC9pbmZvPjonLCAkdGV4dCk7CgpicmVhazsKCmNhc2UgJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ29uZmlybWF0aW9uUXVlc3Rpb246CiR0ZXh0ID0gc3ByaW50ZignIDxpbmZvPiVzICh5ZXMvbm8pPC9pbmZvPiBbPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+XTonLCAkdGV4dCwgJGRlZmF1bHQgPyAneWVzJyA6ICdubycpOwoKYnJlYWs7CgpjYXNlICRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uICYmICRxdWVzdGlvbi0+aXNNdWx0aXNlbGVjdCgpOgokY2hvaWNlcyA9ICRxdWVzdGlvbi0+Z2V0Q2hvaWNlcygpOwokZGVmYXVsdCA9IGV4cGxvZGUoJywnLCAkZGVmYXVsdCk7Cgpmb3JlYWNoICgkZGVmYXVsdCBhcyAka2V5ID0+ICR2YWx1ZSkgewokZGVmYXVsdFska2V5XSA9ICRjaG9pY2VzW3RyaW0oJHZhbHVlKV07Cn0KCiR0ZXh0ID0gc3ByaW50ZignIDxpbmZvPiVzPC9pbmZvPiBbPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+XTonLCAkdGV4dCwgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoaW1wbG9kZSgnLCAnLCAkZGVmYXVsdCkpKTsKCmJyZWFrOwoKY2FzZSAkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbjoKJGNob2ljZXMgPSAkcXVlc3Rpb24tPmdldENob2ljZXMoKTsKJHRleHQgPSBzcHJpbnRmKCcgPGluZm8+JXM8L2luZm8+IFs8Y29tbWVudD4lczwvY29tbWVudD5dOicsICR0ZXh0LCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkY2hvaWNlc1skZGVmYXVsdF0gPz8gJGRlZmF1bHQpKTsKCmJyZWFrOwoKZGVmYXVsdDoKJHRleHQgPSBzcHJpbnRmKCcgPGluZm8+JXM8L2luZm8+IFs8Y29tbWVudD4lczwvY29tbWVudD5dOicsICR0ZXh0LCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkZGVmYXVsdCkpOwp9Cgokb3V0cHV0LT53cml0ZWxuKCR0ZXh0KTsKCiRwcm9tcHQgPSAnID4gJzsKCmlmICgkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbikgewokb3V0cHV0LT53cml0ZWxuKCR0aGlzLT5mb3JtYXRDaG9pY2VRdWVzdGlvbkNob2ljZXMoJHF1ZXN0aW9uLCAnY29tbWVudCcpKTsKCiRwcm9tcHQgPSAkcXVlc3Rpb24tPmdldFByb21wdCgpOwp9Cgokb3V0cHV0LT53cml0ZSgkcHJvbXB0KTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlRXJyb3IoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFxFeGNlcHRpb24gJGVycm9yKQp7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgU3ltZm9ueVN0eWxlKSB7CiRvdXRwdXQtPm5ld0xpbmUoKTsKJG91dHB1dC0+ZXJyb3IoJGVycm9yLT5nZXRNZXNzYWdlKCkpOwoKcmV0dXJuOwp9CgpwYXJlbnQ6OndyaXRlRXJyb3IoJG91dHB1dCwgJGVycm9yKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRFb2ZTaG9ydGN1dCgpOiBzdHJpbmcKewppZiAoJ1dpbmRvd3MnID09PSBcUEhQX09TX0ZBTUlMWSkgewpyZXR1cm4gJzxjb21tZW50PkN0cmwrWjwvY29tbWVudD4gdGhlbiA8Y29tbWVudD5FbnRlcjwvY29tbWVudD4nOwp9CgpyZXR1cm4gJzxjb21tZW50PkN0cmwrRDwvY29tbWVudD4nOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZVNlY3Rpb25PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKCgpjbGFzcyBUYWJsZQp7CnByaXZhdGUgY29uc3QgU0VQQVJBVE9SX1RPUCA9IDA7CnByaXZhdGUgY29uc3QgU0VQQVJBVE9SX1RPUF9CT1RUT00gPSAxOwpwcml2YXRlIGNvbnN0IFNFUEFSQVRPUl9NSUQgPSAyOwpwcml2YXRlIGNvbnN0IFNFUEFSQVRPUl9CT1RUT00gPSAzOwpwcml2YXRlIGNvbnN0IEJPUkRFUl9PVVRTSURFID0gMDsKcHJpdmF0ZSBjb25zdCBCT1JERVJfSU5TSURFID0gMTsKCnByaXZhdGUgJGhlYWRlclRpdGxlOwpwcml2YXRlICRmb290ZXJUaXRsZTsKCgoKCnByaXZhdGUgJGhlYWRlcnMgPSBbXTsKCgoKCnByaXZhdGUgJHJvd3MgPSBbXTsKcHJpdmF0ZSAkaG9yaXpvbnRhbCA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkZWZmZWN0aXZlQ29sdW1uV2lkdGhzID0gW107CgoKCgoKCnByaXZhdGUgJG51bWJlck9mQ29sdW1uczsKCgoKCnByaXZhdGUgJG91dHB1dDsKCgoKCnByaXZhdGUgJHN0eWxlOwoKCgoKcHJpdmF0ZSAkY29sdW1uU3R5bGVzID0gW107CgoKCgoKCnByaXZhdGUgJGNvbHVtbldpZHRocyA9IFtdOwpwcml2YXRlICRjb2x1bW5NYXhXaWR0aHMgPSBbXTsKCgoKCnByaXZhdGUgc3RhdGljICRzdHlsZXM7Cgpwcml2YXRlICRyZW5kZXJlZCA9IGZhbHNlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwoKaWYgKCFzZWxmOjokc3R5bGVzKSB7CnNlbGY6OiRzdHlsZXMgPSBzZWxmOjppbml0U3R5bGVzKCk7Cn0KCiR0aGlzLT5zZXRTdHlsZSgnZGVmYXVsdCcpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFN0eWxlRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUsIFRhYmxlU3R5bGUgJHN0eWxlKQp7CmlmICghc2VsZjo6JHN0eWxlcykgewpzZWxmOjokc3R5bGVzID0gc2VsZjo6aW5pdFN0eWxlcygpOwp9CgpzZWxmOjokc3R5bGVzWyRuYW1lXSA9ICRzdHlsZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN0eWxlRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUpCnsKaWYgKCFzZWxmOjokc3R5bGVzKSB7CnNlbGY6OiRzdHlsZXMgPSBzZWxmOjppbml0U3R5bGVzKCk7Cn0KCmlmIChpc3NldChzZWxmOjokc3R5bGVzWyRuYW1lXSkpIHsKcmV0dXJuIHNlbGY6OiRzdHlsZXNbJG5hbWVdOwp9Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1N0eWxlICIlcyIgaXMgbm90IGRlZmluZWQuJywgJG5hbWUpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHlsZSgkbmFtZSkKewokdGhpcy0+c3R5bGUgPSAkdGhpcy0+cmVzb2x2ZVN0eWxlKCRuYW1lKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoKQp7CnJldHVybiAkdGhpcy0+c3R5bGU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29sdW1uU3R5bGUoaW50ICRjb2x1bW5JbmRleCwgJG5hbWUpCnsKJHRoaXMtPmNvbHVtblN0eWxlc1skY29sdW1uSW5kZXhdID0gJHRoaXMtPnJlc29sdmVTdHlsZSgkbmFtZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sdW1uU3R5bGUoaW50ICRjb2x1bW5JbmRleCkKewpyZXR1cm4gJHRoaXMtPmNvbHVtblN0eWxlc1skY29sdW1uSW5kZXhdID8/ICR0aGlzLT5nZXRTdHlsZSgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb2x1bW5XaWR0aChpbnQgJGNvbHVtbkluZGV4LCBpbnQgJHdpZHRoKQp7CiR0aGlzLT5jb2x1bW5XaWR0aHNbJGNvbHVtbkluZGV4XSA9ICR3aWR0aDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29sdW1uV2lkdGhzKGFycmF5ICR3aWR0aHMpCnsKJHRoaXMtPmNvbHVtbldpZHRocyA9IFtdOwpmb3JlYWNoICgkd2lkdGhzIGFzICRpbmRleCA9PiAkd2lkdGgpIHsKJHRoaXMtPnNldENvbHVtbldpZHRoKCRpbmRleCwgJHdpZHRoKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb2x1bW5NYXhXaWR0aChpbnQgJGNvbHVtbkluZGV4LCBpbnQgJHdpZHRoKTogc2VsZgp7CmlmICghJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCkgaW5zdGFuY2VvZiBXcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdTZXR0aW5nIGEgbWF4aW11bSBjb2x1bW4gd2lkdGggaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBhICIlcyIgZm9ybWF0dGVyLCBnb3QgIiVzIi4nLCBXcmFwcGFibGVPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U6OmNsYXNzLCBnZXRfZGVidWdfdHlwZSgkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSkpKTsKfQoKJHRoaXMtPmNvbHVtbk1heFdpZHRoc1skY29sdW1uSW5kZXhdID0gJHdpZHRoOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVycyhhcnJheSAkaGVhZGVycykKewokaGVhZGVycyA9IGFycmF5X3ZhbHVlcygkaGVhZGVycyk7CmlmICghZW1wdHkoJGhlYWRlcnMpICYmICFcaXNfYXJyYXkoJGhlYWRlcnNbMF0pKSB7CiRoZWFkZXJzID0gWyRoZWFkZXJzXTsKfQoKJHRoaXMtPmhlYWRlcnMgPSAkaGVhZGVyczsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJvd3MoYXJyYXkgJHJvd3MpCnsKJHRoaXMtPnJvd3MgPSBbXTsKCnJldHVybiAkdGhpcy0+YWRkUm93cygkcm93cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSb3dzKGFycmF5ICRyb3dzKQp7CmZvcmVhY2ggKCRyb3dzIGFzICRyb3cpIHsKJHRoaXMtPmFkZFJvdygkcm93KTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUm93KCRyb3cpCnsKaWYgKCRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewokdGhpcy0+cm93c1tdID0gJHJvdzsKCnJldHVybiAkdGhpczsKfQoKaWYgKCFcaXNfYXJyYXkoJHJvdykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQSByb3cgbXVzdCBiZSBhbiBhcnJheSBvciBhIFRhYmxlU2VwYXJhdG9yIGluc3RhbmNlLicpOwp9CgokdGhpcy0+cm93c1tdID0gYXJyYXlfdmFsdWVzKCRyb3cpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmRSb3coJHJvdyk6IHNlbGYKewppZiAoISR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlU2VjdGlvbk91dHB1dCkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdPdXRwdXQgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mICIlcyIgd2hlbiBjYWxsaW5nICIlcyIuJywgQ29uc29sZVNlY3Rpb25PdXRwdXQ6OmNsYXNzLCBfX01FVEhPRF9fKSk7Cn0KCmlmICgkdGhpcy0+cmVuZGVyZWQpIHsKJHRoaXMtPm91dHB1dC0+Y2xlYXIoJHRoaXMtPmNhbGN1bGF0ZVJvd0NvdW50KCkpOwp9CgokdGhpcy0+YWRkUm93KCRyb3cpOwokdGhpcy0+cmVuZGVyKCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSb3coJGNvbHVtbiwgYXJyYXkgJHJvdykKewokdGhpcy0+cm93c1skY29sdW1uXSA9ICRyb3c7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXJUaXRsZSg/c3RyaW5nICR0aXRsZSk6IHNlbGYKewokdGhpcy0+aGVhZGVyVGl0bGUgPSAkdGl0bGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb290ZXJUaXRsZSg/c3RyaW5nICR0aXRsZSk6IHNlbGYKewokdGhpcy0+Zm9vdGVyVGl0bGUgPSAkdGl0bGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIb3Jpem9udGFsKGJvb2wgJGhvcml6b250YWwgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5ob3Jpem9udGFsID0gJGhvcml6b250YWw7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCkKewokZGl2aWRlciA9IG5ldyBUYWJsZVNlcGFyYXRvcigpOwppZiAoJHRoaXMtPmhvcml6b250YWwpIHsKJHJvd3MgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmhlYWRlcnNbMF0gPz8gW10gYXMgJGkgPT4gJGhlYWRlcikgewokcm93c1skaV0gPSBbJGhlYWRlcl07CmZvcmVhY2ggKCR0aGlzLT5yb3dzIGFzICRyb3cpIHsKaWYgKCRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewpjb250aW51ZTsKfQppZiAoaXNzZXQoJHJvd1skaV0pKSB7CiRyb3dzWyRpXVtdID0gJHJvd1skaV07Cn0gZWxzZWlmICgkcm93c1skaV1bMF0gaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJHJvd3NbJGldWzBdLT5nZXRDb2xzcGFuKCkgPj0gMikgewoKfSBlbHNlIHsKJHJvd3NbJGldW10gPSBudWxsOwp9Cn0KfQp9IGVsc2Ugewokcm93cyA9IGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzLCBbJGRpdmlkZXJdLCAkdGhpcy0+cm93cyk7Cn0KCiR0aGlzLT5jYWxjdWxhdGVOdW1iZXJPZkNvbHVtbnMoJHJvd3MpOwoKJHJvd0dyb3VwcyA9ICR0aGlzLT5idWlsZFRhYmxlUm93cygkcm93cyk7CiR0aGlzLT5jYWxjdWxhdGVDb2x1bW5zV2lkdGgoJHJvd0dyb3Vwcyk7CgokaXNIZWFkZXIgPSAhJHRoaXMtPmhvcml6b250YWw7CiRpc0ZpcnN0Um93ID0gJHRoaXMtPmhvcml6b250YWw7CiRoYXNUaXRsZSA9IChib29sKSAkdGhpcy0+aGVhZGVyVGl0bGU7Cgpmb3JlYWNoICgkcm93R3JvdXBzIGFzICRyb3dHcm91cCkgewokaXNIZWFkZXJTZXBhcmF0b3JSZW5kZXJlZCA9IGZhbHNlOwoKZm9yZWFjaCAoJHJvd0dyb3VwIGFzICRyb3cpIHsKaWYgKCRkaXZpZGVyID09PSAkcm93KSB7CiRpc0hlYWRlciA9IGZhbHNlOwokaXNGaXJzdFJvdyA9IHRydWU7Cgpjb250aW51ZTsKfQoKaWYgKCRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewokdGhpcy0+cmVuZGVyUm93U2VwYXJhdG9yKCk7Cgpjb250aW51ZTsKfQoKaWYgKCEkcm93KSB7CmNvbnRpbnVlOwp9CgppZiAoJGlzSGVhZGVyICYmICEkaXNIZWFkZXJTZXBhcmF0b3JSZW5kZXJlZCkgewokdGhpcy0+cmVuZGVyUm93U2VwYXJhdG9yKAokaXNIZWFkZXIgPyBzZWxmOjpTRVBBUkFUT1JfVE9QIDogc2VsZjo6U0VQQVJBVE9SX1RPUF9CT1RUT00sCiRoYXNUaXRsZSA/ICR0aGlzLT5oZWFkZXJUaXRsZSA6IG51bGwsCiRoYXNUaXRsZSA/ICR0aGlzLT5zdHlsZS0+Z2V0SGVhZGVyVGl0bGVGb3JtYXQoKSA6IG51bGwKKTsKJGhhc1RpdGxlID0gZmFsc2U7CiRpc0hlYWRlclNlcGFyYXRvclJlbmRlcmVkID0gdHJ1ZTsKfQoKaWYgKCRpc0ZpcnN0Um93KSB7CiR0aGlzLT5yZW5kZXJSb3dTZXBhcmF0b3IoCiRpc0hlYWRlciA/IHNlbGY6OlNFUEFSQVRPUl9UT1AgOiBzZWxmOjpTRVBBUkFUT1JfVE9QX0JPVFRPTSwKJGhhc1RpdGxlID8gJHRoaXMtPmhlYWRlclRpdGxlIDogbnVsbCwKJGhhc1RpdGxlID8gJHRoaXMtPnN0eWxlLT5nZXRIZWFkZXJUaXRsZUZvcm1hdCgpIDogbnVsbAopOwokaXNGaXJzdFJvdyA9IGZhbHNlOwokaGFzVGl0bGUgPSBmYWxzZTsKfQoKaWYgKCR0aGlzLT5ob3Jpem9udGFsKSB7CiR0aGlzLT5yZW5kZXJSb3coJHJvdywgJHRoaXMtPnN0eWxlLT5nZXRDZWxsUm93Rm9ybWF0KCksICR0aGlzLT5zdHlsZS0+Z2V0Q2VsbEhlYWRlckZvcm1hdCgpKTsKfSBlbHNlIHsKJHRoaXMtPnJlbmRlclJvdygkcm93LCAkaXNIZWFkZXIgPyAkdGhpcy0+c3R5bGUtPmdldENlbGxIZWFkZXJGb3JtYXQoKSA6ICR0aGlzLT5zdHlsZS0+Z2V0Q2VsbFJvd0Zvcm1hdCgpKTsKfQp9Cn0KJHRoaXMtPnJlbmRlclJvd1NlcGFyYXRvcihzZWxmOjpTRVBBUkFUT1JfQk9UVE9NLCAkdGhpcy0+Zm9vdGVyVGl0bGUsICR0aGlzLT5zdHlsZS0+Z2V0Rm9vdGVyVGl0bGVGb3JtYXQoKSk7CgokdGhpcy0+Y2xlYW51cCgpOwokdGhpcy0+cmVuZGVyZWQgPSB0cnVlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW5kZXJSb3dTZXBhcmF0b3IoaW50ICR0eXBlID0gc2VsZjo6U0VQQVJBVE9SX01JRCwgc3RyaW5nICR0aXRsZSA9IG51bGwsIHN0cmluZyAkdGl0bGVGb3JtYXQgPSBudWxsKQp7CmlmICgwID09PSAkY291bnQgPSAkdGhpcy0+bnVtYmVyT2ZDb2x1bW5zKSB7CnJldHVybjsKfQoKJGJvcmRlcnMgPSAkdGhpcy0+c3R5bGUtPmdldEJvcmRlckNoYXJzKCk7CmlmICghJGJvcmRlcnNbMF0gJiYgISRib3JkZXJzWzJdICYmICEkdGhpcy0+c3R5bGUtPmdldENyb3NzaW5nQ2hhcigpKSB7CnJldHVybjsKfQoKJGNyb3NzaW5ncyA9ICR0aGlzLT5zdHlsZS0+Z2V0Q3Jvc3NpbmdDaGFycygpOwppZiAoc2VsZjo6U0VQQVJBVE9SX01JRCA9PT0gJHR5cGUpIHsKWyRob3Jpem9udGFsLCAkbGVmdENoYXIsICRtaWRDaGFyLCAkcmlnaHRDaGFyXSA9IFskYm9yZGVyc1syXSwgJGNyb3NzaW5nc1s4XSwgJGNyb3NzaW5nc1swXSwgJGNyb3NzaW5nc1s0XV07Cn0gZWxzZWlmIChzZWxmOjpTRVBBUkFUT1JfVE9QID09PSAkdHlwZSkgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzBdLCAkY3Jvc3NpbmdzWzFdLCAkY3Jvc3NpbmdzWzJdLCAkY3Jvc3NpbmdzWzNdXTsKfSBlbHNlaWYgKHNlbGY6OlNFUEFSQVRPUl9UT1BfQk9UVE9NID09PSAkdHlwZSkgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzBdLCAkY3Jvc3NpbmdzWzldLCAkY3Jvc3NpbmdzWzEwXSwgJGNyb3NzaW5nc1sxMV1dOwp9IGVsc2UgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzBdLCAkY3Jvc3NpbmdzWzddLCAkY3Jvc3NpbmdzWzZdLCAkY3Jvc3NpbmdzWzVdXTsKfQoKJG1hcmt1cCA9ICRsZWZ0Q2hhcjsKZm9yICgkY29sdW1uID0gMDsgJGNvbHVtbiA8ICRjb3VudDsgKyskY29sdW1uKSB7CiRtYXJrdXAgLj0gc3RyX3JlcGVhdCgkaG9yaXpvbnRhbCwgJHRoaXMtPmVmZmVjdGl2ZUNvbHVtbldpZHRoc1skY29sdW1uXSk7CiRtYXJrdXAgLj0gJGNvbHVtbiA9PT0gJGNvdW50IC0gMSA/ICRyaWdodENoYXIgOiAkbWlkQ2hhcjsKfQoKaWYgKG51bGwgIT09ICR0aXRsZSkgewokdGl0bGVMZW5ndGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkZm9ybWF0dGVyID0gJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRmb3JtYXR0ZWRUaXRsZSA9IHNwcmludGYoJHRpdGxlRm9ybWF0LCAkdGl0bGUpKSk7CiRtYXJrdXBMZW5ndGggPSBIZWxwZXI6OndpZHRoKCRtYXJrdXApOwppZiAoJHRpdGxlTGVuZ3RoID4gJGxpbWl0ID0gJG1hcmt1cExlbmd0aCAtIDQpIHsKJHRpdGxlTGVuZ3RoID0gJGxpbWl0OwokZm9ybWF0TGVuZ3RoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJGZvcm1hdHRlciwgc3ByaW50ZigkdGl0bGVGb3JtYXQsICcnKSkpOwokZm9ybWF0dGVkVGl0bGUgPSBzcHJpbnRmKCR0aXRsZUZvcm1hdCwgSGVscGVyOjpzdWJzdHIoJHRpdGxlLCAwLCAkbGltaXQgLSAkZm9ybWF0TGVuZ3RoIC0gMykuJy4uLicpOwp9CgokdGl0bGVTdGFydCA9IGludGRpdigkbWFya3VwTGVuZ3RoIC0gJHRpdGxlTGVuZ3RoLCAyKTsKaWYgKGZhbHNlID09PSBtYl9kZXRlY3RfZW5jb2RpbmcoJG1hcmt1cCwgbnVsbCwgdHJ1ZSkpIHsKJG1hcmt1cCA9IHN1YnN0cl9yZXBsYWNlKCRtYXJrdXAsICRmb3JtYXR0ZWRUaXRsZSwgJHRpdGxlU3RhcnQsICR0aXRsZUxlbmd0aCk7Cn0gZWxzZSB7CiRtYXJrdXAgPSBtYl9zdWJzdHIoJG1hcmt1cCwgMCwgJHRpdGxlU3RhcnQpLiRmb3JtYXR0ZWRUaXRsZS5tYl9zdWJzdHIoJG1hcmt1cCwgJHRpdGxlU3RhcnQgKyAkdGl0bGVMZW5ndGgpOwp9Cn0KCiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oc3ByaW50ZigkdGhpcy0+c3R5bGUtPmdldEJvcmRlckZvcm1hdCgpLCAkbWFya3VwKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVuZGVyQ29sdW1uU2VwYXJhdG9yKGludCAkdHlwZSA9IHNlbGY6OkJPUkRFUl9PVVRTSURFKTogc3RyaW5nCnsKJGJvcmRlcnMgPSAkdGhpcy0+c3R5bGUtPmdldEJvcmRlckNoYXJzKCk7CgpyZXR1cm4gc3ByaW50ZigkdGhpcy0+c3R5bGUtPmdldEJvcmRlckZvcm1hdCgpLCBzZWxmOjpCT1JERVJfT1VUU0lERSA9PT0gJHR5cGUgPyAkYm9yZGVyc1sxXSA6ICRib3JkZXJzWzNdKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVuZGVyUm93KGFycmF5ICRyb3csIHN0cmluZyAkY2VsbEZvcm1hdCwgc3RyaW5nICRmaXJzdENlbGxGb3JtYXQgPSBudWxsKQp7CiRyb3dDb250ZW50ID0gJHRoaXMtPnJlbmRlckNvbHVtblNlcGFyYXRvcihzZWxmOjpCT1JERVJfT1VUU0lERSk7CiRjb2x1bW5zID0gJHRoaXMtPmdldFJvd0NvbHVtbnMoJHJvdyk7CiRsYXN0ID0gXGNvdW50KCRjb2x1bW5zKSAtIDE7CmZvcmVhY2ggKCRjb2x1bW5zIGFzICRpID0+ICRjb2x1bW4pIHsKaWYgKCRmaXJzdENlbGxGb3JtYXQgJiYgMCA9PT0gJGkpIHsKJHJvd0NvbnRlbnQgLj0gJHRoaXMtPnJlbmRlckNlbGwoJHJvdywgJGNvbHVtbiwgJGZpcnN0Q2VsbEZvcm1hdCk7Cn0gZWxzZSB7CiRyb3dDb250ZW50IC49ICR0aGlzLT5yZW5kZXJDZWxsKCRyb3csICRjb2x1bW4sICRjZWxsRm9ybWF0KTsKfQokcm93Q29udGVudCAuPSAkdGhpcy0+cmVuZGVyQ29sdW1uU2VwYXJhdG9yKCRsYXN0ID09PSAkaSA/IHNlbGY6OkJPUkRFUl9PVVRTSURFIDogc2VsZjo6Qk9SREVSX0lOU0lERSk7Cn0KJHRoaXMtPm91dHB1dC0+d3JpdGVsbigkcm93Q29udGVudCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVuZGVyQ2VsbChhcnJheSAkcm93LCBpbnQgJGNvbHVtbiwgc3RyaW5nICRjZWxsRm9ybWF0KTogc3RyaW5nCnsKJGNlbGwgPSAkcm93WyRjb2x1bW5dID8/ICcnOwokd2lkdGggPSAkdGhpcy0+ZWZmZWN0aXZlQ29sdW1uV2lkdGhzWyRjb2x1bW5dOwppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJGNlbGwtPmdldENvbHNwYW4oKSA+IDEpIHsKCmZvcmVhY2ggKHJhbmdlKCRjb2x1bW4gKyAxLCAkY29sdW1uICsgJGNlbGwtPmdldENvbHNwYW4oKSAtIDEpIGFzICRuZXh0Q29sdW1uKSB7CiR3aWR0aCArPSAkdGhpcy0+Z2V0Q29sdW1uU2VwYXJhdG9yV2lkdGgoKSArICR0aGlzLT5lZmZlY3RpdmVDb2x1bW5XaWR0aHNbJG5leHRDb2x1bW5dOwp9Cn0KCgppZiAoZmFsc2UgIT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkY2VsbCwgbnVsbCwgdHJ1ZSkpIHsKJHdpZHRoICs9IFxzdHJsZW4oJGNlbGwpIC0gbWJfc3Ryd2lkdGgoJGNlbGwsICRlbmNvZGluZyk7Cn0KCiRzdHlsZSA9ICR0aGlzLT5nZXRDb2x1bW5TdHlsZSgkY29sdW1uKTsKCmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCRzdHlsZS0+Z2V0Qm9yZGVyRm9ybWF0KCksIHN0cl9yZXBlYXQoJHN0eWxlLT5nZXRCb3JkZXJDaGFycygpWzJdLCAkd2lkdGgpKTsKfQoKJHdpZHRoICs9IEhlbHBlcjo6bGVuZ3RoKCRjZWxsKSAtIEhlbHBlcjo6bGVuZ3RoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJGNlbGwpKTsKJGNvbnRlbnQgPSBzcHJpbnRmKCRzdHlsZS0+Z2V0Q2VsbFJvd0NvbnRlbnRGb3JtYXQoKSwgJGNlbGwpOwoKJHBhZFR5cGUgPSAkc3R5bGUtPmdldFBhZFR5cGUoKTsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRTdHlsZSgpIGluc3RhbmNlb2YgVGFibGVDZWxsU3R5bGUpIHsKJGlzTm90U3R5bGVkQnlUYWcgPSAhcHJlZ19tYXRjaCgnL148KFx3K3woXHcrPVtcdyxdKzs/KSopPi4rPFwvKFx3K3woXHcrPVx3Kzs/KSopPz4kLycsICRjZWxsKTsKaWYgKCRpc05vdFN0eWxlZEJ5VGFnKSB7CiRjZWxsRm9ybWF0ID0gJGNlbGwtPmdldFN0eWxlKCktPmdldENlbGxGb3JtYXQoKTsKaWYgKCFcaXNfc3RyaW5nKCRjZWxsRm9ybWF0KSkgewokdGFnID0gaHR0cF9idWlsZF9xdWVyeSgkY2VsbC0+Z2V0U3R5bGUoKS0+Z2V0VGFnT3B0aW9ucygpLCAnJywgJzsnKTsKJGNlbGxGb3JtYXQgPSAnPCcuJHRhZy4nPiVzPC8+JzsKfQoKaWYgKHN0cnN0cigkY29udGVudCwgJzwvPicpKSB7CiRjb250ZW50ID0gc3RyX3JlcGxhY2UoJzwvPicsICcnLCAkY29udGVudCk7CiR3aWR0aCAtPSAzOwp9CmlmIChzdHJzdHIoJGNvbnRlbnQsICc8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PicpKSB7CiRjb250ZW50ID0gc3RyX3JlcGxhY2UoJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+JywgJycsICRjb250ZW50KTsKJHdpZHRoIC09IFxzdHJsZW4oJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+Jyk7Cn0KfQoKJHBhZFR5cGUgPSAkY2VsbC0+Z2V0U3R5bGUoKS0+Z2V0UGFkQnlBbGlnbigpOwp9CgpyZXR1cm4gc3ByaW50ZigkY2VsbEZvcm1hdCwgc3RyX3BhZCgkY29udGVudCwgJHdpZHRoLCAkc3R5bGUtPmdldFBhZGRpbmdDaGFyKCksICRwYWRUeXBlKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlTnVtYmVyT2ZDb2x1bW5zKGFycmF5ICRyb3dzKQp7CiRjb2x1bW5zID0gWzBdOwpmb3JlYWNoICgkcm93cyBhcyAkcm93KSB7CmlmICgkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKY29udGludWU7Cn0KCiRjb2x1bW5zW10gPSAkdGhpcy0+Z2V0TnVtYmVyT2ZDb2x1bW5zKCRyb3cpOwp9CgokdGhpcy0+bnVtYmVyT2ZDb2x1bW5zID0gbWF4KCRjb2x1bW5zKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBidWlsZFRhYmxlUm93cyhhcnJheSAkcm93cyk6IFRhYmxlUm93cwp7CgokZm9ybWF0dGVyID0gJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCk7CiR1bm1lcmdlZFJvd3MgPSBbXTsKZm9yICgkcm93S2V5ID0gMDsgJHJvd0tleSA8IFxjb3VudCgkcm93cyk7ICsrJHJvd0tleSkgewokcm93cyA9ICR0aGlzLT5maWxsTmV4dFJvd3MoJHJvd3MsICRyb3dLZXkpOwoKCmZvcmVhY2ggKCRyb3dzWyRyb3dLZXldIGFzICRjb2x1bW4gPT4gJGNlbGwpIHsKJGNvbHNwYW4gPSAkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCA/ICRjZWxsLT5nZXRDb2xzcGFuKCkgOiAxOwoKaWYgKGlzc2V0KCR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0pICYmIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCRmb3JtYXR0ZXIsICRjZWxsKSkgPiAkdGhpcy0+Y29sdW1uTWF4V2lkdGhzWyRjb2x1bW5dKSB7CiRjZWxsID0gJGZvcm1hdHRlci0+Zm9ybWF0QW5kV3JhcCgkY2VsbCwgJHRoaXMtPmNvbHVtbk1heFdpZHRoc1skY29sdW1uXSAqICRjb2xzcGFuKTsKfQppZiAoIXN0cnN0cigkY2VsbCA/PyAnJywgIlxuIikpIHsKY29udGludWU7Cn0KJGVzY2FwZWQgPSBpbXBsb2RlKCJcbiIsIGFycmF5X21hcChbT3V0cHV0Rm9ybWF0dGVyOjpjbGFzcywgJ2VzY2FwZVRyYWlsaW5nQmFja3NsYXNoJ10sIGV4cGxvZGUoIlxuIiwgJGNlbGwpKSk7CiRjZWxsID0gJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgPyBuZXcgVGFibGVDZWxsKCRlc2NhcGVkLCBbJ2NvbHNwYW4nID0+ICRjZWxsLT5nZXRDb2xzcGFuKCldKSA6ICRlc2NhcGVkOwokbGluZXMgPSBleHBsb2RlKCJcbiIsIHN0cl9yZXBsYWNlKCJcbiIsICI8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PjwvPlxuIiwgJGNlbGwpKTsKZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lS2V5ID0+ICRsaW5lKSB7CmlmICgkY29sc3BhbiA+IDEpIHsKJGxpbmUgPSBuZXcgVGFibGVDZWxsKCRsaW5lLCBbJ2NvbHNwYW4nID0+ICRjb2xzcGFuXSk7Cn0KaWYgKDAgPT09ICRsaW5lS2V5KSB7CiRyb3dzWyRyb3dLZXldWyRjb2x1bW5dID0gJGxpbmU7Cn0gZWxzZSB7CmlmICghXGFycmF5X2tleV9leGlzdHMoJHJvd0tleSwgJHVubWVyZ2VkUm93cykgfHwgIVxhcnJheV9rZXlfZXhpc3RzKCRsaW5lS2V5LCAkdW5tZXJnZWRSb3dzWyRyb3dLZXldKSkgewokdW5tZXJnZWRSb3dzWyRyb3dLZXldWyRsaW5lS2V5XSA9ICR0aGlzLT5jb3B5Um93KCRyb3dzLCAkcm93S2V5KTsKfQokdW5tZXJnZWRSb3dzWyRyb3dLZXldWyRsaW5lS2V5XVskY29sdW1uXSA9ICRsaW5lOwp9Cn0KfQp9CgpyZXR1cm4gbmV3IFRhYmxlUm93cyhmdW5jdGlvbiAoKSB1c2UgKCRyb3dzLCAkdW5tZXJnZWRSb3dzKTogXFRyYXZlcnNhYmxlIHsKZm9yZWFjaCAoJHJvd3MgYXMgJHJvd0tleSA9PiAkcm93KSB7CiRyb3dHcm91cCA9IFskcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IgPyAkcm93IDogJHRoaXMtPmZpbGxDZWxscygkcm93KV07CgppZiAoaXNzZXQoJHVubWVyZ2VkUm93c1skcm93S2V5XSkpIHsKZm9yZWFjaCAoJHVubWVyZ2VkUm93c1skcm93S2V5XSBhcyAkcm93KSB7CiRyb3dHcm91cFtdID0gJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yID8gJHJvdyA6ICR0aGlzLT5maWxsQ2VsbHMoJHJvdyk7Cn0KfQp5aWVsZCAkcm93R3JvdXA7Cn0KfSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlUm93Q291bnQoKTogaW50CnsKJG51bWJlck9mUm93cyA9IFxjb3VudChpdGVyYXRvcl90b19hcnJheSgkdGhpcy0+YnVpbGRUYWJsZVJvd3MoYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnMsIFtuZXcgVGFibGVTZXBhcmF0b3IoKV0sICR0aGlzLT5yb3dzKSkpKTsKCmlmICgkdGhpcy0+aGVhZGVycykgeworKyRudW1iZXJPZlJvd3M7IAp9CgppZiAoXGNvdW50KCR0aGlzLT5yb3dzKSA+IDApIHsKKyskbnVtYmVyT2ZSb3dzOyAKfQoKcmV0dXJuICRudW1iZXJPZlJvd3M7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxsTmV4dFJvd3MoYXJyYXkgJHJvd3MsIGludCAkbGluZSk6IGFycmF5CnsKJHVubWVyZ2VkUm93cyA9IFtdOwpmb3JlYWNoICgkcm93c1skbGluZV0gYXMgJGNvbHVtbiA9PiAkY2VsbCkgewppZiAobnVsbCAhPT0gJGNlbGwgJiYgISRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICFcaXNfc2NhbGFyKCRjZWxsKSAmJiAhKFxpc19vYmplY3QoJGNlbGwpICYmIG1ldGhvZF9leGlzdHMoJGNlbGwsICdfX3RvU3RyaW5nJykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQSBjZWxsIG11c3QgYmUgYSBUYWJsZUNlbGwsIGEgc2NhbGFyIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgIl9fdG9TdHJpbmcoKSIsICIlcyIgZ2l2ZW4uJywgZ2V0X2RlYnVnX3R5cGUoJGNlbGwpKSk7Cn0KaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRSb3dzcGFuKCkgPiAxKSB7CiRuYkxpbmVzID0gJGNlbGwtPmdldFJvd3NwYW4oKSAtIDE7CiRsaW5lcyA9IFskY2VsbF07CmlmIChzdHJzdHIoJGNlbGwsICJcbiIpKSB7CiRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgc3RyX3JlcGxhY2UoIlxuIiwgIjxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+XG48Lz4iLCAkY2VsbCkpOwokbmJMaW5lcyA9IFxjb3VudCgkbGluZXMpID4gJG5iTGluZXMgPyBzdWJzdHJfY291bnQoJGNlbGwsICJcbiIpIDogJG5iTGluZXM7Cgokcm93c1skbGluZV1bJGNvbHVtbl0gPSBuZXcgVGFibGVDZWxsKCRsaW5lc1swXSwgWydjb2xzcGFuJyA9PiAkY2VsbC0+Z2V0Q29sc3BhbigpLCAnc3R5bGUnID0+ICRjZWxsLT5nZXRTdHlsZSgpXSk7CnVuc2V0KCRsaW5lc1swXSk7Cn0KCgokdW5tZXJnZWRSb3dzID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoYXJyYXlfZmlsbCgkbGluZSArIDEsICRuYkxpbmVzLCBbXSksICR1bm1lcmdlZFJvd3MpOwpmb3JlYWNoICgkdW5tZXJnZWRSb3dzIGFzICR1bm1lcmdlZFJvd0tleSA9PiAkdW5tZXJnZWRSb3cpIHsKJHZhbHVlID0gJGxpbmVzWyR1bm1lcmdlZFJvd0tleSAtICRsaW5lXSA/PyAnJzsKJHVubWVyZ2VkUm93c1skdW5tZXJnZWRSb3dLZXldWyRjb2x1bW5dID0gbmV3IFRhYmxlQ2VsbCgkdmFsdWUsIFsnY29sc3BhbicgPT4gJGNlbGwtPmdldENvbHNwYW4oKSwgJ3N0eWxlJyA9PiAkY2VsbC0+Z2V0U3R5bGUoKV0pOwppZiAoJG5iTGluZXMgPT09ICR1bm1lcmdlZFJvd0tleSAtICRsaW5lKSB7CmJyZWFrOwp9Cn0KfQp9Cgpmb3JlYWNoICgkdW5tZXJnZWRSb3dzIGFzICR1bm1lcmdlZFJvd0tleSA9PiAkdW5tZXJnZWRSb3cpIHsKCmlmIChpc3NldCgkcm93c1skdW5tZXJnZWRSb3dLZXldKSAmJiBcaXNfYXJyYXkoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSkgJiYgKCR0aGlzLT5nZXROdW1iZXJPZkNvbHVtbnMoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSkgKyAkdGhpcy0+Z2V0TnVtYmVyT2ZDb2x1bW5zKCR1bm1lcmdlZFJvd3NbJHVubWVyZ2VkUm93S2V5XSkgPD0gJHRoaXMtPm51bWJlck9mQ29sdW1ucykpIHsKZm9yZWFjaCAoJHVubWVyZ2VkUm93IGFzICRjZWxsS2V5ID0+ICRjZWxsKSB7CgphcnJheV9zcGxpY2UoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSwgJGNlbGxLZXksIDAsIFskY2VsbF0pOwp9Cn0gZWxzZSB7CiRyb3cgPSAkdGhpcy0+Y29weVJvdygkcm93cywgJHVubWVyZ2VkUm93S2V5IC0gMSk7CmZvcmVhY2ggKCR1bm1lcmdlZFJvdyBhcyAkY29sdW1uID0+ICRjZWxsKSB7CmlmICghZW1wdHkoJGNlbGwpKSB7CiRyb3dbJGNvbHVtbl0gPSAkdW5tZXJnZWRSb3dbJGNvbHVtbl07Cn0KfQphcnJheV9zcGxpY2UoJHJvd3MsICR1bm1lcmdlZFJvd0tleSwgMCwgWyRyb3ddKTsKfQp9CgpyZXR1cm4gJHJvd3M7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsbENlbGxzKGl0ZXJhYmxlICRyb3cpCnsKJG5ld1JvdyA9IFtdOwoKZm9yZWFjaCAoJHJvdyBhcyAkY29sdW1uID0+ICRjZWxsKSB7CiRuZXdSb3dbXSA9ICRjZWxsOwppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJGNlbGwtPmdldENvbHNwYW4oKSA+IDEpIHsKZm9yZWFjaCAocmFuZ2UoJGNvbHVtbiArIDEsICRjb2x1bW4gKyAkY2VsbC0+Z2V0Q29sc3BhbigpIC0gMSkgYXMgJHBvc2l0aW9uKSB7CgokbmV3Um93W10gPSAnJzsKfQp9Cn0KCnJldHVybiAkbmV3Um93ID86ICRyb3c7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY29weVJvdyhhcnJheSAkcm93cywgaW50ICRsaW5lKTogYXJyYXkKewokcm93ID0gJHJvd3NbJGxpbmVdOwpmb3JlYWNoICgkcm93IGFzICRjZWxsS2V5ID0+ICRjZWxsVmFsdWUpIHsKJHJvd1skY2VsbEtleV0gPSAnJzsKaWYgKCRjZWxsVmFsdWUgaW5zdGFuY2VvZiBUYWJsZUNlbGwpIHsKJHJvd1skY2VsbEtleV0gPSBuZXcgVGFibGVDZWxsKCcnLCBbJ2NvbHNwYW4nID0+ICRjZWxsVmFsdWUtPmdldENvbHNwYW4oKV0pOwp9Cn0KCnJldHVybiAkcm93Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldE51bWJlck9mQ29sdW1ucyhhcnJheSAkcm93KTogaW50CnsKJGNvbHVtbnMgPSBcY291bnQoJHJvdyk7CmZvcmVhY2ggKCRyb3cgYXMgJGNvbHVtbikgewokY29sdW1ucyArPSAkY29sdW1uIGluc3RhbmNlb2YgVGFibGVDZWxsID8gKCRjb2x1bW4tPmdldENvbHNwYW4oKSAtIDEpIDogMDsKfQoKcmV0dXJuICRjb2x1bW5zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJvd0NvbHVtbnMoYXJyYXkgJHJvdyk6IGFycmF5CnsKJGNvbHVtbnMgPSByYW5nZSgwLCAkdGhpcy0+bnVtYmVyT2ZDb2x1bW5zIC0gMSk7CmZvcmVhY2ggKCRyb3cgYXMgJGNlbGxLZXkgPT4gJGNlbGwpIHsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRDb2xzcGFuKCkgPiAxKSB7CgokY29sdW1ucyA9IGFycmF5X2RpZmYoJGNvbHVtbnMsIHJhbmdlKCRjZWxsS2V5ICsgMSwgJGNlbGxLZXkgKyAkY2VsbC0+Z2V0Q29sc3BhbigpIC0gMSkpOwp9Cn0KCnJldHVybiAkY29sdW1uczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5zV2lkdGgoaXRlcmFibGUgJGdyb3VwcykKewpmb3IgKCRjb2x1bW4gPSAwOyAkY29sdW1uIDwgJHRoaXMtPm51bWJlck9mQ29sdW1uczsgKyskY29sdW1uKSB7CiRsZW5ndGhzID0gW107CmZvcmVhY2ggKCRncm91cHMgYXMgJGdyb3VwKSB7CmZvcmVhY2ggKCRncm91cCBhcyAkcm93KSB7CmlmICgkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRyb3cgYXMgJGkgPT4gJGNlbGwpIHsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsKSB7CiR0ZXh0Q29udGVudCA9IEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJGNlbGwpOwokdGV4dExlbmd0aCA9IEhlbHBlcjo6d2lkdGgoJHRleHRDb250ZW50KTsKaWYgKCR0ZXh0TGVuZ3RoID4gMCkgewokY29udGVudENvbHVtbnMgPSBtYl9zdHJfc3BsaXQoJHRleHRDb250ZW50LCBjZWlsKCR0ZXh0TGVuZ3RoIC8gJGNlbGwtPmdldENvbHNwYW4oKSkpOwpmb3JlYWNoICgkY29udGVudENvbHVtbnMgYXMgJHBvc2l0aW9uID0+ICRjb250ZW50KSB7CiRyb3dbJGkgKyAkcG9zaXRpb25dID0gJGNvbnRlbnQ7Cn0KfQp9Cn0KCiRsZW5ndGhzW10gPSAkdGhpcy0+Z2V0Q2VsbFdpZHRoKCRyb3csICRjb2x1bW4pOwp9Cn0KCiR0aGlzLT5lZmZlY3RpdmVDb2x1bW5XaWR0aHNbJGNvbHVtbl0gPSBtYXgoJGxlbmd0aHMpICsgSGVscGVyOjp3aWR0aCgkdGhpcy0+c3R5bGUtPmdldENlbGxSb3dDb250ZW50Rm9ybWF0KCkpIC0gMjsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbHVtblNlcGFyYXRvcldpZHRoKCk6IGludAp7CnJldHVybiBIZWxwZXI6OndpZHRoKHNwcmludGYoJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJGb3JtYXQoKSwgJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJDaGFycygpWzNdKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q2VsbFdpZHRoKGFycmF5ICRyb3csIGludCAkY29sdW1uKTogaW50CnsKJGNlbGxXaWR0aCA9IDA7CgppZiAoaXNzZXQoJHJvd1skY29sdW1uXSkpIHsKJGNlbGwgPSAkcm93WyRjb2x1bW5dOwokY2VsbFdpZHRoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRjZWxsKSk7Cn0KCiRjb2x1bW5XaWR0aCA9ICR0aGlzLT5jb2x1bW5XaWR0aHNbJGNvbHVtbl0gPz8gMDsKJGNlbGxXaWR0aCA9IG1heCgkY2VsbFdpZHRoLCAkY29sdW1uV2lkdGgpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0pID8gbWluKCR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0sICRjZWxsV2lkdGgpIDogJGNlbGxXaWR0aDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjbGVhbnVwKCkKewokdGhpcy0+ZWZmZWN0aXZlQ29sdW1uV2lkdGhzID0gW107CiR0aGlzLT5udW1iZXJPZkNvbHVtbnMgPSBudWxsOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0U3R5bGVzKCk6IGFycmF5CnsKJGJvcmRlcmxlc3MgPSBuZXcgVGFibGVTdHlsZSgpOwokYm9yZGVybGVzcwotPnNldEhvcml6b250YWxCb3JkZXJDaGFycygnPScpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygnICcpCi0+c2V0RGVmYXVsdENyb3NzaW5nQ2hhcignICcpCjsKCiRjb21wYWN0ID0gbmV3IFRhYmxlU3R5bGUoKTsKJGNvbXBhY3QKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJycpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygnJykKLT5zZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKCcnKQotPnNldENlbGxSb3dDb250ZW50Rm9ybWF0KCclcyAnKQo7Cgokc3R5bGVHdWlkZSA9IG5ldyBUYWJsZVN0eWxlKCk7CiRzdHlsZUd1aWRlCi0+c2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKCctJykKLT5zZXRWZXJ0aWNhbEJvcmRlckNoYXJzKCcgJykKLT5zZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKCcgJykKLT5zZXRDZWxsSGVhZGVyRm9ybWF0KCclcycpCjsKCiRib3ggPSAobmV3IFRhYmxlU3R5bGUoKSkKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJ+KUgCcpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygn4pSCJykKLT5zZXRDcm9zc2luZ0NoYXJzKCfilLwnLCAn4pSMJywgJ+KUrCcsICfilJAnLCAn4pSkJywgJ+KUmCcsICfilLQnLCAn4pSUJywgJ+KUnCcpCjsKCiRib3hEb3VibGUgPSAobmV3IFRhYmxlU3R5bGUoKSkKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJ+KVkCcsICfilIAnKQotPnNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoJ+KVkScsICfilIInKQotPnNldENyb3NzaW5nQ2hhcnMoJ+KUvCcsICfilZQnLCAn4pWkJywgJ+KVlycsICfilaInLCAn4pWdJywgJ+KVpycsICfilZonLCAn4pWfJywgJ+KVoCcsICfilaonLCAn4pWjJykKOwoKcmV0dXJuIFsKJ2RlZmF1bHQnID0+IG5ldyBUYWJsZVN0eWxlKCksCidib3JkZXJsZXNzJyA9PiAkYm9yZGVybGVzcywKJ2NvbXBhY3QnID0+ICRjb21wYWN0LAonc3ltZm9ueS1zdHlsZS1ndWlkZScgPT4gJHN0eWxlR3VpZGUsCidib3gnID0+ICRib3gsCidib3gtZG91YmxlJyA9PiAkYm94RG91YmxlLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlc29sdmVTdHlsZSgkbmFtZSk6IFRhYmxlU3R5bGUKewppZiAoJG5hbWUgaW5zdGFuY2VvZiBUYWJsZVN0eWxlKSB7CnJldHVybiAkbmFtZTsKfQoKaWYgKGlzc2V0KHNlbGY6OiRzdHlsZXNbJG5hbWVdKSkgewpyZXR1cm4gc2VsZjo6JHN0eWxlc1skbmFtZV07Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU3R5bGUgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgpjbGFzcyBUYWJsZUNlbGwKewpwcml2YXRlICR2YWx1ZTsKcHJpdmF0ZSAkb3B0aW9ucyA9IFsKJ3Jvd3NwYW4nID0+IDEsCidjb2xzcGFuJyA9PiAxLAonc3R5bGUnID0+IG51bGwsCl07CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR2YWx1ZSA9ICcnLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCgppZiAoJGRpZmYgPSBhcnJheV9kaWZmKGFycmF5X2tleXMoJG9wdGlvbnMpLCBhcnJheV9rZXlzKCR0aGlzLT5vcHRpb25zKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgVGFibGVDZWxsIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcJyVzXCcuJywgaW1wbG9kZSgnXCcsIFwnJywgJGRpZmYpKSk7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snc3R5bGUnXSkgJiYgISRvcHRpb25zWydzdHlsZSddIGluc3RhbmNlb2YgVGFibGVDZWxsU3R5bGUpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIHN0eWxlIG9wdGlvbiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICJUYWJsZUNlbGxTdHlsZSIuJyk7Cn0KCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuICR0aGlzLT52YWx1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sc3BhbigpCnsKcmV0dXJuIChpbnQpICR0aGlzLT5vcHRpb25zWydjb2xzcGFuJ107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvd3NwYW4oKQp7CnJldHVybiAoaW50KSAkdGhpcy0+b3B0aW9uc1sncm93c3BhbiddOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoKTogP1RhYmxlQ2VsbFN0eWxlCnsKcmV0dXJuICR0aGlzLT5vcHRpb25zWydzdHlsZSddOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgpjbGFzcyBUYWJsZUNlbGxTdHlsZQp7CnB1YmxpYyBjb25zdCBERUZBVUxUX0FMSUdOID0gJ2xlZnQnOwoKcHJpdmF0ZSBjb25zdCBUQUdfT1BUSU9OUyA9IFsKJ2ZnJywKJ2JnJywKJ29wdGlvbnMnLApdOwoKcHJpdmF0ZSBjb25zdCBBTElHTl9NQVAgPSBbCidsZWZ0JyA9PiBcU1RSX1BBRF9SSUdIVCwKJ2NlbnRlcicgPT4gXFNUUl9QQURfQk9USCwKJ3JpZ2h0JyA9PiBcU1RSX1BBRF9MRUZULApdOwoKcHJpdmF0ZSAkb3B0aW9ucyA9IFsKJ2ZnJyA9PiAnZGVmYXVsdCcsCidiZycgPT4gJ2RlZmF1bHQnLAonb3B0aW9ucycgPT4gbnVsbCwKJ2FsaWduJyA9PiBzZWxmOjpERUZBVUxUX0FMSUdOLAonY2VsbEZvcm1hdCcgPT4gbnVsbCwKXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgkZGlmZiA9IGFycmF5X2RpZmYoYXJyYXlfa2V5cygkb3B0aW9ucyksIGFycmF5X2tleXMoJHRoaXMtPm9wdGlvbnMpKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBUYWJsZUNlbGxTdHlsZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczogXCclc1wnLicsIGltcGxvZGUoJ1wnLCBcJycsICRkaWZmKSkpOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2FsaWduJ10pICYmICFcYXJyYXlfa2V5X2V4aXN0cygkb3B0aW9uc1snYWxpZ24nXSwgc2VsZjo6QUxJR05fTUFQKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1dyb25nIGFsaWduIHZhbHVlLiBWYWx1ZSBtdXN0IGJlIGZvbGxvd2luZzogXCclc1wnLicsIGltcGxvZGUoJ1wnLCBcJycsIGFycmF5X2tleXMoc2VsZjo6QUxJR05fTUFQKSkpKTsKfQoKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFnT3B0aW9ucygpCnsKcmV0dXJuIGFycmF5X2ZpbHRlcigKJHRoaXMtPmdldE9wdGlvbnMoKSwKZnVuY3Rpb24gKCRrZXkpIHsKcmV0dXJuIFxpbl9hcnJheSgka2V5LCBzZWxmOjpUQUdfT1BUSU9OUykgJiYgaXNzZXQoJHRoaXMtPm9wdGlvbnNbJGtleV0pOwp9LApcQVJSQVlfRklMVEVSX1VTRV9LRVkKKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhZEJ5QWxpZ24oKQp7CnJldHVybiBzZWxmOjpBTElHTl9NQVBbJHRoaXMtPmdldE9wdGlvbnMoKVsnYWxpZ24nXV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsRm9ybWF0KCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldE9wdGlvbnMoKVsnY2VsbEZvcm1hdCddOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCgoKCmNsYXNzIFRhYmxlUm93cyBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7CnByaXZhdGUgJGdlbmVyYXRvcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcQ2xvc3VyZSAkZ2VuZXJhdG9yKQp7CiR0aGlzLT5nZW5lcmF0b3IgPSAkZ2VuZXJhdG9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogXFRyYXZlcnNhYmxlCnsKcmV0dXJuICgkdGhpcy0+Z2VuZXJhdG9yKSgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCgoKCgoKY2xhc3MgVGFibGVTZXBhcmF0b3IgZXh0ZW5kcyBUYWJsZUNlbGwKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJG9wdGlvbnMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCcnLCAkb3B0aW9ucyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIFRhYmxlU3R5bGUKewpwcml2YXRlICRwYWRkaW5nQ2hhciA9ICcgJzsKcHJpdmF0ZSAkaG9yaXpvbnRhbE91dHNpZGVCb3JkZXJDaGFyID0gJy0nOwpwcml2YXRlICRob3Jpem9udGFsSW5zaWRlQm9yZGVyQ2hhciA9ICctJzsKcHJpdmF0ZSAkdmVydGljYWxPdXRzaWRlQm9yZGVyQ2hhciA9ICd8JzsKcHJpdmF0ZSAkdmVydGljYWxJbnNpZGVCb3JkZXJDaGFyID0gJ3wnOwpwcml2YXRlICRjcm9zc2luZ0NoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wUmlnaHRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcE1pZENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wTGVmdENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nTWlkUmlnaHRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ0JvdHRvbVJpZ2h0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdCb3R0b21NaWRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ0JvdHRvbUxlZnRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ01pZExlZnRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcExlZnRCb3R0b21DaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcE1pZEJvdHRvbUNoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wUmlnaHRCb3R0b21DaGFyID0gJysnOwpwcml2YXRlICRoZWFkZXJUaXRsZUZvcm1hdCA9ICc8Zmc9YmxhY2s7Ymc9d2hpdGU7b3B0aW9ucz1ib2xkPiAlcyA8Lz4nOwpwcml2YXRlICRmb290ZXJUaXRsZUZvcm1hdCA9ICc8Zmc9YmxhY2s7Ymc9d2hpdGU7b3B0aW9ucz1ib2xkPiAlcyA8Lz4nOwpwcml2YXRlICRjZWxsSGVhZGVyRm9ybWF0ID0gJzxpbmZvPiVzPC9pbmZvPic7CnByaXZhdGUgJGNlbGxSb3dGb3JtYXQgPSAnJXMnOwpwcml2YXRlICRjZWxsUm93Q29udGVudEZvcm1hdCA9ICcgJXMgJzsKcHJpdmF0ZSAkYm9yZGVyRm9ybWF0ID0gJyVzJzsKcHJpdmF0ZSAkcGFkVHlwZSA9IFxTVFJfUEFEX1JJR0hUOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFkZGluZ0NoYXIoc3RyaW5nICRwYWRkaW5nQ2hhcikKewppZiAoISRwYWRkaW5nQ2hhcikgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1RoZSBwYWRkaW5nIGNoYXIgbXVzdCBub3QgYmUgZW1wdHkuJyk7Cn0KCiR0aGlzLT5wYWRkaW5nQ2hhciA9ICRwYWRkaW5nQ2hhcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFkZGluZ0NoYXIoKQp7CnJldHVybiAkdGhpcy0+cGFkZGluZ0NoYXI7Cn0KCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKHN0cmluZyAkb3V0c2lkZSwgc3RyaW5nICRpbnNpZGUgPSBudWxsKTogc2VsZgp7CiR0aGlzLT5ob3Jpem9udGFsT3V0c2lkZUJvcmRlckNoYXIgPSAkb3V0c2lkZTsKJHRoaXMtPmhvcml6b250YWxJbnNpZGVCb3JkZXJDaGFyID0gJGluc2lkZSA/PyAkb3V0c2lkZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVydGljYWxCb3JkZXJDaGFycyhzdHJpbmcgJG91dHNpZGUsIHN0cmluZyAkaW5zaWRlID0gbnVsbCk6IHNlbGYKewokdGhpcy0+dmVydGljYWxPdXRzaWRlQm9yZGVyQ2hhciA9ICRvdXRzaWRlOwokdGhpcy0+dmVydGljYWxJbnNpZGVCb3JkZXJDaGFyID0gJGluc2lkZSA/PyAkb3V0c2lkZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9yZGVyQ2hhcnMoKTogYXJyYXkKewpyZXR1cm4gWwokdGhpcy0+aG9yaXpvbnRhbE91dHNpZGVCb3JkZXJDaGFyLAokdGhpcy0+dmVydGljYWxPdXRzaWRlQm9yZGVyQ2hhciwKJHRoaXMtPmhvcml6b250YWxJbnNpZGVCb3JkZXJDaGFyLAokdGhpcy0+dmVydGljYWxJbnNpZGVCb3JkZXJDaGFyLApdOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENyb3NzaW5nQ2hhcnMoc3RyaW5nICRjcm9zcywgc3RyaW5nICR0b3BMZWZ0LCBzdHJpbmcgJHRvcE1pZCwgc3RyaW5nICR0b3BSaWdodCwgc3RyaW5nICRtaWRSaWdodCwgc3RyaW5nICRib3R0b21SaWdodCwgc3RyaW5nICRib3R0b21NaWQsIHN0cmluZyAkYm90dG9tTGVmdCwgc3RyaW5nICRtaWRMZWZ0LCBzdHJpbmcgJHRvcExlZnRCb3R0b20gPSBudWxsLCBzdHJpbmcgJHRvcE1pZEJvdHRvbSA9IG51bGwsIHN0cmluZyAkdG9wUmlnaHRCb3R0b20gPSBudWxsKTogc2VsZgp7CiR0aGlzLT5jcm9zc2luZ0NoYXIgPSAkY3Jvc3M7CiR0aGlzLT5jcm9zc2luZ1RvcExlZnRDaGFyID0gJHRvcExlZnQ7CiR0aGlzLT5jcm9zc2luZ1RvcE1pZENoYXIgPSAkdG9wTWlkOwokdGhpcy0+Y3Jvc3NpbmdUb3BSaWdodENoYXIgPSAkdG9wUmlnaHQ7CiR0aGlzLT5jcm9zc2luZ01pZFJpZ2h0Q2hhciA9ICRtaWRSaWdodDsKJHRoaXMtPmNyb3NzaW5nQm90dG9tUmlnaHRDaGFyID0gJGJvdHRvbVJpZ2h0OwokdGhpcy0+Y3Jvc3NpbmdCb3R0b21NaWRDaGFyID0gJGJvdHRvbU1pZDsKJHRoaXMtPmNyb3NzaW5nQm90dG9tTGVmdENoYXIgPSAkYm90dG9tTGVmdDsKJHRoaXMtPmNyb3NzaW5nTWlkTGVmdENoYXIgPSAkbWlkTGVmdDsKJHRoaXMtPmNyb3NzaW5nVG9wTGVmdEJvdHRvbUNoYXIgPSAkdG9wTGVmdEJvdHRvbSA/PyAkbWlkTGVmdDsKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQm90dG9tQ2hhciA9ICR0b3BNaWRCb3R0b20gPz8gJGNyb3NzOwokdGhpcy0+Y3Jvc3NpbmdUb3BSaWdodEJvdHRvbUNoYXIgPSAkdG9wUmlnaHRCb3R0b20gPz8gJG1pZFJpZ2h0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKHN0cmluZyAkY2hhcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPnNldENyb3NzaW5nQ2hhcnMoJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhcik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENyb3NzaW5nQ2hhcigpCnsKcmV0dXJuICR0aGlzLT5jcm9zc2luZ0NoYXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENyb3NzaW5nQ2hhcnMoKTogYXJyYXkKewpyZXR1cm4gWwokdGhpcy0+Y3Jvc3NpbmdDaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BMZWZ0Q2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wUmlnaHRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdNaWRSaWdodENoYXIsCiR0aGlzLT5jcm9zc2luZ0JvdHRvbVJpZ2h0Q2hhciwKJHRoaXMtPmNyb3NzaW5nQm90dG9tTWlkQ2hhciwKJHRoaXMtPmNyb3NzaW5nQm90dG9tTGVmdENoYXIsCiR0aGlzLT5jcm9zc2luZ01pZExlZnRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BMZWZ0Qm90dG9tQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQm90dG9tQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wUmlnaHRCb3R0b21DaGFyLApdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDZWxsSGVhZGVyRm9ybWF0KHN0cmluZyAkY2VsbEhlYWRlckZvcm1hdCkKewokdGhpcy0+Y2VsbEhlYWRlckZvcm1hdCA9ICRjZWxsSGVhZGVyRm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsSGVhZGVyRm9ybWF0KCkKewpyZXR1cm4gJHRoaXMtPmNlbGxIZWFkZXJGb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENlbGxSb3dGb3JtYXQoc3RyaW5nICRjZWxsUm93Rm9ybWF0KQp7CiR0aGlzLT5jZWxsUm93Rm9ybWF0ID0gJGNlbGxSb3dGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENlbGxSb3dGb3JtYXQoKQp7CnJldHVybiAkdGhpcy0+Y2VsbFJvd0Zvcm1hdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2VsbFJvd0NvbnRlbnRGb3JtYXQoc3RyaW5nICRjZWxsUm93Q29udGVudEZvcm1hdCkKewokdGhpcy0+Y2VsbFJvd0NvbnRlbnRGb3JtYXQgPSAkY2VsbFJvd0NvbnRlbnRGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENlbGxSb3dDb250ZW50Rm9ybWF0KCkKewpyZXR1cm4gJHRoaXMtPmNlbGxSb3dDb250ZW50Rm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCb3JkZXJGb3JtYXQoc3RyaW5nICRib3JkZXJGb3JtYXQpCnsKJHRoaXMtPmJvcmRlckZvcm1hdCA9ICRib3JkZXJGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJvcmRlckZvcm1hdCgpCnsKcmV0dXJuICR0aGlzLT5ib3JkZXJGb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBhZFR5cGUoaW50ICRwYWRUeXBlKQp7CmlmICghXGluX2FycmF5KCRwYWRUeXBlLCBbXFNUUl9QQURfTEVGVCwgXFNUUl9QQURfUklHSFQsIFxTVFJfUEFEX0JPVEhdLCB0cnVlKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHBhZGRpbmcgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIChTVFJfUEFEX0xFRlQsIFNUUl9QQURfUklHSFQsIFNUUl9QQURfQk9USCkuJyk7Cn0KCiR0aGlzLT5wYWRUeXBlID0gJHBhZFR5cGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhZFR5cGUoKQp7CnJldHVybiAkdGhpcy0+cGFkVHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlclRpdGxlRm9ybWF0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+aGVhZGVyVGl0bGVGb3JtYXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXJUaXRsZUZvcm1hdChzdHJpbmcgJGZvcm1hdCk6IHNlbGYKewokdGhpcy0+aGVhZGVyVGl0bGVGb3JtYXQgPSAkZm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9vdGVyVGl0bGVGb3JtYXQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5mb290ZXJUaXRsZUZvcm1hdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvb3RlclRpdGxlRm9ybWF0KHN0cmluZyAkZm9ybWF0KTogc2VsZgp7CiR0aGlzLT5mb290ZXJUaXRsZUZvcm1hdCA9ICRmb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBBcmd2SW5wdXQgZXh0ZW5kcyBJbnB1dAp7CnByaXZhdGUgJHRva2VuczsKcHJpdmF0ZSAkcGFyc2VkOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRhcmd2ID0gbnVsbCwgSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uID0gbnVsbCkKewokYXJndiA9ICRhcmd2ID8/ICRfU0VSVkVSWydhcmd2J10gPz8gW107CgoKYXJyYXlfc2hpZnQoJGFyZ3YpOwoKJHRoaXMtPnRva2VucyA9ICRhcmd2OwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkZGVmaW5pdGlvbik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzZXRUb2tlbnMoYXJyYXkgJHRva2VucykKewokdGhpcy0+dG9rZW5zID0gJHRva2VuczsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlKCkKewokcGFyc2VPcHRpb25zID0gdHJ1ZTsKJHRoaXMtPnBhcnNlZCA9ICR0aGlzLT50b2tlbnM7CndoaWxlIChudWxsICE9PSAkdG9rZW4gPSBhcnJheV9zaGlmdCgkdGhpcy0+cGFyc2VkKSkgewokcGFyc2VPcHRpb25zID0gJHRoaXMtPnBhcnNlVG9rZW4oJHRva2VuLCAkcGFyc2VPcHRpb25zKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VUb2tlbihzdHJpbmcgJHRva2VuLCBib29sICRwYXJzZU9wdGlvbnMpOiBib29sCnsKaWYgKCRwYXJzZU9wdGlvbnMgJiYgJycgPT0gJHRva2VuKSB7CiR0aGlzLT5wYXJzZUFyZ3VtZW50KCR0b2tlbik7Cn0gZWxzZWlmICgkcGFyc2VPcHRpb25zICYmICctLScgPT0gJHRva2VuKSB7CnJldHVybiBmYWxzZTsKfSBlbHNlaWYgKCRwYXJzZU9wdGlvbnMgJiYgc3RyX3N0YXJ0c193aXRoKCR0b2tlbiwgJy0tJykpIHsKJHRoaXMtPnBhcnNlTG9uZ09wdGlvbigkdG9rZW4pOwp9IGVsc2VpZiAoJHBhcnNlT3B0aW9ucyAmJiAnLScgPT09ICR0b2tlblswXSAmJiAnLScgIT09ICR0b2tlbikgewokdGhpcy0+cGFyc2VTaG9ydE9wdGlvbigkdG9rZW4pOwp9IGVsc2UgewokdGhpcy0+cGFyc2VBcmd1bWVudCgkdG9rZW4pOwp9CgpyZXR1cm4gJHBhcnNlT3B0aW9uczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVNob3J0T3B0aW9uKHN0cmluZyAkdG9rZW4pCnsKJG5hbWUgPSBzdWJzdHIoJHRva2VuLCAxKTsKCmlmIChcc3RybGVuKCRuYW1lKSA+IDEpIHsKaWYgKCR0aGlzLT5kZWZpbml0aW9uLT5oYXNTaG9ydGN1dCgkbmFtZVswXSkgJiYgJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbkZvclNob3J0Y3V0KCRuYW1lWzBdKS0+YWNjZXB0VmFsdWUoKSkgewoKJHRoaXMtPmFkZFNob3J0T3B0aW9uKCRuYW1lWzBdLCBzdWJzdHIoJG5hbWUsIDEpKTsKfSBlbHNlIHsKJHRoaXMtPnBhcnNlU2hvcnRPcHRpb25TZXQoJG5hbWUpOwp9Cn0gZWxzZSB7CiR0aGlzLT5hZGRTaG9ydE9wdGlvbigkbmFtZSwgbnVsbCk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlU2hvcnRPcHRpb25TZXQoc3RyaW5nICRuYW1lKQp7CiRsZW4gPSBcc3RybGVuKCRuYW1lKTsKZm9yICgkaSA9IDA7ICRpIDwgJGxlbjsgKyskaSkgewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNTaG9ydGN1dCgkbmFtZVskaV0pKSB7CiRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkbmFtZSwgbnVsbCwgdHJ1ZSk7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgZmFsc2UgPT09ICRlbmNvZGluZyA/ICRuYW1lWyRpXSA6IG1iX3N1YnN0cigkbmFtZSwgJGksIDEsICRlbmNvZGluZykpKTsKfQoKJG9wdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25Gb3JTaG9ydGN1dCgkbmFtZVskaV0pOwppZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdGhpcy0+YWRkTG9uZ09wdGlvbigkb3B0aW9uLT5nZXROYW1lKCksICRpID09PSAkbGVuIC0gMSA/IG51bGwgOiBzdWJzdHIoJG5hbWUsICRpICsgMSkpOwoKYnJlYWs7Cn0gZWxzZSB7CiR0aGlzLT5hZGRMb25nT3B0aW9uKCRvcHRpb24tPmdldE5hbWUoKSwgbnVsbCk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlTG9uZ09wdGlvbihzdHJpbmcgJHRva2VuKQp7CiRuYW1lID0gc3Vic3RyKCR0b2tlbiwgMik7CgppZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJwb3MoJG5hbWUsICc9JykpIHsKaWYgKCcnID09PSAkdmFsdWUgPSBzdWJzdHIoJG5hbWUsICRwb3MgKyAxKSkgewphcnJheV91bnNoaWZ0KCR0aGlzLT5wYXJzZWQsICR2YWx1ZSk7Cn0KJHRoaXMtPmFkZExvbmdPcHRpb24oc3Vic3RyKCRuYW1lLCAwLCAkcG9zKSwgJHZhbHVlKTsKfSBlbHNlIHsKJHRoaXMtPmFkZExvbmdPcHRpb24oJG5hbWUsIG51bGwpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUFyZ3VtZW50KHN0cmluZyAkdG9rZW4pCnsKJGMgPSBcY291bnQoJHRoaXMtPmFyZ3VtZW50cyk7CgoKaWYgKCR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkYykpIHsKJGFyZyA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkYyk7CiR0aGlzLT5hcmd1bWVudHNbJGFyZy0+Z2V0TmFtZSgpXSA9ICRhcmctPmlzQXJyYXkoKSA/IFskdG9rZW5dIDogJHRva2VuOwoKCn0gZWxzZWlmICgkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJGMgLSAxKSAmJiAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJGMgLSAxKS0+aXNBcnJheSgpKSB7CiRhcmcgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJGMgLSAxKTsKJHRoaXMtPmFyZ3VtZW50c1skYXJnLT5nZXROYW1lKCldW10gPSAkdG9rZW47CgoKfSBlbHNlIHsKJGFsbCA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKTsKJHN5bWZvbnlDb21tYW5kTmFtZSA9IG51bGw7CmlmICgoJGlucHV0QXJndW1lbnQgPSAkYWxsWyRrZXkgPSBhcnJheV9rZXlfZmlyc3QoJGFsbCldID8/IG51bGwpICYmICdjb21tYW5kJyA9PT0gJGlucHV0QXJndW1lbnQtPmdldE5hbWUoKSkgewokc3ltZm9ueUNvbW1hbmROYW1lID0gJHRoaXMtPmFyZ3VtZW50c1snY29tbWFuZCddID8/IG51bGw7CnVuc2V0KCRhbGxbJGtleV0pOwp9CgppZiAoXGNvdW50KCRhbGwpKSB7CmlmICgkc3ltZm9ueUNvbW1hbmROYW1lKSB7CiRtZXNzYWdlID0gc3ByaW50ZignVG9vIG1hbnkgYXJndW1lbnRzIHRvICIlcyIgY29tbWFuZCwgZXhwZWN0ZWQgYXJndW1lbnRzICIlcyIuJywgJHN5bWZvbnlDb21tYW5kTmFtZSwgaW1wbG9kZSgnIiAiJywgYXJyYXlfa2V5cygkYWxsKSkpOwp9IGVsc2UgewokbWVzc2FnZSA9IHNwcmludGYoJ1RvbyBtYW55IGFyZ3VtZW50cywgZXhwZWN0ZWQgYXJndW1lbnRzICIlcyIuJywgaW1wbG9kZSgnIiAiJywgYXJyYXlfa2V5cygkYWxsKSkpOwp9Cn0gZWxzZWlmICgkc3ltZm9ueUNvbW1hbmROYW1lKSB7CiRtZXNzYWdlID0gc3ByaW50ZignTm8gYXJndW1lbnRzIGV4cGVjdGVkIGZvciAiJXMiIGNvbW1hbmQsIGdvdCAiJXMiLicsICRzeW1mb255Q29tbWFuZE5hbWUsICR0b2tlbik7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50ZignTm8gYXJndW1lbnRzIGV4cGVjdGVkLCBnb3QgIiVzIi4nLCAkdG9rZW4pOwp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZFNob3J0T3B0aW9uKHN0cmluZyAkc2hvcnRjdXQsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNTaG9ydGN1dCgkc2hvcnRjdXQpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJHNob3J0Y3V0KSk7Cn0KCiR0aGlzLT5hZGRMb25nT3B0aW9uKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25Gb3JTaG9ydGN1dCgkc2hvcnRjdXQpLT5nZXROYW1lKCksICR2YWx1ZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRMb25nT3B0aW9uKHN0cmluZyAkbmFtZSwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkpIHsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzTmVnYXRpb24oJG5hbWUpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiRvcHRpb25OYW1lID0gJHRoaXMtPmRlZmluaXRpb24tPm5lZ2F0aW9uVG9OYW1lKCRuYW1lKTsKaWYgKG51bGwgIT09ICR2YWx1ZSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiBkb2VzIG5vdCBhY2NlcHQgYSB2YWx1ZS4nLCAkbmFtZSkpOwp9CiR0aGlzLT5vcHRpb25zWyRvcHRpb25OYW1lXSA9IGZhbHNlOwoKcmV0dXJuOwp9Cgokb3B0aW9uID0gJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbigkbmFtZSk7CgppZiAobnVsbCAhPT0gJHZhbHVlICYmICEkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIGRvZXMgbm90IGFjY2VwdCBhIHZhbHVlLicsICRuYW1lKSk7Cn0KCmlmIChcaW5fYXJyYXkoJHZhbHVlLCBbJycsIG51bGxdLCB0cnVlKSAmJiAkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpICYmIFxjb3VudCgkdGhpcy0+cGFyc2VkKSkgewoKCiRuZXh0ID0gYXJyYXlfc2hpZnQoJHRoaXMtPnBhcnNlZCk7CmlmICgoaXNzZXQoJG5leHRbMF0pICYmICctJyAhPT0gJG5leHRbMF0pIHx8IFxpbl9hcnJheSgkbmV4dCwgWycnLCBudWxsXSwgdHJ1ZSkpIHsKJHZhbHVlID0gJG5leHQ7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoJHRoaXMtPnBhcnNlZCwgJG5leHQpOwp9Cn0KCmlmIChudWxsID09PSAkdmFsdWUpIHsKaWYgKCRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIHJlcXVpcmVzIGEgdmFsdWUuJywgJG5hbWUpKTsKfQoKaWYgKCEkb3B0aW9uLT5pc0FycmF5KCkgJiYgISRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpKSB7CiR2YWx1ZSA9IHRydWU7Cn0KfQoKaWYgKCRvcHRpb24tPmlzQXJyYXkoKSkgewokdGhpcy0+b3B0aW9uc1skbmFtZV1bXSA9ICR2YWx1ZTsKfSBlbHNlIHsKJHRoaXMtPm9wdGlvbnNbJG5hbWVdID0gJHZhbHVlOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXJzdEFyZ3VtZW50KCkKewokaXNPcHRpb24gPSBmYWxzZTsKZm9yZWFjaCAoJHRoaXMtPnRva2VucyBhcyAkaSA9PiAkdG9rZW4pIHsKaWYgKCR0b2tlbiAmJiAnLScgPT09ICR0b2tlblswXSkgewppZiAoc3RyX2NvbnRhaW5zKCR0b2tlbiwgJz0nKSB8fCAhaXNzZXQoJHRoaXMtPnRva2Vuc1skaSArIDFdKSkgewpjb250aW51ZTsKfQoKCgokbmFtZSA9ICctJyA9PT0gJHRva2VuWzFdID8gc3Vic3RyKCR0b2tlbiwgMikgOiBzdWJzdHIoJHRva2VuLCAtMSk7CmlmICghaXNzZXQoJHRoaXMtPm9wdGlvbnNbJG5hbWVdKSAmJiAhJHRoaXMtPmRlZmluaXRpb24tPmhhc1Nob3J0Y3V0KCRuYW1lKSkgewoKfSBlbHNlaWYgKChpc3NldCgkdGhpcy0+b3B0aW9uc1skbmFtZV0pIHx8IGlzc2V0KCR0aGlzLT5vcHRpb25zWyRuYW1lID0gJHRoaXMtPmRlZmluaXRpb24tPnNob3J0Y3V0VG9OYW1lKCRuYW1lKV0pKSAmJiAkdGhpcy0+dG9rZW5zWyRpICsgMV0gPT09ICR0aGlzLT5vcHRpb25zWyRuYW1lXSkgewokaXNPcHRpb24gPSB0cnVlOwp9Cgpjb250aW51ZTsKfQoKaWYgKCRpc09wdGlvbikgewokaXNPcHRpb24gPSBmYWxzZTsKY29udGludWU7Cn0KCnJldHVybiAkdG9rZW47Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFyYW1ldGVyT3B0aW9uKCR2YWx1ZXMsIGJvb2wgJG9ubHlQYXJhbXMgPSBmYWxzZSkKewokdmFsdWVzID0gKGFycmF5KSAkdmFsdWVzOwoKZm9yZWFjaCAoJHRoaXMtPnRva2VucyBhcyAkdG9rZW4pIHsKaWYgKCRvbmx5UGFyYW1zICYmICctLScgPT09ICR0b2tlbikgewpyZXR1cm4gZmFsc2U7Cn0KZm9yZWFjaCAoJHZhbHVlcyBhcyAkdmFsdWUpIHsKCgoKJGxlYWRpbmcgPSBzdHJfc3RhcnRzX3dpdGgoJHZhbHVlLCAnLS0nKSA/ICR2YWx1ZS4nPScgOiAkdmFsdWU7CmlmICgkdG9rZW4gPT09ICR2YWx1ZSB8fCAnJyAhPT0gJGxlYWRpbmcgJiYgc3RyX3N0YXJ0c193aXRoKCR0b2tlbiwgJGxlYWRpbmcpKSB7CnJldHVybiB0cnVlOwp9Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyYW1ldGVyT3B0aW9uKCR2YWx1ZXMsICRkZWZhdWx0ID0gZmFsc2UsIGJvb2wgJG9ubHlQYXJhbXMgPSBmYWxzZSkKewokdmFsdWVzID0gKGFycmF5KSAkdmFsdWVzOwokdG9rZW5zID0gJHRoaXMtPnRva2VuczsKCndoaWxlICgwIDwgXGNvdW50KCR0b2tlbnMpKSB7CiR0b2tlbiA9IGFycmF5X3NoaWZ0KCR0b2tlbnMpOwppZiAoJG9ubHlQYXJhbXMgJiYgJy0tJyA9PT0gJHRva2VuKSB7CnJldHVybiAkZGVmYXVsdDsKfQoKZm9yZWFjaCAoJHZhbHVlcyBhcyAkdmFsdWUpIHsKaWYgKCR0b2tlbiA9PT0gJHZhbHVlKSB7CnJldHVybiBhcnJheV9zaGlmdCgkdG9rZW5zKTsKfQoKCgokbGVhZGluZyA9IHN0cl9zdGFydHNfd2l0aCgkdmFsdWUsICctLScpID8gJHZhbHVlLic9JyA6ICR2YWx1ZTsKaWYgKCcnICE9PSAkbGVhZGluZyAmJiBzdHJfc3RhcnRzX3dpdGgoJHRva2VuLCAkbGVhZGluZykpIHsKcmV0dXJuIHN1YnN0cigkdG9rZW4sIFxzdHJsZW4oJGxlYWRpbmcpKTsKfQp9Cn0KCnJldHVybiAkZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKJHRva2VucyA9IGFycmF5X21hcChmdW5jdGlvbiAoJHRva2VuKSB7CmlmIChwcmVnX21hdGNoKCd7XigtW149XSs9KSguKyl9JywgJHRva2VuLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV0uJHRoaXMtPmVzY2FwZVRva2VuKCRtYXRjaFsyXSk7Cn0KCmlmICgkdG9rZW4gJiYgJy0nICE9PSAkdG9rZW5bMF0pIHsKcmV0dXJuICR0aGlzLT5lc2NhcGVUb2tlbigkdG9rZW4pOwp9CgpyZXR1cm4gJHRva2VuOwp9LCAkdGhpcy0+dG9rZW5zKTsKCnJldHVybiBpbXBsb2RlKCcgJywgJHRva2Vucyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZE9wdGlvbkV4Y2VwdGlvbjsKCgoKCgoKCgoKCmNsYXNzIEFycmF5SW5wdXQgZXh0ZW5kcyBJbnB1dAp7CnByaXZhdGUgJHBhcmFtZXRlcnM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhcmFtZXRlcnMsIElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiA9IG51bGwpCnsKJHRoaXMtPnBhcmFtZXRlcnMgPSAkcGFyYW1ldGVyczsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGRlZmluaXRpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rmlyc3RBcmd1bWVudCgpCnsKZm9yZWFjaCAoJHRoaXMtPnBhcmFtZXRlcnMgYXMgJHBhcmFtID0+ICR2YWx1ZSkgewppZiAoJHBhcmFtICYmIFxpc19zdHJpbmcoJHBhcmFtKSAmJiAnLScgPT09ICRwYXJhbVswXSkgewpjb250aW51ZTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKQp7CiR2YWx1ZXMgPSAoYXJyYXkpICR2YWx1ZXM7Cgpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkayA9PiAkdikgewppZiAoIVxpc19pbnQoJGspKSB7CiR2ID0gJGs7Cn0KCmlmICgkb25seVBhcmFtcyAmJiAnLS0nID09PSAkdikgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChcaW5fYXJyYXkoJHYsICR2YWx1ZXMpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlck9wdGlvbigkdmFsdWVzLCAkZGVmYXVsdCA9IGZhbHNlLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpCnsKJHZhbHVlcyA9IChhcnJheSkgJHZhbHVlczsKCmZvcmVhY2ggKCR0aGlzLT5wYXJhbWV0ZXJzIGFzICRrID0+ICR2KSB7CmlmICgkb25seVBhcmFtcyAmJiAoJy0tJyA9PT0gJGsgfHwgKFxpc19pbnQoJGspICYmICctLScgPT09ICR2KSkpIHsKcmV0dXJuICRkZWZhdWx0Owp9CgppZiAoXGlzX2ludCgkaykpIHsKaWYgKFxpbl9hcnJheSgkdiwgJHZhbHVlcykpIHsKcmV0dXJuIHRydWU7Cn0KfSBlbHNlaWYgKFxpbl9hcnJheSgkaywgJHZhbHVlcykpIHsKcmV0dXJuICR2Owp9Cn0KCnJldHVybiAkZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKJHBhcmFtcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkcGFyYW0gPT4gJHZhbCkgewppZiAoJHBhcmFtICYmIFxpc19zdHJpbmcoJHBhcmFtKSAmJiAnLScgPT09ICRwYXJhbVswXSkgewokZ2x1ZSA9ICgnLScgPT09ICRwYXJhbVsxXSkgPyAnPScgOiAnICc7CmlmIChcaXNfYXJyYXkoJHZhbCkpIHsKZm9yZWFjaCAoJHZhbCBhcyAkdikgewokcGFyYW1zW10gPSAkcGFyYW0uKCcnICE9ICR2ID8gJGdsdWUuJHRoaXMtPmVzY2FwZVRva2VuKCR2KSA6ICcnKTsKfQp9IGVsc2UgewokcGFyYW1zW10gPSAkcGFyYW0uKCcnICE9ICR2YWwgPyAkZ2x1ZS4kdGhpcy0+ZXNjYXBlVG9rZW4oJHZhbCkgOiAnJyk7Cn0KfSBlbHNlIHsKJHBhcmFtc1tdID0gXGlzX2FycmF5KCR2YWwpID8gaW1wbG9kZSgnICcsIGFycmF5X21hcChbJHRoaXMsICdlc2NhcGVUb2tlbiddLCAkdmFsKSkgOiAkdGhpcy0+ZXNjYXBlVG9rZW4oJHZhbCk7Cn0KfQoKcmV0dXJuIGltcGxvZGUoJyAnLCAkcGFyYW1zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlKCkKewpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJy0tJyA9PT0gJGtleSkgewpyZXR1cm47Cn0KaWYgKHN0cl9zdGFydHNfd2l0aCgka2V5LCAnLS0nKSkgewokdGhpcy0+YWRkTG9uZ09wdGlvbihzdWJzdHIoJGtleSwgMiksICR2YWx1ZSk7Cn0gZWxzZWlmIChzdHJfc3RhcnRzX3dpdGgoJGtleSwgJy0nKSkgewokdGhpcy0+YWRkU2hvcnRPcHRpb24oc3Vic3RyKCRrZXksIDEpLCAkdmFsdWUpOwp9IGVsc2UgewokdGhpcy0+YWRkQXJndW1lbnQoJGtleSwgJHZhbHVlKTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRTaG9ydE9wdGlvbihzdHJpbmcgJHNob3J0Y3V0LCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJHNob3J0Y3V0KSkgewp0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRzaG9ydGN1dCkpOwp9CgokdGhpcy0+YWRkTG9uZ09wdGlvbigkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRm9yU2hvcnRjdXQoJHNob3J0Y3V0KS0+Z2V0TmFtZSgpLCAkdmFsdWUpOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZExvbmdPcHRpb24oc3RyaW5nICRuYW1lLCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKSkgewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNOZWdhdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRPcHRpb25FeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJG9wdGlvbk5hbWUgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+bmVnYXRpb25Ub05hbWUoJG5hbWUpOwokdGhpcy0+b3B0aW9uc1skb3B0aW9uTmFtZV0gPSBmYWxzZTsKCnJldHVybjsKfQoKJG9wdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb24oJG5hbWUpOwoKaWYgKG51bGwgPT09ICR2YWx1ZSkgewppZiAoJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkpIHsKdGhyb3cgbmV3IEludmFsaWRPcHRpb25FeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gcmVxdWlyZXMgYSB2YWx1ZS4nLCAkbmFtZSkpOwp9CgppZiAoISRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpKSB7CiR2YWx1ZSA9IHRydWU7Cn0KfQoKJHRoaXMtPm9wdGlvbnNbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkQXJndW1lbnQoJG5hbWUsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBhcmd1bWVudCBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgokdGhpcy0+YXJndW1lbnRzWyRuYW1lXSA9ICR2YWx1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBJbnB1dCBpbXBsZW1lbnRzIElucHV0SW50ZXJmYWNlLCBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UKewpwcm90ZWN0ZWQgJGRlZmluaXRpb247CnByb3RlY3RlZCAkc3RyZWFtOwpwcm90ZWN0ZWQgJG9wdGlvbnMgPSBbXTsKcHJvdGVjdGVkICRhcmd1bWVudHMgPSBbXTsKcHJvdGVjdGVkICRpbnRlcmFjdGl2ZSA9IHRydWU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGRlZmluaXRpb24pIHsKJHRoaXMtPmRlZmluaXRpb24gPSBuZXcgSW5wdXREZWZpbml0aW9uKCk7Cn0gZWxzZSB7CiR0aGlzLT5iaW5kKCRkZWZpbml0aW9uKTsKJHRoaXMtPnZhbGlkYXRlKCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJpbmQoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKQp7CiR0aGlzLT5hcmd1bWVudHMgPSBbXTsKJHRoaXMtPm9wdGlvbnMgPSBbXTsKJHRoaXMtPmRlZmluaXRpb24gPSAkZGVmaW5pdGlvbjsKCiR0aGlzLT5wYXJzZSgpOwp9CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2UoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpCnsKJGRlZmluaXRpb24gPSAkdGhpcy0+ZGVmaW5pdGlvbjsKJGdpdmVuQXJndW1lbnRzID0gJHRoaXMtPmFyZ3VtZW50czsKCiRtaXNzaW5nQXJndW1lbnRzID0gYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKSwgZnVuY3Rpb24gKCRhcmd1bWVudCkgdXNlICgkZGVmaW5pdGlvbiwgJGdpdmVuQXJndW1lbnRzKSB7CnJldHVybiAhXGFycmF5X2tleV9leGlzdHMoJGFyZ3VtZW50LCAkZ2l2ZW5Bcmd1bWVudHMpICYmICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkYXJndW1lbnQpLT5pc1JlcXVpcmVkKCk7Cn0pOwoKaWYgKFxjb3VudCgkbWlzc2luZ0FyZ3VtZW50cykgPiAwKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ05vdCBlbm91Z2ggYXJndW1lbnRzIChtaXNzaW5nOiAiJXMiKS4nLCBpbXBsb2RlKCcsICcsICRtaXNzaW5nQXJndW1lbnRzKSkpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKCkKewpyZXR1cm4gJHRoaXMtPmludGVyYWN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW50ZXJhY3RpdmUoYm9vbCAkaW50ZXJhY3RpdmUpCnsKJHRoaXMtPmludGVyYWN0aXZlID0gJGludGVyYWN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCkKewpyZXR1cm4gYXJyYXlfbWVyZ2UoJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50RGVmYXVsdHMoKSwgJHRoaXMtPmFyZ3VtZW50cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudChzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5hcmd1bWVudHNbJG5hbWVdID8/ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkbmFtZSktPmdldERlZmF1bHQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyZ3VtZW50KHN0cmluZyAkbmFtZSwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiR0aGlzLT5hcmd1bWVudHNbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXJndW1lbnQoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpCnsKcmV0dXJuIGFycmF5X21lcmdlKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25EZWZhdWx0cygpLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oc3RyaW5nICRuYW1lKQp7CmlmICgkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzTmVnYXRpb24oJG5hbWUpKSB7CmlmIChudWxsID09PSAkdmFsdWUgPSAkdGhpcy0+Z2V0T3B0aW9uKCR0aGlzLT5kZWZpbml0aW9uLT5uZWdhdGlvblRvTmFtZSgkbmFtZSkpKSB7CnJldHVybiAkdmFsdWU7Cn0KCnJldHVybiAhJHZhbHVlOwp9CgppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiBcYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJHRoaXMtPm9wdGlvbnMpID8gJHRoaXMtPm9wdGlvbnNbJG5hbWVdIDogJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbigkbmFtZSktPmdldERlZmF1bHQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG5hbWUsICR2YWx1ZSkKewppZiAoJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKSkgewokdGhpcy0+b3B0aW9uc1skdGhpcy0+ZGVmaW5pdGlvbi0+bmVnYXRpb25Ub05hbWUoJG5hbWUpXSA9ICEkdmFsdWU7CgpyZXR1cm47Cn0gZWxzZWlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJHRoaXMtPm9wdGlvbnNbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzT3B0aW9uKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkgfHwgJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXNjYXBlVG9rZW4oc3RyaW5nICR0b2tlbikKewpyZXR1cm4gcHJlZ19tYXRjaCgne15bXHctXSskfScsICR0b2tlbikgPyAkdG9rZW4gOiBlc2NhcGVzaGVsbGFyZygkdG9rZW4pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RyZWFtKCRzdHJlYW0pCnsKJHRoaXMtPnN0cmVhbSA9ICRzdHJlYW07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKQp7CnJldHVybiAkdGhpcy0+c3RyZWFtOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBJbnB1dEFyZ3VtZW50CnsKcHVibGljIGNvbnN0IFJFUVVJUkVEID0gMTsKcHVibGljIGNvbnN0IE9QVElPTkFMID0gMjsKcHVibGljIGNvbnN0IElTX0FSUkFZID0gNDsKCnByaXZhdGUgJG5hbWU7CnByaXZhdGUgJG1vZGU7CnByaXZhdGUgJGRlZmF1bHQ7CnByaXZhdGUgJGRlc2NyaXB0aW9uOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBpbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCkKewppZiAobnVsbCA9PT0gJG1vZGUpIHsKJG1vZGUgPSBzZWxmOjpPUFRJT05BTDsKfSBlbHNlaWYgKCRtb2RlID4gNyB8fCAkbW9kZSA8IDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdBcmd1bWVudCBtb2RlICIlcyIgaXMgbm90IHZhbGlkLicsICRtb2RlKSk7Cn0KCiR0aGlzLT5uYW1lID0gJG5hbWU7CiR0aGlzLT5tb2RlID0gJG1vZGU7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCiR0aGlzLT5zZXREZWZhdWx0KCRkZWZhdWx0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1JlcXVpcmVkKCkKewpyZXR1cm4gc2VsZjo6UkVRVUlSRUQgPT09IChzZWxmOjpSRVFVSVJFRCAmICR0aGlzLT5tb2RlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBcnJheSgpCnsKcmV0dXJuIHNlbGY6OklTX0FSUkFZID09PSAoc2VsZjo6SVNfQVJSQVkgJiAkdGhpcy0+bW9kZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmYXVsdCgkZGVmYXVsdCA9IG51bGwpCnsKaWYgKCR0aGlzLT5pc1JlcXVpcmVkKCkgJiYgbnVsbCAhPT0gJGRlZmF1bHQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdDYW5ub3Qgc2V0IGEgZGVmYXVsdCB2YWx1ZSBleGNlcHQgZm9yIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMIG1vZGUuJyk7Cn0KCmlmICgkdGhpcy0+aXNBcnJheSgpKSB7CmlmIChudWxsID09PSAkZGVmYXVsdCkgewokZGVmYXVsdCA9IFtdOwp9IGVsc2VpZiAoIVxpc19hcnJheSgkZGVmYXVsdCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdBIGRlZmF1bHQgdmFsdWUgZm9yIGFuIGFycmF5IGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJyk7Cn0KfQoKJHRoaXMtPmRlZmF1bHQgPSAkZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpCnsKcmV0dXJuICR0aGlzLT5kZWZhdWx0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCgoKCgoKCmludGVyZmFjZSBJbnB1dEF3YXJlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHNldElucHV0KElucHV0SW50ZXJmYWNlICRpbnB1dCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgoKY2xhc3MgSW5wdXREZWZpbml0aW9uCnsKcHJpdmF0ZSAkYXJndW1lbnRzOwpwcml2YXRlICRyZXF1aXJlZENvdW50Owpwcml2YXRlICRsYXN0QXJyYXlBcmd1bWVudDsKcHJpdmF0ZSAkbGFzdE9wdGlvbmFsQXJndW1lbnQ7CnByaXZhdGUgJG9wdGlvbnM7CnByaXZhdGUgJG5lZ2F0aW9uczsKcHJpdmF0ZSAkc2hvcnRjdXRzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRkZWZpbml0aW9uID0gW10pCnsKJHRoaXMtPnNldERlZmluaXRpb24oJGRlZmluaXRpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmaW5pdGlvbihhcnJheSAkZGVmaW5pdGlvbikKewokYXJndW1lbnRzID0gW107CiRvcHRpb25zID0gW107CmZvcmVhY2ggKCRkZWZpbml0aW9uIGFzICRpdGVtKSB7CmlmICgkaXRlbSBpbnN0YW5jZW9mIElucHV0T3B0aW9uKSB7CiRvcHRpb25zW10gPSAkaXRlbTsKfSBlbHNlIHsKJGFyZ3VtZW50c1tdID0gJGl0ZW07Cn0KfQoKJHRoaXMtPnNldEFyZ3VtZW50cygkYXJndW1lbnRzKTsKJHRoaXMtPnNldE9wdGlvbnMoJG9wdGlvbnMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmd1bWVudHMoYXJyYXkgJGFyZ3VtZW50cyA9IFtdKQp7CiR0aGlzLT5hcmd1bWVudHMgPSBbXTsKJHRoaXMtPnJlcXVpcmVkQ291bnQgPSAwOwokdGhpcy0+bGFzdE9wdGlvbmFsQXJndW1lbnQgPSBudWxsOwokdGhpcy0+bGFzdEFycmF5QXJndW1lbnQgPSBudWxsOwokdGhpcy0+YWRkQXJndW1lbnRzKCRhcmd1bWVudHMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBcmd1bWVudHMoP2FycmF5ICRhcmd1bWVudHMgPSBbXSkKewppZiAobnVsbCAhPT0gJGFyZ3VtZW50cykgewpmb3JlYWNoICgkYXJndW1lbnRzIGFzICRhcmd1bWVudCkgewokdGhpcy0+YWRkQXJndW1lbnQoJGFyZ3VtZW50KTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCkKewppZiAoaXNzZXQoJHRoaXMtPmFyZ3VtZW50c1skYXJndW1lbnQtPmdldE5hbWUoKV0pKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdBbiBhcmd1bWVudCB3aXRoIG5hbWUgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkYXJndW1lbnQtPmdldE5hbWUoKSkpOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmxhc3RBcnJheUFyZ3VtZW50KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgYWRkIGEgcmVxdWlyZWQgYXJndW1lbnQgIiVzIiBhZnRlciBhbiBhcnJheSBhcmd1bWVudCAiJXMiLicsICRhcmd1bWVudC0+Z2V0TmFtZSgpLCAkdGhpcy0+bGFzdEFycmF5QXJndW1lbnQtPmdldE5hbWUoKSkpOwp9CgppZiAoJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCkgJiYgbnVsbCAhPT0gJHRoaXMtPmxhc3RPcHRpb25hbEFyZ3VtZW50KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgYWRkIGEgcmVxdWlyZWQgYXJndW1lbnQgIiVzIiBhZnRlciBhbiBvcHRpb25hbCBvbmUgIiVzIi4nLCAkYXJndW1lbnQtPmdldE5hbWUoKSwgJHRoaXMtPmxhc3RPcHRpb25hbEFyZ3VtZW50LT5nZXROYW1lKCkpKTsKfQoKaWYgKCRhcmd1bWVudC0+aXNBcnJheSgpKSB7CiR0aGlzLT5sYXN0QXJyYXlBcmd1bWVudCA9ICRhcmd1bWVudDsKfQoKaWYgKCRhcmd1bWVudC0+aXNSZXF1aXJlZCgpKSB7CisrJHRoaXMtPnJlcXVpcmVkQ291bnQ7Cn0gZWxzZSB7CiR0aGlzLT5sYXN0T3B0aW9uYWxBcmd1bWVudCA9ICRhcmd1bWVudDsKfQoKJHRoaXMtPmFyZ3VtZW50c1skYXJndW1lbnQtPmdldE5hbWUoKV0gPSAkYXJndW1lbnQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudCgkbmFtZSkKewppZiAoISR0aGlzLT5oYXNBcmd1bWVudCgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBhcmd1bWVudCBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgokYXJndW1lbnRzID0gXGlzX2ludCgkbmFtZSkgPyBhcnJheV92YWx1ZXMoJHRoaXMtPmFyZ3VtZW50cykgOiAkdGhpcy0+YXJndW1lbnRzOwoKcmV0dXJuICRhcmd1bWVudHNbJG5hbWVdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0FyZ3VtZW50KCRuYW1lKQp7CiRhcmd1bWVudHMgPSBcaXNfaW50KCRuYW1lKSA/IGFycmF5X3ZhbHVlcygkdGhpcy0+YXJndW1lbnRzKSA6ICR0aGlzLT5hcmd1bWVudHM7CgpyZXR1cm4gaXNzZXQoJGFyZ3VtZW50c1skbmFtZV0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKQp7CnJldHVybiAkdGhpcy0+YXJndW1lbnRzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudENvdW50KCkKewpyZXR1cm4gbnVsbCAhPT0gJHRoaXMtPmxhc3RBcnJheUFyZ3VtZW50ID8gXFBIUF9JTlRfTUFYIDogXGNvdW50KCR0aGlzLT5hcmd1bWVudHMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudFJlcXVpcmVkQ291bnQoKQp7CnJldHVybiAkdGhpcy0+cmVxdWlyZWRDb3VudDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50RGVmYXVsdHMoKQp7CiR2YWx1ZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFyZ3VtZW50cyBhcyAkYXJndW1lbnQpIHsKJHZhbHVlc1skYXJndW1lbnQtPmdldE5hbWUoKV0gPSAkYXJndW1lbnQtPmdldERlZmF1bHQoKTsKfQoKcmV0dXJuICR2YWx1ZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+b3B0aW9ucyA9IFtdOwokdGhpcy0+c2hvcnRjdXRzID0gW107CiR0aGlzLT5uZWdhdGlvbnMgPSBbXTsKJHRoaXMtPmFkZE9wdGlvbnMoJG9wdGlvbnMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRPcHRpb25zKGFycmF5ICRvcHRpb25zID0gW10pCnsKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewokdGhpcy0+YWRkT3B0aW9uKCRvcHRpb24pOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbikKewppZiAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbJG9wdGlvbi0+Z2V0TmFtZSgpXSkgJiYgISRvcHRpb24tPmVxdWFscygkdGhpcy0+b3B0aW9uc1skb3B0aW9uLT5nZXROYW1lKCldKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQW4gb3B0aW9uIG5hbWVkICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJG9wdGlvbi0+Z2V0TmFtZSgpKSk7Cn0KaWYgKGlzc2V0KCR0aGlzLT5uZWdhdGlvbnNbJG9wdGlvbi0+Z2V0TmFtZSgpXSkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0FuIG9wdGlvbiBuYW1lZCAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRvcHRpb24tPmdldE5hbWUoKSkpOwp9CgppZiAoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgewpmb3JlYWNoIChleHBsb2RlKCd8JywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgYXMgJHNob3J0Y3V0KSB7CmlmIChpc3NldCgkdGhpcy0+c2hvcnRjdXRzWyRzaG9ydGN1dF0pICYmICEkb3B0aW9uLT5lcXVhbHMoJHRoaXMtPm9wdGlvbnNbJHRoaXMtPnNob3J0Y3V0c1skc2hvcnRjdXRdXSkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0FuIG9wdGlvbiB3aXRoIHNob3J0Y3V0ICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJHNob3J0Y3V0KSk7Cn0KfQp9CgokdGhpcy0+b3B0aW9uc1skb3B0aW9uLT5nZXROYW1lKCldID0gJG9wdGlvbjsKaWYgKCRvcHRpb24tPmdldFNob3J0Y3V0KCkpIHsKZm9yZWFjaCAoZXhwbG9kZSgnfCcsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpIGFzICRzaG9ydGN1dCkgewokdGhpcy0+c2hvcnRjdXRzWyRzaG9ydGN1dF0gPSAkb3B0aW9uLT5nZXROYW1lKCk7Cn0KfQoKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJG5lZ2F0ZWROYW1lID0gJ25vLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwppZiAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbJG5lZ2F0ZWROYW1lXSkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0FuIG9wdGlvbiBuYW1lZCAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRuZWdhdGVkTmFtZSkpOwp9CiR0aGlzLT5uZWdhdGlvbnNbJG5lZ2F0ZWROYW1lXSA9ICRvcHRpb24tPmdldE5hbWUoKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbihzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzT3B0aW9uKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+b3B0aW9uc1skbmFtZV07Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc09wdGlvbihzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5vcHRpb25zWyRuYW1lXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzU2hvcnRjdXQoc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+c2hvcnRjdXRzWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNOZWdhdGlvbihzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5uZWdhdGlvbnNbJG5hbWVdKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9uRm9yU2hvcnRjdXQoc3RyaW5nICRzaG9ydGN1dCkKewpyZXR1cm4gJHRoaXMtPmdldE9wdGlvbigkdGhpcy0+c2hvcnRjdXRUb05hbWUoJHNob3J0Y3V0KSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25EZWZhdWx0cygpCnsKJHZhbHVlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+b3B0aW9ucyBhcyAkb3B0aW9uKSB7CiR2YWx1ZXNbJG9wdGlvbi0+Z2V0TmFtZSgpXSA9ICRvcHRpb24tPmdldERlZmF1bHQoKTsKfQoKcmV0dXJuICR2YWx1ZXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvcnRjdXRUb05hbWUoc3RyaW5nICRzaG9ydGN1dCk6IHN0cmluZwp7CmlmICghaXNzZXQoJHRoaXMtPnNob3J0Y3V0c1skc2hvcnRjdXRdKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJHNob3J0Y3V0KSk7Cn0KCnJldHVybiAkdGhpcy0+c2hvcnRjdXRzWyRzaG9ydGN1dF07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbmVnYXRpb25Ub05hbWUoc3RyaW5nICRuZWdhdGlvbik6IHN0cmluZwp7CmlmICghaXNzZXQoJHRoaXMtPm5lZ2F0aW9uc1skbmVnYXRpb25dKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuZWdhdGlvbikpOwp9CgpyZXR1cm4gJHRoaXMtPm5lZ2F0aW9uc1skbmVnYXRpb25dOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTeW5vcHNpcyhib29sICRzaG9ydCA9IGZhbHNlKQp7CiRlbGVtZW50cyA9IFtdOwoKaWYgKCRzaG9ydCAmJiAkdGhpcy0+Z2V0T3B0aW9ucygpKSB7CiRlbGVtZW50c1tdID0gJ1tvcHRpb25zXSc7Cn0gZWxzZWlmICghJHNob3J0KSB7CmZvcmVhY2ggKCR0aGlzLT5nZXRPcHRpb25zKCkgYXMgJG9wdGlvbikgewokdmFsdWUgPSAnJzsKaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHZhbHVlID0gc3ByaW50ZigKJyAlcyVzJXMnLAokb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSA/ICdbJyA6ICcnLApzdHJ0b3VwcGVyKCRvcHRpb24tPmdldE5hbWUoKSksCiRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpID8gJ10nIDogJycKKTsKfQoKJHNob3J0Y3V0ID0gJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/IHNwcmludGYoJy0lc3wnLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSA6ICcnOwokbmVnYXRpb24gPSAkb3B0aW9uLT5pc05lZ2F0YWJsZSgpID8gc3ByaW50ZignfC0tbm8tJXMnLCAkb3B0aW9uLT5nZXROYW1lKCkpIDogJyc7CiRlbGVtZW50c1tdID0gc3ByaW50ZignWyVzLS0lcyVzJXNdJywgJHNob3J0Y3V0LCAkb3B0aW9uLT5nZXROYW1lKCksICR2YWx1ZSwgJG5lZ2F0aW9uKTsKfQp9CgppZiAoXGNvdW50KCRlbGVtZW50cykgJiYgJHRoaXMtPmdldEFyZ3VtZW50cygpKSB7CiRlbGVtZW50c1tdID0gJ1stLV0nOwp9CgokdGFpbCA9ICcnOwpmb3JlYWNoICgkdGhpcy0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiRlbGVtZW50ID0gJzwnLiRhcmd1bWVudC0+Z2V0TmFtZSgpLic+JzsKaWYgKCRhcmd1bWVudC0+aXNBcnJheSgpKSB7CiRlbGVtZW50IC49ICcuLi4nOwp9CgppZiAoISRhcmd1bWVudC0+aXNSZXF1aXJlZCgpKSB7CiRlbGVtZW50ID0gJ1snLiRlbGVtZW50OwokdGFpbCAuPSAnXSc7Cn0KCiRlbGVtZW50c1tdID0gJGVsZW1lbnQ7Cn0KCnJldHVybiBpbXBsb2RlKCcgJywgJGVsZW1lbnRzKS4kdGFpbDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgppbnRlcmZhY2UgSW5wdXRJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXJzdEFyZ3VtZW50KCk7CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhcmFtZXRlck9wdGlvbigkdmFsdWVzLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpOwoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyYW1ldGVyT3B0aW9uKCR2YWx1ZXMsICRkZWZhdWx0ID0gZmFsc2UsIGJvb2wgJG9ubHlQYXJhbXMgPSBmYWxzZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBiaW5kKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbik7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50KHN0cmluZyAkbmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyZ3VtZW50KHN0cmluZyAkbmFtZSwgJHZhbHVlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0FyZ3VtZW50KHN0cmluZyAkbmFtZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25zKCk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbihzdHJpbmcgJG5hbWUpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oc3RyaW5nICRuYW1lLCAkdmFsdWUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzT3B0aW9uKHN0cmluZyAkbmFtZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW50ZXJhY3RpdmUoYm9vbCAkaW50ZXJhY3RpdmUpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSW5wdXRPcHRpb24KewoKCgpwdWJsaWMgY29uc3QgVkFMVUVfTk9ORSA9IDE7CgoKCgpwdWJsaWMgY29uc3QgVkFMVUVfUkVRVUlSRUQgPSAyOwoKCgoKcHVibGljIGNvbnN0IFZBTFVFX09QVElPTkFMID0gNDsKCgoKCnB1YmxpYyBjb25zdCBWQUxVRV9JU19BUlJBWSA9IDg7CgoKCgpwdWJsaWMgY29uc3QgVkFMVUVfTkVHQVRBQkxFID0gMTY7Cgpwcml2YXRlICRuYW1lOwpwcml2YXRlICRzaG9ydGN1dDsKcHJpdmF0ZSAkbW9kZTsKcHJpdmF0ZSAkZGVmYXVsdDsKcHJpdmF0ZSAkZGVzY3JpcHRpb247CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgJHNob3J0Y3V0ID0gbnVsbCwgaW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKHN0cl9zdGFydHNfd2l0aCgkbmFtZSwgJy0tJykpIHsKJG5hbWUgPSBzdWJzdHIoJG5hbWUsIDIpOwp9CgppZiAoZW1wdHkoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0FuIG9wdGlvbiBuYW1lIGNhbm5vdCBiZSBlbXB0eS4nKTsKfQoKaWYgKGVtcHR5KCRzaG9ydGN1dCkpIHsKJHNob3J0Y3V0ID0gbnVsbDsKfQoKaWYgKG51bGwgIT09ICRzaG9ydGN1dCkgewppZiAoXGlzX2FycmF5KCRzaG9ydGN1dCkpIHsKJHNob3J0Y3V0ID0gaW1wbG9kZSgnfCcsICRzaG9ydGN1dCk7Cn0KJHNob3J0Y3V0cyA9IHByZWdfc3BsaXQoJ3soXHwpLT99JywgbHRyaW0oJHNob3J0Y3V0LCAnLScpKTsKJHNob3J0Y3V0cyA9IGFycmF5X2ZpbHRlcigkc2hvcnRjdXRzKTsKJHNob3J0Y3V0ID0gaW1wbG9kZSgnfCcsICRzaG9ydGN1dHMpOwoKaWYgKGVtcHR5KCRzaG9ydGN1dCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQW4gb3B0aW9uIHNob3J0Y3V0IGNhbm5vdCBiZSBlbXB0eS4nKTsKfQp9CgppZiAobnVsbCA9PT0gJG1vZGUpIHsKJG1vZGUgPSBzZWxmOjpWQUxVRV9OT05FOwp9IGVsc2VpZiAoJG1vZGUgPj0gKHNlbGY6OlZBTFVFX05FR0FUQUJMRSA8PCAxKSB8fCAkbW9kZSA8IDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdPcHRpb24gbW9kZSAiJXMiIGlzIG5vdCB2YWxpZC4nLCAkbW9kZSkpOwp9CgokdGhpcy0+bmFtZSA9ICRuYW1lOwokdGhpcy0+c2hvcnRjdXQgPSAkc2hvcnRjdXQ7CiR0aGlzLT5tb2RlID0gJG1vZGU7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCmlmICgkdGhpcy0+aXNBcnJheSgpICYmICEkdGhpcy0+YWNjZXB0VmFsdWUoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbXBvc3NpYmxlIHRvIGhhdmUgYW4gb3B0aW9uIG1vZGUgVkFMVUVfSVNfQVJSQVkgaWYgdGhlIG9wdGlvbiBkb2VzIG5vdCBhY2NlcHQgYSB2YWx1ZS4nKTsKfQppZiAoJHRoaXMtPmlzTmVnYXRhYmxlKCkgJiYgJHRoaXMtPmFjY2VwdFZhbHVlKCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW1wb3NzaWJsZSB0byBoYXZlIGFuIG9wdGlvbiBtb2RlIFZBTFVFX05FR0FUQUJMRSBpZiB0aGUgb3B0aW9uIGFsc28gYWNjZXB0cyBhIHZhbHVlLicpOwp9CgokdGhpcy0+c2V0RGVmYXVsdCgkZGVmYXVsdCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNob3J0Y3V0KCkKewpyZXR1cm4gJHRoaXMtPnNob3J0Y3V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFjY2VwdFZhbHVlKCkKewpyZXR1cm4gJHRoaXMtPmlzVmFsdWVSZXF1aXJlZCgpIHx8ICR0aGlzLT5pc1ZhbHVlT3B0aW9uYWwoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWx1ZVJlcXVpcmVkKCkKewpyZXR1cm4gc2VsZjo6VkFMVUVfUkVRVUlSRUQgPT09IChzZWxmOjpWQUxVRV9SRVFVSVJFRCAmICR0aGlzLT5tb2RlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWx1ZU9wdGlvbmFsKCkKewpyZXR1cm4gc2VsZjo6VkFMVUVfT1BUSU9OQUwgPT09IChzZWxmOjpWQUxVRV9PUFRJT05BTCAmICR0aGlzLT5tb2RlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBcnJheSgpCnsKcmV0dXJuIHNlbGY6OlZBTFVFX0lTX0FSUkFZID09PSAoc2VsZjo6VkFMVUVfSVNfQVJSQVkgJiAkdGhpcy0+bW9kZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc05lZ2F0YWJsZSgpOiBib29sCnsKcmV0dXJuIHNlbGY6OlZBTFVFX05FR0FUQUJMRSA9PT0gKHNlbGY6OlZBTFVFX05FR0FUQUJMRSAmICR0aGlzLT5tb2RlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHQoJGRlZmF1bHQgPSBudWxsKQp7CmlmIChzZWxmOjpWQUxVRV9OT05FID09PSAoc2VsZjo6VkFMVUVfTk9ORSAmICR0aGlzLT5tb2RlKSAmJiBudWxsICE9PSAkZGVmYXVsdCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZXQgYSBkZWZhdWx0IHZhbHVlIHdoZW4gdXNpbmcgSW5wdXRPcHRpb246OlZBTFVFX05PTkUgbW9kZS4nKTsKfQoKaWYgKCR0aGlzLT5pc0FycmF5KCkpIHsKaWYgKG51bGwgPT09ICRkZWZhdWx0KSB7CiRkZWZhdWx0ID0gW107Cn0gZWxzZWlmICghXGlzX2FycmF5KCRkZWZhdWx0KSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0EgZGVmYXVsdCB2YWx1ZSBmb3IgYW4gYXJyYXkgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkuJyk7Cn0KfQoKJHRoaXMtPmRlZmF1bHQgPSAkdGhpcy0+YWNjZXB0VmFsdWUoKSB8fCAkdGhpcy0+aXNOZWdhdGFibGUoKSA/ICRkZWZhdWx0IDogZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlZmF1bHQoKQp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKQp7CnJldHVybiAkdGhpcy0+ZGVzY3JpcHRpb247Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFscyhzZWxmICRvcHRpb24pCnsKcmV0dXJuICRvcHRpb24tPmdldE5hbWUoKSA9PT0gJHRoaXMtPmdldE5hbWUoKQomJiAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID09PSAkdGhpcy0+Z2V0U2hvcnRjdXQoKQomJiAkb3B0aW9uLT5nZXREZWZhdWx0KCkgPT09ICR0aGlzLT5nZXREZWZhdWx0KCkKJiYgJG9wdGlvbi0+aXNOZWdhdGFibGUoKSA9PT0gJHRoaXMtPmlzTmVnYXRhYmxlKCkKJiYgJG9wdGlvbi0+aXNBcnJheSgpID09PSAkdGhpcy0+aXNBcnJheSgpCiYmICRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpID09PSAkdGhpcy0+aXNWYWx1ZVJlcXVpcmVkKCkKJiYgJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkgPT09ICR0aGlzLT5pc1ZhbHVlT3B0aW9uYWwoKQo7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7CgoKCgoKCgppbnRlcmZhY2UgU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlIGV4dGVuZHMgSW5wdXRJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0cmVhbSgkc3RyZWFtKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbSgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKCgpjbGFzcyBTdHJpbmdJbnB1dCBleHRlbmRzIEFyZ3ZJbnB1dAp7CnB1YmxpYyBjb25zdCBSRUdFWF9TVFJJTkcgPSAnKFteXHNdKz8pKD86XHN8KD88IVxcXFwpInwoPzwhXFxcXClcJ3wkKSc7CnB1YmxpYyBjb25zdCBSRUdFWF9VTlFVT1RFRF9TVFJJTkcgPSAnKFteXHNcXFxcXSs/KSc7CnB1YmxpYyBjb25zdCBSRUdFWF9RVU9URURfU1RSSU5HID0gJyg/OiIoW14iXFxcXF0qKD86XFxcXC5bXiJcXFxcXSopKikifFwnKFteXCdcXFxcXSooPzpcXFxcLlteXCdcXFxcXSopKilcJyknOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkaW5wdXQpCnsKcGFyZW50OjpfX2NvbnN0cnVjdChbXSk7CgokdGhpcy0+c2V0VG9rZW5zKCR0aGlzLT50b2tlbml6ZSgkaW5wdXQpKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHRva2VuaXplKHN0cmluZyAkaW5wdXQpOiBhcnJheQp7CiR0b2tlbnMgPSBbXTsKJGxlbmd0aCA9IFxzdHJsZW4oJGlucHV0KTsKJGN1cnNvciA9IDA7CiR0b2tlbiA9IG51bGw7CndoaWxlICgkY3Vyc29yIDwgJGxlbmd0aCkgewppZiAoJ1xcJyA9PT0gJGlucHV0WyRjdXJzb3JdKSB7CiR0b2tlbiAuPSAkaW5wdXRbKyskY3Vyc29yXSA/PyAnJzsKKyskY3Vyc29yOwpjb250aW51ZTsKfQoKaWYgKHByZWdfbWF0Y2goJy9ccysvQScsICRpbnB1dCwgJG1hdGNoLCAwLCAkY3Vyc29yKSkgewppZiAobnVsbCAhPT0gJHRva2VuKSB7CiR0b2tlbnNbXSA9ICR0b2tlbjsKJHRva2VuID0gbnVsbDsKfQp9IGVsc2VpZiAocHJlZ19tYXRjaCgnLyhbXj0iXCdcc10rPykoPT8pKCcuc2VsZjo6UkVHRVhfUVVPVEVEX1NUUklORy4nKykvQScsICRpbnB1dCwgJG1hdGNoLCAwLCAkY3Vyc29yKSkgewokdG9rZW4gLj0gJG1hdGNoWzFdLiRtYXRjaFsyXS5zdHJpcGNzbGFzaGVzKHN0cl9yZXBsYWNlKFsnIlwnJywgJ1wnIicsICdcJ1wnJywgJyIiJ10sICcnLCBzdWJzdHIoJG1hdGNoWzNdLCAxLCAtMSkpKTsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJy8nLnNlbGY6OlJFR0VYX1FVT1RFRF9TVFJJTkcuJy9BJywgJGlucHV0LCAkbWF0Y2gsIDAsICRjdXJzb3IpKSB7CiR0b2tlbiAuPSBzdHJpcGNzbGFzaGVzKHN1YnN0cigkbWF0Y2hbMF0sIDEsIC0xKSk7Cn0gZWxzZWlmIChwcmVnX21hdGNoKCcvJy5zZWxmOjpSRUdFWF9VTlFVT1RFRF9TVFJJTkcuJy9BJywgJGlucHV0LCAkbWF0Y2gsIDAsICRjdXJzb3IpKSB7CiR0b2tlbiAuPSAkbWF0Y2hbMV07Cn0gZWxzZSB7Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBwYXJzZSBpbnB1dCBuZWFyICIuLi4gJXMgLi4uIi4nLCBzdWJzdHIoJGlucHV0LCAkY3Vyc29yLCAxMCkpKTsKfQoKJGN1cnNvciArPSBcc3RybGVuKCRtYXRjaFswXSk7Cn0KCmlmIChudWxsICE9PSAkdG9rZW4pIHsKJHRva2Vuc1tdID0gJHRva2VuOwp9CgpyZXR1cm4gJHRva2VuczsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMDQtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXExvZ2dlcjsKCnVzZSBQc3JcTG9nXEFic3RyYWN0TG9nZ2VyOwp1c2UgUHNyXExvZ1xJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBQc3JcTG9nXExvZ0xldmVsOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCgpjbGFzcyBDb25zb2xlTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dnZXIKewpwdWJsaWMgY29uc3QgSU5GTyA9ICdpbmZvJzsKcHVibGljIGNvbnN0IEVSUk9SID0gJ2Vycm9yJzsKCnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkdmVyYm9zaXR5TGV2ZWxNYXAgPSBbCkxvZ0xldmVsOjpFTUVSR0VOQ1kgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfTk9STUFMLApMb2dMZXZlbDo6QUxFUlQgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfTk9STUFMLApMb2dMZXZlbDo6Q1JJVElDQUwgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfTk9STUFMLApMb2dMZXZlbDo6RVJST1IgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfTk9STUFMLApMb2dMZXZlbDo6V0FSTklORyA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9OT1JNQUwsCkxvZ0xldmVsOjpOT1RJQ0UgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSwKTG9nTGV2ZWw6OklORk8gPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFLApMb2dMZXZlbDo6REVCVUcgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUcsCl07CnByaXZhdGUgJGZvcm1hdExldmVsTWFwID0gWwpMb2dMZXZlbDo6RU1FUkdFTkNZID0+IHNlbGY6OkVSUk9SLApMb2dMZXZlbDo6QUxFUlQgPT4gc2VsZjo6RVJST1IsCkxvZ0xldmVsOjpDUklUSUNBTCA9PiBzZWxmOjpFUlJPUiwKTG9nTGV2ZWw6OkVSUk9SID0+IHNlbGY6OkVSUk9SLApMb2dMZXZlbDo6V0FSTklORyA9PiBzZWxmOjpJTkZPLApMb2dMZXZlbDo6Tk9USUNFID0+IHNlbGY6OklORk8sCkxvZ0xldmVsOjpJTkZPID0+IHNlbGY6OklORk8sCkxvZ0xldmVsOjpERUJVRyA9PiBzZWxmOjpJTkZPLApdOwpwcml2YXRlICRlcnJvcmVkID0gZmFsc2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGFycmF5ICR2ZXJib3NpdHlMZXZlbE1hcCA9IFtdLCBhcnJheSAkZm9ybWF0TGV2ZWxNYXAgPSBbXSkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKJHRoaXMtPnZlcmJvc2l0eUxldmVsTWFwID0gJHZlcmJvc2l0eUxldmVsTWFwICsgJHRoaXMtPnZlcmJvc2l0eUxldmVsTWFwOwokdGhpcy0+Zm9ybWF0TGV2ZWxNYXAgPSAkZm9ybWF0TGV2ZWxNYXAgKyAkdGhpcy0+Zm9ybWF0TGV2ZWxNYXA7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKQp7CmlmICghaXNzZXQoJHRoaXMtPnZlcmJvc2l0eUxldmVsTWFwWyRsZXZlbF0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGxvZyBsZXZlbCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRsZXZlbCkpOwp9Cgokb3V0cHV0ID0gJHRoaXMtPm91dHB1dDsKCgppZiAoc2VsZjo6RVJST1IgPT09ICR0aGlzLT5mb3JtYXRMZXZlbE1hcFskbGV2ZWxdKSB7CmlmICgkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQokdGhpcy0+ZXJyb3JlZCA9IHRydWU7Cn0KCgoKaWYgKCRvdXRwdXQtPmdldFZlcmJvc2l0eSgpID49ICR0aGlzLT52ZXJib3NpdHlMZXZlbE1hcFskbGV2ZWxdKSB7CiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignPCUxJHM+WyUyJHNdICUzJHM8LyUxJHM+JywgJHRoaXMtPmZvcm1hdExldmVsTWFwWyRsZXZlbF0sICRsZXZlbCwgJHRoaXMtPmludGVycG9sYXRlKCRtZXNzYWdlLCAkY29udGV4dCkpLCAkdGhpcy0+dmVyYm9zaXR5TGV2ZWxNYXBbJGxldmVsXSk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzRXJyb3JlZCgpCnsKcmV0dXJuICR0aGlzLT5lcnJvcmVkOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW50ZXJwb2xhdGUoc3RyaW5nICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCk6IHN0cmluZwp7CmlmICghc3RyX2NvbnRhaW5zKCRtZXNzYWdlLCAneycpKSB7CnJldHVybiAkbWVzc2FnZTsKfQoKJHJlcGxhY2VtZW50cyA9IFtdOwpmb3JlYWNoICgkY29udGV4dCBhcyAka2V5ID0+ICR2YWwpIHsKaWYgKG51bGwgPT09ICR2YWwgfHwgXGlzX3NjYWxhcigkdmFsKSB8fCAoXGlzX29iamVjdCgkdmFsKSAmJiBtZXRob2RfZXhpc3RzKCR2YWwsICdfX3RvU3RyaW5nJykpKSB7CiRyZXBsYWNlbWVudHNbInt7JGtleX19Il0gPSAkdmFsOwp9IGVsc2VpZiAoJHZhbCBpbnN0YW5jZW9mIFxEYXRlVGltZUludGVyZmFjZSkgewokcmVwbGFjZW1lbnRzWyJ7eyRrZXl9fSJdID0gJHZhbC0+Zm9ybWF0KFxEYXRlVGltZTo6UkZDMzMzOSk7Cn0gZWxzZWlmIChcaXNfb2JqZWN0KCR2YWwpKSB7CiRyZXBsYWNlbWVudHNbInt7JGtleX19Il0gPSAnW29iamVjdCAnLlxnZXRfY2xhc3MoJHZhbCkuJ10nOwp9IGVsc2UgewokcmVwbGFjZW1lbnRzWyJ7eyRrZXl9fSJdID0gJ1snLlxnZXR0eXBlKCR2YWwpLiddJzsKfQp9CgpyZXR1cm4gc3RydHIoJG1lc3NhZ2UsICRyZXBsYWNlbWVudHMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCgoKCmNsYXNzIEJ1ZmZlcmVkT3V0cHV0IGV4dGVuZHMgT3V0cHV0CnsKcHJpdmF0ZSAkYnVmZmVyID0gJyc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmZXRjaCgpCnsKJGNvbnRlbnQgPSAkdGhpcy0+YnVmZmVyOwokdGhpcy0+YnVmZmVyID0gJyc7CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSkKewokdGhpcy0+YnVmZmVyIC49ICRtZXNzYWdlOwoKaWYgKCRuZXdsaW5lKSB7CiR0aGlzLT5idWZmZXIgLj0gXFBIUF9FT0w7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgpjbGFzcyBDb25zb2xlT3V0cHV0IGV4dGVuZHMgU3RyZWFtT3V0cHV0IGltcGxlbWVudHMgQ29uc29sZU91dHB1dEludGVyZmFjZQp7CnByaXZhdGUgJHN0ZGVycjsKcHJpdmF0ZSAkY29uc29sZVNlY3Rpb25PdXRwdXRzID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJHZlcmJvc2l0eSA9IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwsIGJvb2wgJGRlY29yYXRlZCA9IG51bGwsIE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0aGlzLT5vcGVuT3V0cHV0U3RyZWFtKCksICR2ZXJib3NpdHksICRkZWNvcmF0ZWQsICRmb3JtYXR0ZXIpOwoKaWYgKG51bGwgPT09ICRmb3JtYXR0ZXIpIHsKCiR0aGlzLT5zdGRlcnIgPSBuZXcgU3RyZWFtT3V0cHV0KCR0aGlzLT5vcGVuRXJyb3JTdHJlYW0oKSwgJHZlcmJvc2l0eSwgJGRlY29yYXRlZCk7CgpyZXR1cm47Cn0KCiRhY3R1YWxEZWNvcmF0ZWQgPSAkdGhpcy0+aXNEZWNvcmF0ZWQoKTsKJHRoaXMtPnN0ZGVyciA9IG5ldyBTdHJlYW1PdXRwdXQoJHRoaXMtPm9wZW5FcnJvclN0cmVhbSgpLCAkdmVyYm9zaXR5LCAkZGVjb3JhdGVkLCAkdGhpcy0+Z2V0Rm9ybWF0dGVyKCkpOwoKaWYgKG51bGwgPT09ICRkZWNvcmF0ZWQpIHsKJHRoaXMtPnNldERlY29yYXRlZCgkYWN0dWFsRGVjb3JhdGVkICYmICR0aGlzLT5zdGRlcnItPmlzRGVjb3JhdGVkKCkpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKCk6IENvbnNvbGVTZWN0aW9uT3V0cHV0CnsKcmV0dXJuIG5ldyBDb25zb2xlU2VjdGlvbk91dHB1dCgkdGhpcy0+Z2V0U3RyZWFtKCksICR0aGlzLT5jb25zb2xlU2VjdGlvbk91dHB1dHMsICR0aGlzLT5nZXRWZXJib3NpdHkoKSwgJHRoaXMtPmlzRGVjb3JhdGVkKCksICR0aGlzLT5nZXRGb3JtYXR0ZXIoKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7CnBhcmVudDo6c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwokdGhpcy0+c3RkZXJyLT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKcGFyZW50OjpzZXRGb3JtYXR0ZXIoJGZvcm1hdHRlcik7CiR0aGlzLT5zdGRlcnItPnNldEZvcm1hdHRlcigkZm9ybWF0dGVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKQp7CnBhcmVudDo6c2V0VmVyYm9zaXR5KCRsZXZlbCk7CiR0aGlzLT5zdGRlcnItPnNldFZlcmJvc2l0eSgkbGV2ZWwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKQp7CnJldHVybiAkdGhpcy0+c3RkZXJyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JPdXRwdXQoT3V0cHV0SW50ZXJmYWNlICRlcnJvcikKewokdGhpcy0+c3RkZXJyID0gJGVycm9yOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzU3Rkb3V0U3VwcG9ydCgpCnsKcmV0dXJuIGZhbHNlID09PSAkdGhpcy0+aXNSdW5uaW5nT1M0MDAoKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1N0ZGVyclN1cHBvcnQoKQp7CnJldHVybiBmYWxzZSA9PT0gJHRoaXMtPmlzUnVubmluZ09TNDAwKCk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzUnVubmluZ09TNDAwKCk6IGJvb2wKewokY2hlY2tzID0gWwpcZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncycpIDogJycsCmdldGVudignT1NUWVBFJyksClxQSFBfT1MsCl07CgpyZXR1cm4gZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnOycsICRjaGVja3MpLCAnT1M0MDAnKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcGVuT3V0cHV0U3RyZWFtKCkKewppZiAoISR0aGlzLT5oYXNTdGRvdXRTdXBwb3J0KCkpIHsKcmV0dXJuIGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwp9CgoKcmV0dXJuIFxkZWZpbmVkKCdTVERPVVQnKSA/IFxTVERPVVQgOiAoQGZvcGVuKCdwaHA6Ly9zdGRvdXQnLCAndycpID86IGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcGVuRXJyb3JTdHJlYW0oKQp7CmlmICghJHRoaXMtPmhhc1N0ZGVyclN1cHBvcnQoKSkgewpyZXR1cm4gZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Cn0KCgpyZXR1cm4gXGRlZmluZWQoJ1NUREVSUicpID8gXFNUREVSUiA6IChAZm9wZW4oJ3BocDovL3N0ZGVycicsICd3JykgPzogZm9wZW4oJ3BocDovL291dHB1dCcsICd3JykpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCgoKCgoKCmludGVyZmFjZSBDb25zb2xlT3V0cHV0SW50ZXJmYWNlIGV4dGVuZHMgT3V0cHV0SW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKTsKCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvck91dHB1dChPdXRwdXRJbnRlcmZhY2UgJGVycm9yKTsKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKCk6IENvbnNvbGVTZWN0aW9uT3V0cHV0Owp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCgoKCgpjbGFzcyBDb25zb2xlU2VjdGlvbk91dHB1dCBleHRlbmRzIFN0cmVhbU91dHB1dAp7CnByaXZhdGUgJGNvbnRlbnQgPSBbXTsKcHJpdmF0ZSAkbGluZXMgPSAwOwpwcml2YXRlICRzZWN0aW9uczsKcHJpdmF0ZSAkdGVybWluYWw7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJlYW0sIGFycmF5ICYkc2VjdGlvbnMsIGludCAkdmVyYm9zaXR5LCBib29sICRkZWNvcmF0ZWQsIE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHN0cmVhbSwgJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7CmFycmF5X3Vuc2hpZnQoJHNlY3Rpb25zLCAkdGhpcyk7CiR0aGlzLT5zZWN0aW9ucyA9ICYkc2VjdGlvbnM7CiR0aGlzLT50ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhcihpbnQgJGxpbmVzID0gbnVsbCkKewppZiAoZW1wdHkoJHRoaXMtPmNvbnRlbnQpIHx8ICEkdGhpcy0+aXNEZWNvcmF0ZWQoKSkgewpyZXR1cm47Cn0KCmlmICgkbGluZXMpIHsKYXJyYXlfc3BsaWNlKCR0aGlzLT5jb250ZW50LCAtKCRsaW5lcyAqIDIpKTsgCn0gZWxzZSB7CiRsaW5lcyA9ICR0aGlzLT5saW5lczsKJHRoaXMtPmNvbnRlbnQgPSBbXTsKfQoKJHRoaXMtPmxpbmVzIC09ICRsaW5lczsKCnBhcmVudDo6ZG9Xcml0ZSgkdGhpcy0+cG9wU3RyZWFtQ29udGVudFVudGlsQ3VycmVudFNlY3Rpb24oJGxpbmVzKSwgZmFsc2UpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGUoJG1lc3NhZ2UpCnsKJHRoaXMtPmNsZWFyKCk7CiR0aGlzLT53cml0ZWxuKCRtZXNzYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnQoKTogc3RyaW5nCnsKcmV0dXJuIGltcGxvZGUoJycsICR0aGlzLT5jb250ZW50KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbnRlbnQoc3RyaW5nICRpbnB1dCkKewpmb3JlYWNoIChleHBsb2RlKFxQSFBfRU9MLCAkaW5wdXQpIGFzICRsaW5lQ29udGVudCkgewokdGhpcy0+bGluZXMgKz0gY2VpbCgkdGhpcy0+Z2V0RGlzcGxheUxlbmd0aCgkbGluZUNvbnRlbnQpIC8gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKSA/OiAxOwokdGhpcy0+Y29udGVudFtdID0gJGxpbmVDb250ZW50OwokdGhpcy0+Y29udGVudFtdID0gXFBIUF9FT0w7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvV3JpdGUoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdsaW5lKQp7CmlmICghJHRoaXMtPmlzRGVjb3JhdGVkKCkpIHsKcGFyZW50Ojpkb1dyaXRlKCRtZXNzYWdlLCAkbmV3bGluZSk7CgpyZXR1cm47Cn0KCiRlcmFzZWRDb250ZW50ID0gJHRoaXMtPnBvcFN0cmVhbUNvbnRlbnRVbnRpbEN1cnJlbnRTZWN0aW9uKCk7CgokdGhpcy0+YWRkQ29udGVudCgkbWVzc2FnZSk7CgpwYXJlbnQ6OmRvV3JpdGUoJG1lc3NhZ2UsIHRydWUpOwpwYXJlbnQ6OmRvV3JpdGUoJGVyYXNlZENvbnRlbnQsIGZhbHNlKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcG9wU3RyZWFtQ29udGVudFVudGlsQ3VycmVudFNlY3Rpb24oaW50ICRudW1iZXJPZkxpbmVzVG9DbGVhckZyb21DdXJyZW50U2VjdGlvbiA9IDApOiBzdHJpbmcKewokbnVtYmVyT2ZMaW5lc1RvQ2xlYXIgPSAkbnVtYmVyT2ZMaW5lc1RvQ2xlYXJGcm9tQ3VycmVudFNlY3Rpb247CiRlcmFzZWRDb250ZW50ID0gW107Cgpmb3JlYWNoICgkdGhpcy0+c2VjdGlvbnMgYXMgJHNlY3Rpb24pIHsKaWYgKCRzZWN0aW9uID09PSAkdGhpcykgewpicmVhazsKfQoKJG51bWJlck9mTGluZXNUb0NsZWFyICs9ICRzZWN0aW9uLT5saW5lczsKJGVyYXNlZENvbnRlbnRbXSA9ICRzZWN0aW9uLT5nZXRDb250ZW50KCk7Cn0KCmlmICgkbnVtYmVyT2ZMaW5lc1RvQ2xlYXIgPiAwKSB7CgpwYXJlbnQ6OmRvV3JpdGUoc3ByaW50ZigiXHgxYlslZEEiLCAkbnVtYmVyT2ZMaW5lc1RvQ2xlYXIpLCBmYWxzZSk7CgpwYXJlbnQ6OmRvV3JpdGUoIlx4MWJbMEoiLCBmYWxzZSk7Cn0KCnJldHVybiBpbXBsb2RlKCcnLCBhcnJheV9yZXZlcnNlKCRlcmFzZWRDb250ZW50KSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGlzcGxheUxlbmd0aChzdHJpbmcgJHRleHQpOiBpbnQKewpyZXR1cm4gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCBzdHJfcmVwbGFjZSgiXHQiLCAnICAgICAgICAnLCAkdGV4dCkpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcTnVsbE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKCgoKY2xhc3MgTnVsbE91dHB1dCBpbXBsZW1lbnRzIE91dHB1dEludGVyZmFjZQp7CnByaXZhdGUgJGZvcm1hdHRlcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoKQp7CmlmICgkdGhpcy0+Zm9ybWF0dGVyKSB7CnJldHVybiAkdGhpcy0+Zm9ybWF0dGVyOwp9CgpyZXR1cm4gJHRoaXMtPmZvcm1hdHRlciA9IG5ldyBOdWxsT3V0cHV0Rm9ybWF0dGVyKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyYm9zaXR5KCkKewpyZXR1cm4gc2VsZjo6VkVSQk9TSVRZX1FVSUVUOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNRdWlldCgpCnsKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkb3B0aW9ucyA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKCn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBPdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRJbnRlcmZhY2UKewpwcml2YXRlICR2ZXJib3NpdHk7CnByaXZhdGUgJGZvcm1hdHRlcjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9pbnQgJHZlcmJvc2l0eSA9IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwsIGJvb2wgJGRlY29yYXRlZCA9IGZhbHNlLCBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKJHRoaXMtPnZlcmJvc2l0eSA9ICR2ZXJib3NpdHkgPz8gc2VsZjo6VkVSQk9TSVRZX05PUk1BTDsKJHRoaXMtPmZvcm1hdHRlciA9ICRmb3JtYXR0ZXIgPz8gbmV3IE91dHB1dEZvcm1hdHRlcigpOwokdGhpcy0+Zm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKJHRoaXMtPmZvcm1hdHRlciA9ICRmb3JtYXR0ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoKQp7CnJldHVybiAkdGhpcy0+Zm9ybWF0dGVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewokdGhpcy0+Zm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5mb3JtYXR0ZXItPmlzRGVjb3JhdGVkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCkKewokdGhpcy0+dmVyYm9zaXR5ID0gJGxldmVsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyYm9zaXR5KCkKewpyZXR1cm4gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUXVpZXQoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfUVVJRVQgPT09ICR0aGlzLT52ZXJib3NpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfVkVSQk9TRSA8PSAkdGhpcy0+dmVyYm9zaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpCnsKcmV0dXJuIHNlbGY6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UgPD0gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfREVCVUcgPD0gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CiR0aGlzLT53cml0ZSgkbWVzc2FnZXMsIHRydWUsICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CmlmICghaXNfaXRlcmFibGUoJG1lc3NhZ2VzKSkgewokbWVzc2FnZXMgPSBbJG1lc3NhZ2VzXTsKfQoKJHR5cGVzID0gc2VsZjo6T1VUUFVUX05PUk1BTCB8IHNlbGY6Ok9VVFBVVF9SQVcgfCBzZWxmOjpPVVRQVVRfUExBSU47CiR0eXBlID0gJHR5cGVzICYgJG9wdGlvbnMgPzogc2VsZjo6T1VUUFVUX05PUk1BTDsKCiR2ZXJib3NpdGllcyA9IHNlbGY6OlZFUkJPU0lUWV9RVUlFVCB8IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwgfCBzZWxmOjpWRVJCT1NJVFlfVkVSQk9TRSB8IHNlbGY6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UgfCBzZWxmOjpWRVJCT1NJVFlfREVCVUc7CiR2ZXJib3NpdHkgPSAkdmVyYm9zaXRpZXMgJiAkb3B0aW9ucyA/OiBzZWxmOjpWRVJCT1NJVFlfTk9STUFMOwoKaWYgKCR2ZXJib3NpdHkgPiAkdGhpcy0+Z2V0VmVyYm9zaXR5KCkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKc3dpdGNoICgkdHlwZSkgewpjYXNlIE91dHB1dEludGVyZmFjZTo6T1VUUFVUX05PUk1BTDoKJG1lc3NhZ2UgPSAkdGhpcy0+Zm9ybWF0dGVyLT5mb3JtYXQoJG1lc3NhZ2UpOwpicmVhazsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9SQVc6CmJyZWFrOwpjYXNlIE91dHB1dEludGVyZmFjZTo6T1VUUFVUX1BMQUlOOgokbWVzc2FnZSA9IHN0cmlwX3RhZ3MoJHRoaXMtPmZvcm1hdHRlci0+Zm9ybWF0KCRtZXNzYWdlKSk7CmJyZWFrOwp9CgokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZSA/PyAnJywgJG5ld2xpbmUpOwp9Cn0KCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBPdXRwdXRJbnRlcmZhY2UKewpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX1FVSUVUID0gMTY7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfTk9STUFMID0gMzI7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfVkVSQk9TRSA9IDY0OwpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX1ZFUllfVkVSQk9TRSA9IDEyODsKcHVibGljIGNvbnN0IFZFUkJPU0lUWV9ERUJVRyA9IDI1NjsKCnB1YmxpYyBjb25zdCBPVVRQVVRfTk9STUFMID0gMTsKcHVibGljIGNvbnN0IE9VVFBVVF9SQVcgPSAyOwpwdWJsaWMgY29uc3QgT1VUUFVUX1BMQUlOID0gNDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkb3B0aW9ucyA9IDApOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJG9wdGlvbnMgPSAwKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJib3NpdHkoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUXVpZXQoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKTsKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKY2xhc3MgU3RyZWFtT3V0cHV0IGV4dGVuZHMgT3V0cHV0CnsKcHJpdmF0ZSAkc3RyZWFtOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmVhbSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpWRVJCT1NJVFlfTk9STUFMLCBib29sICRkZWNvcmF0ZWQgPSBudWxsLCBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKaWYgKCFcaXNfcmVzb3VyY2UoJHN0cmVhbSkgfHwgJ3N0cmVhbScgIT09IGdldF9yZXNvdXJjZV90eXBlKCRzdHJlYW0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBTdHJlYW1PdXRwdXQgY2xhc3MgbmVlZHMgYSBzdHJlYW0gYXMgaXRzIGZpcnN0IGFyZ3VtZW50LicpOwp9CgokdGhpcy0+c3RyZWFtID0gJHN0cmVhbTsKCmlmIChudWxsID09PSAkZGVjb3JhdGVkKSB7CiRkZWNvcmF0ZWQgPSAkdGhpcy0+aGFzQ29sb3JTdXBwb3J0KCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbSgpCnsKcmV0dXJuICR0aGlzLT5zdHJlYW07Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSkKewppZiAoJG5ld2xpbmUpIHsKJG1lc3NhZ2UgLj0gXFBIUF9FT0w7Cn0KCkBmd3JpdGUoJHRoaXMtPnN0cmVhbSwgJG1lc3NhZ2UpOwoKZmZsdXNoKCR0aGlzLT5zdHJlYW0pOwp9CgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc0NvbG9yU3VwcG9ydCgpCnsKCmlmIChpc3NldCgkX1NFUlZFUlsnTk9fQ09MT1InXSkgfHwgZmFsc2UgIT09IGdldGVudignTk9fQ09MT1InKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgnSHlwZXInID09PSBnZXRlbnYoJ1RFUk1fUFJPR1JBTScpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKcmV0dXJuIChcZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3NfdnQxMDBfc3VwcG9ydCcpCiYmIEBzYXBpX3dpbmRvd3NfdnQxMDBfc3VwcG9ydCgkdGhpcy0+c3RyZWFtKSkKfHwgZmFsc2UgIT09IGdldGVudignQU5TSUNPTicpCnx8ICdPTicgPT09IGdldGVudignQ29uRW11QU5TSScpCnx8ICd4dGVybScgPT09IGdldGVudignVEVSTScpOwp9CgpyZXR1cm4gc3RyZWFtX2lzYXR0eSgkdGhpcy0+c3RyZWFtKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBUcmltbWVkQnVmZmVyT3V0cHV0IGV4dGVuZHMgT3V0cHV0CnsKcHJpdmF0ZSAkbWF4TGVuZ3RoOwpwcml2YXRlICRidWZmZXIgPSAnJzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJG1heExlbmd0aCwgP2ludCAkdmVyYm9zaXR5ID0gc2VsZjo6VkVSQk9TSVRZX05PUk1BTCwgYm9vbCAkZGVjb3JhdGVkID0gZmFsc2UsIE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyID0gbnVsbCkKewppZiAoJG1heExlbmd0aCA8PSAwKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzKCkiIGV4cGVjdHMgYSBzdHJpY3RseSBwb3NpdGl2ZSBtYXhMZW5ndGguIEdvdCAlZC4nLCBfX01FVEhPRF9fLCAkbWF4TGVuZ3RoKSk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7CiR0aGlzLT5tYXhMZW5ndGggPSAkbWF4TGVuZ3RoOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmZXRjaCgpCnsKJGNvbnRlbnQgPSAkdGhpcy0+YnVmZmVyOwokdGhpcy0+YnVmZmVyID0gJyc7CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSkKewokdGhpcy0+YnVmZmVyIC49ICRtZXNzYWdlOwoKaWYgKCRuZXdsaW5lKSB7CiR0aGlzLT5idWZmZXIgLj0gXFBIUF9FT0w7Cn0KCiR0aGlzLT5idWZmZXIgPSBzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgMCAtICR0aGlzLT5tYXhMZW5ndGgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgQ2hvaWNlUXVlc3Rpb24gZXh0ZW5kcyBRdWVzdGlvbgp7CnByaXZhdGUgJGNob2ljZXM7CnByaXZhdGUgJG11bHRpc2VsZWN0ID0gZmFsc2U7CnByaXZhdGUgJHByb21wdCA9ICcgPiAnOwpwcml2YXRlICRlcnJvck1lc3NhZ2UgPSAnVmFsdWUgIiVzIiBpcyBpbnZhbGlkJzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcXVlc3Rpb24sIGFycmF5ICRjaG9pY2VzLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKCEkY2hvaWNlcykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDaG9pY2UgcXVlc3Rpb24gbXVzdCBoYXZlIGF0IGxlYXN0IDEgY2hvaWNlIGF2YWlsYWJsZS4nKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkcXVlc3Rpb24sICRkZWZhdWx0KTsKCiR0aGlzLT5jaG9pY2VzID0gJGNob2ljZXM7CiR0aGlzLT5zZXRWYWxpZGF0b3IoJHRoaXMtPmdldERlZmF1bHRWYWxpZGF0b3IoKSk7CiR0aGlzLT5zZXRBdXRvY29tcGxldGVyVmFsdWVzKCRjaG9pY2VzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hvaWNlcygpCnsKcmV0dXJuICR0aGlzLT5jaG9pY2VzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE11bHRpc2VsZWN0KGJvb2wgJG11bHRpc2VsZWN0KQp7CiR0aGlzLT5tdWx0aXNlbGVjdCA9ICRtdWx0aXNlbGVjdDsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNNdWx0aXNlbGVjdCgpCnsKcmV0dXJuICR0aGlzLT5tdWx0aXNlbGVjdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvbXB0KCkKewpyZXR1cm4gJHRoaXMtPnByb21wdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvbXB0KHN0cmluZyAkcHJvbXB0KQp7CiR0aGlzLT5wcm9tcHQgPSAkcHJvbXB0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yTWVzc2FnZShzdHJpbmcgJGVycm9yTWVzc2FnZSkKewokdGhpcy0+ZXJyb3JNZXNzYWdlID0gJGVycm9yTWVzc2FnZTsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKCnJldHVybiAkdGhpczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0VmFsaWRhdG9yKCk6IGNhbGxhYmxlCnsKJGNob2ljZXMgPSAkdGhpcy0+Y2hvaWNlczsKJGVycm9yTWVzc2FnZSA9ICR0aGlzLT5lcnJvck1lc3NhZ2U7CiRtdWx0aXNlbGVjdCA9ICR0aGlzLT5tdWx0aXNlbGVjdDsKJGlzQXNzb2MgPSAkdGhpcy0+aXNBc3NvYygkY2hvaWNlcyk7CgpyZXR1cm4gZnVuY3Rpb24gKCRzZWxlY3RlZCkgdXNlICgkY2hvaWNlcywgJGVycm9yTWVzc2FnZSwgJG11bHRpc2VsZWN0LCAkaXNBc3NvYykgewppZiAoJG11bHRpc2VsZWN0KSB7CgppZiAoIXByZWdfbWF0Y2goJy9eW14sXSsoPzosW14sXSspKiQvJywgKHN0cmluZykgJHNlbGVjdGVkLCAkbWF0Y2hlcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCRlcnJvck1lc3NhZ2UsICRzZWxlY3RlZCkpOwp9Cgokc2VsZWN0ZWRDaG9pY2VzID0gZXhwbG9kZSgnLCcsIChzdHJpbmcpICRzZWxlY3RlZCk7Cn0gZWxzZSB7CiRzZWxlY3RlZENob2ljZXMgPSBbJHNlbGVjdGVkXTsKfQoKaWYgKCR0aGlzLT5pc1RyaW1tYWJsZSgpKSB7CmZvcmVhY2ggKCRzZWxlY3RlZENob2ljZXMgYXMgJGsgPT4gJHYpIHsKJHNlbGVjdGVkQ2hvaWNlc1ska10gPSB0cmltKChzdHJpbmcpICR2KTsKfQp9CgokbXVsdGlzZWxlY3RDaG9pY2VzID0gW107CmZvcmVhY2ggKCRzZWxlY3RlZENob2ljZXMgYXMgJHZhbHVlKSB7CiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCRjaG9pY2VzIGFzICRrZXkgPT4gJGNob2ljZSkgewppZiAoJGNob2ljZSA9PT0gJHZhbHVlKSB7CiRyZXN1bHRzW10gPSAka2V5Owp9Cn0KCmlmIChcY291bnQoJHJlc3VsdHMpID4gMSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBwcm92aWRlZCBhbnN3ZXIgaXMgYW1iaWd1b3VzLiBWYWx1ZSBzaG91bGQgYmUgb25lIG9mICIlcyIuJywgaW1wbG9kZSgnIiBvciAiJywgJHJlc3VsdHMpKSk7Cn0KCiRyZXN1bHQgPSBhcnJheV9zZWFyY2goJHZhbHVlLCAkY2hvaWNlcyk7CgppZiAoISRpc0Fzc29jKSB7CmlmIChmYWxzZSAhPT0gJHJlc3VsdCkgewokcmVzdWx0ID0gJGNob2ljZXNbJHJlc3VsdF07Cn0gZWxzZWlmIChpc3NldCgkY2hvaWNlc1skdmFsdWVdKSkgewokcmVzdWx0ID0gJGNob2ljZXNbJHZhbHVlXTsKfQp9IGVsc2VpZiAoZmFsc2UgPT09ICRyZXN1bHQgJiYgaXNzZXQoJGNob2ljZXNbJHZhbHVlXSkpIHsKJHJlc3VsdCA9ICR2YWx1ZTsKfQoKaWYgKGZhbHNlID09PSAkcmVzdWx0KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigkZXJyb3JNZXNzYWdlLCAkdmFsdWUpKTsKfQoKCiRtdWx0aXNlbGVjdENob2ljZXNbXSA9ICRpc0Fzc29jID8gKHN0cmluZykgJHJlc3VsdCA6ICRyZXN1bHQ7Cn0KCmlmICgkbXVsdGlzZWxlY3QpIHsKcmV0dXJuICRtdWx0aXNlbGVjdENob2ljZXM7Cn0KCnJldHVybiBjdXJyZW50KCRtdWx0aXNlbGVjdENob2ljZXMpOwp9Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uOwoKCgoKCgpjbGFzcyBDb25maXJtYXRpb25RdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uCnsKcHJpdmF0ZSAkdHJ1ZUFuc3dlclJlZ2V4OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUsIHN0cmluZyAkdHJ1ZUFuc3dlclJlZ2V4ID0gJy9eeS9pJykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRxdWVzdGlvbiwgJGRlZmF1bHQpOwoKJHRoaXMtPnRydWVBbnN3ZXJSZWdleCA9ICR0cnVlQW5zd2VyUmVnZXg7CiR0aGlzLT5zZXROb3JtYWxpemVyKCR0aGlzLT5nZXREZWZhdWx0Tm9ybWFsaXplcigpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0Tm9ybWFsaXplcigpOiBjYWxsYWJsZQp7CiRkZWZhdWx0ID0gJHRoaXMtPmdldERlZmF1bHQoKTsKJHJlZ2V4ID0gJHRoaXMtPnRydWVBbnN3ZXJSZWdleDsKCnJldHVybiBmdW5jdGlvbiAoJGFuc3dlcikgdXNlICgkZGVmYXVsdCwgJHJlZ2V4KSB7CmlmIChcaXNfYm9vbCgkYW5zd2VyKSkgewpyZXR1cm4gJGFuc3dlcjsKfQoKJGFuc3dlcklzVHJ1ZSA9IChib29sKSBwcmVnX21hdGNoKCRyZWdleCwgJGFuc3dlcik7CmlmIChmYWxzZSA9PT0gJGRlZmF1bHQpIHsKcmV0dXJuICRhbnN3ZXIgJiYgJGFuc3dlcklzVHJ1ZTsKfQoKcmV0dXJuICcnID09PSAkYW5zd2VyIHx8ICRhbnN3ZXJJc1RydWU7Cn07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CgoKCgoKCmNsYXNzIFF1ZXN0aW9uCnsKcHJpdmF0ZSAkcXVlc3Rpb247CnByaXZhdGUgJGF0dGVtcHRzOwpwcml2YXRlICRoaWRkZW4gPSBmYWxzZTsKcHJpdmF0ZSAkaGlkZGVuRmFsbGJhY2sgPSB0cnVlOwpwcml2YXRlICRhdXRvY29tcGxldGVyQ2FsbGJhY2s7CnByaXZhdGUgJHZhbGlkYXRvcjsKcHJpdmF0ZSAkZGVmYXVsdDsKcHJpdmF0ZSAkbm9ybWFsaXplcjsKcHJpdmF0ZSAkdHJpbW1hYmxlID0gdHJ1ZTsKcHJpdmF0ZSAkbXVsdGlsaW5lID0gZmFsc2U7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcXVlc3Rpb24sICRkZWZhdWx0ID0gbnVsbCkKewokdGhpcy0+cXVlc3Rpb24gPSAkcXVlc3Rpb247CiR0aGlzLT5kZWZhdWx0ID0gJGRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFF1ZXN0aW9uKCkKewpyZXR1cm4gJHRoaXMtPnF1ZXN0aW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0KCkKewpyZXR1cm4gJHRoaXMtPmRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc011bHRpbGluZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5tdWx0aWxpbmU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE11bHRpbGluZShib29sICRtdWx0aWxpbmUpOiBzZWxmCnsKJHRoaXMtPm11bHRpbGluZSA9ICRtdWx0aWxpbmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSGlkZGVuKCkKewpyZXR1cm4gJHRoaXMtPmhpZGRlbjsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIaWRkZW4oYm9vbCAkaGlkZGVuKQp7CmlmICgkdGhpcy0+YXV0b2NvbXBsZXRlckNhbGxiYWNrKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQSBoaWRkZW4gcXVlc3Rpb24gY2Fubm90IHVzZSB0aGUgYXV0b2NvbXBsZXRlci4nKTsKfQoKJHRoaXMtPmhpZGRlbiA9ICRoaWRkZW47CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSGlkZGVuRmFsbGJhY2soKQp7CnJldHVybiAkdGhpcy0+aGlkZGVuRmFsbGJhY2s7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhpZGRlbkZhbGxiYWNrKGJvb2wgJGZhbGxiYWNrKQp7CiR0aGlzLT5oaWRkZW5GYWxsYmFjayA9ICRmYWxsYmFjazsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2NvbXBsZXRlclZhbHVlcygpCnsKJGNhbGxiYWNrID0gJHRoaXMtPmdldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygpOwoKcmV0dXJuICRjYWxsYmFjayA/ICRjYWxsYmFjaygnJykgOiBudWxsOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9jb21wbGV0ZXJWYWx1ZXMoP2l0ZXJhYmxlICR2YWx1ZXMpCnsKaWYgKFxpc19hcnJheSgkdmFsdWVzKSkgewokdmFsdWVzID0gJHRoaXMtPmlzQXNzb2MoJHZhbHVlcykgPyBhcnJheV9tZXJnZShhcnJheV9rZXlzKCR2YWx1ZXMpLCBhcnJheV92YWx1ZXMoJHZhbHVlcykpIDogYXJyYXlfdmFsdWVzKCR2YWx1ZXMpOwoKJGNhbGxiYWNrID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJHZhbHVlcykgewpyZXR1cm4gJHZhbHVlczsKfTsKfSBlbHNlaWYgKCR2YWx1ZXMgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJHZhbHVlQ2FjaGUgPSBudWxsOwokY2FsbGJhY2sgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkdmFsdWVzLCAmJHZhbHVlQ2FjaGUpIHsKcmV0dXJuICR2YWx1ZUNhY2hlID8/ICR2YWx1ZUNhY2hlID0gaXRlcmF0b3JfdG9fYXJyYXkoJHZhbHVlcywgZmFsc2UpOwp9Owp9IGVsc2UgewokY2FsbGJhY2sgPSBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnNldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygkY2FsbGJhY2spOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2NvbXBsZXRlckNhbGxiYWNrKCk6ID9jYWxsYWJsZQp7CnJldHVybiAkdGhpcy0+YXV0b2NvbXBsZXRlckNhbGxiYWNrOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9jb21wbGV0ZXJDYWxsYmFjayhjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKTogc2VsZgp7CmlmICgkdGhpcy0+aGlkZGVuICYmIG51bGwgIT09ICRjYWxsYmFjaykgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0EgaGlkZGVuIHF1ZXN0aW9uIGNhbm5vdCB1c2UgdGhlIGF1dG9jb21wbGV0ZXIuJyk7Cn0KCiR0aGlzLT5hdXRvY29tcGxldGVyQ2FsbGJhY2sgPSAkY2FsbGJhY2s7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZhbGlkYXRvcihjYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCkKewokdGhpcy0+dmFsaWRhdG9yID0gJHZhbGlkYXRvcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsaWRhdG9yKCkKewpyZXR1cm4gJHRoaXMtPnZhbGlkYXRvcjsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1heEF0dGVtcHRzKD9pbnQgJGF0dGVtcHRzKQp7CmlmIChudWxsICE9PSAkYXR0ZW1wdHMgJiYgJGF0dGVtcHRzIDwgMSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBtdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUuJyk7Cn0KCiR0aGlzLT5hdHRlbXB0cyA9ICRhdHRlbXB0czsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXhBdHRlbXB0cygpCnsKcmV0dXJuICR0aGlzLT5hdHRlbXB0czsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXROb3JtYWxpemVyKGNhbGxhYmxlICRub3JtYWxpemVyKQp7CiR0aGlzLT5ub3JtYWxpemVyID0gJG5vcm1hbGl6ZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplcigpCnsKcmV0dXJuICR0aGlzLT5ub3JtYWxpemVyOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNBc3NvYyhhcnJheSAkYXJyYXkpCnsKcmV0dXJuIChib29sKSBcY291bnQoYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJGFycmF5KSwgJ2lzX3N0cmluZycpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzVHJpbW1hYmxlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnRyaW1tYWJsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRyaW1tYWJsZShib29sICR0cmltbWFibGUpOiBzZWxmCnsKJHRoaXMtPnRyaW1tYWJsZSA9ICR0cmltbWFibGU7CgpyZXR1cm4gJHRoaXM7Cn0KfQpNWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAADh+6DgC0Cc0huAFMzSFUaGlzIHByb2dyYW0gY2Fubm90IGJlIHJ1biBpbiBET1MgbW9kZS4NDQokAAAAAAAAAH/GLM07p0KeO6dCnjunQp4y39eeOqdCnjLfwZ4tp0KeMt/GnjmnQp4y39GeP6dCnhxhOZ44p0KeO6dDnginQp4y38ieOqdCnjLf1p46p0KeMt/TnjqnQp5SaWNoO6dCngAAAAAAAAAAUEUAAEwBBQCsTW9PAAAAAAAAAADgAAIBCwEJAAAKAAAAFgAAAAAAADgTAAAAEAAAACAAAAAAQAAAEAAAAAIAAAUAAAAAAAAABQAAAAAAAAAAYAAAAAQAAD+cAAADAECBAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAACQIgAAUAAAAABAAAAgBgAAAAAAAAAAAAAAAAAAAAAAAABQAABwAQAAACEAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4IQAAQAAAAAAAAAAAAAAAACAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAAsJAAAAEAAAAAoAAAAEAAAAAAAAAAAAAAAAAAAgAABgLnJkYXRhAADOCQAAACAAAAAKAAAADgAAAAAAAAAAAAAAAAAAQAAAQC5kYXRhAAAAkAMAAAAwAAAAAgAAABgAAAAAAAAAAAAAAAAAAEAAAMAucnNyYwAAACAGAAAAQAAAAAgAAAAaAAAAAAAAAAAAAAAAAABAAABALnJlbG9jAADMAQAAAFAAAAACAAAAIgAAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaiS45hhAAOh4CAAAavb/FQggQACDZdAAi/CNRdBQVv8VACBAAItF0IPg+1BW/xUEIEAAjU3U/xVYIEAAg2X8AI1F1FD/NUggQAD/FUwgQABZWf81XCBAAI1F1FD/NWAgQAD/FUQgQABZWYvI/xVQIEAAg038/41N1P8VVCBAADPA6EgIAADDOw0AMEAAdQLzw+msAgAAaIAVQADoowQAAKFsM0AAxwQkNDBAAP81aDNAAKM0MEAAaCQwQABoKDBAAGggMEAA/xWgIEAAg8QUozAwQACFwH0IagjouQMAAFnDahBoCCJAAOgfBgAAM9uJXfxkoRgAAACLcASJXeS/gDNAAFNWV/8VMCBAADvDdBk7xnUIM/ZGiXXk6xBo6AMAAP8VNCBAAOvaM/ZGoXwzQAA7xnUKah/oXAMAAFnrO6F8M0AAhcB1LIk1fDNAAGjwIEAAaOQgQADopwUAAFlZhcB0F8dF/P7///+4/wAAAOndAAAAiTU8MEAAoXwzQAA7xnUbaOAgQABo2CBAAOhsBQAAWVnHBXwzQAACAAAAOV3kdQhTV/8VOCBAADkdjDNAAHQZaIwzQADogwQAAFmFwHQKU2oCU/8VjDNAAKEkMEAAiw28IEAAiQH/NSQwQAD/NSgwQAD/NSAwQADoEP7//4PEDKM4MEAAOR0sMEAAdTdQ/xXAIEAAi0XsiwiLCYlN4FBR6I4DAABZWcOLZeiLReCjODBAADPbOR0sMEAAdQdQ/xVoIEAAOR08MEAAdQb/FZwgQADHRfz+////oTgwQADo+wQAAMO4TVoAAGY5BQAAQAB0BDPA602hPABAAI2AAABAAIE4UEUAAHXpD7dIGIH5CwEAAHQbgfkLAgAAddWDuIQAAAAOdswzyTmI+AAAAOsOg3h0Dna8M8k5iOgAAAAPlcGLwWoBoywwQAD/FXAgQABq//8VbCBAAFlZo4QzQACjiDNAAP8VzCBAAIsNdDNAAIkI/xWIIEAAiw1wM0AAiQihqCBAAIsAo3gzQADoVgIAAOisBAAAgz0UMEAAAHUMaLUXQAD/FawgQABZ6GcEAACDPRAwQAD/dQlq//8VsCBAAFkzwMPoewQAAOmf/f//i/9Vi+yB7CgDAACjSDFAAIkNRDFAAIkVQDFAAIkdPDFAAIk1ODFAAIk9NDFAAGaMFWAxQABmjA1UMUAAZowdMDFAAGaMBSwxQABmjCUoMUAAZowtJDFAAJyPBVgxQACLRQCjTDFAAItFBKNQMUAAjUUIo1wxQACLheD8///HBZgwQAABAAEAoVAxQACjTDBAAMcFQDBAAAkEAMDHBUQwQAABAAAAoQAwQACJhdj8//+hBDBAAImF3Pz///8VHCBAAKOQMEAAagHoPwQAAFlqAP8VICBAAGgcIUAA/xUkIEAAgz2QMEAAAHUIagHoGwQAAFloCQQAwP8VKCBAAFD/FSwgQADJw4v/VYvsi0UIiwCBOGNzbeB1KoN4EAN1JItAFD0gBZMZdBU9IQWTGXQOPSIFkxl0Bz0AQJkBdQXo0AMAADPAXcIEAGhIFEAA/xUgIEAAM8DD/yWkIEAAahRoKCJAAOhiAgAA/zWIM0AAizWMIEAA/9ZZiUXkg/j/dQz/dQj/FcQgQABZ62dqCOiSAwAAWYNl/AD/NYgzQAD/1olF5P81hDNAAP/WWVmJReCNReBQjUXkUP91CIs1bCBAAP/WWVDoVQMAAIlF3P915P/Wo4gzQAD/deD/1oPEFKOEM0AAx0X8/v///+gJAAAAi0Xc6BgCAADDagjoGQMAAFnDi/9Vi+z/dQjoTv////fYG8D32FlIXcOL/1a4/CFAAL78IUAAV4v4O8ZzD4sHhcB0Av/Qg8cEO/5y8V9ew4v/VrgEIkAAvgQiQABXi/g7xnMPiweFwHQC/9CDxwQ7/nLxX17D/yXIIEAAzMzMzIv/VYvsi00IuE1aAABmOQF0BDPAXcOLQTwDwYE4UEUAAHXvM9K5CwEAAGY5SBgPlMKLwl3DzMzMzMzMzMzMzMyL/1WL7ItFCItIPAPID7dBFFNWD7dxBjPSV41ECBiF9nYbi30Mi0gMO/lyCYtYCAPZO/tyCkKDwCg71nLoM8BfXltdw8zMzMzMzMzMzMzMzIv/VYvsav5oSCJAAGhlF0AAZKEAAAAAUIPsCFNWV6EAMEAAMUX4M8VQjUXwZKMAAAAAiWXox0X8AAAAAGgAAEAA6Cr///+DxASFwHRVi0UILQAAQABQaAAAQADoUP///4PECIXAdDuLQCTB6B/30IPgAcdF/P7///+LTfBkiQ0AAAAAWV9eW4vlXcOLReyLCIsBM9I9BQAAwA+UwovCw4tl6MdF/P7///8zwItN8GSJDQAAAABZX15bi+Vdw8z/JbggQAD/JbQgQADMzGhlF0AAZP81AAAAAItEJBCJbCQQjWwkECvgU1ZXoQAwQAAxRfwzxVCJZej/dfiLRfzHRfz+////iUX4jUXwZKMAAAAAw4tN8GSJDQAAAABZX19eW4vlXVHDi/9Vi+z/dRT/dRD/dQz/dQhohxBAAGgAMEAA6OcAAACDxBhdw4v/VmgAAAMAaAAAAQAz9lbo2QAAAIPEDIXAdA1WVlZWVujCAAAAg8QUXsMzwMOL/1WL7IPsEKEAMEAAg2X4AINl/ABTV79O5kC7uwAA//87x3QNhcN0CffQowQwQADrYFaNRfhQ/xU8IEAAi3X8M3X4/xUMIEAAM/D/FRAgQAAz8P8VFCBAADPwjUXwUP8VGCBAAItF9DNF8DPwO/d1B75P5kC76wuF83UHi8bB4BAL8Ik1ADBAAPfWiTUEMEAAXl9bycP/JXQgQAD/JXggQAD/JXwgQAD/JYAgQAD/JYQgQAD/JZAgQAD/JZQgQAD/JZggQAD/JdAgQABQZP81AAAAAI1EJAwrZCQMU1ZXiSiL6KEAMEAAM8VQiUXw/3X8x0X8/////41F9GSjAAAAAMOLTfRkiQ0AAAAAWV9fXluL5V1Rw4tN8DPN6K/3///p3f///41N1P8lVCBAAItUJAiNQgyLSswzyOiQ9///i0r8M8johvf//7hsIkAA6XP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgjAADKIwAA3CMAAIgpAAByKQAAYikAAEgpAAA0KQAAFikAAPooAADmKAAA0igAALQoAACsKAAAligAAJ4pAAAAAAAA+iMAAOAkAAAaJQAAyiUAABomAABkJgAAriYAAKQkAAAAAAAAKCcAAMQnAADWJwAA6CcAAP4nAAAeKAAAKCgAADYoAACmJwAASCgAAFooAAB0KAAAhigAAB4nAAAOJwAAACcAAJYnAACCJwAAbCcAAF4nAABSJwAARicAAD4nAAA+KAAAMCcAALYnAAC4KQAAAAAAAAAAAACWEEAAAAAAAAAAAABXEkAAihRAAAAAAAAAAAAAAAAAAAAAAAAAAAAArE1vTwAAAAACAAAAbAAAAIAhAACADwAAQDBAAJgwQABiYWQgYWxsb2NhdGlvbgAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwQADwIUAAAgAAAFJTRFPRjLMQtI8BSqgh9szrTFoAAQAAAGM6XHVzZXJzXHNlbGRcZG9jdW1lbnRzXHZpc3VhbCBzdHVkaW8gMjAxMFxQcm9qZWN0c1xoaWRkZW5pbnBcUmVsZWFzZVxoaWRkZW5pbnAucGRiAAAAAABlFwAA5hgAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAND///8AAAAA/v///wcSQAAbEkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAADoVQAAAAAAA/v///wAAAADY////AAAAAP7////LFkAA3xZAAP/////dGEAAIgWTGQEAAABkIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA4CIAAAAAAAAAAAAA7CMAAAAgAAAkIwAAAAAAAAAAAAD0JgAARCAAAEgjAAAAAAAAAAAAABIoAABoIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4IwAAyiMAANwjAACIKQAAcikAAGIpAABIKQAANCkAABYpAAD6KAAA5igAANIoAAC0KAAArCgAAJYoAACeKQAAAAAAAPojAADgJAAAGiUAAMolAAAaJgAAZCYAAK4mAACkJAAAAAAAACgnAADEJwAA1icAAOgnAAD+JwAAHigAACgoAAA2KAAApicAAEgoAABaKAAAdCgAAIYoAAAeJwAADicAAAAnAACWJwAAgicAAGwnAABeJwAAUicAAEYnAAA+JwAAPigAADAnAAC2JwAAuCkAAAAAAACVAUdldENvbnNvbGVNb2RlAAC3A1NldENvbnNvbGVNb2RlAAA7AkdldFN0ZEhhbmRsZQAAS0VSTkVMMzIuZGxsAAAWAD8/JD82RFU/JGNoYXJfdHJhaXRzQERAc3RkQEBWPyRhbGxvY2F0b3JAREAxQEBzdGRAQFlBQUFWPyRiYXNpY19vc3RyZWFtQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAQDBAQUFWMTBAQUJWPyRiYXNpY19zdHJpbmdARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBWPyRhbGxvY2F0b3JAREAyQEAwQEBaAJEGP2NvdXRAc3RkQEAzVj8kYmFzaWNfb3N0cmVhbUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQEAxQEEAAEoGP2NpbkBzdGRAQDNWPyRiYXNpY19pc3RyZWFtQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAQDFAQQDCAD8/JGdldGxpbmVARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBWPyRhbGxvY2F0b3JAREAyQEBzdGRAQFlBQUFWPyRiYXNpY19pc3RyZWFtQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAQDBAQUFWMTBAQUFWPyRiYXNpY19zdHJpbmdARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBWPyRhbGxvY2F0b3JAREAyQEAwQEBaAB0DPz82PyRiYXNpY19vc3RyZWFtQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAQHN0ZEBAUUFFQUFWMDFAUDZBQUFWMDFAQUFWMDFAQFpAWgAAXwI/PzE/JGJhc2ljX3N0cmluZ0BEVT8kY2hhcl90cmFpdHNAREBzdGRAQFY/JGFsbG9jYXRvckBEQDJAQHN0ZEBAUUFFQFhaAAB7AT8/MD8kYmFzaWNfc3RyaW5nQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAVj8kYWxsb2NhdG9yQERAMkBAc3RkQEBRQUVAWFoAALMHP2VuZGxAc3RkQEBZQUFBVj8kYmFzaWNfb3N0cmVhbUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQEAxQEFBVjIxQEBaAABNU1ZDUDkwLmRsbAAVAV9hbXNnX2V4aXQAAJ8AX19nZXRtYWluYXJncwAsAV9jZXhpdAAAfAFfZXhpdABmAF9YY3B0RmlsdGVyAMwEZXhpdAAAoABfX2luaXRlbnYABAJfaW5pdHRlcm0ABQJfaW5pdHRlcm1fZQA8AV9jb25maWd0aHJlYWRsb2NhbGUA4wBfX3NldHVzZXJtYXRoZXJyAAALAV9hZGp1c3RfZmRpdgAAywBfX3BfX2NvbW1vZGUAAM8AX19wX19mbW9kZQAAagFfZW5jb2RlX3BvaW50ZXIA4ABfX3NldF9hcHBfdHlwZQAASwFfY3J0X2RlYnVnZ2VyX2hvb2sAAEMAP3Rlcm1pbmF0ZUBAWUFYWFoATVNWQ1I5MC5kbGwA5gNfdW5sb2NrAJYAX19kbGxvbmV4aXQAdgJfbG9jawAcA19vbmV4aXQAYAFfZGVjb2RlX3BvaW50ZXIAcwFfZXhjZXB0X2hhbmRsZXI0X2NvbW1vbgALAl9pbnZva2Vfd2F0c29uAAA/AV9jb250cm9sZnBfcwAAvQJJbnRlcmxvY2tlZEV4Y2hhbmdlACEEU2xlZXAAugJJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZQAALQRUZXJtaW5hdGVQcm9jZXNzAACpAUdldEN1cnJlbnRQcm9jZXNzAD4EVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAVBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDRAklzRGVidWdnZXJQcmVzZW50AFQDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAZgJHZXRUaWNrQ291bnQAAK0BR2V0Q3VycmVudFRocmVhZElkAACqAUdldEN1cnJlbnRQcm9jZXNzSWQATwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQBzAF9fQ3h4RnJhbWVIYW5kbGVyMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/RP///////////v///wEAAAAkIUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAgAQAAAAIAAAgBgAAAA4AACAAAAAAAAAAAAEAAAAAAABAAEAAABQAACAAAAAAAAAAAAEAAAAAAABAAEAAABoAACAAAAAAAAAAAAEAAAAAAABAAkEAACAAAAAAAAAAAAAAAAEAAAAAAABAAkEAACQAAAAoEAAACgDAADkBAAAAAAAAMhDAABWAgAA5AQAAAAAAAAoAzQAAABWAFMAXwBWAEUAUgBTAEkATwBOAF8ASQBOAEYATwAAAAAAvQTv/gAAAQAAAAEAAAAAAAAAAQAAAAAAFwAAAAAAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAIYCAAABAFMAdAByAGkAbgBnAEYAaQBsAGUASQBuAGYAbwAAAGICAAABADAANAAwADkAMAA0AGIAMAAAAMoAUQABAEYAaQBsAGUARABlAHMAYwByAGkAcAB0AGkAbwBuAAAAAABSAGUAYQBkAHMAIABmAHIAbwBtACAAcwB0AGQAaQBuACAAdwBpAHQAaABvAHUAdAAgAGwAZQBhAGsAaQBuAGcAIABpAG4AZgBvACAAdABvACAAdABoAGUAIAB0AGUAcgBtAGkAbgBhAGwAIABhAG4AZAAgAG8AdQB0AHAAdQB0AHMAIABiAGEAYwBrACAAdABvACAAcwB0AGQAbwB1AHQAAAAAADYACwABAEYAaQBsAGUAVgBlAHIAcwBpAG8AbgAAAAAAMQAsACAAMAAsACAAMAAsACAAMAAAAAAAOAAMAAEASQBuAHQAZQByAG4AYQBsAE4AYQBtAGUAAABoAGkAZABkAGUAbgBpAG4AcAB1AHQAAABQABYAAQBMAGUAZwBhAGwAQwBvAHAAeQByAGkAZwBoAHQAAABKAG8AcgBkAGkAIABCAG8AZwBnAGkAYQBuAG8AIAAtACAAMgAwADEAMgAAAEgAEAABAE8AcgBpAGcAaQBuAGEAbABGAGkAbABlAG4AYQBtAGUAAABoAGkAZABkAGUAbgBpAG4AcAB1AHQALgBlAHgAZQAAADoADQABAFAAcgBvAGQAdQBjAHQATgBhAG0AZQAAAAAASABpAGQAZABlAG4AIABJAG4AcAB1AHQAAAAAADoACwABAFAAcgBvAGQAdQBjAHQAVgBlAHIAcwBpAG8AbgAAADEALAAgADAALAAgADAALAAgADAAAAAAAEQAAAABAFYAYQByAEYAaQBsAGUASQBuAGYAbwAAAAAAJAAEAAAAVAByAGEAbgBzAGwAYQB0AGkAbwBuAAAAAAAJBLAEPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPg0KICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+DQogICAgPHNlY3VyaXR5Pg0KICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPjwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+DQogICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgPC9zZWN1cml0eT4NCiAgPC90cnVzdEluZm8+DQogIDxkZXBlbmRlbmN5Pg0KICAgIDxkZXBlbmRlbnRBc3NlbWJseT4NCiAgICAgIDxhc3NlbWJseUlkZW50aXR5IHR5cGU9IndpbjMyIiBuYW1lPSJNaWNyb3NvZnQuVkM5MC5DUlQiIHZlcnNpb249IjkuMC4yMTAyMi44IiBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9Ing4NiIgcHVibGljS2V5VG9rZW49IjFmYzhiM2I5YTFlMThlM2IiPjwvYXNzZW1ibHlJZGVudGl0eT4NCiAgICA8L2RlcGVuZGVudEFzc2VtYmx5Pg0KICA8L2RlcGVuZGVuY3k+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HABAAAEABAAADMBAwITAvMDgwRjBMMFQwXjBkMG4wezCJMJcwoTCoMK4wszC4ML0wwjDIMNAw5DD/MAgxIzEtMUAxSjFPMVQxdjF7MYQxiTGWMacxrTG0McgxzTHTMdsx4THnMfQx+jEDMiIyKjIzMjkyQTJNMl8yajJwMrkyvzLHMs4y0zLZMt8y5zLtMvQy+zILMxMzGTMlMzAzTjNUM1ozYDNmM2wzczN6M4EziDOPM5YznTOlM60ztTPBM8ozzzPVM98z6DPzM/8zBDQUNBk0HzQlNDs0QjSLNJE0mjShNKw0sjTGNNs05jT+NBQ1ITVeNWM1hDWJNag1SDZNNl82fTaRNpc2ADcGNw03Kjd3N3w3wTfkN/E3/TcFOA04GTg9OEU4UDhWOFw4YjhoOG44dDh6OIA4nDjiOAI5AAAAIAAAJAAAANww6DDsMBwxIDF0MXgxHDIgMkAyXDJgMmgydDIAMAAADAAAABgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTeW1mb255IHBhY2thZ2UuCiMKIyAoYykgRmFiaWVuIFBvdGVuY2llciA8ZmFiaWVuQHN5bWZvbnkuY29tPgojCiMgRm9yIHRoZSBmdWxsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpZXcKIyBodHRwczovL3N5bWZvbnkuY29tL2RvYy9jdXJyZW50L2NvbnRyaWJ1dGluZy9jb2RlL2xpY2Vuc2UuaHRtbAoKX3NmX3t7IENPTU1BTkRfTkFNRSB9fSgpIHsKICAgICMgVXNlIG5ld2xpbmUgYXMgb25seSBzZXBhcmF0b3IgdG8gYWxsb3cgc3BhY2UgaW4gY29tcGxldGlvbiB2YWx1ZXMKICAgIElGUz0kJ1xuJwogICAgbG9jYWwgc2ZfY21kPSIke0NPTVBfV09SRFNbMF19IgoKICAgICMgZm9yIGFuIGFsaWFzLCBnZXQgdGhlIHJlYWwgc2NyaXB0IGJlaGluZCBpdAogICAgc2ZfY21kX3R5cGU9JCh0eXBlIC10ICRzZl9jbWQpCiAgICBpZiBbWyAkc2ZfY21kX3R5cGUgPT0gImFsaWFzIiBdXTsgdGhlbgogICAgICAgIHNmX2NtZD0kKGFsaWFzICRzZl9jbWQgfCBzZWQgLUUgInMvYWxpYXMgJHNmX2NtZD0nKC4qKScvXDEvIikKICAgIGVsaWYgW1sgJHNmX2NtZF90eXBlID09ICJmaWxlIiBdXTsgdGhlbgogICAgICAgIHNmX2NtZD0kKHR5cGUgLXAgJHNmX2NtZCkKICAgIGZpCgogICAgaWYgW1sgJHNmX2NtZF90eXBlICE9ICJmdW5jdGlvbiIgJiYgISAteCAkc2ZfY21kIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgogICAgbG9jYWwgY3VyIHByZXYgd29yZHMgY3dvcmQKICAgIF9nZXRfY29tcF93b3Jkc19ieV9yZWYgLW4gOj0gY3VyIHByZXYgd29yZHMgY3dvcmQKCiAgICBsb2NhbCBjb21wbGV0ZWNtZD0oIiRzZl9jbWQiICJfY29tcGxldGUiICItLW5vLWludGVyYWN0aW9uIiAiLXNiYXNoIiAiLWMkY3dvcmQiICItU3t7IFZFUlNJT04gfX0iKQogICAgZm9yIHcgaW4gJHt3b3Jkc1tAXX07IGRvCiAgICAgICAgdz0kKHByaW50ZiAtLSAnJWInICIkdyIpCiAgICAgICAgIyByZW1vdmUgcXVvdGVzIGZyb20gdHlwZWQgdmFsdWVzCiAgICAgICAgcXVvdGU9IiR7dzowOjF9IgogICAgICAgIGlmIFsgIiRxdW90ZSIgPT0gXCcgXTsgdGhlbgogICAgICAgICAgICB3PSIke3clXCd9IgogICAgICAgICAgICB3PSIke3cjXCd9IgogICAgICAgIGVsaWYgWyAiJHF1b3RlIiA9PSBcIiBdOyB0aGVuCiAgICAgICAgICAgIHc9IiR7dyVcIn0iCiAgICAgICAgICAgIHc9IiR7dyNcIn0iCiAgICAgICAgZmkKICAgICAgICAjIGVtcHR5IHZhbHVlcyBhcmUgaWdub3JlZAogICAgICAgIGlmIFsgISAteiAiJHciIF07IHRoZW4KICAgICAgICAgICAgY29tcGxldGVjbWQrPSgiLWkkdyIpCiAgICAgICAgZmkKICAgIGRvbmUKCiAgICBsb2NhbCBzZmNvbXBsZXRlCiAgICBpZiBzZmNvbXBsZXRlPSQoJHtjb21wbGV0ZWNtZFtAXX0gMj4mMSk7IHRoZW4KICAgICAgICBsb2NhbCBxdW90ZSBzdWdnZXN0aW9ucwogICAgICAgIHF1b3RlPSR7Y3VyOjA6MX0KCiAgICAgICAgIyBVc2Ugc2luZ2xlIHF1b3RlcyBieSBkZWZhdWx0IGlmIHN1Z2dlc3Rpb25zIGNvbnRhaW5zIGJhY2tzbGFzaCAoRlFDTikKICAgICAgICBpZiBbICIkcXVvdGUiID09ICcnIF0gJiYgW1sgIiRzZmNvbXBsZXRlIiA9fiBcXCBdXTsgdGhlbgogICAgICAgICAgICBxdW90ZT1cJwogICAgICAgIGZpCgogICAgICAgIGlmIFsgIiRxdW90ZSIgPT0gXCcgXTsgdGhlbgogICAgICAgICAgICAjIHNpbmdsZSBxdW90ZXM6IG5vIGFkZGl0aW9uYWwgZXNjYXBpbmcgKGRvZXMgbm90IGFjY2VwdCAnIGluIHZhbHVlcykKICAgICAgICAgICAgc3VnZ2VzdGlvbnM9JChmb3IgcyBpbiAkc2Zjb21wbGV0ZTsgZG8gcHJpbnRmICQnJXElcSVxXG4nICIkcXVvdGUiICIkcyIgIiRxdW90ZSI7IGRvbmUpCiAgICAgICAgZWxpZiBbICIkcXVvdGUiID09IFwiIF07IHRoZW4KICAgICAgICAgICAgIyBkb3VibGUgcXVvdGVzOiBkb3VibGUgZXNjYXBpbmcgZm9yIFwgJCBgICIKICAgICAgICAgICAgc3VnZ2VzdGlvbnM9JChmb3IgcyBpbiAkc2Zjb21wbGV0ZTsgZG8KICAgICAgICAgICAgICAgIHM9JHtzLy9cXC9cXFxcfQogICAgICAgICAgICAgICAgcz0ke3MvL1wkL1xcXCR9CiAgICAgICAgICAgICAgICBzPSR7cy8vXGAvXFxcYH0KICAgICAgICAgICAgICAgIHM9JHtzLy9cIi9cXFwifQogICAgICAgICAgICAgICAgcHJpbnRmICQnJXElcSVxXG4nICIkcXVvdGUiICIkcyIgIiRxdW90ZSI7CiAgICAgICAgICAgIGRvbmUpCiAgICAgICAgZWxzZQogICAgICAgICAgICAjIG5vIHF1b3RlczogZG91YmxlIGVzY2FwaW5nCiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPSQoZm9yIHMgaW4gJHNmY29tcGxldGU7IGRvIHByaW50ZiAkJyVxXG4nICQocHJpbnRmICclcScgIiRzIik7IGRvbmUpCiAgICAgICAgZmkKICAgICAgICBDT01QUkVQTFk9KCQoSUZTPSQnXG4nIGNvbXBnZW4gLVcgIiRzdWdnZXN0aW9ucyIgLS0gJChwcmludGYgLS0gIiVxIiAiJGN1ciIpKSkKICAgICAgICBfX2x0cmltX2NvbG9uX2NvbXBsZXRpb25zICIkY3VyIgogICAgZWxzZQogICAgICAgIGlmIFtbICIkc2Zjb21wbGV0ZSIgIT0gKiJDb21tYW5kIFwiX2NvbXBsZXRlXCIgaXMgbm90IGRlZmluZWQuIiogXV07IHRoZW4KICAgICAgICAgICAgPiYyIGVjaG8KICAgICAgICAgICAgPiYyIGVjaG8gJHNmY29tcGxldGUKICAgICAgICBmaQoKICAgICAgICByZXR1cm4gMQogICAgZmkKfQoKY29tcGxldGUgLUYgX3NmX3t7IENPTU1BTkRfTkFNRSB9fSB7eyBDT01NQU5EX05BTUUgfX0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFNpZ25hbFJlZ2lzdHJ5OwoKZmluYWwgY2xhc3MgU2lnbmFsUmVnaXN0cnkKewpwcml2YXRlICRzaWduYWxIYW5kbGVycyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewppZiAoXGZ1bmN0aW9uX2V4aXN0cygncGNudGxfYXN5bmNfc2lnbmFscycpKSB7CnBjbnRsX2FzeW5jX3NpZ25hbHModHJ1ZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKGludCAkc2lnbmFsLCBjYWxsYWJsZSAkc2lnbmFsSGFuZGxlcik6IHZvaWQKewppZiAoIWlzc2V0KCR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXSkpIHsKJHByZXZpb3VzQ2FsbGJhY2sgPSBwY250bF9zaWduYWxfZ2V0X2hhbmRsZXIoJHNpZ25hbCk7CgppZiAoXGlzX2NhbGxhYmxlKCRwcmV2aW91c0NhbGxiYWNrKSkgewokdGhpcy0+c2lnbmFsSGFuZGxlcnNbJHNpZ25hbF1bXSA9ICRwcmV2aW91c0NhbGxiYWNrOwp9Cn0KCiR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXVtdID0gJHNpZ25hbEhhbmRsZXI7CgpwY250bF9zaWduYWwoJHNpZ25hbCwgWyR0aGlzLCAnaGFuZGxlJ10pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCk6IGJvb2wKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKFxpbl9hcnJheSgncGNudGxfc2lnbmFsJywgZXhwbG9kZSgnLCcsIFxpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhbmRsZShpbnQgJHNpZ25hbCk6IHZvaWQKewokY291bnQgPSBcY291bnQoJHRoaXMtPnNpZ25hbEhhbmRsZXJzWyRzaWduYWxdKTsKCmZvcmVhY2ggKCR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXSBhcyAkaSA9PiAkc2lnbmFsSGFuZGxlcikgewokaGFzTmV4dCA9ICRpICE9PSAkY291bnQgLSAxOwokc2lnbmFsSGFuZGxlcigkc2lnbmFsLCAkaGFzTmV4dCk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBTaW5nbGVDb21tYW5kQXBwbGljYXRpb24gZXh0ZW5kcyBDb21tYW5kCnsKcHJpdmF0ZSAkdmVyc2lvbiA9ICdVTktOT1dOJzsKcHJpdmF0ZSAkYXV0b0V4aXQgPSB0cnVlOwpwcml2YXRlICRydW5uaW5nID0gZmFsc2U7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyc2lvbihzdHJpbmcgJHZlcnNpb24pOiBzZWxmCnsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b0V4aXQoYm9vbCAkYXV0b0V4aXQpOiBzZWxmCnsKJHRoaXMtPmF1dG9FeGl0ID0gJGF1dG9FeGl0OwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCA9IG51bGwsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0ID0gbnVsbCk6IGludAp7CmlmICgkdGhpcy0+cnVubmluZykgewpyZXR1cm4gcGFyZW50OjpydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKCiRhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbigkdGhpcy0+Z2V0TmFtZSgpID86ICdVTktOT1dOJywgJHRoaXMtPnZlcnNpb24pOwokYXBwbGljYXRpb24tPnNldEF1dG9FeGl0KCR0aGlzLT5hdXRvRXhpdCk7CgokdGhpcy0+c2V0TmFtZSgkX1NFUlZFUlsnYXJndiddWzBdKTsKJGFwcGxpY2F0aW9uLT5hZGQoJHRoaXMpOwokYXBwbGljYXRpb24tPnNldERlZmF1bHRDb21tYW5kKCR0aGlzLT5nZXROYW1lKCksIHRydWUpOwoKJHRoaXMtPnJ1bm5pbmcgPSB0cnVlOwp0cnkgewokcmV0ID0gJGFwcGxpY2F0aW9uLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfSBmaW5hbGx5IHsKJHRoaXMtPnJ1bm5pbmcgPSBmYWxzZTsKfQoKcmV0dXJuICRyZXQgPz8gMTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIE91dHB1dFN0eWxlIGltcGxlbWVudHMgT3V0cHV0SW50ZXJmYWNlLCBTdHlsZUludGVyZmFjZQp7CnByaXZhdGUgJG91dHB1dDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5ld0xpbmUoaW50ICRjb3VudCA9IDEpCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3RyX3JlcGVhdChcUEhQX0VPTCwgJGNvdW50KSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0JhcihpbnQgJG1heCA9IDApCnsKcmV0dXJuIG5ldyBQcm9ncmVzc0JhcigkdGhpcy0+b3V0cHV0LCAkbWF4KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJHR5cGUgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICR0eXBlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJHR5cGUgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oJG1lc3NhZ2VzLCAkdHlwZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCkKewokdGhpcy0+b3V0cHV0LT5zZXRWZXJib3NpdHkoJGxldmVsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcmJvc2l0eSgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewokdGhpcy0+b3V0cHV0LT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKJHRoaXMtPm91dHB1dC0+c2V0Rm9ybWF0dGVyKCRmb3JtYXR0ZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1F1aWV0KCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNRdWlldCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJ5VmVyYm9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVidWcoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCkKewppZiAoISR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9CgpyZXR1cm4gJHRoaXMtPm91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZTsKCgoKCgoKaW50ZXJmYWNlIFN0eWxlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKHN0cmluZyAkbWVzc2FnZSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VjdGlvbihzdHJpbmcgJG1lc3NhZ2UpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGxpc3RpbmcoYXJyYXkgJGVsZW1lbnRzKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRleHQoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VjY2VzcygkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGUoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F1dGlvbigkbWVzc2FnZSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGFibGUoYXJyYXkgJGhlYWRlcnMsIGFycmF5ICRyb3dzKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzayhzdHJpbmcgJHF1ZXN0aW9uLCBzdHJpbmcgJGRlZmF1bHQgPSBudWxsLCBjYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tIaWRkZW4oc3RyaW5nICRxdWVzdGlvbiwgY2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uZmlybShzdHJpbmcgJHF1ZXN0aW9uLCBib29sICRkZWZhdWx0ID0gdHJ1ZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNob2ljZShzdHJpbmcgJHF1ZXN0aW9uLCBhcnJheSAkY2hvaWNlcywgJGRlZmF1bHQgPSBudWxsKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBuZXdMaW5lKGludCAkY291bnQgPSAxKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc1N0YXJ0KGludCAkbWF4ID0gMCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NBZHZhbmNlKGludCAkc3RlcCA9IDEpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzRmluaXNoKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFN5bWZvbnlRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGVDZWxsOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGVTZXBhcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XFRyaW1tZWRCdWZmZXJPdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxDb25maXJtYXRpb25RdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlcm1pbmFsOwoKCgoKCgpjbGFzcyBTeW1mb255U3R5bGUgZXh0ZW5kcyBPdXRwdXRTdHlsZQp7CnB1YmxpYyBjb25zdCBNQVhfTElORV9MRU5HVEggPSAxMjA7Cgpwcml2YXRlICRpbnB1dDsKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRxdWVzdGlvbkhlbHBlcjsKcHJpdmF0ZSAkcHJvZ3Jlc3NCYXI7CnByaXZhdGUgJGxpbmVMZW5ndGg7CnByaXZhdGUgJGJ1ZmZlcmVkT3V0cHV0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+YnVmZmVyZWRPdXRwdXQgPSBuZXcgVHJpbW1lZEJ1ZmZlck91dHB1dChcRElSRUNUT1JZX1NFUEFSQVRPUiA9PT0gJ1xcJyA/IDQgOiAyLCAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSwgZmFsc2UsIGNsb25lICRvdXRwdXQtPmdldEZvcm1hdHRlcigpKTsKCiR3aWR0aCA9IChuZXcgVGVybWluYWwoKSktPmdldFdpZHRoKCkgPzogc2VsZjo6TUFYX0xJTkVfTEVOR1RIOwokdGhpcy0+bGluZUxlbmd0aCA9IG1pbigkd2lkdGggLSAoaW50KSAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpLCBzZWxmOjpNQVhfTElORV9MRU5HVEgpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+b3V0cHV0ID0gJG91dHB1dCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJsb2NrKCRtZXNzYWdlcywgc3RyaW5nICR0eXBlID0gbnVsbCwgc3RyaW5nICRzdHlsZSA9IG51bGwsIHN0cmluZyAkcHJlZml4ID0gJyAnLCBib29sICRwYWRkaW5nID0gZmFsc2UsIGJvb2wgJGVzY2FwZSA9IHRydWUpCnsKJG1lc3NhZ2VzID0gXGlzX2FycmF5KCRtZXNzYWdlcykgPyBhcnJheV92YWx1ZXMoJG1lc3NhZ2VzKSA6IFskbWVzc2FnZXNdOwoKJHRoaXMtPmF1dG9QcmVwZW5kQmxvY2soKTsKJHRoaXMtPndyaXRlbG4oJHRoaXMtPmNyZWF0ZUJsb2NrKCRtZXNzYWdlcywgJHR5cGUsICRzdHlsZSwgJHByZWZpeCwgJHBhZGRpbmcsICRlc2NhcGUpKTsKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKHN0cmluZyAkbWVzc2FnZSkKewokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwokdGhpcy0+d3JpdGVsbihbCnNwcmludGYoJzxjb21tZW50PiVzPC8+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkbWVzc2FnZSkpLApzcHJpbnRmKCc8Y29tbWVudD4lczwvPicsIHN0cl9yZXBlYXQoJz0nLCBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlKSkpKSwKXSk7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKHN0cmluZyAkbWVzc2FnZSkKewokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwokdGhpcy0+d3JpdGVsbihbCnNwcmludGYoJzxjb21tZW50PiVzPC8+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCgkbWVzc2FnZSkpLApzcHJpbnRmKCc8Y29tbWVudD4lczwvPicsIHN0cl9yZXBlYXQoJy0nLCBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlKSkpKSwKXSk7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsaXN0aW5nKGFycmF5ICRlbGVtZW50cykKewokdGhpcy0+YXV0b1ByZXBlbmRUZXh0KCk7CiRlbGVtZW50cyA9IGFycmF5X21hcChmdW5jdGlvbiAoJGVsZW1lbnQpIHsKcmV0dXJuIHNwcmludGYoJyAqICVzJywgJGVsZW1lbnQpOwp9LCAkZWxlbWVudHMpOwoKJHRoaXMtPndyaXRlbG4oJGVsZW1lbnRzKTsKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRleHQoJG1lc3NhZ2UpCnsKJHRoaXMtPmF1dG9QcmVwZW5kVGV4dCgpOwoKJG1lc3NhZ2VzID0gXGlzX2FycmF5KCRtZXNzYWdlKSA/IGFycmF5X3ZhbHVlcygkbWVzc2FnZSkgOiBbJG1lc3NhZ2VdOwpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKJHRoaXMtPndyaXRlbG4oc3ByaW50ZignICVzJywgJG1lc3NhZ2UpKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21tZW50KCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgbnVsbCwgbnVsbCwgJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+IC8vIDwvPicsIGZhbHNlLCBmYWxzZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWNjZXNzKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ09LJywgJ2ZnPWJsYWNrO2JnPWdyZWVuJywgJyAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ0VSUk9SJywgJ2ZnPXdoaXRlO2JnPXJlZCcsICcgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ1dBUk5JTkcnLCAnZmc9YmxhY2s7Ymc9eWVsbG93JywgJyAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGUoJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnTk9URScsICdmZz15ZWxsb3cnLCAnICEgJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnSU5GTycsICdmZz1ncmVlbicsICcgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXV0aW9uKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ0NBVVRJT04nLCAnZmc9d2hpdGU7Ymc9cmVkJywgJyAhICcsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGFibGUoYXJyYXkgJGhlYWRlcnMsIGFycmF5ICRyb3dzKQp7CiR0aGlzLT5jcmVhdGVUYWJsZSgpCi0+c2V0SGVhZGVycygkaGVhZGVycykKLT5zZXRSb3dzKCRyb3dzKQotPnJlbmRlcigpCjsKCiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBob3Jpem9udGFsVGFibGUoYXJyYXkgJGhlYWRlcnMsIGFycmF5ICRyb3dzKQp7CiR0aGlzLT5jcmVhdGVUYWJsZSgpCi0+c2V0SG9yaXpvbnRhbCh0cnVlKQotPnNldEhlYWRlcnMoJGhlYWRlcnMpCi0+c2V0Um93cygkcm93cykKLT5yZW5kZXIoKQo7CgokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlZmluaXRpb25MaXN0KC4uLiRsaXN0KQp7CiRoZWFkZXJzID0gW107CiRyb3cgPSBbXTsKZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKSB7CmlmICgkdmFsdWUgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewokaGVhZGVyc1tdID0gJHZhbHVlOwokcm93W10gPSAkdmFsdWU7CmNvbnRpbnVlOwp9CmlmIChcaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJGhlYWRlcnNbXSA9IG5ldyBUYWJsZUNlbGwoJHZhbHVlLCBbJ2NvbHNwYW4nID0+IDJdKTsKJHJvd1tdID0gbnVsbDsKY29udGludWU7Cn0KaWYgKCFcaXNfYXJyYXkoJHZhbHVlKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdWYWx1ZSBzaG91bGQgYmUgYW4gYXJyYXksIHN0cmluZywgb3IgYW4gaW5zdGFuY2Ugb2YgVGFibGVTZXBhcmF0b3IuJyk7Cn0KJGhlYWRlcnNbXSA9IGtleSgkdmFsdWUpOwokcm93W10gPSBjdXJyZW50KCR2YWx1ZSk7Cn0KCiR0aGlzLT5ob3Jpem9udGFsVGFibGUoJGhlYWRlcnMsIFskcm93XSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soc3RyaW5nICRxdWVzdGlvbiwgc3RyaW5nICRkZWZhdWx0ID0gbnVsbCwgY2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpCnsKJHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKCRxdWVzdGlvbiwgJGRlZmF1bHQpOwokcXVlc3Rpb24tPnNldFZhbGlkYXRvcigkdmFsaWRhdG9yKTsKCnJldHVybiAkdGhpcy0+YXNrUXVlc3Rpb24oJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0hpZGRlbihzdHJpbmcgJHF1ZXN0aW9uLCBjYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCkKewokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oJHF1ZXN0aW9uKTsKCiRxdWVzdGlvbi0+c2V0SGlkZGVuKHRydWUpOwokcXVlc3Rpb24tPnNldFZhbGlkYXRvcigkdmFsaWRhdG9yKTsKCnJldHVybiAkdGhpcy0+YXNrUXVlc3Rpb24oJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbmZpcm0oc3RyaW5nICRxdWVzdGlvbiwgYm9vbCAkZGVmYXVsdCA9IHRydWUpCnsKcmV0dXJuICR0aGlzLT5hc2tRdWVzdGlvbihuZXcgQ29uZmlybWF0aW9uUXVlc3Rpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hvaWNlKHN0cmluZyAkcXVlc3Rpb24sIGFycmF5ICRjaG9pY2VzLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKG51bGwgIT09ICRkZWZhdWx0KSB7CiR2YWx1ZXMgPSBhcnJheV9mbGlwKCRjaG9pY2VzKTsKJGRlZmF1bHQgPSAkdmFsdWVzWyRkZWZhdWx0XSA/PyAkZGVmYXVsdDsKfQoKcmV0dXJuICR0aGlzLT5hc2tRdWVzdGlvbihuZXcgQ2hvaWNlUXVlc3Rpb24oJHF1ZXN0aW9uLCAkY2hvaWNlcywgJGRlZmF1bHQpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzU3RhcnQoaW50ICRtYXggPSAwKQp7CiR0aGlzLT5wcm9ncmVzc0JhciA9ICR0aGlzLT5jcmVhdGVQcm9ncmVzc0JhcigkbWF4KTsKJHRoaXMtPnByb2dyZXNzQmFyLT5zdGFydCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NBZHZhbmNlKGludCAkc3RlcCA9IDEpCnsKJHRoaXMtPmdldFByb2dyZXNzQmFyKCktPmFkdmFuY2UoJHN0ZXApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NGaW5pc2goKQp7CiR0aGlzLT5nZXRQcm9ncmVzc0JhcigpLT5maW5pc2goKTsKJHRoaXMtPm5ld0xpbmUoMik7CiR0aGlzLT5wcm9ncmVzc0JhciA9IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0JhcihpbnQgJG1heCA9IDApCnsKJHByb2dyZXNzQmFyID0gcGFyZW50OjpjcmVhdGVQcm9ncmVzc0JhcigkbWF4KTsKCmlmICgnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAnSHlwZXInID09PSBnZXRlbnYoJ1RFUk1fUFJPR1JBTScpKSB7CiRwcm9ncmVzc0Jhci0+c2V0RW1wdHlCYXJDaGFyYWN0ZXIoJ+KWkScpOyAKJHByb2dyZXNzQmFyLT5zZXRQcm9ncmVzc0NoYXJhY3RlcignJyk7CiRwcm9ncmVzc0Jhci0+c2V0QmFyQ2hhcmFjdGVyKCfilpMnKTsgCn0KCnJldHVybiAkcHJvZ3Jlc3NCYXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc0l0ZXJhdGUoaXRlcmFibGUgJGl0ZXJhYmxlLCBpbnQgJG1heCA9IG51bGwpOiBpdGVyYWJsZQp7CnlpZWxkIGZyb20gJHRoaXMtPmNyZWF0ZVByb2dyZXNzQmFyKCktPml0ZXJhdGUoJGl0ZXJhYmxlLCAkbWF4KTsKCiR0aGlzLT5uZXdMaW5lKDIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrUXVlc3Rpb24oUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CmlmICgkdGhpcy0+aW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwp9CgppZiAoISR0aGlzLT5xdWVzdGlvbkhlbHBlcikgewokdGhpcy0+cXVlc3Rpb25IZWxwZXIgPSBuZXcgU3ltZm9ueVF1ZXN0aW9uSGVscGVyKCk7Cn0KCiRhbnN3ZXIgPSAkdGhpcy0+cXVlc3Rpb25IZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLCAkcXVlc3Rpb24pOwoKaWYgKCR0aGlzLT5pbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5uZXdMaW5lKCk7CiR0aGlzLT5idWZmZXJlZE91dHB1dC0+d3JpdGUoIlxuIik7Cn0KCnJldHVybiAkYW5zd2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVsbigkbWVzc2FnZXMsIGludCAkdHlwZSA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKaWYgKCFpc19pdGVyYWJsZSgkbWVzc2FnZXMpKSB7CiRtZXNzYWdlcyA9IFskbWVzc2FnZXNdOwp9Cgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKcGFyZW50Ojp3cml0ZWxuKCRtZXNzYWdlLCAkdHlwZSk7CiR0aGlzLT53cml0ZUJ1ZmZlcigkbWVzc2FnZSwgdHJ1ZSwgJHR5cGUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSBmYWxzZSwgaW50ICR0eXBlID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewppZiAoIWlzX2l0ZXJhYmxlKCRtZXNzYWdlcykpIHsKJG1lc3NhZ2VzID0gWyRtZXNzYWdlc107Cn0KCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkbWVzc2FnZSkgewpwYXJlbnQ6OndyaXRlKCRtZXNzYWdlLCAkbmV3bGluZSwgJHR5cGUpOwokdGhpcy0+d3JpdGVCdWZmZXIoJG1lc3NhZ2UsICRuZXdsaW5lLCAkdHlwZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5ld0xpbmUoaW50ICRjb3VudCA9IDEpCnsKcGFyZW50OjpuZXdMaW5lKCRjb3VudCk7CiR0aGlzLT5idWZmZXJlZE91dHB1dC0+d3JpdGUoc3RyX3JlcGVhdCgiXG4iLCAkY291bnQpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JTdHlsZSgpCnsKcmV0dXJuIG5ldyBzZWxmKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlVGFibGUoKTogVGFibGUKewokb3V0cHV0ID0gJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UgPyAkdGhpcy0+b3V0cHV0LT5zZWN0aW9uKCkgOiAkdGhpcy0+b3V0cHV0Owokc3R5bGUgPSBjbG9uZSBUYWJsZTo6Z2V0U3R5bGVEZWZpbml0aW9uKCdzeW1mb255LXN0eWxlLWd1aWRlJyk7CiRzdHlsZS0+c2V0Q2VsbEhlYWRlckZvcm1hdCgnPGluZm8+JXM8L2luZm8+Jyk7CgpyZXR1cm4gKG5ldyBUYWJsZSgkb3V0cHV0KSktPnNldFN0eWxlKCRzdHlsZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NCYXIoKTogUHJvZ3Jlc3NCYXIKewppZiAoISR0aGlzLT5wcm9ncmVzc0Jhcikgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVGhlIFByb2dyZXNzQmFyIGlzIG5vdCBzdGFydGVkLicpOwp9CgpyZXR1cm4gJHRoaXMtPnByb2dyZXNzQmFyOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGF1dG9QcmVwZW5kQmxvY2soKTogdm9pZAp7CiRjaGFycyA9IHN1YnN0cihzdHJfcmVwbGFjZShcUEhQX0VPTCwgIlxuIiwgJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT5mZXRjaCgpKSwgLTIpOwoKaWYgKCFpc3NldCgkY2hhcnNbMF0pKSB7CiR0aGlzLT5uZXdMaW5lKCk7IAoKcmV0dXJuOwp9CgokdGhpcy0+bmV3TGluZSgyIC0gc3Vic3RyX2NvdW50KCRjaGFycywgIlxuIikpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGF1dG9QcmVwZW5kVGV4dCgpOiB2b2lkCnsKJGZldGNoZWQgPSAkdGhpcy0+YnVmZmVyZWRPdXRwdXQtPmZldGNoKCk7CgppZiAoIXN0cl9lbmRzX3dpdGgoJGZldGNoZWQsICJcbiIpKSB7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUJ1ZmZlcihzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld0xpbmUsIGludCAkdHlwZSk6IHZvaWQKewoKJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT53cml0ZSgkbWVzc2FnZSwgJG5ld0xpbmUsICR0eXBlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVCbG9jayhpdGVyYWJsZSAkbWVzc2FnZXMsIHN0cmluZyAkdHlwZSA9IG51bGwsIHN0cmluZyAkc3R5bGUgPSBudWxsLCBzdHJpbmcgJHByZWZpeCA9ICcgJywgYm9vbCAkcGFkZGluZyA9IGZhbHNlLCBib29sICRlc2NhcGUgPSBmYWxzZSk6IGFycmF5CnsKJGluZGVudExlbmd0aCA9IDA7CiRwcmVmaXhMZW5ndGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRwcmVmaXgpKTsKJGxpbmVzID0gW107CgppZiAobnVsbCAhPT0gJHR5cGUpIHsKJHR5cGUgPSBzcHJpbnRmKCdbJXNdICcsICR0eXBlKTsKJGluZGVudExlbmd0aCA9IFxzdHJsZW4oJHR5cGUpOwokbGluZUluZGVudGF0aW9uID0gc3RyX3JlcGVhdCgnICcsICRpbmRlbnRMZW5ndGgpOwp9CgoKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRrZXkgPT4gJG1lc3NhZ2UpIHsKaWYgKCRlc2NhcGUpIHsKJG1lc3NhZ2UgPSBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbWVzc2FnZSk7Cn0KCiRkZWNvcmF0aW9uTGVuZ3RoID0gSGVscGVyOjp3aWR0aCgkbWVzc2FnZSkgLSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRtZXNzYWdlKSk7CiRtZXNzYWdlTGluZUxlbmd0aCA9IG1pbigkdGhpcy0+bGluZUxlbmd0aCAtICRwcmVmaXhMZW5ndGggLSAkaW5kZW50TGVuZ3RoICsgJGRlY29yYXRpb25MZW5ndGgsICR0aGlzLT5saW5lTGVuZ3RoKTsKJG1lc3NhZ2VMaW5lcyA9IGV4cGxvZGUoXFBIUF9FT0wsIHdvcmR3cmFwKCRtZXNzYWdlLCAkbWVzc2FnZUxpbmVMZW5ndGgsIFxQSFBfRU9MLCB0cnVlKSk7CmZvcmVhY2ggKCRtZXNzYWdlTGluZXMgYXMgJG1lc3NhZ2VMaW5lKSB7CiRsaW5lc1tdID0gJG1lc3NhZ2VMaW5lOwp9CgppZiAoXGNvdW50KCRtZXNzYWdlcykgPiAxICYmICRrZXkgPCBcY291bnQoJG1lc3NhZ2VzKSAtIDEpIHsKJGxpbmVzW10gPSAnJzsKfQp9CgokZmlyc3RMaW5lSW5kZXggPSAwOwppZiAoJHBhZGRpbmcgJiYgJHRoaXMtPmlzRGVjb3JhdGVkKCkpIHsKJGZpcnN0TGluZUluZGV4ID0gMTsKYXJyYXlfdW5zaGlmdCgkbGluZXMsICcnKTsKJGxpbmVzW10gPSAnJzsKfQoKZm9yZWFjaCAoJGxpbmVzIGFzICRpID0+ICYkbGluZSkgewppZiAobnVsbCAhPT0gJHR5cGUpIHsKJGxpbmUgPSAkZmlyc3RMaW5lSW5kZXggPT09ICRpID8gJHR5cGUuJGxpbmUgOiAkbGluZUluZGVudGF0aW9uLiRsaW5lOwp9CgokbGluZSA9ICRwcmVmaXguJGxpbmU7CiRsaW5lIC49IHN0cl9yZXBlYXQoJyAnLCBtYXgoJHRoaXMtPmxpbmVMZW5ndGggLSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+Z2V0Rm9ybWF0dGVyKCksICRsaW5lKSksIDApKTsKCmlmICgkc3R5bGUpIHsKJGxpbmUgPSBzcHJpbnRmKCc8JXM+JXM8Lz4nLCAkc3R5bGUsICRsaW5lKTsKfQp9CgpyZXR1cm4gJGxpbmVzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKY2xhc3MgVGVybWluYWwKewpwcml2YXRlIHN0YXRpYyAkd2lkdGg7CnByaXZhdGUgc3RhdGljICRoZWlnaHQ7CnByaXZhdGUgc3RhdGljICRzdHR5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0V2lkdGgoKQp7CiR3aWR0aCA9IGdldGVudignQ09MVU1OUycpOwppZiAoZmFsc2UgIT09ICR3aWR0aCkgewpyZXR1cm4gKGludCkgdHJpbSgkd2lkdGgpOwp9CgppZiAobnVsbCA9PT0gc2VsZjo6JHdpZHRoKSB7CnNlbGY6OmluaXREaW1lbnNpb25zKCk7Cn0KCnJldHVybiBzZWxmOjokd2lkdGggPzogODA7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlaWdodCgpCnsKJGhlaWdodCA9IGdldGVudignTElORVMnKTsKaWYgKGZhbHNlICE9PSAkaGVpZ2h0KSB7CnJldHVybiAoaW50KSB0cmltKCRoZWlnaHQpOwp9CgppZiAobnVsbCA9PT0gc2VsZjo6JGhlaWdodCkgewpzZWxmOjppbml0RGltZW5zaW9ucygpOwp9CgpyZXR1cm4gc2VsZjo6JGhlaWdodCA/OiA1MDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNTdHR5QXZhaWxhYmxlKCk6IGJvb2wKewppZiAobnVsbCAhPT0gc2VsZjo6JHN0dHkpIHsKcmV0dXJuIHNlbGY6OiRzdHR5Owp9CgoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gc2VsZjo6JHN0dHkgPSAoYm9vbCkgc2hlbGxfZXhlYygnc3R0eSAyPiAnLignXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/ICdOVUwnIDogJy9kZXYvbnVsbCcpKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdERpbWVuc2lvbnMoKQp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokYW5zaWNvbiA9IGdldGVudignQU5TSUNPTicpOwppZiAoZmFsc2UgIT09ICRhbnNpY29uICYmIHByZWdfbWF0Y2goJy9eKFxkKyl4KFxkKykoPzogXCgoXGQrKXgoXGQrKVwpKT8kLycsIHRyaW0oJGFuc2ljb24pLCAkbWF0Y2hlcykpIHsKCgpzZWxmOjokd2lkdGggPSAoaW50KSAkbWF0Y2hlc1sxXTsKc2VsZjo6JGhlaWdodCA9IGlzc2V0KCRtYXRjaGVzWzRdKSA/IChpbnQpICRtYXRjaGVzWzRdIDogKGludCkgJG1hdGNoZXNbMl07Cn0gZWxzZWlmICghc2VsZjo6aGFzVnQxMDBTdXBwb3J0KCkgJiYgc2VsZjo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CgoKc2VsZjo6aW5pdERpbWVuc2lvbnNVc2luZ1N0dHkoKTsKfSBlbHNlaWYgKG51bGwgIT09ICRkaW1lbnNpb25zID0gc2VsZjo6Z2V0Q29uc29sZU1vZGUoKSkgewoKc2VsZjo6JHdpZHRoID0gKGludCkgJGRpbWVuc2lvbnNbMF07CnNlbGY6OiRoZWlnaHQgPSAoaW50KSAkZGltZW5zaW9uc1sxXTsKfQp9IGVsc2UgewpzZWxmOjppbml0RGltZW5zaW9uc1VzaW5nU3R0eSgpOwp9Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1Z0MTAwU3VwcG9ydCgpOiBib29sCnsKcmV0dXJuIFxmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c192dDEwMF9zdXBwb3J0JykgJiYgc2FwaV93aW5kb3dzX3Z0MTAwX3N1cHBvcnQoZm9wZW4oJ3BocDovL3N0ZG91dCcsICd3JykpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0RGltZW5zaW9uc1VzaW5nU3R0eSgpCnsKaWYgKCRzdHR5U3RyaW5nID0gc2VsZjo6Z2V0U3R0eUNvbHVtbnMoKSkgewppZiAocHJlZ19tYXRjaCgnL3Jvd3MuKFxkKyk7LmNvbHVtbnMuKFxkKyk7L2knLCAkc3R0eVN0cmluZywgJG1hdGNoZXMpKSB7CgpzZWxmOjokd2lkdGggPSAoaW50KSAkbWF0Y2hlc1syXTsKc2VsZjo6JGhlaWdodCA9IChpbnQpICRtYXRjaGVzWzFdOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgnLzsuKFxkKykucm93czsuKFxkKykuY29sdW1ucy9pJywgJHN0dHlTdHJpbmcsICRtYXRjaGVzKSkgewoKc2VsZjo6JHdpZHRoID0gKGludCkgJG1hdGNoZXNbMl07CnNlbGY6OiRoZWlnaHQgPSAoaW50KSAkbWF0Y2hlc1sxXTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29uc29sZU1vZGUoKTogP2FycmF5CnsKJGluZm8gPSBzZWxmOjpyZWFkRnJvbVByb2Nlc3MoJ21vZGUgQ09OJyk7CgppZiAobnVsbCA9PT0gJGluZm8gfHwgIXByZWdfbWF0Y2goJy8tLS0tLS0tLStccj9cbi4rPyhcZCspXHI/XG4uKz8oXGQrKVxyP1xuLycsICRpbmZvLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBbKGludCkgJG1hdGNoZXNbMl0sIChpbnQpICRtYXRjaGVzWzFdXTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U3R0eUNvbHVtbnMoKTogP3N0cmluZwp7CnJldHVybiBzZWxmOjpyZWFkRnJvbVByb2Nlc3MoJ3N0dHkgLWEgfCBncmVwIGNvbHVtbnMnKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVhZEZyb21Qcm9jZXNzKHN0cmluZyAkY29tbWFuZCk6ID9zdHJpbmcKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnJldHVybiBudWxsOwp9CgokZGVzY3JpcHRvcnNwZWMgPSBbCjEgPT4gWydwaXBlJywgJ3cnXSwKMiA9PiBbJ3BpcGUnLCAndyddLApdOwoKJGNwID0gXGZ1bmN0aW9uX2V4aXN0cygnc2FwaV93aW5kb3dzX2NwX3NldCcpID8gc2FwaV93aW5kb3dzX2NwX2dldCgpIDogMDsKCiRwcm9jZXNzID0gcHJvY19vcGVuKCRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcywgbnVsbCwgbnVsbCwgWydzdXBwcmVzc19lcnJvcnMnID0+IHRydWVdKTsKaWYgKCFcaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7CnJldHVybiBudWxsOwp9CgokaW5mbyA9IHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKTsKZmNsb3NlKCRwaXBlc1sxXSk7CmZjbG9zZSgkcGlwZXNbMl0pOwpwcm9jX2Nsb3NlKCRwcm9jZXNzKTsKCmlmICgkY3ApIHsKc2FwaV93aW5kb3dzX2NwX3NldCgkY3ApOwp9CgpyZXR1cm4gJGluZm87Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CgoKCgoKCgoKCgoKY2xhc3MgQXBwbGljYXRpb25UZXN0ZXIKewp1c2UgVGVzdGVyVHJhaXQ7Cgpwcml2YXRlICRhcHBsaWNhdGlvbjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24pCnsKJHRoaXMtPmFwcGxpY2F0aW9uID0gJGFwcGxpY2F0aW9uOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKGFycmF5ICRpbnB1dCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokcHJldlNoZWxsVmVyYm9zaXR5ID0gZ2V0ZW52KCdTSEVMTF9WRVJCT1NJVFknKTsKCnRyeSB7CiR0aGlzLT5pbnB1dCA9IG5ldyBBcnJheUlucHV0KCRpbnB1dCk7CmlmIChpc3NldCgkb3B0aW9uc1snaW50ZXJhY3RpdmUnXSkpIHsKJHRoaXMtPmlucHV0LT5zZXRJbnRlcmFjdGl2ZSgkb3B0aW9uc1snaW50ZXJhY3RpdmUnXSk7Cn0KCmlmICgkdGhpcy0+aW5wdXRzKSB7CiR0aGlzLT5pbnB1dC0+c2V0U3RyZWFtKHNlbGY6OmNyZWF0ZVN0cmVhbSgkdGhpcy0+aW5wdXRzKSk7Cn0KCiR0aGlzLT5pbml0T3V0cHV0KCRvcHRpb25zKTsKCnJldHVybiAkdGhpcy0+c3RhdHVzQ29kZSA9ICR0aGlzLT5hcHBsaWNhdGlvbi0+cnVuKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm91dHB1dCk7Cn0gZmluYWxseSB7CgoKaWYgKGZhbHNlID09PSAkcHJldlNoZWxsVmVyYm9zaXR5KSB7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwdXRlbnYnKSkgewpAcHV0ZW52KCdTSEVMTF9WRVJCT1NJVFknKTsKfQp1bnNldCgkX0VOVlsnU0hFTExfVkVSQk9TSVRZJ10pOwp1bnNldCgkX1NFUlZFUlsnU0hFTExfVkVSQk9TSVRZJ10pOwp9IGVsc2UgewppZiAoXGZ1bmN0aW9uX2V4aXN0cygncHV0ZW52JykpIHsKQHB1dGVudignU0hFTExfVkVSQk9TSVRZPScuJHByZXZTaGVsbFZlcmJvc2l0eSk7Cn0KJF9FTlZbJ1NIRUxMX1ZFUkJPU0lUWSddID0gJHByZXZTaGVsbFZlcmJvc2l0eTsKJF9TRVJWRVJbJ1NIRUxMX1ZFUkJPU0lUWSddID0gJHByZXZTaGVsbFZlcmJvc2l0eTsKfQp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CgoKCgoKCmNsYXNzIENvbW1hbmRDb21wbGV0aW9uVGVzdGVyCnsKcHJpdmF0ZSAkY29tbWFuZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21tYW5kICRjb21tYW5kKQp7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShhcnJheSAkaW5wdXQpOiBhcnJheQp7CiRjdXJyZW50SW5kZXggPSBcY291bnQoJGlucHV0KTsKaWYgKCcnID09PSBlbmQoJGlucHV0KSkgewphcnJheV9wb3AoJGlucHV0KTsKfQphcnJheV91bnNoaWZ0KCRpbnB1dCwgJHRoaXMtPmNvbW1hbmQtPmdldE5hbWUoKSk7CgokY29tcGxldGlvbklucHV0ID0gQ29tcGxldGlvbklucHV0Ojpmcm9tVG9rZW5zKCRpbnB1dCwgJGN1cnJlbnRJbmRleCk7CiRjb21wbGV0aW9uSW5wdXQtPmJpbmQoJHRoaXMtPmNvbW1hbmQtPmdldERlZmluaXRpb24oKSk7CiRzdWdnZXN0aW9ucyA9IG5ldyBDb21wbGV0aW9uU3VnZ2VzdGlvbnMoKTsKCiR0aGlzLT5jb21tYW5kLT5jb21wbGV0ZSgkY29tcGxldGlvbklucHV0LCAkc3VnZ2VzdGlvbnMpOwoKJG9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJHN1Z2dlc3Rpb25zLT5nZXRPcHRpb25TdWdnZXN0aW9ucygpIGFzICRvcHRpb24pIHsKJG9wdGlvbnNbXSA9ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gYXJyYXlfbWFwKCdzdHJ2YWwnLCBhcnJheV9tZXJnZSgkb3B0aW9ucywgJHN1Z2dlc3Rpb25zLT5nZXRWYWx1ZVN1Z2dlc3Rpb25zKCkpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CgoKCgoKCgpjbGFzcyBDb21tYW5kVGVzdGVyCnsKdXNlIFRlc3RlclRyYWl0OwoKcHJpdmF0ZSAkY29tbWFuZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21tYW5kICRjb21tYW5kKQp7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKGFycmF5ICRpbnB1dCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewoKCmlmICghaXNzZXQoJGlucHV0Wydjb21tYW5kJ10pCiYmIChudWxsICE9PSAkYXBwbGljYXRpb24gPSAkdGhpcy0+Y29tbWFuZC0+Z2V0QXBwbGljYXRpb24oKSkKJiYgJGFwcGxpY2F0aW9uLT5nZXREZWZpbml0aW9uKCktPmhhc0FyZ3VtZW50KCdjb21tYW5kJykKKSB7CiRpbnB1dCA9IGFycmF5X21lcmdlKFsnY29tbWFuZCcgPT4gJHRoaXMtPmNvbW1hbmQtPmdldE5hbWUoKV0sICRpbnB1dCk7Cn0KCiR0aGlzLT5pbnB1dCA9IG5ldyBBcnJheUlucHV0KCRpbnB1dCk7CgokdGhpcy0+aW5wdXQtPnNldFN0cmVhbShzZWxmOjpjcmVhdGVTdHJlYW0oJHRoaXMtPmlucHV0cykpOwoKaWYgKGlzc2V0KCRvcHRpb25zWydpbnRlcmFjdGl2ZSddKSkgewokdGhpcy0+aW5wdXQtPnNldEludGVyYWN0aXZlKCRvcHRpb25zWydpbnRlcmFjdGl2ZSddKTsKfQoKaWYgKCFpc3NldCgkb3B0aW9uc1snZGVjb3JhdGVkJ10pKSB7CiRvcHRpb25zWydkZWNvcmF0ZWQnXSA9IGZhbHNlOwp9CgokdGhpcy0+aW5pdE91dHB1dCgkb3B0aW9ucyk7CgpyZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGUgPSAkdGhpcy0+Y29tbWFuZC0+cnVuKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm91dHB1dCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyXENvbnN0cmFpbnQ7Cgp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CgpmaW5hbCBjbGFzcyBDb21tYW5kSXNTdWNjZXNzZnVsIGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJ2lzIHN1Y2Nlc3NmdWwnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hlcygkb3RoZXIpOiBib29sCnsKcmV0dXJuIENvbW1hbmQ6OlNVQ0NFU1MgPT09ICRvdGhlcjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZhaWx1cmVEZXNjcmlwdGlvbigkb3RoZXIpOiBzdHJpbmcKewpyZXR1cm4gJ3RoZSBjb21tYW5kICcuJHRoaXMtPnRvU3RyaW5nKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRpdGlvbmFsRmFpbHVyZURlc2NyaXB0aW9uKCRvdGhlcik6IHN0cmluZwp7CiRtYXBwaW5nID0gWwpDb21tYW5kOjpGQUlMVVJFID0+ICdDb21tYW5kIGZhaWxlZC4nLApDb21tYW5kOjpJTlZBTElEID0+ICdDb21tYW5kIHdhcyBpbnZhbGlkLicsCl07CgpyZXR1cm4gJG1hcHBpbmdbJG90aGVyXSA/PyBzcHJpbnRmKCdDb21tYW5kIHJldHVybmVkIGV4aXQgc3RhdHVzICVkLicsICRvdGhlcik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFBIUFVuaXRcRnJhbWV3b3JrXEFzc2VydDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcU3RyZWFtT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXJcQ29uc3RyYWludFxDb21tYW5kSXNTdWNjZXNzZnVsOwoKCgoKdHJhaXQgVGVzdGVyVHJhaXQKewoKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRpbnB1dHMgPSBbXTsKcHJpdmF0ZSAkY2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5ID0gZmFsc2U7Cgpwcml2YXRlICRpbnB1dDsKCnByaXZhdGUgJHN0YXR1c0NvZGU7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3BsYXkoYm9vbCAkbm9ybWFsaXplID0gZmFsc2UpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5vdXRwdXQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdPdXRwdXQgbm90IGluaXRpYWxpemVkLCBkaWQgeW91IGV4ZWN1dGUgdGhlIGNvbW1hbmQgYmVmb3JlIHJlcXVlc3RpbmcgdGhlIGRpc3BsYXk/Jyk7Cn0KCnJld2luZCgkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSk7CgokZGlzcGxheSA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPm91dHB1dC0+Z2V0U3RyZWFtKCkpOwoKaWYgKCRub3JtYWxpemUpIHsKJGRpc3BsYXkgPSBzdHJfcmVwbGFjZShcUEhQX0VPTCwgIlxuIiwgJGRpc3BsYXkpOwp9CgpyZXR1cm4gJGRpc3BsYXk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoYm9vbCAkbm9ybWFsaXplID0gZmFsc2UpCnsKaWYgKCEkdGhpcy0+Y2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5KSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBlcnJvciBvdXRwdXQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIHRoZSB0ZXN0ZXIgaXMgcnVuIHdpdGhvdXQgImNhcHR1cmVfc3RkZXJyX3NlcGFyYXRlbHkiIG9wdGlvbiBzZXQuJyk7Cn0KCnJld2luZCgkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpLT5nZXRTdHJlYW0oKSk7CgokZGlzcGxheSA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPm91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKS0+Z2V0U3RyZWFtKCkpOwoKaWYgKCRub3JtYWxpemUpIHsKJGRpc3BsYXkgPSBzdHJfcmVwbGFjZShcUEhQX0VPTCwgIlxuIiwgJGRpc3BsYXkpOwp9CgpyZXR1cm4gJGRpc3BsYXk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCkKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoKQp7CmlmIChudWxsID09PSAkdGhpcy0+c3RhdHVzQ29kZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1N0YXR1cyBjb2RlIG5vdCBpbml0aWFsaXplZCwgZGlkIHlvdSBleGVjdXRlIHRoZSBjb21tYW5kIGJlZm9yZSByZXF1ZXN0aW5nIHRoZSBzdGF0dXMgY29kZT8nKTsKfQoKcmV0dXJuICR0aGlzLT5zdGF0dXNDb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0Q29tbWFuZElzU3VjY2Vzc2Z1bChzdHJpbmcgJG1lc3NhZ2UgPSAnJyk6IHZvaWQKewpBc3NlcnQ6OmFzc2VydFRoYXQoJHRoaXMtPnN0YXR1c0NvZGUsIG5ldyBDb21tYW5kSXNTdWNjZXNzZnVsKCksICRtZXNzYWdlKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXRzKGFycmF5ICRpbnB1dHMpCnsKJHRoaXMtPmlucHV0cyA9ICRpbnB1dHM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdE91dHB1dChhcnJheSAkb3B0aW9ucykKewokdGhpcy0+Y2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5ID0gXGFycmF5X2tleV9leGlzdHMoJ2NhcHR1cmVfc3RkZXJyX3NlcGFyYXRlbHknLCAkb3B0aW9ucykgJiYgJG9wdGlvbnNbJ2NhcHR1cmVfc3RkZXJyX3NlcGFyYXRlbHknXTsKaWYgKCEkdGhpcy0+Y2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5KSB7CiR0aGlzLT5vdXRwdXQgPSBuZXcgU3RyZWFtT3V0cHV0KGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycsIGZhbHNlKSk7CmlmIChpc3NldCgkb3B0aW9uc1snZGVjb3JhdGVkJ10pKSB7CiR0aGlzLT5vdXRwdXQtPnNldERlY29yYXRlZCgkb3B0aW9uc1snZGVjb3JhdGVkJ10pOwp9CmlmIChpc3NldCgkb3B0aW9uc1sndmVyYm9zaXR5J10pKSB7CiR0aGlzLT5vdXRwdXQtPnNldFZlcmJvc2l0eSgkb3B0aW9uc1sndmVyYm9zaXR5J10pOwp9Cn0gZWxzZSB7CiR0aGlzLT5vdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dCgKJG9wdGlvbnNbJ3ZlcmJvc2l0eSddID8/IENvbnNvbGVPdXRwdXQ6OlZFUkJPU0lUWV9OT1JNQUwsCiRvcHRpb25zWydkZWNvcmF0ZWQnXSA/PyBudWxsCik7CgokZXJyb3JPdXRwdXQgPSBuZXcgU3RyZWFtT3V0cHV0KGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycsIGZhbHNlKSk7CiRlcnJvck91dHB1dC0+c2V0Rm9ybWF0dGVyKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpKTsKJGVycm9yT3V0cHV0LT5zZXRWZXJib3NpdHkoJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpOwokZXJyb3JPdXRwdXQtPnNldERlY29yYXRlZCgkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKTsKCiRyZWZsZWN0ZWRPdXRwdXQgPSBuZXcgXFJlZmxlY3Rpb25PYmplY3QoJHRoaXMtPm91dHB1dCk7CiRzdHJFcnJQcm9wZXJ0eSA9ICRyZWZsZWN0ZWRPdXRwdXQtPmdldFByb3BlcnR5KCdzdGRlcnInKTsKJHN0ckVyclByb3BlcnR5LT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokc3RyRXJyUHJvcGVydHktPnNldFZhbHVlKCR0aGlzLT5vdXRwdXQsICRlcnJvck91dHB1dCk7CgokcmVmbGVjdGVkUGFyZW50ID0gJHJlZmxlY3RlZE91dHB1dC0+Z2V0UGFyZW50Q2xhc3MoKTsKJHN0cmVhbVByb3BlcnR5ID0gJHJlZmxlY3RlZFBhcmVudC0+Z2V0UHJvcGVydHkoJ3N0cmVhbScpOwokc3RyZWFtUHJvcGVydHktPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRzdHJlYW1Qcm9wZXJ0eS0+c2V0VmFsdWUoJHRoaXMtPm91dHB1dCwgZm9wZW4oJ3BocDovL21lbW9yeScsICd3JywgZmFsc2UpKTsKfQp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVTdHJlYW0oYXJyYXkgJGlucHV0cykKewokc3RyZWFtID0gZm9wZW4oJ3BocDovL21lbW9yeScsICdyKycsIGZhbHNlKTsKCmZvcmVhY2ggKCRpbnB1dHMgYXMgJGlucHV0KSB7CmZ3cml0ZSgkc3RyZWFtLCAkaW5wdXQuXFBIUF9FT0wpOwp9CgpyZXdpbmQoJHN0cmVhbSk7CgpyZXR1cm4gJHN0cmVhbTsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMiBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCd0cmlnZ2VyX2RlcHJlY2F0aW9uJykpIHsKCgoKCgoKCgoKCmZ1bmN0aW9uIHRyaWdnZXJfZGVwcmVjYXRpb24oc3RyaW5nICRwYWNrYWdlLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkbWVzc2FnZSwgLi4uJGFyZ3MpOiB2b2lkCnsKQHRyaWdnZXJfZXJyb3IoKCRwYWNrYWdlIHx8ICR2ZXJzaW9uID8gIlNpbmNlICRwYWNrYWdlICR2ZXJzaW9uOiAiIDogJycpLigkYXJncyA/IHZzcHJpbnRmKCRtZXNzYWdlLCAkYXJncykgOiAkbWVzc2FnZSksIFxFX1VTRVJfREVQUkVDQVRFRCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKCgppbnRlcmZhY2UgRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgXFRocm93YWJsZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCgoKCmNsYXNzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSA9IG51bGwsIGludCAkY29kZSA9IDAsIFxUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCwgc3RyaW5nICRwYXRoID0gbnVsbCkKewppZiAobnVsbCA9PT0gJG1lc3NhZ2UpIHsKaWYgKG51bGwgPT09ICRwYXRoKSB7CiRtZXNzYWdlID0gJ0ZpbGUgY291bGQgbm90IGJlIGZvdW5kLic7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50ZignRmlsZSAiJXMiIGNvdWxkIG5vdCBiZSBmb3VuZC4nLCAkcGF0aCk7Cn0KfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cywgJHBhdGgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBJT0V4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb25JbnRlcmZhY2UKewpwcml2YXRlICRwYXRoOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgaW50ICRjb2RlID0gMCwgXFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsLCBzdHJpbmcgJHBhdGggPSBudWxsKQp7CiR0aGlzLT5wYXRoID0gJHBhdGg7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKQp7CnJldHVybiAkdGhpcy0+cGF0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBJT0V4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIEV4Y2VwdGlvbkludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXElPRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBGaWxlc3lzdGVtCnsKcHJpdmF0ZSBzdGF0aWMgJGxhc3RFcnJvcjsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJG9yaWdpbkZpbGUsIHN0cmluZyAkdGFyZ2V0RmlsZSwgYm9vbCAkb3ZlcndyaXRlTmV3ZXJGaWxlcyA9IGZhbHNlKQp7CiRvcmlnaW5Jc0xvY2FsID0gc3RyZWFtX2lzX2xvY2FsKCRvcmlnaW5GaWxlKSB8fCAwID09PSBzdHJpcG9zKCRvcmlnaW5GaWxlLCAnZmlsZTovLycpOwppZiAoJG9yaWdpbklzTG9jYWwgJiYgIWlzX2ZpbGUoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiBiZWNhdXNlIGZpbGUgZG9lcyBub3QgZXhpc3QuJywgJG9yaWdpbkZpbGUpLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCiR0aGlzLT5ta2RpcihcZGlybmFtZSgkdGFyZ2V0RmlsZSkpOwoKJGRvQ29weSA9IHRydWU7CmlmICghJG92ZXJ3cml0ZU5ld2VyRmlsZXMgJiYgbnVsbCA9PT0gcGFyc2VfdXJsKCRvcmlnaW5GaWxlLCBcUEhQX1VSTF9IT1NUKSAmJiBpc19maWxlKCR0YXJnZXRGaWxlKSkgewokZG9Db3B5ID0gZmlsZW10aW1lKCRvcmlnaW5GaWxlKSA+IGZpbGVtdGltZSgkdGFyZ2V0RmlsZSk7Cn0KCmlmICgkZG9Db3B5KSB7CgppZiAoISRzb3VyY2UgPSBzZWxmOjpib3goJ2ZvcGVuJywgJG9yaWdpbkZpbGUsICdyJykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjb3B5ICIlcyIgdG8gIiVzIiBiZWNhdXNlIHNvdXJjZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmc6ICcsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgoKaWYgKCEkdGFyZ2V0ID0gc2VsZjo6Ym94KCdmb3BlbicsICR0YXJnZXRGaWxlLCAndycsIGZhbHNlLCBzdHJlYW1fY29udGV4dF9jcmVhdGUoWydmdHAnID0+IFsnb3ZlcndyaXRlJyA9PiB0cnVlXV0pKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiB0byAiJXMiIGJlY2F1c2UgdGFyZ2V0IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZzogJywgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCiRieXRlc0NvcGllZCA9IHN0cmVhbV9jb3B5X3RvX3N0cmVhbSgkc291cmNlLCAkdGFyZ2V0KTsKZmNsb3NlKCRzb3VyY2UpOwpmY2xvc2UoJHRhcmdldCk7CnVuc2V0KCRzb3VyY2UsICR0YXJnZXQpOwoKaWYgKCFpc19maWxlKCR0YXJnZXRGaWxlKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiB0byAiJXMiLicsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSksIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQoKaWYgKCRvcmlnaW5Jc0xvY2FsKSB7CgpzZWxmOjpib3goJ2NobW9kJywgJHRhcmdldEZpbGUsIGZpbGVwZXJtcygkdGFyZ2V0RmlsZSkgfCAoZmlsZXBlcm1zKCRvcmlnaW5GaWxlKSAmIDAxMTEpKTsKCmlmICgkYnl0ZXNDb3BpZWQgIT09ICRieXRlc09yaWdpbiA9IGZpbGVzaXplKCRvcmlnaW5GaWxlKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgdGhlIHdob2xlIGNvbnRlbnQgb2YgIiVzIiB0byAiJXMiICglZyBvZiAlZyBieXRlcyBjb3BpZWQpLicsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSwgJGJ5dGVzQ29waWVkLCAkYnl0ZXNPcmlnaW4pLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWtkaXIoJGRpcnMsIGludCAkbW9kZSA9IDA3NzcpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGRpcnMpIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSkgewpjb250aW51ZTsKfQoKaWYgKCFzZWxmOjpib3goJ21rZGlyJywgJGRpciwgJG1vZGUsIHRydWUpICYmICFpc19kaXIoJGRpcikpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjcmVhdGUgIiVzIjogJywgJGRpcikuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGRpcik7Cn0KfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4aXN0cygkZmlsZXMpCnsKJG1heFBhdGhMZW5ndGggPSBcUEhQX01BWFBBVEhMRU4gLSAyOwoKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoXHN0cmxlbigkZmlsZSkgPiAkbWF4UGF0aExlbmd0aCkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ291bGQgbm90IGNoZWNrIGlmIGZpbGUgZXhpc3QgYmVjYXVzZSBwYXRoIGxlbmd0aCBleGNlZWRzICVkIGNoYXJhY3RlcnMuJywgJG1heFBhdGhMZW5ndGgpLCAwLCBudWxsLCAkZmlsZSk7Cn0KCmlmICghZmlsZV9leGlzdHMoJGZpbGUpKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRvdWNoKCRmaWxlcywgaW50ICR0aW1lID0gbnVsbCwgaW50ICRhdGltZSA9IG51bGwpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoISgkdGltZSA/IHNlbGY6OmJveCgndG91Y2gnLCAkZmlsZSwgJHRpbWUsICRhdGltZSkgOiBzZWxmOjpib3goJ3RvdWNoJywgJGZpbGUpKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHRvdWNoICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgkZmlsZXMpCnsKaWYgKCRmaWxlcyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewokZmlsZXMgPSBpdGVyYXRvcl90b19hcnJheSgkZmlsZXMsIGZhbHNlKTsKfSBlbHNlaWYgKCFcaXNfYXJyYXkoJGZpbGVzKSkgewokZmlsZXMgPSBbJGZpbGVzXTsKfQoKc2VsZjo6ZG9SZW1vdmUoJGZpbGVzLCBmYWxzZSk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGRvUmVtb3ZlKGFycmF5ICRmaWxlcywgYm9vbCAkaXNSZWN1cnNpdmUpOiB2b2lkCnsKJGZpbGVzID0gYXJyYXlfcmV2ZXJzZSgkZmlsZXMpOwpmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsKaWYgKGlzX2xpbmsoJGZpbGUpKSB7CgppZiAoIShzZWxmOjpib3goJ3VubGluaycsICRmaWxlKSB8fCAnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCBzZWxmOjpib3goJ3JtZGlyJywgJGZpbGUpKSAmJiBmaWxlX2V4aXN0cygkZmlsZSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byByZW1vdmUgc3ltbGluayAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvcik7Cn0KfSBlbHNlaWYgKGlzX2RpcigkZmlsZSkpIHsKaWYgKCEkaXNSZWN1cnNpdmUpIHsKJHRtcE5hbWUgPSBcZGlybmFtZShyZWFscGF0aCgkZmlsZSkpLicvLicuc3RycmV2KHN0cnRyKGJhc2U2NF9lbmNvZGUocmFuZG9tX2J5dGVzKDIpKSwgJy89JywgJy1fJykpOwoKaWYgKGZpbGVfZXhpc3RzKCR0bXBOYW1lKSkgewp0cnkgewpzZWxmOjpkb1JlbW92ZShbJHRtcE5hbWVdLCB0cnVlKTsKfSBjYXRjaCAoSU9FeGNlcHRpb24gJGUpIHsKfQp9CgppZiAoIWZpbGVfZXhpc3RzKCR0bXBOYW1lKSAmJiBzZWxmOjpib3goJ3JlbmFtZScsICRmaWxlLCAkdG1wTmFtZSkpIHsKJG9yaWdGaWxlID0gJGZpbGU7CiRmaWxlID0gJHRtcE5hbWU7Cn0gZWxzZSB7CiRvcmlnRmlsZSA9IG51bGw7Cn0KfQoKJGZpbGVzID0gbmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUsIFxGaWxlc3lzdGVtSXRlcmF0b3I6OkNVUlJFTlRfQVNfUEFUSE5BTUUgfCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwpzZWxmOjpkb1JlbW92ZShpdGVyYXRvcl90b19hcnJheSgkZmlsZXMsIHRydWUpLCB0cnVlKTsKCmlmICghc2VsZjo6Ym94KCdybWRpcicsICRmaWxlKSAmJiBmaWxlX2V4aXN0cygkZmlsZSkgJiYgISRpc1JlY3Vyc2l2ZSkgewokbGFzdEVycm9yID0gc2VsZjo6JGxhc3RFcnJvcjsKCmlmIChudWxsICE9PSAkb3JpZ0ZpbGUgJiYgc2VsZjo6Ym94KCdyZW5hbWUnLCAkZmlsZSwgJG9yaWdGaWxlKSkgewokZmlsZSA9ICRvcmlnRmlsZTsKfQoKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byByZW1vdmUgZGlyZWN0b3J5ICIlcyI6ICcsICRmaWxlKS4kbGFzdEVycm9yKTsKfQp9IGVsc2VpZiAoIXNlbGY6OmJveCgndW5saW5rJywgJGZpbGUpICYmIChzdHJfY29udGFpbnMoc2VsZjo6JGxhc3RFcnJvciwgJ1Blcm1pc3Npb24gZGVuaWVkJykgfHwgZmlsZV9leGlzdHMoJGZpbGUpKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHJlbW92ZSBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yKTsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2htb2QoJGZpbGVzLCBpbnQgJG1vZGUsIGludCAkdW1hc2sgPSAwMDAwLCBib29sICRyZWN1cnNpdmUgPSBmYWxzZSkKewpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZmlsZXMpIGFzICRmaWxlKSB7CmlmICgoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDAgfHwgXGlzX2ludCgkbW9kZSkpICYmICFzZWxmOjpib3goJ2NobW9kJywgJGZpbGUsICRtb2RlICYgfiR1bWFzaykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaG1vZCBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KaWYgKCRyZWN1cnNpdmUgJiYgaXNfZGlyKCRmaWxlKSAmJiAhaXNfbGluaygkZmlsZSkpIHsKJHRoaXMtPmNobW9kKG5ldyBcRmlsZXN5c3RlbUl0ZXJhdG9yKCRmaWxlKSwgJG1vZGUsICR1bWFzaywgdHJ1ZSk7Cn0KfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hvd24oJGZpbGVzLCAkdXNlciwgYm9vbCAkcmVjdXJzaXZlID0gZmFsc2UpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoJHJlY3Vyc2l2ZSAmJiBpc19kaXIoJGZpbGUpICYmICFpc19saW5rKCRmaWxlKSkgewokdGhpcy0+Y2hvd24obmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUpLCAkdXNlciwgdHJ1ZSk7Cn0KaWYgKGlzX2xpbmsoJGZpbGUpICYmIFxmdW5jdGlvbl9leGlzdHMoJ2xjaG93bicpKSB7CmlmICghc2VsZjo6Ym94KCdsY2hvd24nLCAkZmlsZSwgJHVzZXIpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY2hvd24gZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0gZWxzZSB7CmlmICghc2VsZjo6Ym94KCdjaG93bicsICRmaWxlLCAkdXNlcikpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaG93biBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGdycCgkZmlsZXMsICRncm91cCwgYm9vbCAkcmVjdXJzaXZlID0gZmFsc2UpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoJHJlY3Vyc2l2ZSAmJiBpc19kaXIoJGZpbGUpICYmICFpc19saW5rKCRmaWxlKSkgewokdGhpcy0+Y2hncnAobmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUpLCAkZ3JvdXAsIHRydWUpOwp9CmlmIChpc19saW5rKCRmaWxlKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdsY2hncnAnKSkgewppZiAoIXNlbGY6OmJveCgnbGNoZ3JwJywgJGZpbGUsICRncm91cCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaGdycCBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfSBlbHNlIHsKaWYgKCFzZWxmOjpib3goJ2NoZ3JwJywgJGZpbGUsICRncm91cCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaGdycCBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW5hbWUoc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdGFyZ2V0LCBib29sICRvdmVyd3JpdGUgPSBmYWxzZSkKewoKaWYgKCEkb3ZlcndyaXRlICYmICR0aGlzLT5pc1JlYWRhYmxlKCR0YXJnZXQpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgcmVuYW1lIGJlY2F1c2UgdGhlIHRhcmdldCAiJXMiIGFscmVhZHkgZXhpc3RzLicsICR0YXJnZXQpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKaWYgKCFzZWxmOjpib3goJ3JlbmFtZScsICRvcmlnaW4sICR0YXJnZXQpKSB7CmlmIChpc19kaXIoJG9yaWdpbikpIHsKCiR0aGlzLT5taXJyb3IoJG9yaWdpbiwgJHRhcmdldCwgbnVsbCwgWydvdmVycmlkZScgPT4gJG92ZXJ3cml0ZSwgJ2RlbGV0ZScgPT4gJG92ZXJ3cml0ZV0pOwokdGhpcy0+cmVtb3ZlKCRvcmlnaW4pOwoKcmV0dXJuOwp9CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgcmVuYW1lICIlcyIgdG8gIiVzIjogJywgJG9yaWdpbiwgJHRhcmdldCkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRmaWxlbmFtZSk6IGJvb2wKewokbWF4UGF0aExlbmd0aCA9IFxQSFBfTUFYUEFUSExFTiAtIDI7CgppZiAoXHN0cmxlbigkZmlsZW5hbWUpID4gJG1heFBhdGhMZW5ndGgpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0NvdWxkIG5vdCBjaGVjayBpZiBmaWxlIGlzIHJlYWRhYmxlIGJlY2F1c2UgcGF0aCBsZW5ndGggZXhjZWVkcyAlZCBjaGFyYWN0ZXJzLicsICRtYXhQYXRoTGVuZ3RoKSwgMCwgbnVsbCwgJGZpbGVuYW1lKTsKfQoKcmV0dXJuIGlzX3JlYWRhYmxlKCRmaWxlbmFtZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN5bWxpbmsoc3RyaW5nICRvcmlnaW5EaXIsIHN0cmluZyAkdGFyZ2V0RGlyLCBib29sICRjb3B5T25XaW5kb3dzID0gZmFsc2UpCnsKc2VsZjo6YXNzZXJ0RnVuY3Rpb25FeGlzdHMoJ3N5bWxpbmsnKTsKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokb3JpZ2luRGlyID0gc3RydHIoJG9yaWdpbkRpciwgJy8nLCAnXFwnKTsKJHRhcmdldERpciA9IHN0cnRyKCR0YXJnZXREaXIsICcvJywgJ1xcJyk7CgppZiAoJGNvcHlPbldpbmRvd3MpIHsKJHRoaXMtPm1pcnJvcigkb3JpZ2luRGlyLCAkdGFyZ2V0RGlyKTsKCnJldHVybjsKfQp9CgokdGhpcy0+bWtkaXIoXGRpcm5hbWUoJHRhcmdldERpcikpOwoKaWYgKGlzX2xpbmsoJHRhcmdldERpcikpIHsKaWYgKHJlYWRsaW5rKCR0YXJnZXREaXIpID09PSAkb3JpZ2luRGlyKSB7CnJldHVybjsKfQokdGhpcy0+cmVtb3ZlKCR0YXJnZXREaXIpOwp9CgppZiAoIXNlbGY6OmJveCgnc3ltbGluaycsICRvcmlnaW5EaXIsICR0YXJnZXREaXIpKSB7CiR0aGlzLT5saW5rRXhjZXB0aW9uKCRvcmlnaW5EaXIsICR0YXJnZXREaXIsICdzeW1ib2xpYycpOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcmRsaW5rKHN0cmluZyAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGVzKQp7CnNlbGY6OmFzc2VydEZ1bmN0aW9uRXhpc3RzKCdsaW5rJyk7CgppZiAoISR0aGlzLT5leGlzdHMoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24obnVsbCwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgppZiAoIWlzX2ZpbGUoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignT3JpZ2luIGZpbGUgIiVzIiBpcyBub3QgYSBmaWxlLicsICRvcmlnaW5GaWxlKSk7Cn0KCmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCR0YXJnZXRGaWxlcykgYXMgJHRhcmdldEZpbGUpIHsKaWYgKGlzX2ZpbGUoJHRhcmdldEZpbGUpKSB7CmlmIChmaWxlaW5vZGUoJG9yaWdpbkZpbGUpID09PSBmaWxlaW5vZGUoJHRhcmdldEZpbGUpKSB7CmNvbnRpbnVlOwp9CiR0aGlzLT5yZW1vdmUoJHRhcmdldEZpbGUpOwp9CgppZiAoIXNlbGY6OmJveCgnbGluaycsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSkpIHsKJHRoaXMtPmxpbmtFeGNlcHRpb24oJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlLCAnaGFyZCcpOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsaW5rRXhjZXB0aW9uKHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRsaW5rVHlwZSkKewppZiAoc2VsZjo6JGxhc3RFcnJvcikgewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgc3RyX2NvbnRhaW5zKHNlbGY6OiRsYXN0RXJyb3IsICdlcnJvciBjb2RlKDEzMTQpJykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBjcmVhdGUgIiVzIiBsaW5rIGR1ZSB0byBlcnJvciBjb2RlIDEzMTQ6IFwnQSByZXF1aXJlZCBwcml2aWxlZ2UgaXMgbm90IGhlbGQgYnkgdGhlIGNsaWVudFwnLiBEbyB5b3UgaGF2ZSB0aGUgcmVxdWlyZWQgQWRtaW5pc3RyYXRvci1yaWdodHM/JywgJGxpbmtUeXBlKSwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KfQp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNyZWF0ZSAiJXMiIGxpbmsgZnJvbSAiJXMiIHRvICIlcyI6ICcsICRsaW5rVHlwZSwgJG9yaWdpbiwgJHRhcmdldCkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZGxpbmsoc3RyaW5nICRwYXRoLCBib29sICRjYW5vbmljYWxpemUgPSBmYWxzZSkKewppZiAoISRjYW5vbmljYWxpemUgJiYgIWlzX2xpbmsoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgppZiAoJGNhbm9uaWNhbGl6ZSkgewppZiAoISR0aGlzLT5leGlzdHMoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgXFBIUF9WRVJTSU9OX0lEIDwgNzA0MTApIHsKJHBhdGggPSByZWFkbGluaygkcGF0aCk7Cn0KCnJldHVybiByZWFscGF0aCgkcGF0aCk7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBcUEhQX1ZFUlNJT05fSUQgPCA3MDQwMCkgewpyZXR1cm4gcmVhbHBhdGgoJHBhdGgpOwp9CgpyZXR1cm4gcmVhZGxpbmsoJHBhdGgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYWtlUGF0aFJlbGF0aXZlKHN0cmluZyAkZW5kUGF0aCwgc3RyaW5nICRzdGFydFBhdGgpCnsKaWYgKCEkdGhpcy0+aXNBYnNvbHV0ZVBhdGgoJHN0YXJ0UGF0aCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgc3RhcnQgcGF0aCAiJXMiIGlzIG5vdCBhYnNvbHV0ZS4nLCAkc3RhcnRQYXRoKSk7Cn0KCmlmICghJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCRlbmRQYXRoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBlbmQgcGF0aCAiJXMiIGlzIG5vdCBhYnNvbHV0ZS4nLCAkZW5kUGF0aCkpOwp9CgoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRlbmRQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZW5kUGF0aCk7CiRzdGFydFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRzdGFydFBhdGgpOwp9Cgokc3BsaXREcml2ZUxldHRlciA9IGZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gKFxzdHJsZW4oJHBhdGgpID4gMiAmJiAnOicgPT09ICRwYXRoWzFdICYmICcvJyA9PT0gJHBhdGhbMl0gJiYgY3R5cGVfYWxwaGEoJHBhdGhbMF0pKQo/IFtzdWJzdHIoJHBhdGgsIDIpLCBzdHJ0b3VwcGVyKCRwYXRoWzBdKV0KOiBbJHBhdGgsIG51bGxdOwp9OwoKJHNwbGl0UGF0aCA9IGZ1bmN0aW9uICgkcGF0aCkgewokcmVzdWx0ID0gW107Cgpmb3JlYWNoIChleHBsb2RlKCcvJywgdHJpbSgkcGF0aCwgJy8nKSkgYXMgJHNlZ21lbnQpIHsKaWYgKCcuLicgPT09ICRzZWdtZW50KSB7CmFycmF5X3BvcCgkcmVzdWx0KTsKfSBlbHNlaWYgKCcuJyAhPT0gJHNlZ21lbnQgJiYgJycgIT09ICRzZWdtZW50KSB7CiRyZXN1bHRbXSA9ICRzZWdtZW50Owp9Cn0KCnJldHVybiAkcmVzdWx0Owp9OwoKWyRlbmRQYXRoLCAkZW5kRHJpdmVMZXR0ZXJdID0gJHNwbGl0RHJpdmVMZXR0ZXIoJGVuZFBhdGgpOwpbJHN0YXJ0UGF0aCwgJHN0YXJ0RHJpdmVMZXR0ZXJdID0gJHNwbGl0RHJpdmVMZXR0ZXIoJHN0YXJ0UGF0aCk7Cgokc3RhcnRQYXRoQXJyID0gJHNwbGl0UGF0aCgkc3RhcnRQYXRoKTsKJGVuZFBhdGhBcnIgPSAkc3BsaXRQYXRoKCRlbmRQYXRoKTsKCmlmICgkZW5kRHJpdmVMZXR0ZXIgJiYgJHN0YXJ0RHJpdmVMZXR0ZXIgJiYgJGVuZERyaXZlTGV0dGVyICE9ICRzdGFydERyaXZlTGV0dGVyKSB7CgpyZXR1cm4gJGVuZERyaXZlTGV0dGVyLic6LycuKCRlbmRQYXRoQXJyID8gaW1wbG9kZSgnLycsICRlbmRQYXRoQXJyKS4nLycgOiAnJyk7Cn0KCgokaW5kZXggPSAwOwp3aGlsZSAoaXNzZXQoJHN0YXJ0UGF0aEFyclskaW5kZXhdKSAmJiBpc3NldCgkZW5kUGF0aEFyclskaW5kZXhdKSAmJiAkc3RhcnRQYXRoQXJyWyRpbmRleF0gPT09ICRlbmRQYXRoQXJyWyRpbmRleF0pIHsKKyskaW5kZXg7Cn0KCgppZiAoMSA9PT0gXGNvdW50KCRzdGFydFBhdGhBcnIpICYmICcnID09PSAkc3RhcnRQYXRoQXJyWzBdKSB7CiRkZXB0aCA9IDA7Cn0gZWxzZSB7CiRkZXB0aCA9IFxjb3VudCgkc3RhcnRQYXRoQXJyKSAtICRpbmRleDsKfQoKCiR0cmF2ZXJzZXIgPSBzdHJfcmVwZWF0KCcuLi8nLCAkZGVwdGgpOwoKJGVuZFBhdGhSZW1haW5kZXIgPSBpbXBsb2RlKCcvJywgXGFycmF5X3NsaWNlKCRlbmRQYXRoQXJyLCAkaW5kZXgpKTsKCgokcmVsYXRpdmVQYXRoID0gJHRyYXZlcnNlci4oJycgIT09ICRlbmRQYXRoUmVtYWluZGVyID8gJGVuZFBhdGhSZW1haW5kZXIuJy8nIDogJycpOwoKcmV0dXJuICcnID09PSAkcmVsYXRpdmVQYXRoID8gJy4vJyA6ICRyZWxhdGl2ZVBhdGg7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1pcnJvcihzdHJpbmcgJG9yaWdpbkRpciwgc3RyaW5nICR0YXJnZXREaXIsIFxUcmF2ZXJzYWJsZSAkaXRlcmF0b3IgPSBudWxsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0YXJnZXREaXIgPSBydHJpbSgkdGFyZ2V0RGlyLCAnL1xcJyk7CiRvcmlnaW5EaXIgPSBydHJpbSgkb3JpZ2luRGlyLCAnL1xcJyk7CiRvcmlnaW5EaXJMZW4gPSBcc3RybGVuKCRvcmlnaW5EaXIpOwoKaWYgKCEkdGhpcy0+ZXhpc3RzKCRvcmlnaW5EaXIpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdUaGUgb3JpZ2luIGRpcmVjdG9yeSBzcGVjaWZpZWQgIiVzIiB3YXMgbm90IGZvdW5kLicsICRvcmlnaW5EaXIpLCAwLCBudWxsLCAkb3JpZ2luRGlyKTsKfQoKCmlmICgkdGhpcy0+ZXhpc3RzKCR0YXJnZXREaXIpICYmIGlzc2V0KCRvcHRpb25zWydkZWxldGUnXSkgJiYgJG9wdGlvbnNbJ2RlbGV0ZSddKSB7CiRkZWxldGVJdGVyYXRvciA9ICRpdGVyYXRvcjsKaWYgKG51bGwgPT09ICRkZWxldGVJdGVyYXRvcikgewokZmxhZ3MgPSBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFM7CiRkZWxldGVJdGVyYXRvciA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCR0YXJnZXREaXIsICRmbGFncyksIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cn0KJHRhcmdldERpckxlbiA9IFxzdHJsZW4oJHRhcmdldERpcik7CmZvcmVhY2ggKCRkZWxldGVJdGVyYXRvciBhcyAkZmlsZSkgewokb3JpZ2luID0gJG9yaWdpbkRpci5zdWJzdHIoJGZpbGUtPmdldFBhdGhuYW1lKCksICR0YXJnZXREaXJMZW4pOwppZiAoISR0aGlzLT5leGlzdHMoJG9yaWdpbikpIHsKJHRoaXMtPnJlbW92ZSgkZmlsZSk7Cn0KfQp9CgokY29weU9uV2luZG93cyA9ICRvcHRpb25zWydjb3B5X29uX3dpbmRvd3MnXSA/PyBmYWxzZTsKCmlmIChudWxsID09PSAkaXRlcmF0b3IpIHsKJGZsYWdzID0gJGNvcHlPbldpbmRvd3MgPyBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMgfCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpGT0xMT1dfU1lNTElOS1MgOiBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFM7CiRpdGVyYXRvciA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRvcmlnaW5EaXIsICRmbGFncyksIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKfQoKJHRoaXMtPm1rZGlyKCR0YXJnZXREaXIpOwokZmlsZXNDcmVhdGVkV2hpbGVNaXJyb3JpbmcgPSBbXTsKCmZvcmVhY2ggKCRpdGVyYXRvciBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmdldFBhdGhuYW1lKCkgPT09ICR0YXJnZXREaXIgfHwgJGZpbGUtPmdldFJlYWxQYXRoKCkgPT09ICR0YXJnZXREaXIgfHwgaXNzZXQoJGZpbGVzQ3JlYXRlZFdoaWxlTWlycm9yaW5nWyRmaWxlLT5nZXRSZWFsUGF0aCgpXSkpIHsKY29udGludWU7Cn0KCiR0YXJnZXQgPSAkdGFyZ2V0RGlyLnN1YnN0cigkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJG9yaWdpbkRpckxlbik7CiRmaWxlc0NyZWF0ZWRXaGlsZU1pcnJvcmluZ1skdGFyZ2V0XSA9IHRydWU7CgppZiAoISRjb3B5T25XaW5kb3dzICYmIGlzX2xpbmsoJGZpbGUpKSB7CiR0aGlzLT5zeW1saW5rKCRmaWxlLT5nZXRMaW5rVGFyZ2V0KCksICR0YXJnZXQpOwp9IGVsc2VpZiAoaXNfZGlyKCRmaWxlKSkgewokdGhpcy0+bWtkaXIoJHRhcmdldCk7Cn0gZWxzZWlmIChpc19maWxlKCRmaWxlKSkgewokdGhpcy0+Y29weSgkZmlsZSwgJHRhcmdldCwgJG9wdGlvbnNbJ292ZXJyaWRlJ10gPz8gZmFsc2UpOwp9IGVsc2Ugewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIGd1ZXNzICIlcyIgZmlsZSB0eXBlLicsICRmaWxlKSwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBYnNvbHV0ZVBhdGgoc3RyaW5nICRmaWxlKQp7CnJldHVybiAnJyAhPT0gJGZpbGUgJiYgKHN0cnNwbigkZmlsZSwgJy9cXCcsIDAsIDEpCnx8IChcc3RybGVuKCRmaWxlKSA+IDMgJiYgY3R5cGVfYWxwaGEoJGZpbGVbMF0pCiYmICc6JyA9PT0gJGZpbGVbMV0KJiYgc3Ryc3BuKCRmaWxlLCAnL1xcJywgMiwgMSkKKQp8fCBudWxsICE9PSBwYXJzZV91cmwoJGZpbGUsIFxQSFBfVVJMX1NDSEVNRSkKKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRlbXBuYW0oc3RyaW5nICRkaXIsIHN0cmluZyAkcHJlZml4KQp7CiRzdWZmaXggPSBcZnVuY19udW1fYXJncygpID4gMiA/IGZ1bmNfZ2V0X2FyZygyKSA6ICcnOwpbJHNjaGVtZSwgJGhpZXJhcmNoeV0gPSAkdGhpcy0+Z2V0U2NoZW1lQW5kSGllcmFyY2h5KCRkaXIpOwoKCmlmICgobnVsbCA9PT0gJHNjaGVtZSB8fCAnZmlsZScgPT09ICRzY2hlbWUgfHwgJ2dzJyA9PT0gJHNjaGVtZSkgJiYgJycgPT09ICRzdWZmaXgpIHsKCmlmICgkdG1wRmlsZSA9IHNlbGY6OmJveCgndGVtcG5hbScsICRoaWVyYXJjaHksICRwcmVmaXgpKSB7CmlmIChudWxsICE9PSAkc2NoZW1lICYmICdncycgIT09ICRzY2hlbWUpIHsKcmV0dXJuICRzY2hlbWUuJzovLycuJHRtcEZpbGU7Cn0KCnJldHVybiAkdG1wRmlsZTsKfQoKdGhyb3cgbmV3IElPRXhjZXB0aW9uKCdBIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiAnLnNlbGY6OiRsYXN0RXJyb3IpOwp9CgoKZm9yICgkaSA9IDA7ICRpIDwgMTA7ICsrJGkpIHsKCiR0bXBGaWxlID0gJGRpci4nLycuJHByZWZpeC51bmlxaWQobXRfcmFuZCgpLCB0cnVlKS4kc3VmZml4OwoKCgppZiAoISRoYW5kbGUgPSBzZWxmOjpib3goJ2ZvcGVuJywgJHRtcEZpbGUsICd4KycpKSB7CmNvbnRpbnVlOwp9CgoKc2VsZjo6Ym94KCdmY2xvc2UnLCAkaGFuZGxlKTsKCnJldHVybiAkdG1wRmlsZTsKfQoKdGhyb3cgbmV3IElPRXhjZXB0aW9uKCdBIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiAnLnNlbGY6OiRsYXN0RXJyb3IpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGR1bXBGaWxlKHN0cmluZyAkZmlsZW5hbWUsICRjb250ZW50KQp7CmlmIChcaXNfYXJyYXkoJGNvbnRlbnQpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIHN0cmluZyBvciByZXNvdXJjZSwgYXJyYXkgZ2l2ZW4uJywgX19NRVRIT0RfXykpOwp9CgokZGlyID0gXGRpcm5hbWUoJGZpbGVuYW1lKTsKCmlmIChpc19saW5rKCRmaWxlbmFtZSkgJiYgJGxpbmtUYXJnZXQgPSAkdGhpcy0+cmVhZGxpbmsoJGZpbGVuYW1lKSkgewokdGhpcy0+ZHVtcEZpbGUoUGF0aDo6bWFrZUFic29sdXRlKCRsaW5rVGFyZ2V0LCAkZGlyKSwgJGNvbnRlbnQpOwoKcmV0dXJuOwp9CgppZiAoIWlzX2RpcigkZGlyKSkgewokdGhpcy0+bWtkaXIoJGRpcik7Cn0KCgoKJHRtcEZpbGUgPSAkdGhpcy0+dGVtcG5hbSgkZGlyLCBiYXNlbmFtZSgkZmlsZW5hbWUpKTsKCnRyeSB7CmlmIChmYWxzZSA9PT0gc2VsZjo6Ym94KCdmaWxlX3B1dF9jb250ZW50cycsICR0bXBGaWxlLCAkY29udGVudCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byB3cml0ZSBmaWxlICIlcyI6ICcsICRmaWxlbmFtZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGVuYW1lKTsKfQoKc2VsZjo6Ym94KCdjaG1vZCcsICR0bXBGaWxlLCBmaWxlX2V4aXN0cygkZmlsZW5hbWUpID8gZmlsZXBlcm1zKCRmaWxlbmFtZSkgOiAwNjY2ICYgfnVtYXNrKCkpOwoKJHRoaXMtPnJlbmFtZSgkdG1wRmlsZSwgJGZpbGVuYW1lLCB0cnVlKTsKfSBmaW5hbGx5IHsKaWYgKGZpbGVfZXhpc3RzKCR0bXBGaWxlKSkgewpzZWxmOjpib3goJ3VubGluaycsICR0bXBGaWxlKTsKfQp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZFRvRmlsZShzdHJpbmcgJGZpbGVuYW1lLCAkY29udGVudCkKewppZiAoXGlzX2FycmF5KCRjb250ZW50KSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBzdHJpbmcgb3IgcmVzb3VyY2UsIGFycmF5IGdpdmVuLicsIF9fTUVUSE9EX18pKTsKfQoKJGRpciA9IFxkaXJuYW1lKCRmaWxlbmFtZSk7CgppZiAoIWlzX2RpcigkZGlyKSkgewokdGhpcy0+bWtkaXIoJGRpcik7Cn0KCiRsb2NrID0gXGZ1bmNfbnVtX2FyZ3MoKSA+IDIgJiYgZnVuY19nZXRfYXJnKDIpOwoKaWYgKGZhbHNlID09PSBzZWxmOjpib3goJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJGZpbGVuYW1lLCAkY29udGVudCwgXEZJTEVfQVBQRU5EIHwgKCRsb2NrID8gXExPQ0tfRVggOiAwKSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byB3cml0ZSBmaWxlICIlcyI6ICcsICRmaWxlbmFtZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGVuYW1lKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHRvSXRlcmFibGUoJGZpbGVzKTogaXRlcmFibGUKewpyZXR1cm4gaXNfaXRlcmFibGUoJGZpbGVzKSA/ICRmaWxlcyA6IFskZmlsZXNdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFNjaGVtZUFuZEhpZXJhcmNoeShzdHJpbmcgJGZpbGVuYW1lKTogYXJyYXkKewokY29tcG9uZW50cyA9IGV4cGxvZGUoJzovLycsICRmaWxlbmFtZSwgMik7CgpyZXR1cm4gMiA9PT0gXGNvdW50KCRjb21wb25lbnRzKSA/IFskY29tcG9uZW50c1swXSwgJGNvbXBvbmVudHNbMV1dIDogW251bGwsICRjb21wb25lbnRzWzBdXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0RnVuY3Rpb25FeGlzdHMoc3RyaW5nICRmdW5jKTogdm9pZAp7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygkZnVuYykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBwZXJmb3JtIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIGJlY2F1c2UgdGhlICIlcygpIiBmdW5jdGlvbiBoYXMgYmVlbiBkaXNhYmxlZC4nLCAkZnVuYykpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYm94KHN0cmluZyAkZnVuYywgLi4uJGFyZ3MpCnsKc2VsZjo6YXNzZXJ0RnVuY3Rpb25FeGlzdHMoJGZ1bmMpOwoKc2VsZjo6JGxhc3RFcnJvciA9IG51bGw7CnNldF9lcnJvcl9oYW5kbGVyKF9fQ0xBU1NfXy4nOjpoYW5kbGVFcnJvcicpOwp0cnkgewpyZXR1cm4gJGZ1bmMoLi4uJGFyZ3MpOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGludCAkdHlwZSwgc3RyaW5nICRtc2cpCnsKc2VsZjo6JGxhc3RFcnJvciA9ICRtc2c7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDA0LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgpmaW5hbCBjbGFzcyBQYXRoCnsKCgoKcHJpdmF0ZSBjb25zdCBDTEVBTlVQX1RIUkVTSE9MRCA9IDEyNTA7CgoKCgpwcml2YXRlIGNvbnN0IENMRUFOVVBfU0laRSA9IDEwMDA7CgoKCgoKCnByaXZhdGUgc3RhdGljICRidWZmZXIgPSBbXTsKCgoKCnByaXZhdGUgc3RhdGljICRidWZmZXJTaXplID0gMDsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYW5vbmljYWxpemUoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCgoKCmlmIChpc3NldChzZWxmOjokYnVmZmVyWyRwYXRoXSkpIHsKcmV0dXJuIHNlbGY6OiRidWZmZXJbJHBhdGhdOwp9CgoKaWYgKCd+JyA9PT0gJHBhdGhbMF0pIHsKJHBhdGggPSBzZWxmOjpnZXRIb21lRGlyZWN0b3J5KCkuc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHBhdGggPSBzZWxmOjpub3JtYWxpemUoJHBhdGgpOwoKWyRyb290LCAkcGF0aFdpdGhvdXRSb290XSA9IHNlbGY6OnNwbGl0KCRwYXRoKTsKCiRjYW5vbmljYWxQYXJ0cyA9IHNlbGY6OmZpbmRDYW5vbmljYWxQYXJ0cygkcm9vdCwgJHBhdGhXaXRob3V0Um9vdCk7CgoKc2VsZjo6JGJ1ZmZlclskcGF0aF0gPSAkY2Fub25pY2FsUGF0aCA9ICRyb290LmltcGxvZGUoJy8nLCAkY2Fub25pY2FsUGFydHMpOworK3NlbGY6OiRidWZmZXJTaXplOwoKCmlmIChzZWxmOjokYnVmZmVyU2l6ZSA+IHNlbGY6OkNMRUFOVVBfVEhSRVNIT0xEKSB7CnNlbGY6OiRidWZmZXIgPSBcYXJyYXlfc2xpY2Uoc2VsZjo6JGJ1ZmZlciwgLXNlbGY6OkNMRUFOVVBfU0laRSwgbnVsbCwgdHJ1ZSk7CnNlbGY6OiRidWZmZXJTaXplID0gc2VsZjo6Q0xFQU5VUF9TSVpFOwp9CgpyZXR1cm4gJGNhbm9uaWNhbFBhdGg7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKcmV0dXJuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGlyZWN0b3J5KHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgokcGF0aCA9IHNlbGY6OmNhbm9uaWNhbGl6ZSgkcGF0aCk7CgoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgewokc2NoZW1lID0gc3Vic3RyKCRwYXRoLCAwLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKJHBhdGggPSBzdWJzdHIoJHBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokc2NoZW1lID0gJyc7Cn0KCmlmIChmYWxzZSA9PT0gJGRpclNlcGFyYXRvclBvc2l0aW9uID0gc3RycnBvcygkcGF0aCwgJy8nKSkgewpyZXR1cm4gJyc7Cn0KCgppZiAoMCA9PT0gJGRpclNlcGFyYXRvclBvc2l0aW9uKSB7CnJldHVybiAkc2NoZW1lLicvJzsKfQoKCmlmICgyID09PSAkZGlyU2VwYXJhdG9yUG9zaXRpb24gJiYgY3R5cGVfYWxwaGEoJHBhdGhbMF0pICYmICc6JyA9PT0gJHBhdGhbMV0pIHsKcmV0dXJuICRzY2hlbWUuc3Vic3RyKCRwYXRoLCAwLCAzKTsKfQoKcmV0dXJuICRzY2hlbWUuc3Vic3RyKCRwYXRoLCAwLCAkZGlyU2VwYXJhdG9yUG9zaXRpb24pOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SG9tZURpcmVjdG9yeSgpOiBzdHJpbmcKewoKaWYgKGdldGVudignSE9NRScpKSB7CnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoZ2V0ZW52KCdIT01FJykpOwp9CgoKaWYgKGdldGVudignSE9NRURSSVZFJykgJiYgZ2V0ZW52KCdIT01FUEFUSCcpKSB7CnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoZ2V0ZW52KCdIT01FRFJJVkUnKS5nZXRlbnYoJ0hPTUVQQVRIJykpOwp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgdGhlIGhvbWUgZGlyZWN0b3J5IHBhdGg6IFlvdXIgZW52aXJvbm1lbnQgb3Igb3BlcmF0aW5nIHN5c3RlbSBpc24ndCBzdXBwb3J0ZWQuIik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSb290KHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgewokc2NoZW1lID0gc3Vic3RyKCRwYXRoLCAwLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKJHBhdGggPSBzdWJzdHIoJHBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokc2NoZW1lID0gJyc7Cn0KCiRmaXJzdENoYXJhY3RlciA9ICRwYXRoWzBdOwoKCmlmICgnLycgPT09ICRmaXJzdENoYXJhY3RlciB8fCAnXFwnID09PSAkZmlyc3RDaGFyYWN0ZXIpIHsKcmV0dXJuICRzY2hlbWUuJy8nOwp9CgokbGVuZ3RoID0gXHN0cmxlbigkcGF0aCk7CgoKaWYgKCRsZW5ndGggPiAxICYmICc6JyA9PT0gJHBhdGhbMV0gJiYgY3R5cGVfYWxwaGEoJGZpcnN0Q2hhcmFjdGVyKSkgewoKaWYgKDIgPT09ICRsZW5ndGgpIHsKcmV0dXJuICRzY2hlbWUuJHBhdGguJy8nOwp9CgoKaWYgKCcvJyA9PT0gJHBhdGhbMl0gfHwgJ1xcJyA9PT0gJHBhdGhbMl0pIHsKcmV0dXJuICRzY2hlbWUuJGZpcnN0Q2hhcmFjdGVyLiRwYXRoWzFdLicvJzsKfQp9CgpyZXR1cm4gJyc7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uKHN0cmluZyAkcGF0aCwgc3RyaW5nICRleHRlbnNpb24gPSBudWxsKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCmlmIChudWxsICE9PSAkZXh0ZW5zaW9uKSB7CgpyZXR1cm4gcnRyaW0oYmFzZW5hbWUoJHBhdGgsICRleHRlbnNpb24pLCAnLicpOwp9CgpyZXR1cm4gcGF0aGluZm8oJHBhdGgsIFxQQVRISU5GT19GSUxFTkFNRSk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRFeHRlbnNpb24oc3RyaW5nICRwYXRoLCBib29sICRmb3JjZUxvd2VyQ2FzZSA9IGZhbHNlKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCiRleHRlbnNpb24gPSBwYXRoaW5mbygkcGF0aCwgXFBBVEhJTkZPX0VYVEVOU0lPTik7CgppZiAoJGZvcmNlTG93ZXJDYXNlKSB7CiRleHRlbnNpb24gPSBzZWxmOjp0b0xvd2VyKCRleHRlbnNpb24pOwp9CgpyZXR1cm4gJGV4dGVuc2lvbjsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0V4dGVuc2lvbihzdHJpbmcgJHBhdGgsICRleHRlbnNpb25zID0gbnVsbCwgYm9vbCAkaWdub3JlQ2FzZSA9IGZhbHNlKTogYm9vbAp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuIGZhbHNlOwp9CgokYWN0dWFsRXh0ZW5zaW9uID0gc2VsZjo6Z2V0RXh0ZW5zaW9uKCRwYXRoLCAkaWdub3JlQ2FzZSk7CgoKaWYgKFtdID09PSAkZXh0ZW5zaW9ucyB8fCBudWxsID09PSAkZXh0ZW5zaW9ucykgewpyZXR1cm4gJycgIT09ICRhY3R1YWxFeHRlbnNpb247Cn0KCmlmIChcaXNfc3RyaW5nKCRleHRlbnNpb25zKSkgewokZXh0ZW5zaW9ucyA9IFskZXh0ZW5zaW9uc107Cn0KCmZvcmVhY2ggKCRleHRlbnNpb25zIGFzICRrZXkgPT4gJGV4dGVuc2lvbikgewppZiAoJGlnbm9yZUNhc2UpIHsKJGV4dGVuc2lvbiA9IHNlbGY6OnRvTG93ZXIoJGV4dGVuc2lvbik7Cn0KCgokZXh0ZW5zaW9uc1ska2V5XSA9IGx0cmltKCRleHRlbnNpb24sICcuJyk7Cn0KCnJldHVybiBcaW5fYXJyYXkoJGFjdHVhbEV4dGVuc2lvbiwgJGV4dGVuc2lvbnMsIHRydWUpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hhbmdlRXh0ZW5zaW9uKHN0cmluZyAkcGF0aCwgc3RyaW5nICRleHRlbnNpb24pOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKJGFjdHVhbEV4dGVuc2lvbiA9IHNlbGY6OmdldEV4dGVuc2lvbigkcGF0aCk7CiRleHRlbnNpb24gPSBsdHJpbSgkZXh0ZW5zaW9uLCAnLicpOwoKCmlmICgnLycgPT09IHN1YnN0cigkcGF0aCwgLTEpKSB7CnJldHVybiAkcGF0aDsKfQoKCmlmIChlbXB0eSgkYWN0dWFsRXh0ZW5zaW9uKSkgewpyZXR1cm4gJHBhdGguKCcuJyA9PT0gc3Vic3RyKCRwYXRoLCAtMSkgPyAnJyA6ICcuJykuJGV4dGVuc2lvbjsKfQoKcmV0dXJuIHN1YnN0cigkcGF0aCwgMCwgLVxzdHJsZW4oJGFjdHVhbEV4dGVuc2lvbikpLiRleHRlbnNpb247Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBYnNvbHV0ZShzdHJpbmcgJHBhdGgpOiBib29sCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoZmFsc2UgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJzovLycpKSB7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfQoKJGZpcnN0Q2hhcmFjdGVyID0gJHBhdGhbMF07CgoKaWYgKCcvJyA9PT0gJGZpcnN0Q2hhcmFjdGVyIHx8ICdcXCcgPT09ICRmaXJzdENoYXJhY3RlcikgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChcc3RybGVuKCRwYXRoKSA+IDEgJiYgY3R5cGVfYWxwaGEoJGZpcnN0Q2hhcmFjdGVyKSAmJiAnOicgPT09ICRwYXRoWzFdKSB7CgppZiAoMiA9PT0gXHN0cmxlbigkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoJy8nID09PSAkcGF0aFsyXSB8fCAnXFwnID09PSAkcGF0aFsyXSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNSZWxhdGl2ZShzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuICFzZWxmOjppc0Fic29sdXRlKCRwYXRoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFrZUFic29sdXRlKHN0cmluZyAkcGF0aCwgc3RyaW5nICRiYXNlUGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJGJhc2VQYXRoKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGJhc2UgcGF0aCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4gR290OiAiJXMiLicsICRiYXNlUGF0aCkpOwp9CgppZiAoIXNlbGY6OmlzQWJzb2x1dGUoJGJhc2VQYXRoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBiYXNlIHBhdGggIiVzIiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4nLCAkYmFzZVBhdGgpKTsKfQoKaWYgKHNlbGY6OmlzQWJzb2x1dGUoJHBhdGgpKSB7CnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoJHBhdGgpOwp9CgppZiAoZmFsc2UgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkYmFzZVBhdGgsICc6Ly8nKSkgewokc2NoZW1lID0gc3Vic3RyKCRiYXNlUGF0aCwgMCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7CiRiYXNlUGF0aCA9IHN1YnN0cigkYmFzZVBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokc2NoZW1lID0gJyc7Cn0KCnJldHVybiAkc2NoZW1lLnNlbGY6OmNhbm9uaWNhbGl6ZShydHJpbSgkYmFzZVBhdGgsICcvXFwnKS4nLycuJHBhdGgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFrZVJlbGF0aXZlKHN0cmluZyAkcGF0aCwgc3RyaW5nICRiYXNlUGF0aCk6IHN0cmluZwp7CiRwYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRwYXRoKTsKJGJhc2VQYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRiYXNlUGF0aCk7CgpbJHJvb3QsICRyZWxhdGl2ZVBhdGhdID0gc2VsZjo6c3BsaXQoJHBhdGgpOwpbJGJhc2VSb290LCAkcmVsYXRpdmVCYXNlUGF0aF0gPSBzZWxmOjpzcGxpdCgkYmFzZVBhdGgpOwoKCgoKaWYgKCcnID09PSAkcm9vdCAmJiAnJyAhPT0gJGJhc2VSb290KSB7CgppZiAoJycgPT09ICRyZWxhdGl2ZUJhc2VQYXRoKSB7CiRyZWxhdGl2ZVBhdGggPSBsdHJpbSgkcmVsYXRpdmVQYXRoLCAnLi9cXCcpOwp9CgpyZXR1cm4gJHJlbGF0aXZlUGF0aDsKfQoKCgppZiAoJycgIT09ICRyb290ICYmICcnID09PSAkYmFzZVJvb3QpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgYWJzb2x1dGUgcGF0aCAiJXMiIGNhbm5vdCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSByZWxhdGl2ZSBwYXRoICIlcyIuIFlvdSBzaG91bGQgcHJvdmlkZSBhbiBhYnNvbHV0ZSBiYXNlIHBhdGggaW5zdGVhZC4nLCAkcGF0aCwgJGJhc2VQYXRoKSk7Cn0KCgppZiAoJGJhc2VSb290ICYmICRyb290ICE9PSAkYmFzZVJvb3QpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcGF0aCAiJXMiIGNhbm5vdCBiZSBtYWRlIHJlbGF0aXZlIHRvICIlcyIsIGJlY2F1c2UgdGhleSBoYXZlIGRpZmZlcmVudCByb290cyAoIiVzIiBhbmQgIiVzIikuJywgJHBhdGgsICRiYXNlUGF0aCwgJHJvb3QsICRiYXNlUm9vdCkpOwp9CgppZiAoJycgPT09ICRyZWxhdGl2ZUJhc2VQYXRoKSB7CnJldHVybiAkcmVsYXRpdmVQYXRoOwp9CgoKJHBhcnRzID0gZXhwbG9kZSgnLycsICRyZWxhdGl2ZVBhdGgpOwokYmFzZVBhcnRzID0gZXhwbG9kZSgnLycsICRyZWxhdGl2ZUJhc2VQYXRoKTsKJGRvdERvdFByZWZpeCA9ICcnOwoKCgokbWF0Y2ggPSB0cnVlOwoKZm9yZWFjaCAoJGJhc2VQYXJ0cyBhcyAkaW5kZXggPT4gJGJhc2VQYXJ0KSB7CmlmICgkbWF0Y2ggJiYgaXNzZXQoJHBhcnRzWyRpbmRleF0pICYmICRiYXNlUGFydCA9PT0gJHBhcnRzWyRpbmRleF0pIHsKdW5zZXQoJHBhcnRzWyRpbmRleF0pOwoKY29udGludWU7Cn0KCiRtYXRjaCA9IGZhbHNlOwokZG90RG90UHJlZml4IC49ICcuLi8nOwp9CgpyZXR1cm4gcnRyaW0oJGRvdERvdFByZWZpeC5pbXBsb2RlKCcvJywgJHBhcnRzKSwgJy8nKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0xvY2FsKHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gJycgIT09ICRwYXRoICYmIGZhbHNlID09PSBzdHJwb3MoJHBhdGgsICc6Ly8nKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRMb25nZXN0Q29tbW9uQmFzZVBhdGgoc3RyaW5nIC4uLiRwYXRocyk6ID9zdHJpbmcKewpbJGJwUm9vdCwgJGJhc2VQYXRoXSA9IHNlbGY6OnNwbGl0KHNlbGY6OmNhbm9uaWNhbGl6ZShyZXNldCgkcGF0aHMpKSk7Cgpmb3IgKG5leHQoJHBhdGhzKTsgbnVsbCAhPT0ga2V5KCRwYXRocykgJiYgJycgIT09ICRiYXNlUGF0aDsgbmV4dCgkcGF0aHMpKSB7Clskcm9vdCwgJHBhdGhdID0gc2VsZjo6c3BsaXQoc2VsZjo6Y2Fub25pY2FsaXplKGN1cnJlbnQoJHBhdGhzKSkpOwoKCgppZiAoJHJvb3QgIT09ICRicFJvb3QpIHsKcmV0dXJuIG51bGw7Cn0KCgp3aGlsZSAodHJ1ZSkgewppZiAoJy4nID09PSAkYmFzZVBhdGgpIHsKCiRiYXNlUGF0aCA9ICcnOwoKCmNvbnRpbnVlIDI7Cn0KCgoKaWYgKDAgPT09IHN0cnBvcygkcGF0aC4nLycsICRiYXNlUGF0aC4nLycpKSB7Cgpjb250aW51ZSAyOwp9CgokYmFzZVBhdGggPSBcZGlybmFtZSgkYmFzZVBhdGgpOwp9Cn0KCnJldHVybiAkYnBSb290LiRiYXNlUGF0aDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBqb2luKHN0cmluZyAuLi4kcGF0aHMpOiBzdHJpbmcKewokZmluYWxQYXRoID0gbnVsbDsKJHdhc1NjaGVtZSA9IGZhbHNlOwoKZm9yZWFjaCAoJHBhdGhzIGFzICRwYXRoKSB7CmlmICgnJyA9PT0gJHBhdGgpIHsKY29udGludWU7Cn0KCmlmIChudWxsID09PSAkZmluYWxQYXRoKSB7CgokZmluYWxQYXRoID0gJHBhdGg7CiR3YXNTY2hlbWUgPSAoZmFsc2UgIT09IHN0cnBvcygkcGF0aCwgJzovLycpKTsKY29udGludWU7Cn0KCgppZiAoIVxpbl9hcnJheShzdWJzdHIoJGZpbmFsUGF0aCwgLTEpLCBbJy8nLCAnXFwnXSkpIHsKJGZpbmFsUGF0aCAuPSAnLyc7Cn0KCgokZmluYWxQYXRoIC49ICR3YXNTY2hlbWUgPyAkcGF0aCA6IGx0cmltKCRwYXRoLCAnLycpOwokd2FzU2NoZW1lID0gZmFsc2U7Cn0KCmlmIChudWxsID09PSAkZmluYWxQYXRoKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuIHNlbGY6OmNhbm9uaWNhbGl6ZSgkZmluYWxQYXRoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQmFzZVBhdGgoc3RyaW5nICRiYXNlUGF0aCwgc3RyaW5nICRvZlBhdGgpOiBib29sCnsKJGJhc2VQYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRiYXNlUGF0aCk7CiRvZlBhdGggPSBzZWxmOjpjYW5vbmljYWxpemUoJG9mUGF0aCk7CgoKCgoKCnJldHVybiAwID09PSBzdHJwb3MoJG9mUGF0aC4nLycsIHJ0cmltKCRiYXNlUGF0aCwgJy8nKS4nLycpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmaW5kQ2Fub25pY2FsUGFydHMoc3RyaW5nICRyb290LCBzdHJpbmcgJHBhdGhXaXRob3V0Um9vdCk6IGFycmF5CnsKJHBhcnRzID0gZXhwbG9kZSgnLycsICRwYXRoV2l0aG91dFJvb3QpOwoKJGNhbm9uaWNhbFBhcnRzID0gW107CgoKZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KSB7CmlmICgnLicgPT09ICRwYXJ0IHx8ICcnID09PSAkcGFydCkgewpjb250aW51ZTsKfQoKCgppZiAoJy4uJyA9PT0gJHBhcnQgJiYgXGNvdW50KCRjYW5vbmljYWxQYXJ0cykgPiAwICYmICcuLicgIT09ICRjYW5vbmljYWxQYXJ0c1tcY291bnQoJGNhbm9uaWNhbFBhcnRzKSAtIDFdKSB7CmFycmF5X3BvcCgkY2Fub25pY2FsUGFydHMpOwoKY29udGludWU7Cn0KCgppZiAoJy4uJyAhPT0gJHBhcnQgfHwgJycgPT09ICRyb290KSB7CiRjYW5vbmljYWxQYXJ0c1tdID0gJHBhcnQ7Cn0KfQoKcmV0dXJuICRjYW5vbmljYWxQYXJ0czsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzcGxpdChzdHJpbmcgJHBhdGgpOiBhcnJheQp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuIFsnJywgJyddOwp9CgoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgewokcm9vdCA9IHN1YnN0cigkcGF0aCwgMCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfSBlbHNlIHsKJHJvb3QgPSAnJzsKfQoKJGxlbmd0aCA9IFxzdHJsZW4oJHBhdGgpOwoKCmlmICgwID09PSBzdHJwb3MoJHBhdGgsICcvJykpIHsKJHJvb3QgLj0gJy8nOwokcGF0aCA9ICRsZW5ndGggPiAxID8gc3Vic3RyKCRwYXRoLCAxKSA6ICcnOwp9IGVsc2VpZiAoJGxlbmd0aCA+IDEgJiYgY3R5cGVfYWxwaGEoJHBhdGhbMF0pICYmICc6JyA9PT0gJHBhdGhbMV0pIHsKaWYgKDIgPT09ICRsZW5ndGgpIHsKCiRyb290IC49ICRwYXRoLicvJzsKJHBhdGggPSAnJzsKfSBlbHNlaWYgKCcvJyA9PT0gJHBhdGhbMl0pIHsKCiRyb290IC49IHN1YnN0cigkcGF0aCwgMCwgMyk7CiRwYXRoID0gJGxlbmd0aCA+IDMgPyBzdWJzdHIoJHBhdGgsIDMpIDogJyc7Cn0KfQoKcmV0dXJuIFskcm9vdCwgJHBhdGhdOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0b0xvd2VyKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKaWYgKGZhbHNlICE9PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIG1iX3N0cnRvbG93ZXIoJHN0cmluZywgJGVuY29kaW5nKTsKfQoKcmV0dXJuIHN0cnRvbG93ZXIoJHN0cmluZyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yOwoKCgoKY2xhc3MgQ29tcGFyYXRvcgp7CnByaXZhdGUgJHRhcmdldDsKcHJpdmF0ZSAkb3BlcmF0b3IgPSAnPT0nOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdGFyZ2V0ID0gbnVsbCwgc3RyaW5nICRvcGVyYXRvciA9ICc9PScpCnsKaWYgKG51bGwgPT09ICR0YXJnZXQpIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9maW5kZXInLCAnNS40JywgJ0NvbnN0cnVjdGluZyBhICIlcyIgd2l0aG91dCBzZXR0aW5nICIkdGFyZ2V0IiBpcyBkZXByZWNhdGVkLicsIF9fQ0xBU1NfXyk7Cn0KCiR0aGlzLT50YXJnZXQgPSAkdGFyZ2V0OwokdGhpcy0+ZG9TZXRPcGVyYXRvcigkb3BlcmF0b3IpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXQoKQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFyZ2V0KSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICdDYWxsaW5nICIlcyIgd2l0aG91dCBpbml0aWFsaXppbmcgdGhlIHRhcmdldCBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pOwp9CgpyZXR1cm4gJHRoaXMtPnRhcmdldDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRhcmdldChzdHJpbmcgJHRhcmdldCkKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnIiVzIiBpcyBkZXByZWNhdGVkLiBTZXQgdGhlIHRhcmdldCB2aWEgdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJywgX19NRVRIT0RfXyk7CgokdGhpcy0+dGFyZ2V0ID0gJHRhcmdldDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0b3IoKQp7CnJldHVybiAkdGhpcy0+b3BlcmF0b3I7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3BlcmF0b3Ioc3RyaW5nICRvcGVyYXRvcikKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnIiVzIiBpcyBkZXByZWNhdGVkLiBTZXQgdGhlIG9wZXJhdG9yIHZpYSB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nLCBfX01FVEhPRF9fKTsKCiR0aGlzLT5kb1NldE9wZXJhdG9yKCcnID09PSAkb3BlcmF0b3IgPyAnPT0nIDogJG9wZXJhdG9yKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0KCR0ZXN0KQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFyZ2V0KSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICdDYWxsaW5nICIlcyIgd2l0aG91dCBpbml0aWFsaXppbmcgdGhlIHRhcmdldCBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pOwp9Cgpzd2l0Y2ggKCR0aGlzLT5vcGVyYXRvcikgewpjYXNlICc+JzoKcmV0dXJuICR0ZXN0ID4gJHRoaXMtPnRhcmdldDsKY2FzZSAnPj0nOgpyZXR1cm4gJHRlc3QgPj0gJHRoaXMtPnRhcmdldDsKY2FzZSAnPCc6CnJldHVybiAkdGVzdCA8ICR0aGlzLT50YXJnZXQ7CmNhc2UgJzw9JzoKcmV0dXJuICR0ZXN0IDw9ICR0aGlzLT50YXJnZXQ7CmNhc2UgJyE9JzoKcmV0dXJuICR0ZXN0ICE9ICR0aGlzLT50YXJnZXQ7Cn0KCnJldHVybiAkdGVzdCA9PSAkdGhpcy0+dGFyZ2V0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRvU2V0T3BlcmF0b3Ioc3RyaW5nICRvcGVyYXRvcik6IHZvaWQKewppZiAoIVxpbl9hcnJheSgkb3BlcmF0b3IsIFsnPicsICc8JywgJz49JywgJzw9JywgJz09JywgJyE9J10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgb3BlcmF0b3IgIiVzIi4nLCAkb3BlcmF0b3IpKTsKfQoKJHRoaXMtPm9wZXJhdG9yID0gJG9wZXJhdG9yOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvcjsKCgoKCgoKY2xhc3MgRGF0ZUNvbXBhcmF0b3IgZXh0ZW5kcyBDb21wYXJhdG9yCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR0ZXN0KQp7CmlmICghcHJlZ19tYXRjaCgnI15ccyooPT18IT18Wzw+XT0/fGFmdGVyfHNpbmNlfGJlZm9yZXx1bnRpbCk/XHMqKC4rPylccyokI2knLCAkdGVzdCwgJG1hdGNoZXMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0RvblwndCB1bmRlcnN0YW5kICIlcyIgYXMgYSBkYXRlIHRlc3QuJywgJHRlc3QpKTsKfQoKdHJ5IHsKJGRhdGUgPSBuZXcgXERhdGVUaW1lKCRtYXRjaGVzWzJdKTsKJHRhcmdldCA9ICRkYXRlLT5mb3JtYXQoJ1UnKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIGlzIG5vdCBhIHZhbGlkIGRhdGUuJywgJG1hdGNoZXNbMl0pKTsKfQoKJG9wZXJhdG9yID0gJG1hdGNoZXNbMV0gPz8gJz09JzsKaWYgKCdzaW5jZScgPT09ICRvcGVyYXRvciB8fCAnYWZ0ZXInID09PSAkb3BlcmF0b3IpIHsKJG9wZXJhdG9yID0gJz4nOwp9CgppZiAoJ3VudGlsJyA9PT0gJG9wZXJhdG9yIHx8ICdiZWZvcmUnID09PSAkb3BlcmF0b3IpIHsKJG9wZXJhdG9yID0gJzwnOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0YXJnZXQsICRvcGVyYXRvcik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgTnVtYmVyQ29tcGFyYXRvciBleHRlbmRzIENvbXBhcmF0b3IKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICR0ZXN0KQp7CmlmIChudWxsID09PSAkdGVzdCB8fCAhcHJlZ19tYXRjaCgnI15ccyooPT18IT18Wzw+XT0/KT9ccyooWzAtOVwuXSspXHMqKFtrbWddaT8pP1xzKiQjaScsICR0ZXN0LCAkbWF0Y2hlcykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignRG9uXCd0IHVuZGVyc3RhbmQgIiVzIiBhcyBhIG51bWJlciB0ZXN0LicsICR0ZXN0ID8/ICdudWxsJykpOwp9CgokdGFyZ2V0ID0gJG1hdGNoZXNbMl07CmlmICghaXNfbnVtZXJpYygkdGFyZ2V0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIG51bWJlciAiJXMiLicsICR0YXJnZXQpKTsKfQppZiAoaXNzZXQoJG1hdGNoZXNbM10pKSB7Cgpzd2l0Y2ggKHN0cnRvbG93ZXIoJG1hdGNoZXNbM10pKSB7CmNhc2UgJ2snOgokdGFyZ2V0ICo9IDEwMDA7CmJyZWFrOwpjYXNlICdraSc6CiR0YXJnZXQgKj0gMTAyNDsKYnJlYWs7CmNhc2UgJ20nOgokdGFyZ2V0ICo9IDEwMDAwMDA7CmJyZWFrOwpjYXNlICdtaSc6CiR0YXJnZXQgKj0gMTAyNCAqIDEwMjQ7CmJyZWFrOwpjYXNlICdnJzoKJHRhcmdldCAqPSAxMDAwMDAwMDAwOwpicmVhazsKY2FzZSAnZ2knOgokdGFyZ2V0ICo9IDEwMjQgKiAxMDI0ICogMTAyNDsKYnJlYWs7Cn0KfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGFyZ2V0LCAkbWF0Y2hlc1sxXSA/OiAnPT0nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiBleHRlbmRzIFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIERpcmVjdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3JcRGF0ZUNvbXBhcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvclxOdW1iZXJDb21wYXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvblxEaXJlY3RvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxDdXN0b21GaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxEYXRlUmFuZ2VGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxEZXB0aFJhbmdlRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRXhjbHVkZURpcmVjdG9yeUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXEZpbGVjb250ZW50RmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRmlsZW5hbWVGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxMYXp5SXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcU2l6ZVJhbmdlRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjsKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIEZpbmRlciBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZSwgXENvdW50YWJsZQp7CnB1YmxpYyBjb25zdCBJR05PUkVfVkNTX0ZJTEVTID0gMTsKcHVibGljIGNvbnN0IElHTk9SRV9ET1RfRklMRVMgPSAyOwpwdWJsaWMgY29uc3QgSUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTID0gNDsKCnByaXZhdGUgJG1vZGUgPSAwOwpwcml2YXRlICRuYW1lcyA9IFtdOwpwcml2YXRlICRub3ROYW1lcyA9IFtdOwpwcml2YXRlICRleGNsdWRlID0gW107CnByaXZhdGUgJGZpbHRlcnMgPSBbXTsKcHJpdmF0ZSAkZGVwdGhzID0gW107CnByaXZhdGUgJHNpemVzID0gW107CnByaXZhdGUgJGZvbGxvd0xpbmtzID0gZmFsc2U7CnByaXZhdGUgJHJldmVyc2VTb3J0aW5nID0gZmFsc2U7CnByaXZhdGUgJHNvcnQgPSBmYWxzZTsKcHJpdmF0ZSAkaWdub3JlID0gMDsKcHJpdmF0ZSAkZGlycyA9IFtdOwpwcml2YXRlICRkYXRlcyA9IFtdOwpwcml2YXRlICRpdGVyYXRvcnMgPSBbXTsKcHJpdmF0ZSAkY29udGFpbnMgPSBbXTsKcHJpdmF0ZSAkbm90Q29udGFpbnMgPSBbXTsKcHJpdmF0ZSAkcGF0aHMgPSBbXTsKcHJpdmF0ZSAkbm90UGF0aHMgPSBbXTsKcHJpdmF0ZSAkaWdub3JlVW5yZWFkYWJsZURpcnMgPSBmYWxzZTsKCnByaXZhdGUgc3RhdGljICR2Y3NQYXR0ZXJucyA9IFsnLnN2bicsICdfc3ZuJywgJ0NWUycsICdfZGFyY3MnLCAnLmFyY2gtcGFyYW1zJywgJy5tb25vdG9uZScsICcuYnpyJywgJy5naXQnLCAnLmhnJ107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5pZ25vcmUgPSBzdGF0aWM6OklHTk9SRV9WQ1NfRklMRVMgfCBzdGF0aWM6OklHTk9SRV9ET1RfRklMRVM7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQp7CnJldHVybiBuZXcgc3RhdGljKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpcmVjdG9yaWVzKCkKewokdGhpcy0+bW9kZSA9IEl0ZXJhdG9yXEZpbGVUeXBlRmlsdGVySXRlcmF0b3I6Ok9OTFlfRElSRUNUT1JJRVM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbGVzKCkKewokdGhpcy0+bW9kZSA9IEl0ZXJhdG9yXEZpbGVUeXBlRmlsdGVySXRlcmF0b3I6Ok9OTFlfRklMRVM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVwdGgoJGxldmVscykKewpmb3JlYWNoICgoYXJyYXkpICRsZXZlbHMgYXMgJGxldmVsKSB7CiR0aGlzLT5kZXB0aHNbXSA9IG5ldyBDb21wYXJhdG9yXE51bWJlckNvbXBhcmF0b3IoJGxldmVsKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRhdGUoJGRhdGVzKQp7CmZvcmVhY2ggKChhcnJheSkgJGRhdGVzIGFzICRkYXRlKSB7CiR0aGlzLT5kYXRlc1tdID0gbmV3IENvbXBhcmF0b3JcRGF0ZUNvbXBhcmF0b3IoJGRhdGUpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbmFtZSgkcGF0dGVybnMpCnsKJHRoaXMtPm5hbWVzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5hbWVzLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3ROYW1lKCRwYXR0ZXJucykKewokdGhpcy0+bm90TmFtZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bm90TmFtZXMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKCRwYXR0ZXJucykKewokdGhpcy0+Y29udGFpbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29udGFpbnMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdENvbnRhaW5zKCRwYXR0ZXJucykKewokdGhpcy0+bm90Q29udGFpbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bm90Q29udGFpbnMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGF0aCgkcGF0dGVybnMpCnsKJHRoaXMtPnBhdGhzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnBhdGhzLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdFBhdGgoJHBhdHRlcm5zKQp7CiR0aGlzLT5ub3RQYXRocyA9IGFycmF5X21lcmdlKCR0aGlzLT5ub3RQYXRocywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2l6ZSgkc2l6ZXMpCnsKZm9yZWFjaCAoKGFycmF5KSAkc2l6ZXMgYXMgJHNpemUpIHsKJHRoaXMtPnNpemVzW10gPSBuZXcgQ29tcGFyYXRvclxOdW1iZXJDb21wYXJhdG9yKCRzaXplKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4Y2x1ZGUoJGRpcnMpCnsKJHRoaXMtPmV4Y2x1ZGUgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZXhjbHVkZSwgKGFycmF5KSAkZGlycyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVEb3RGaWxlcyhib29sICRpZ25vcmVEb3RGaWxlcykKewppZiAoJGlnbm9yZURvdEZpbGVzKSB7CiR0aGlzLT5pZ25vcmUgfD0gc3RhdGljOjpJR05PUkVfRE9UX0ZJTEVTOwp9IGVsc2UgewokdGhpcy0+aWdub3JlICY9IH5zdGF0aWM6OklHTk9SRV9ET1RfRklMRVM7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVZDUyhib29sICRpZ25vcmVWQ1MpCnsKaWYgKCRpZ25vcmVWQ1MpIHsKJHRoaXMtPmlnbm9yZSB8PSBzdGF0aWM6OklHTk9SRV9WQ1NfRklMRVM7Cn0gZWxzZSB7CiR0aGlzLT5pZ25vcmUgJj0gfnN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUzsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVZDU0lnbm9yZWQoYm9vbCAkaWdub3JlVkNTSWdub3JlZCkKewppZiAoJGlnbm9yZVZDU0lnbm9yZWQpIHsKJHRoaXMtPmlnbm9yZSB8PSBzdGF0aWM6OklHTk9SRV9WQ1NfSUdOT1JFRF9GSUxFUzsKfSBlbHNlIHsKJHRoaXMtPmlnbm9yZSAmPSB+c3RhdGljOjpJR05PUkVfVkNTX0lHTk9SRURfRklMRVM7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkVkNTUGF0dGVybigkcGF0dGVybikKewpmb3JlYWNoICgoYXJyYXkpICRwYXR0ZXJuIGFzICRwKSB7CnNlbGY6OiR2Y3NQYXR0ZXJuc1tdID0gJHA7Cn0KCnNlbGY6OiR2Y3NQYXR0ZXJucyA9IGFycmF5X3VuaXF1ZShzZWxmOjokdmNzUGF0dGVybnMpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0KFxDbG9zdXJlICRjbG9zdXJlKQp7CiR0aGlzLT5zb3J0ID0gJGNsb3N1cmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlOYW1lKGJvb2wgJHVzZU5hdHVyYWxTb3J0ID0gZmFsc2UpCnsKJHRoaXMtPnNvcnQgPSAkdXNlTmF0dXJhbFNvcnQgPyBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX05BTUVfTkFUVVJBTCA6IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfTkFNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnRCeVR5cGUoKQp7CiR0aGlzLT5zb3J0ID0gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9UWVBFOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlBY2Nlc3NlZFRpbWUoKQp7CiR0aGlzLT5zb3J0ID0gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9BQ0NFU1NFRF9USU1FOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXZlcnNlU29ydGluZygpCnsKJHRoaXMtPnJldmVyc2VTb3J0aW5nID0gdHJ1ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlDaGFuZ2VkVGltZSgpCnsKJHRoaXMtPnNvcnQgPSBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX0NIQU5HRURfVElNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydEJ5TW9kaWZpZWRUaW1lKCkKewokdGhpcy0+c29ydCA9IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfTU9ESUZJRURfVElNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXIoXENsb3N1cmUgJGNsb3N1cmUpCnsKJHRoaXMtPmZpbHRlcnNbXSA9ICRjbG9zdXJlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb2xsb3dMaW5rcygpCnsKJHRoaXMtPmZvbGxvd0xpbmtzID0gdHJ1ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVVbnJlYWRhYmxlRGlycyhib29sICRpZ25vcmUgPSB0cnVlKQp7CiR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycyA9ICRpZ25vcmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbigkZGlycykKewokcmVzb2x2ZWREaXJzID0gW107Cgpmb3JlYWNoICgoYXJyYXkpICRkaXJzIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSkgewokcmVzb2x2ZWREaXJzW10gPSBbJHRoaXMtPm5vcm1hbGl6ZURpcigkZGlyKV07Cn0gZWxzZWlmICgkZ2xvYiA9IGdsb2IoJGRpciwgKFxkZWZpbmVkKCdHTE9CX0JSQUNFJykgPyBcR0xPQl9CUkFDRSA6IDApIHwgXEdMT0JfT05MWURJUiB8IFxHTE9CX05PU09SVCkpIHsKc29ydCgkZ2xvYik7CiRyZXNvbHZlZERpcnNbXSA9IGFycmF5X21hcChbJHRoaXMsICdub3JtYWxpemVEaXInXSwgJGdsb2IpOwp9IGVsc2Ugewp0aHJvdyBuZXcgRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LicsICRkaXIpKTsKfQp9CgokdGhpcy0+ZGlycyA9IGFycmF5X21lcmdlKCR0aGlzLT5kaXJzLCAuLi4kcmVzb2x2ZWREaXJzKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpCnsKaWYgKDAgPT09IFxjb3VudCgkdGhpcy0+ZGlycykgJiYgMCA9PT0gXGNvdW50KCR0aGlzLT5pdGVyYXRvcnMpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1lvdSBtdXN0IGNhbGwgb25lIG9mIGluKCkgb3IgYXBwZW5kKCkgbWV0aG9kcyBiZWZvcmUgaXRlcmF0aW5nIG92ZXIgYSBGaW5kZXIuJyk7Cn0KCmlmICgxID09PSBcY291bnQoJHRoaXMtPmRpcnMpICYmIDAgPT09IFxjb3VudCgkdGhpcy0+aXRlcmF0b3JzKSkgewokaXRlcmF0b3IgPSAkdGhpcy0+c2VhcmNoSW5EaXJlY3RvcnkoJHRoaXMtPmRpcnNbMF0pOwoKaWYgKCR0aGlzLT5zb3J0IHx8ICR0aGlzLT5yZXZlcnNlU29ydGluZykgewokaXRlcmF0b3IgPSAobmV3IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+c29ydCwgJHRoaXMtPnJldmVyc2VTb3J0aW5nKSktPmdldEl0ZXJhdG9yKCk7Cn0KCnJldHVybiAkaXRlcmF0b3I7Cn0KCiRpdGVyYXRvciA9IG5ldyBcQXBwZW5kSXRlcmF0b3IoKTsKZm9yZWFjaCAoJHRoaXMtPmRpcnMgYXMgJGRpcikgewokaXRlcmF0b3ItPmFwcGVuZChuZXcgXEl0ZXJhdG9ySXRlcmF0b3IobmV3IExhenlJdGVyYXRvcihmdW5jdGlvbiAoKSB1c2UgKCRkaXIpIHsKcmV0dXJuICR0aGlzLT5zZWFyY2hJbkRpcmVjdG9yeSgkZGlyKTsKfSkpKTsKfQoKZm9yZWFjaCAoJHRoaXMtPml0ZXJhdG9ycyBhcyAkaXQpIHsKJGl0ZXJhdG9yLT5hcHBlbmQoJGl0KTsKfQoKaWYgKCR0aGlzLT5zb3J0IHx8ICR0aGlzLT5yZXZlcnNlU29ydGluZykgewokaXRlcmF0b3IgPSAobmV3IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+c29ydCwgJHRoaXMtPnJldmVyc2VTb3J0aW5nKSktPmdldEl0ZXJhdG9yKCk7Cn0KCnJldHVybiAkaXRlcmF0b3I7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoaXRlcmFibGUgJGl0ZXJhdG9yKQp7CmlmICgkaXRlcmF0b3IgaW5zdGFuY2VvZiBcSXRlcmF0b3JBZ2dyZWdhdGUpIHsKJHRoaXMtPml0ZXJhdG9yc1tdID0gJGl0ZXJhdG9yLT5nZXRJdGVyYXRvcigpOwp9IGVsc2VpZiAoJGl0ZXJhdG9yIGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CiR0aGlzLT5pdGVyYXRvcnNbXSA9ICRpdGVyYXRvcjsKfSBlbHNlaWYgKGlzX2l0ZXJhYmxlKCRpdGVyYXRvcikpIHsKJGl0ID0gbmV3IFxBcnJheUl0ZXJhdG9yKCk7CmZvcmVhY2ggKCRpdGVyYXRvciBhcyAkZmlsZSkgewokZmlsZSA9ICRmaWxlIGluc3RhbmNlb2YgXFNwbEZpbGVJbmZvID8gJGZpbGUgOiBuZXcgXFNwbEZpbGVJbmZvKCRmaWxlKTsKJGl0WyRmaWxlLT5nZXRQYXRobmFtZSgpXSA9ICRmaWxlOwp9CiR0aGlzLT5pdGVyYXRvcnNbXSA9ICRpdDsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ZpbmRlcjo6YXBwZW5kKCkgbWV0aG9kIHdyb25nIGFyZ3VtZW50IHR5cGUuJyk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVzdWx0cygpCnsKZm9yZWFjaCAoJHRoaXMtPmdldEl0ZXJhdG9yKCkgYXMgJF8pIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGNvdW50KCkKewpyZXR1cm4gaXRlcmF0b3JfY291bnQoJHRoaXMtPmdldEl0ZXJhdG9yKCkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNlYXJjaEluRGlyZWN0b3J5KHN0cmluZyAkZGlyKTogXEl0ZXJhdG9yCnsKJGV4Y2x1ZGUgPSAkdGhpcy0+ZXhjbHVkZTsKJG5vdFBhdGhzID0gJHRoaXMtPm5vdFBhdGhzOwoKaWYgKHN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUyA9PT0gKHN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUyAmICR0aGlzLT5pZ25vcmUpKSB7CiRleGNsdWRlID0gYXJyYXlfbWVyZ2UoJGV4Y2x1ZGUsIHNlbGY6OiR2Y3NQYXR0ZXJucyk7Cn0KCmlmIChzdGF0aWM6OklHTk9SRV9ET1RfRklMRVMgPT09IChzdGF0aWM6OklHTk9SRV9ET1RfRklMRVMgJiAkdGhpcy0+aWdub3JlKSkgewokbm90UGF0aHNbXSA9ICcjKF58LylcLi4rKC98JCkjJzsKfQoKJG1pbkRlcHRoID0gMDsKJG1heERlcHRoID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoJHRoaXMtPmRlcHRocyBhcyAkY29tcGFyYXRvcikgewpzd2l0Y2ggKCRjb21wYXJhdG9yLT5nZXRPcGVyYXRvcigpKSB7CmNhc2UgJz4nOgokbWluRGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCkgKyAxOwpicmVhazsKY2FzZSAnPj0nOgokbWluRGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCk7CmJyZWFrOwpjYXNlICc8JzoKJG1heERlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpIC0gMTsKYnJlYWs7CmNhc2UgJzw9JzoKJG1heERlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpOwpicmVhazsKZGVmYXVsdDoKJG1pbkRlcHRoID0gJG1heERlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpOwp9Cn0KCiRmbGFncyA9IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTOwoKaWYgKCR0aGlzLT5mb2xsb3dMaW5rcykgewokZmxhZ3MgfD0gXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpGT0xMT1dfU1lNTElOS1M7Cn0KCiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyLCAkZmxhZ3MsICR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycyk7CgppZiAoJGV4Y2x1ZGUpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEV4Y2x1ZGVEaXJlY3RvcnlGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICRleGNsdWRlKTsKfQoKJGl0ZXJhdG9yID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRpdGVyYXRvciwgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwoKaWYgKCRtaW5EZXB0aCA+IDAgfHwgJG1heERlcHRoIDwgXFBIUF9JTlRfTUFYKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxEZXB0aFJhbmdlRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkbWluRGVwdGgsICRtYXhEZXB0aCk7Cn0KCmlmICgkdGhpcy0+bW9kZSkgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRmlsZVR5cGVGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5tb2RlKTsKfQoKaWYgKCR0aGlzLT5uYW1lcyB8fCAkdGhpcy0+bm90TmFtZXMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEZpbGVuYW1lRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+bmFtZXMsICR0aGlzLT5ub3ROYW1lcyk7Cn0KCmlmICgkdGhpcy0+Y29udGFpbnMgfHwgJHRoaXMtPm5vdENvbnRhaW5zKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxGaWxlY29udGVudEZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPmNvbnRhaW5zLCAkdGhpcy0+bm90Q29udGFpbnMpOwp9CgppZiAoJHRoaXMtPnNpemVzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxTaXplUmFuZ2VGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5zaXplcyk7Cn0KCmlmICgkdGhpcy0+ZGF0ZXMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXERhdGVSYW5nZUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPmRhdGVzKTsKfQoKaWYgKCR0aGlzLT5maWx0ZXJzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxDdXN0b21GaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5maWx0ZXJzKTsKfQoKaWYgKCR0aGlzLT5wYXRocyB8fCAkbm90UGF0aHMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXFBhdGhGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5wYXRocywgJG5vdFBhdGhzKTsKfQoKaWYgKHN0YXRpYzo6SUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTID09PSAoc3RhdGljOjpJR05PUkVfVkNTX0lHTk9SRURfRklMRVMgJiAkdGhpcy0+aWdub3JlKSkgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcVmNzSWdub3JlZEZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJGRpcik7Cn0KCnJldHVybiAkaXRlcmF0b3I7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVEaXIoc3RyaW5nICRkaXIpOiBzdHJpbmcKewppZiAoJy8nID09PSAkZGlyKSB7CnJldHVybiAkZGlyOwp9CgokZGlyID0gcnRyaW0oJGRpciwgJy8nLlxESVJFQ1RPUllfU0VQQVJBVE9SKTsKCmlmIChwcmVnX21hdGNoKCcjXihzc2gyXC4pP3M/ZnRwOi8vIycsICRkaXIpKSB7CiRkaXIgLj0gJy8nOwp9CgpyZXR1cm4gJGRpcjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKCgoKCgoKY2xhc3MgR2l0aWdub3JlCnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRnaXRpZ25vcmVGaWxlQ29udGVudCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpidWlsZFJlZ2V4KCRnaXRpZ25vcmVGaWxlQ29udGVudCwgZmFsc2UpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvUmVnZXhNYXRjaGluZ05lZ2F0ZWRQYXR0ZXJucyhzdHJpbmcgJGdpdGlnbm9yZUZpbGVDb250ZW50KTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmJ1aWxkUmVnZXgoJGdpdGlnbm9yZUZpbGVDb250ZW50LCB0cnVlKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYnVpbGRSZWdleChzdHJpbmcgJGdpdGlnbm9yZUZpbGVDb250ZW50LCBib29sICRpbnZlcnRlZCk6IHN0cmluZwp7CiRnaXRpZ25vcmVGaWxlQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfig/PCFcXFxcKSNbXlxuXHJdKn4nLCAnJywgJGdpdGlnbm9yZUZpbGVDb250ZW50KTsKJGdpdGlnbm9yZUxpbmVzID0gcHJlZ19zcGxpdCgnflxyXG4/fFxuficsICRnaXRpZ25vcmVGaWxlQ29udGVudCk7CgokcmVzID0gc2VsZjo6bGluZVRvUmVnZXgoJycpOwpmb3JlYWNoICgkZ2l0aWdub3JlTGluZXMgYXMgJGxpbmUpIHsKJGxpbmUgPSBwcmVnX3JlcGxhY2UoJ34oPzwhXFxcXClbIFx0XSskficsICcnLCAkbGluZSk7CgppZiAoJyEnID09PSBzdWJzdHIoJGxpbmUsIDAsIDEpKSB7CiRsaW5lID0gc3Vic3RyKCRsaW5lLCAxKTsKJGlzTmVnYXRpdmUgPSB0cnVlOwp9IGVsc2UgewokaXNOZWdhdGl2ZSA9IGZhbHNlOwp9CgppZiAoJycgIT09ICRsaW5lKSB7CmlmICgkaXNOZWdhdGl2ZSB4b3IgJGludmVydGVkKSB7CiRyZXMgPSAnKD8hJy5zZWxmOjpsaW5lVG9SZWdleCgkbGluZSkuJyQpJy4kcmVzOwp9IGVsc2UgewokcmVzID0gJyg/OicuJHJlcy4nfCcuc2VsZjo6bGluZVRvUmVnZXgoJGxpbmUpLicpJzsKfQp9Cn0KCnJldHVybiAnfl4oPzonLiRyZXMuJyl+cyc7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxpbmVUb1JlZ2V4KHN0cmluZyAkZ2l0aWdub3JlTGluZSk6IHN0cmluZwp7CmlmICgnJyA9PT0gJGdpdGlnbm9yZUxpbmUpIHsKcmV0dXJuICckZic7IAp9Cgokc2xhc2hQb3MgPSBzdHJwb3MoJGdpdGlnbm9yZUxpbmUsICcvJyk7CmlmIChmYWxzZSAhPT0gJHNsYXNoUG9zICYmIFxzdHJsZW4oJGdpdGlnbm9yZUxpbmUpIC0gMSAhPT0gJHNsYXNoUG9zKSB7CmlmICgwID09PSAkc2xhc2hQb3MpIHsKJGdpdGlnbm9yZUxpbmUgPSBzdWJzdHIoJGdpdGlnbm9yZUxpbmUsIDEpOwp9CiRpc0Fic29sdXRlID0gdHJ1ZTsKfSBlbHNlIHsKJGlzQWJzb2x1dGUgPSBmYWxzZTsKfQoKJHJlZ2V4ID0gcHJlZ19xdW90ZShzdHJfcmVwbGFjZSgnXFwnLCAnJywgJGdpdGlnbm9yZUxpbmUpLCAnficpOwokcmVnZXggPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ35cXFxcXFsoKD86XFxcXCEpPykoW15cW1xdXSopXFxcXFxdficsIGZ1bmN0aW9uIChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZyB7CnJldHVybiAnWycuKCcnICE9PSAkbWF0Y2hlc1sxXSA/ICdeJyA6ICcnKS5zdHJfcmVwbGFjZSgnXFwtJywgJy0nLCAkbWF0Y2hlc1syXSkuJ10nOwp9LCAkcmVnZXgpOwokcmVnZXggPSBwcmVnX3JlcGxhY2UoJ34oPzooPzpcXFxcXCopezIsfSgvPykpK34nLCAnKD86KD86KD8hLy8pLig/PCEvLykpKyQxKT8nLCAkcmVnZXgpOwokcmVnZXggPSBwcmVnX3JlcGxhY2UoJ35cXFxcXCp+JywgJ1teL10qJywgJHJlZ2V4KTsKJHJlZ2V4ID0gcHJlZ19yZXBsYWNlKCd+XFxcXFw/ficsICdbXi9dJywgJHJlZ2V4KTsKCnJldHVybiAoJGlzQWJzb2x1dGUgPyAnJyA6ICcoPzpbXi9dKy8pKicpCi4kcmVnZXgKLighc3RyX2VuZHNfd2l0aCgkZ2l0aWdub3JlTGluZSwgJy8nKSA/ICcoPzokfC8pJyA6ICcnKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIEdsb2IKewoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJGdsb2IsIGJvb2wgJHN0cmljdExlYWRpbmdEb3QgPSB0cnVlLCBib29sICRzdHJpY3RXaWxkY2FyZFNsYXNoID0gdHJ1ZSwgc3RyaW5nICRkZWxpbWl0ZXIgPSAnIycpCnsKJGZpcnN0Qnl0ZSA9IHRydWU7CiRlc2NhcGluZyA9IGZhbHNlOwokaW5DdXJsaWVzID0gMDsKJHJlZ2V4ID0gJyc7CiRzaXplR2xvYiA9IFxzdHJsZW4oJGdsb2IpOwpmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZUdsb2I7ICsrJGkpIHsKJGNhciA9ICRnbG9iWyRpXTsKaWYgKCRmaXJzdEJ5dGUgJiYgJHN0cmljdExlYWRpbmdEb3QgJiYgJy4nICE9PSAkY2FyKSB7CiRyZWdleCAuPSAnKD89W15cLl0pJzsKfQoKJGZpcnN0Qnl0ZSA9ICcvJyA9PT0gJGNhcjsKCmlmICgkZmlyc3RCeXRlICYmICRzdHJpY3RXaWxkY2FyZFNsYXNoICYmIGlzc2V0KCRnbG9iWyRpICsgMl0pICYmICcqKicgPT09ICRnbG9iWyRpICsgMV0uJGdsb2JbJGkgKyAyXSAmJiAoIWlzc2V0KCRnbG9iWyRpICsgM10pIHx8ICcvJyA9PT0gJGdsb2JbJGkgKyAzXSkpIHsKJGNhciA9ICdbXi9dKysvJzsKaWYgKCFpc3NldCgkZ2xvYlskaSArIDNdKSkgewokY2FyIC49ICc/JzsKfQoKaWYgKCRzdHJpY3RMZWFkaW5nRG90KSB7CiRjYXIgPSAnKD89W15cLl0pJy4kY2FyOwp9CgokY2FyID0gJy8oPzonLiRjYXIuJykqJzsKJGkgKz0gMiArIGlzc2V0KCRnbG9iWyRpICsgM10pOwoKaWYgKCcvJyA9PT0gJGRlbGltaXRlcikgewokY2FyID0gc3RyX3JlcGxhY2UoJy8nLCAnXFwvJywgJGNhcik7Cn0KfQoKaWYgKCRkZWxpbWl0ZXIgPT09ICRjYXIgfHwgJy4nID09PSAkY2FyIHx8ICcoJyA9PT0gJGNhciB8fCAnKScgPT09ICRjYXIgfHwgJ3wnID09PSAkY2FyIHx8ICcrJyA9PT0gJGNhciB8fCAnXicgPT09ICRjYXIgfHwgJyQnID09PSAkY2FyKSB7CiRyZWdleCAuPSAiXFwkY2FyIjsKfSBlbHNlaWYgKCcqJyA9PT0gJGNhcikgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJ1xcKicgOiAoJHN0cmljdFdpbGRjYXJkU2xhc2ggPyAnW14vXSonIDogJy4qJyk7Cn0gZWxzZWlmICgnPycgPT09ICRjYXIpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICdcXD8nIDogKCRzdHJpY3RXaWxkY2FyZFNsYXNoID8gJ1teL10nIDogJy4nKTsKfSBlbHNlaWYgKCd7JyA9PT0gJGNhcikgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJ1xceycgOiAnKCc7CmlmICghJGVzY2FwaW5nKSB7CisrJGluQ3VybGllczsKfQp9IGVsc2VpZiAoJ30nID09PSAkY2FyICYmICRpbkN1cmxpZXMpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICd9JyA6ICcpJzsKaWYgKCEkZXNjYXBpbmcpIHsKLS0kaW5DdXJsaWVzOwp9Cn0gZWxzZWlmICgnLCcgPT09ICRjYXIgJiYgJGluQ3VybGllcykgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJywnIDogJ3wnOwp9IGVsc2VpZiAoJ1xcJyA9PT0gJGNhcikgewppZiAoJGVzY2FwaW5nKSB7CiRyZWdleCAuPSAnXFxcXCc7CiRlc2NhcGluZyA9IGZhbHNlOwp9IGVsc2UgewokZXNjYXBpbmcgPSB0cnVlOwp9Cgpjb250aW51ZTsKfSBlbHNlIHsKJHJlZ2V4IC49ICRjYXI7Cn0KJGVzY2FwaW5nID0gZmFsc2U7Cn0KCnJldHVybiAkZGVsaW1pdGVyLideJy4kcmVnZXguJyQnLiRkZWxpbWl0ZXI7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCgpjbGFzcyBDdXN0b21GaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByaXZhdGUgJGZpbHRlcnMgPSBbXTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBhcnJheSAkZmlsdGVycykKewpmb3JlYWNoICgkZmlsdGVycyBhcyAkZmlsdGVyKSB7CmlmICghXGlzX2NhbGxhYmxlKCRmaWx0ZXIpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFBIUCBjYWxsYmFjay4nKTsKfQp9CiR0aGlzLT5maWx0ZXJzID0gJGZpbHRlcnM7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7Cgpmb3JlYWNoICgkdGhpcy0+ZmlsdGVycyBhcyAkZmlsdGVyKSB7CmlmIChmYWxzZSA9PT0gJGZpbHRlcigkZmlsZWluZm8pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yXERhdGVDb21wYXJhdG9yOwoKCgoKCgoKCmNsYXNzIERhdGVSYW5nZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHJpdmF0ZSAkY29tcGFyYXRvcnMgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgYXJyYXkgJGNvbXBhcmF0b3JzKQp7CiR0aGlzLT5jb21wYXJhdG9ycyA9ICRjb21wYXJhdG9yczsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKJGZpbGVpbmZvID0gJHRoaXMtPmN1cnJlbnQoKTsKCmlmICghZmlsZV9leGlzdHMoJGZpbGVpbmZvLT5nZXRQYXRobmFtZSgpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRmaWxlZGF0ZSA9ICRmaWxlaW5mby0+Z2V0TVRpbWUoKTsKZm9yZWFjaCAoJHRoaXMtPmNvbXBhcmF0b3JzIGFzICRjb21wYXJlKSB7CmlmICghJGNvbXBhcmUtPnRlc3QoJGZpbGVkYXRlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCgpjbGFzcyBEZXB0aFJhbmdlRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwcml2YXRlICRtaW5EZXB0aCA9IDA7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvciAkaXRlcmF0b3IsIGludCAkbWluRGVwdGggPSAwLCBpbnQgJG1heERlcHRoID0gXFBIUF9JTlRfTUFYKQp7CiR0aGlzLT5taW5EZXB0aCA9ICRtaW5EZXB0aDsKJGl0ZXJhdG9yLT5zZXRNYXhEZXB0aChcUEhQX0lOVF9NQVggPT09ICRtYXhEZXB0aCA/IC0xIDogJG1heERlcHRoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKcmV0dXJuICR0aGlzLT5nZXRJbm5lckl0ZXJhdG9yKCktPmdldERlcHRoKCkgPj0gJHRoaXMtPm1pbkRlcHRoOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCgpjbGFzcyBFeGNsdWRlRGlyZWN0b3J5RmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IgaW1wbGVtZW50cyBcUmVjdXJzaXZlSXRlcmF0b3IKewpwcml2YXRlICRpdGVyYXRvcjsKcHJpdmF0ZSAkaXNSZWN1cnNpdmU7CnByaXZhdGUgJGV4Y2x1ZGVkRGlycyA9IFtdOwpwcml2YXRlICRleGNsdWRlZFBhdHRlcm47CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRkaXJlY3RvcmllcykKewokdGhpcy0+aXRlcmF0b3IgPSAkaXRlcmF0b3I7CiR0aGlzLT5pc1JlY3Vyc2l2ZSA9ICRpdGVyYXRvciBpbnN0YW5jZW9mIFxSZWN1cnNpdmVJdGVyYXRvcjsKJHBhdHRlcm5zID0gW107CmZvcmVhY2ggKCRkaXJlY3RvcmllcyBhcyAkZGlyZWN0b3J5KSB7CiRkaXJlY3RvcnkgPSBydHJpbSgkZGlyZWN0b3J5LCAnLycpOwppZiAoISR0aGlzLT5pc1JlY3Vyc2l2ZSB8fCBzdHJfY29udGFpbnMoJGRpcmVjdG9yeSwgJy8nKSkgewokcGF0dGVybnNbXSA9IHByZWdfcXVvdGUoJGRpcmVjdG9yeSwgJyMnKTsKfSBlbHNlIHsKJHRoaXMtPmV4Y2x1ZGVkRGlyc1skZGlyZWN0b3J5XSA9IHRydWU7Cn0KfQppZiAoJHBhdHRlcm5zKSB7CiR0aGlzLT5leGNsdWRlZFBhdHRlcm4gPSAnIyg/Ol58LykoPzonLmltcGxvZGUoJ3wnLCAkcGF0dGVybnMpLicpKD86L3wkKSMnOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CmlmICgkdGhpcy0+aXNSZWN1cnNpdmUgJiYgaXNzZXQoJHRoaXMtPmV4Y2x1ZGVkRGlyc1skdGhpcy0+Z2V0RmlsZW5hbWUoKV0pICYmICR0aGlzLT5pc0RpcigpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5leGNsdWRlZFBhdHRlcm4pIHsKJHBhdGggPSAkdGhpcy0+aXNEaXIoKSA/ICR0aGlzLT5jdXJyZW50KCktPmdldFJlbGF0aXZlUGF0aG5hbWUoKSA6ICR0aGlzLT5jdXJyZW50KCktPmdldFJlbGF0aXZlUGF0aCgpOwokcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOwoKcmV0dXJuICFwcmVnX21hdGNoKCR0aGlzLT5leGNsdWRlZFBhdHRlcm4sICRwYXRoKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gaGFzQ2hpbGRyZW4oKQp7CnJldHVybiAkdGhpcy0+aXNSZWN1cnNpdmUgJiYgJHRoaXMtPml0ZXJhdG9yLT5oYXNDaGlsZHJlbigpOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldENoaWxkcmVuKCkKewokY2hpbGRyZW4gPSBuZXcgc2VsZigkdGhpcy0+aXRlcmF0b3ItPmdldENoaWxkcmVuKCksIFtdKTsKJGNoaWxkcmVuLT5leGNsdWRlZERpcnMgPSAkdGhpcy0+ZXhjbHVkZWREaXJzOwokY2hpbGRyZW4tPmV4Y2x1ZGVkUGF0dGVybiA9ICR0aGlzLT5leGNsdWRlZFBhdHRlcm47CgpyZXR1cm4gJGNoaWxkcmVuOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKY2xhc3MgRmlsZVR5cGVGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnB1YmxpYyBjb25zdCBPTkxZX0ZJTEVTID0gMTsKcHVibGljIGNvbnN0IE9OTFlfRElSRUNUT1JJRVMgPSAyOwoKcHJpdmF0ZSAkbW9kZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgaW50ICRtb2RlKQp7CiR0aGlzLT5tb2RlID0gJG1vZGU7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7CmlmIChzZWxmOjpPTkxZX0RJUkVDVE9SSUVTID09PSAoc2VsZjo6T05MWV9ESVJFQ1RPUklFUyAmICR0aGlzLT5tb2RlKSAmJiAkZmlsZWluZm8tPmlzRmlsZSgpKSB7CnJldHVybiBmYWxzZTsKfSBlbHNlaWYgKHNlbGY6Ok9OTFlfRklMRVMgPT09IChzZWxmOjpPTkxZX0ZJTEVTICYgJHRoaXMtPm1vZGUpICYmICRmaWxlaW5mby0+aXNEaXIoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCmNsYXNzIEZpbGVjb250ZW50RmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvcgp7CgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CmlmICghJHRoaXMtPm1hdGNoUmVnZXhwcyAmJiAhJHRoaXMtPm5vTWF0Y2hSZWdleHBzKSB7CnJldHVybiB0cnVlOwp9CgokZmlsZWluZm8gPSAkdGhpcy0+Y3VycmVudCgpOwoKaWYgKCRmaWxlaW5mby0+aXNEaXIoKSB8fCAhJGZpbGVpbmZvLT5pc1JlYWRhYmxlKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokY29udGVudCA9ICRmaWxlaW5mby0+Z2V0Q29udGVudHMoKTsKaWYgKCEkY29udGVudCkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+aXNBY2NlcHRlZCgkY29udGVudCk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJHN0cikKewpyZXR1cm4gJHRoaXMtPmlzUmVnZXgoJHN0cikgPyAkc3RyIDogJy8nLnByZWdfcXVvdGUoJHN0ciwgJy8nKS4nLyc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcR2xvYjsKCgoKCgoKCgpjbGFzcyBGaWxlbmFtZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgTXVsdGlwbGVQY3JlRmlsdGVySXRlcmF0b3IKewoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewpyZXR1cm4gJHRoaXMtPmlzQWNjZXB0ZWQoJHRoaXMtPmN1cnJlbnQoKS0+Z2V0RmlsZW5hbWUoKSk7Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJHN0cikKewpyZXR1cm4gJHRoaXMtPmlzUmVnZXgoJHN0cikgPyAkc3RyIDogR2xvYjo6dG9SZWdleCgkc3RyKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgpjbGFzcyBMYXp5SXRlcmF0b3IgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewpwcml2YXRlICRpdGVyYXRvckZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoY2FsbGFibGUgJGl0ZXJhdG9yRmFjdG9yeSkKewokdGhpcy0+aXRlcmF0b3JGYWN0b3J5ID0gJGl0ZXJhdG9yRmFjdG9yeTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IFxUcmF2ZXJzYWJsZQp7CnlpZWxkIGZyb20gKCR0aGlzLT5pdGVyYXRvckZhY3RvcnkpKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByb3RlY3RlZCAkbWF0Y2hSZWdleHBzID0gW107CnByb3RlY3RlZCAkbm9NYXRjaFJlZ2V4cHMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRtYXRjaFBhdHRlcm5zLCBhcnJheSAkbm9NYXRjaFBhdHRlcm5zKQp7CmZvcmVhY2ggKCRtYXRjaFBhdHRlcm5zIGFzICRwYXR0ZXJuKSB7CiR0aGlzLT5tYXRjaFJlZ2V4cHNbXSA9ICR0aGlzLT50b1JlZ2V4KCRwYXR0ZXJuKTsKfQoKZm9yZWFjaCAoJG5vTWF0Y2hQYXR0ZXJucyBhcyAkcGF0dGVybikgewokdGhpcy0+bm9NYXRjaFJlZ2V4cHNbXSA9ICR0aGlzLT50b1JlZ2V4KCRwYXR0ZXJuKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNBY2NlcHRlZChzdHJpbmcgJHN0cmluZykKewoKZm9yZWFjaCAoJHRoaXMtPm5vTWF0Y2hSZWdleHBzIGFzICRyZWdleCkgewppZiAocHJlZ19tYXRjaCgkcmVnZXgsICRzdHJpbmcpKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKaWYgKCR0aGlzLT5tYXRjaFJlZ2V4cHMpIHsKZm9yZWFjaCAoJHRoaXMtPm1hdGNoUmVnZXhwcyBhcyAkcmVnZXgpIHsKaWYgKHByZWdfbWF0Y2goJHJlZ2V4LCAkc3RyaW5nKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNSZWdleChzdHJpbmcgJHN0cikKewokYXZhaWxhYmxlTW9kaWZpZXJzID0gJ2ltc3h1QURVJzsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAyMDApIHsKJGF2YWlsYWJsZU1vZGlmaWVycyAuPSAnbic7Cn0KCmlmIChwcmVnX21hdGNoKCcvXiguezMsfT8pWycuJGF2YWlsYWJsZU1vZGlmaWVycy4nXSokLycsICRzdHIsICRtKSkgewokc3RhcnQgPSBzdWJzdHIoJG1bMV0sIDAsIDEpOwokZW5kID0gc3Vic3RyKCRtWzFdLCAtMSk7CgppZiAoJHN0YXJ0ID09PSAkZW5kKSB7CnJldHVybiAhcHJlZ19tYXRjaCgnL1sqP1s6YWxudW06XSBcXFxcXS8nLCAkc3RhcnQpOwp9Cgpmb3JlYWNoIChbWyd7JywgJ30nXSwgWycoJywgJyknXSwgWydbJywgJ10nXSwgWyc8JywgJz4nXV0gYXMgJGRlbGltaXRlcnMpIHsKaWYgKCRzdGFydCA9PT0gJGRlbGltaXRlcnNbMF0gJiYgJGVuZCA9PT0gJGRlbGltaXRlcnNbMV0pIHsKcmV0dXJuIHRydWU7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRzdHIpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgpjbGFzcyBQYXRoRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvcgp7CgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlbmFtZSA9ICR0aGlzLT5jdXJyZW50KCktPmdldFJlbGF0aXZlUGF0aG5hbWUoKTsKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRmaWxlbmFtZSk7Cn0KCnJldHVybiAkdGhpcy0+aXNBY2NlcHRlZCgkZmlsZW5hbWUpOwp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkc3RyKQp7CnJldHVybiAkdGhpcy0+aXNSZWdleCgkc3RyKSA/ICRzdHIgOiAnLycucHJlZ19xdW90ZSgkc3RyLCAnLycpLicvJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxFeGNlcHRpb25cQWNjZXNzRGVuaWVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXFNwbEZpbGVJbmZvOwoKCgoKCgpjbGFzcyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvciBleHRlbmRzIFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcgp7CgoKCnByaXZhdGUgJGlnbm9yZVVucmVhZGFibGVEaXJzOwoKCgoKcHJpdmF0ZSAkaWdub3JlRmlyc3RSZXdpbmQgPSB0cnVlOwoKCnByaXZhdGUgJHJvb3RQYXRoOwpwcml2YXRlICRzdWJQYXRoOwpwcml2YXRlICRkaXJlY3RvcnlTZXBhcmF0b3IgPSAnLyc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRwYXRoLCBpbnQgJGZsYWdzLCBib29sICRpZ25vcmVVbnJlYWRhYmxlRGlycyA9IGZhbHNlKQp7CmlmICgkZmxhZ3MgJiAoc2VsZjo6Q1VSUkVOVF9BU19QQVRITkFNRSB8IHNlbGY6OkNVUlJFTlRfQVNfU0VMRikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGlzIGl0ZXJhdG9yIG9ubHkgc3VwcG9ydCByZXR1cm5pbmcgY3VycmVudCBhcyBmaWxlaW5mby4nKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkcGF0aCwgJGZsYWdzKTsKJHRoaXMtPmlnbm9yZVVucmVhZGFibGVEaXJzID0gJGlnbm9yZVVucmVhZGFibGVEaXJzOwokdGhpcy0+cm9vdFBhdGggPSAkcGF0aDsKaWYgKCcvJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgISgkZmxhZ3MgJiBzZWxmOjpVTklYX1BBVEhTKSkgewokdGhpcy0+ZGlyZWN0b3J5U2VwYXJhdG9yID0gXERJUkVDVE9SWV9TRVBBUkFUT1I7Cn0KfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKQp7CgoKaWYgKG51bGwgPT09ICRzdWJQYXRobmFtZSA9ICR0aGlzLT5zdWJQYXRoKSB7CiRzdWJQYXRobmFtZSA9ICR0aGlzLT5zdWJQYXRoID0gJHRoaXMtPmdldFN1YlBhdGgoKTsKfQppZiAoJycgIT09ICRzdWJQYXRobmFtZSkgewokc3ViUGF0aG5hbWUgLj0gJHRoaXMtPmRpcmVjdG9yeVNlcGFyYXRvcjsKfQokc3ViUGF0aG5hbWUgLj0gJHRoaXMtPmdldEZpbGVuYW1lKCk7CgppZiAoJy8nICE9PSAkYmFzZVBhdGggPSAkdGhpcy0+cm9vdFBhdGgpIHsKJGJhc2VQYXRoIC49ICR0aGlzLT5kaXJlY3RvcnlTZXBhcmF0b3I7Cn0KCnJldHVybiBuZXcgU3BsRmlsZUluZm8oJGJhc2VQYXRoLiRzdWJQYXRobmFtZSwgJHRoaXMtPnN1YlBhdGgsICRzdWJQYXRobmFtZSk7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBoYXNDaGlsZHJlbigkYWxsb3dMaW5rcyA9IGZhbHNlKQp7CiRoYXNDaGlsZHJlbiA9IHBhcmVudDo6aGFzQ2hpbGRyZW4oJGFsbG93TGlua3MpOwoKaWYgKCEkaGFzQ2hpbGRyZW4gfHwgISR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycykgewpyZXR1cm4gJGhhc0NoaWxkcmVuOwp9Cgp0cnkgewpwYXJlbnQ6OmdldENoaWxkcmVuKCk7CgpyZXR1cm4gdHJ1ZTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewoKcmV0dXJuIGZhbHNlOwp9Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZHJlbigpCnsKdHJ5IHsKJGNoaWxkcmVuID0gcGFyZW50OjpnZXRDaGlsZHJlbigpOwoKaWYgKCRjaGlsZHJlbiBpbnN0YW5jZW9mIHNlbGYpIHsKCiRjaGlsZHJlbi0+aWdub3JlVW5yZWFkYWJsZURpcnMgPSAkdGhpcy0+aWdub3JlVW5yZWFkYWJsZURpcnM7CgoKJGNoaWxkcmVuLT5yb290UGF0aCA9ICR0aGlzLT5yb290UGF0aDsKfQoKcmV0dXJuICRjaGlsZHJlbjsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgQWNjZXNzRGVuaWVkRXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCksICRlLT5nZXRDb2RlKCksICRlKTsKfQp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIG5leHQoKQp7CiR0aGlzLT5pZ25vcmVGaXJzdFJld2luZCA9IGZhbHNlOwoKcGFyZW50OjpuZXh0KCk7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gcmV3aW5kKCkKewoKCmlmICgkdGhpcy0+aWdub3JlRmlyc3RSZXdpbmQpIHsKJHRoaXMtPmlnbm9yZUZpcnN0UmV3aW5kID0gZmFsc2U7CgpyZXR1cm47Cn0KCnBhcmVudDo6cmV3aW5kKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvclxOdW1iZXJDb21wYXJhdG9yOwoKCgoKCgoKCmNsYXNzIFNpemVSYW5nZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHJpdmF0ZSAkY29tcGFyYXRvcnMgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgYXJyYXkgJGNvbXBhcmF0b3JzKQp7CiR0aGlzLT5jb21wYXJhdG9ycyA9ICRjb21wYXJhdG9yczsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKJGZpbGVpbmZvID0gJHRoaXMtPmN1cnJlbnQoKTsKaWYgKCEkZmlsZWluZm8tPmlzRmlsZSgpKSB7CnJldHVybiB0cnVlOwp9CgokZmlsZXNpemUgPSAkZmlsZWluZm8tPmdldFNpemUoKTsKZm9yZWFjaCAoJHRoaXMtPmNvbXBhcmF0b3JzIGFzICRjb21wYXJlKSB7CmlmICghJGNvbXBhcmUtPnRlc3QoJGZpbGVzaXplKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgpjbGFzcyBTb3J0YWJsZUl0ZXJhdG9yIGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlCnsKcHVibGljIGNvbnN0IFNPUlRfQllfTk9ORSA9IDA7CnB1YmxpYyBjb25zdCBTT1JUX0JZX05BTUUgPSAxOwpwdWJsaWMgY29uc3QgU09SVF9CWV9UWVBFID0gMjsKcHVibGljIGNvbnN0IFNPUlRfQllfQUNDRVNTRURfVElNRSA9IDM7CnB1YmxpYyBjb25zdCBTT1JUX0JZX0NIQU5HRURfVElNRSA9IDQ7CnB1YmxpYyBjb25zdCBTT1JUX0JZX01PRElGSUVEX1RJTUUgPSA1OwpwdWJsaWMgY29uc3QgU09SVF9CWV9OQU1FX05BVFVSQUwgPSA2OwoKcHJpdmF0ZSAkaXRlcmF0b3I7CnByaXZhdGUgJHNvcnQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXFRyYXZlcnNhYmxlICRpdGVyYXRvciwgJHNvcnQsIGJvb2wgJHJldmVyc2VPcmRlciA9IGZhbHNlKQp7CiR0aGlzLT5pdGVyYXRvciA9ICRpdGVyYXRvcjsKJG9yZGVyID0gJHJldmVyc2VPcmRlciA/IC0xIDogMTsKCmlmIChzZWxmOjpTT1JUX0JZX05BTUUgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkb3JkZXIpIHsKcmV0dXJuICRvcmRlciAqIHN0cmNtcCgkYS0+Z2V0UmVhbFBhdGgoKSA/OiAkYS0+Z2V0UGF0aG5hbWUoKSwgJGItPmdldFJlYWxQYXRoKCkgPzogJGItPmdldFBhdGhuYW1lKCkpOwp9Owp9IGVsc2VpZiAoc2VsZjo6U09SVF9CWV9OQU1FX05BVFVSQUwgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkb3JkZXIpIHsKcmV0dXJuICRvcmRlciAqIHN0cm5hdGNtcCgkYS0+Z2V0UmVhbFBhdGgoKSA/OiAkYS0+Z2V0UGF0aG5hbWUoKSwgJGItPmdldFJlYWxQYXRoKCkgPzogJGItPmdldFBhdGhuYW1lKCkpOwp9Owp9IGVsc2VpZiAoc2VsZjo6U09SVF9CWV9UWVBFID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJG9yZGVyKSB7CmlmICgkYS0+aXNEaXIoKSAmJiAkYi0+aXNGaWxlKCkpIHsKcmV0dXJuIC0kb3JkZXI7Cn0gZWxzZWlmICgkYS0+aXNGaWxlKCkgJiYgJGItPmlzRGlyKCkpIHsKcmV0dXJuICRvcmRlcjsKfQoKcmV0dXJuICRvcmRlciAqIHN0cmNtcCgkYS0+Z2V0UmVhbFBhdGgoKSA/OiAkYS0+Z2V0UGF0aG5hbWUoKSwgJGItPmdldFJlYWxQYXRoKCkgPzogJGItPmdldFBhdGhuYW1lKCkpOwp9Owp9IGVsc2VpZiAoc2VsZjo6U09SVF9CWV9BQ0NFU1NFRF9USU1FID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJG9yZGVyKSB7CnJldHVybiAkb3JkZXIgKiAoJGEtPmdldEFUaW1lKCkgLSAkYi0+Z2V0QVRpbWUoKSk7Cn07Cn0gZWxzZWlmIChzZWxmOjpTT1JUX0JZX0NIQU5HRURfVElNRSA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRvcmRlcikgewpyZXR1cm4gJG9yZGVyICogKCRhLT5nZXRDVGltZSgpIC0gJGItPmdldENUaW1lKCkpOwp9Owp9IGVsc2VpZiAoc2VsZjo6U09SVF9CWV9NT0RJRklFRF9USU1FID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJG9yZGVyKSB7CnJldHVybiAkb3JkZXIgKiAoJGEtPmdldE1UaW1lKCkgLSAkYi0+Z2V0TVRpbWUoKSk7Cn07Cn0gZWxzZWlmIChzZWxmOjpTT1JUX0JZX05PTkUgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gJG9yZGVyOwp9IGVsc2VpZiAoXGlzX2NhbGxhYmxlKCRzb3J0KSkgewokdGhpcy0+c29ydCA9ICRyZXZlcnNlT3JkZXIgPyBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRzb3J0KSB7IHJldHVybiAtJHNvcnQoJGEsICRiKTsgfSA6ICRzb3J0Owp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIFNvcnRhYmxlSXRlcmF0b3IgdGFrZXMgYSBQSFAgY2FsbGFibGUgb3IgYSB2YWxpZCBidWlsdC1pbiBzb3J0IGFsZ29yaXRobSBhcyBhbiBhcmd1bWVudC4nKTsKfQp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCkKewppZiAoMSA9PT0gJHRoaXMtPnNvcnQpIHsKcmV0dXJuICR0aGlzLT5pdGVyYXRvcjsKfQoKJGFycmF5ID0gaXRlcmF0b3JfdG9fYXJyYXkoJHRoaXMtPml0ZXJhdG9yLCB0cnVlKTsKCmlmICgtMSA9PT0gJHRoaXMtPnNvcnQpIHsKJGFycmF5ID0gYXJyYXlfcmV2ZXJzZSgkYXJyYXkpOwp9IGVsc2Ugewp1YXNvcnQoJGFycmF5LCAkdGhpcy0+c29ydCk7Cn0KCnJldHVybiBuZXcgXEFycmF5SXRlcmF0b3IoJGFycmF5KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxHaXRpZ25vcmU7CgpmaW5hbCBjbGFzcyBWY3NJZ25vcmVkRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewoKCgpwcml2YXRlICRiYXNlRGlyOwoKCgoKcHJpdmF0ZSAkZ2l0aWdub3JlRmlsZXNDYWNoZSA9IFtdOwoKCgoKcHJpdmF0ZSAkaWdub3JlZFBhdGhzQ2FjaGUgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBzdHJpbmcgJGJhc2VEaXIpCnsKJHRoaXMtPmJhc2VEaXIgPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkYmFzZURpcik7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKTogYm9vbAp7CiRmaWxlID0gJHRoaXMtPmN1cnJlbnQoKTsKCiRmaWxlUmVhbFBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkZmlsZS0+Z2V0UmVhbFBhdGgoKSk7CgpyZXR1cm4gISR0aGlzLT5pc0lnbm9yZWQoJGZpbGVSZWFsUGF0aCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkZmlsZVJlYWxQYXRoKTogYm9vbAp7CmlmIChpc19kaXIoJGZpbGVSZWFsUGF0aCkgJiYgIXN0cl9lbmRzX3dpdGgoJGZpbGVSZWFsUGF0aCwgJy8nKSkgewokZmlsZVJlYWxQYXRoIC49ICcvJzsKfQoKaWYgKGlzc2V0KCR0aGlzLT5pZ25vcmVkUGF0aHNDYWNoZVskZmlsZVJlYWxQYXRoXSkpIHsKcmV0dXJuICR0aGlzLT5pZ25vcmVkUGF0aHNDYWNoZVskZmlsZVJlYWxQYXRoXTsKfQoKJGlnbm9yZWQgPSBmYWxzZTsKCmZvcmVhY2ggKCR0aGlzLT5wYXJlbnRzRGlyZWN0b3J5RG93bndhcmQoJGZpbGVSZWFsUGF0aCkgYXMgJHBhcmVudERpcmVjdG9yeSkgewppZiAoJHRoaXMtPmlzSWdub3JlZCgkcGFyZW50RGlyZWN0b3J5KSkgewoKYnJlYWs7Cn0KCiRmaWxlUmVsYXRpdmVQYXRoID0gc3Vic3RyKCRmaWxlUmVhbFBhdGgsIFxzdHJsZW4oJHBhcmVudERpcmVjdG9yeSkgKyAxKTsKCmlmIChudWxsID09PSAkcmVnZXhwcyA9ICR0aGlzLT5yZWFkR2l0aWdub3JlRmlsZSgieyRwYXJlbnREaXJlY3Rvcnl9Ly5naXRpZ25vcmUiKSkgewpjb250aW51ZTsKfQoKWyRleGNsdXNpb25SZWdleCwgJGluY2x1c2lvblJlZ2V4XSA9ICRyZWdleHBzOwoKaWYgKHByZWdfbWF0Y2goJGV4Y2x1c2lvblJlZ2V4LCAkZmlsZVJlbGF0aXZlUGF0aCkpIHsKJGlnbm9yZWQgPSB0cnVlOwoKY29udGludWU7Cn0KCmlmIChwcmVnX21hdGNoKCRpbmNsdXNpb25SZWdleCwgJGZpbGVSZWxhdGl2ZVBhdGgpKSB7CiRpZ25vcmVkID0gZmFsc2U7Cn0KfQoKcmV0dXJuICR0aGlzLT5pZ25vcmVkUGF0aHNDYWNoZVskZmlsZVJlYWxQYXRoXSA9ICRpZ25vcmVkOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcmVudHNEaXJlY3RvcnlEb3dud2FyZChzdHJpbmcgJGZpbGVSZWFsUGF0aCk6IGFycmF5CnsKJHBhcmVudERpcmVjdG9yaWVzID0gW107CgokcGFyZW50RGlyZWN0b3J5ID0gJGZpbGVSZWFsUGF0aDsKCndoaWxlICh0cnVlKSB7CiRuZXdQYXJlbnREaXJlY3RvcnkgPSBcZGlybmFtZSgkcGFyZW50RGlyZWN0b3J5KTsKCgppZiAoJG5ld1BhcmVudERpcmVjdG9yeSA9PT0gJHBhcmVudERpcmVjdG9yeSkgewpicmVhazsKfQoKJHBhcmVudERpcmVjdG9yeSA9ICRuZXdQYXJlbnREaXJlY3Rvcnk7CgppZiAoMCAhPT0gc3RycG9zKCRwYXJlbnREaXJlY3RvcnksICR0aGlzLT5iYXNlRGlyKSkgewpicmVhazsKfQoKJHBhcmVudERpcmVjdG9yaWVzW10gPSAkcGFyZW50RGlyZWN0b3J5Owp9CgpyZXR1cm4gYXJyYXlfcmV2ZXJzZSgkcGFyZW50RGlyZWN0b3JpZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRHaXRpZ25vcmVGaWxlKHN0cmluZyAkcGF0aCk6ID9hcnJheQp7CmlmIChcYXJyYXlfa2V5X2V4aXN0cygkcGF0aCwgJHRoaXMtPmdpdGlnbm9yZUZpbGVzQ2FjaGUpKSB7CnJldHVybiAkdGhpcy0+Z2l0aWdub3JlRmlsZXNDYWNoZVskcGF0aF07Cn0KCmlmICghZmlsZV9leGlzdHMoJHBhdGgpKSB7CnJldHVybiAkdGhpcy0+Z2l0aWdub3JlRmlsZXNDYWNoZVskcGF0aF0gPSBudWxsOwp9CgppZiAoIWlzX2ZpbGUoJHBhdGgpIHx8ICFpc19yZWFkYWJsZSgkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJUaGUgXCJpZ25vcmVWQ1NJZ25vcmVkXCIgb3B0aW9uIGNhbm5vdCBiZSB1c2VkIGJ5IHRoZSBGaW5kZXIgYXMgdGhlIFwieyRwYXRofVwiIGZpbGUgaXMgbm90IHJlYWRhYmxlLiIpOwp9CgokZ2l0aWdub3JlRmlsZUNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CgpyZXR1cm4gJHRoaXMtPmdpdGlnbm9yZUZpbGVzQ2FjaGVbJHBhdGhdID0gWwpHaXRpZ25vcmU6OnRvUmVnZXgoJGdpdGlnbm9yZUZpbGVDb250ZW50KSwKR2l0aWdub3JlOjp0b1JlZ2V4TWF0Y2hpbmdOZWdhdGVkUGF0dGVybnMoJGdpdGlnbm9yZUZpbGVDb250ZW50KSwKXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewpyZXR1cm4gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7Cn0KCnJldHVybiAkcGF0aDsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMDQtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7CgoKCgoKCmNsYXNzIFNwbEZpbGVJbmZvIGV4dGVuZHMgXFNwbEZpbGVJbmZvCnsKcHJpdmF0ZSAkcmVsYXRpdmVQYXRoOwpwcml2YXRlICRyZWxhdGl2ZVBhdGhuYW1lOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRmaWxlLCBzdHJpbmcgJHJlbGF0aXZlUGF0aCwgc3RyaW5nICRyZWxhdGl2ZVBhdGhuYW1lKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGZpbGUpOwokdGhpcy0+cmVsYXRpdmVQYXRoID0gJHJlbGF0aXZlUGF0aDsKJHRoaXMtPnJlbGF0aXZlUGF0aG5hbWUgPSAkcmVsYXRpdmVQYXRobmFtZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWxhdGl2ZVBhdGgoKQp7CnJldHVybiAkdGhpcy0+cmVsYXRpdmVQYXRoOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGF0aXZlUGF0aG5hbWUoKQp7CnJldHVybiAkdGhpcy0+cmVsYXRpdmVQYXRobmFtZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbigpOiBzdHJpbmcKewokZmlsZW5hbWUgPSAkdGhpcy0+Z2V0RmlsZW5hbWUoKTsKCnJldHVybiBwYXRoaW5mbygkZmlsZW5hbWUsIFxQQVRISU5GT19GSUxFTkFNRSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoKQp7CnNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uICgkdHlwZSwgJG1zZykgdXNlICgmJGVycm9yKSB7ICRlcnJvciA9ICRtc2c7IH0pOwp0cnkgewokY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5nZXRQYXRobmFtZSgpKTsKfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KaWYgKGZhbHNlID09PSAkY29udGVudCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKcmV0dXJuICRjb250ZW50Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXEN0eXBlOwoKCgoKCgoKCmZpbmFsIGNsYXNzIEN0eXBlCnsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9hbG51bSgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teQS1aYS16MC05XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfYWxwaGEoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXkEtWmEtel0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX2NudHJsKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15ceDAwLVx4MWZceDdmXS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfZGlnaXQoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXjAtOV0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX2dyYXBoKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW14hLX5dLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9sb3dlcigkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teYS16XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfcHJpbnQoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXiAtfl0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX3B1bmN0KCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW14hLVwvXDotQFxbLWBcey1+XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfc3BhY2UoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXlxzXS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfdXBwZXIoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXkEtWl0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX3hkaWdpdCgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teQS1GYS1mMC05XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkaW50LCAkZnVuY3Rpb24pCnsKaWYgKCFcaXNfaW50KCRpbnQpKSB7CnJldHVybiAkaW50Owp9CgppZiAoJGludCA8IC0xMjggfHwgJGludCA+IDI1NSkgewpyZXR1cm4gKHN0cmluZykgJGludDsKfQoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCkgewpAdHJpZ2dlcl9lcnJvcigkZnVuY3Rpb24uJygpOiBBcmd1bWVudCBvZiB0eXBlIGludCB3aWxsIGJlIGludGVycHJldGVkIGFzIHN0cmluZyBpbiB0aGUgZnV0dXJlJywgXEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKaWYgKCRpbnQgPCAwKSB7CiRpbnQgKz0gMjU2Owp9CgpyZXR1cm4gXGNocigkaW50KTsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTgtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEN0eXBlIGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnJldHVybiByZXF1aXJlIF9fRElSX18uJy9ib290c3RyYXA4MC5waHAnOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfYWxudW0nKSkgewpmdW5jdGlvbiBjdHlwZV9hbG51bSgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfYWxudW0oJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2FscGhhJykpIHsKZnVuY3Rpb24gY3R5cGVfYWxwaGEoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2FscGhhKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9jbnRybCcpKSB7CmZ1bmN0aW9uIGN0eXBlX2NudHJsKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9jbnRybCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfZGlnaXQnKSkgewpmdW5jdGlvbiBjdHlwZV9kaWdpdCgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfZGlnaXQoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2dyYXBoJykpIHsKZnVuY3Rpb24gY3R5cGVfZ3JhcGgoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2dyYXBoKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9sb3dlcicpKSB7CmZ1bmN0aW9uIGN0eXBlX2xvd2VyKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9sb3dlcigkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfcHJpbnQnKSkgewpmdW5jdGlvbiBjdHlwZV9wcmludCgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfcHJpbnQoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3B1bmN0JykpIHsKZnVuY3Rpb24gY3R5cGVfcHVuY3QoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3B1bmN0KCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9zcGFjZScpKSB7CmZ1bmN0aW9uIGN0eXBlX3NwYWNlKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9zcGFjZSgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfdXBwZXInKSkgewpmdW5jdGlvbiBjdHlwZV91cHBlcigkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfdXBwZXIoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3hkaWdpdCcpKSB7CmZ1bmN0aW9uIGN0eXBlX3hkaWdpdCgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfeGRpZ2l0KCR0ZXh0KTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxDdHlwZSBhcyBwOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2FsbnVtJykpIHsKZnVuY3Rpb24gY3R5cGVfYWxudW0obWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2FsbnVtKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9hbHBoYScpKSB7CmZ1bmN0aW9uIGN0eXBlX2FscGhhKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9hbHBoYSgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfY250cmwnKSkgewpmdW5jdGlvbiBjdHlwZV9jbnRybChtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfY250cmwoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2RpZ2l0JykpIHsKZnVuY3Rpb24gY3R5cGVfZGlnaXQobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2RpZ2l0KCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9ncmFwaCcpKSB7CmZ1bmN0aW9uIGN0eXBlX2dyYXBoKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9ncmFwaCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfbG93ZXInKSkgewpmdW5jdGlvbiBjdHlwZV9sb3dlcihtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfbG93ZXIoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3ByaW50JykpIHsKZnVuY3Rpb24gY3R5cGVfcHJpbnQobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3ByaW50KCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9wdW5jdCcpKSB7CmZ1bmN0aW9uIGN0eXBlX3B1bmN0KG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9wdW5jdCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfc3BhY2UnKSkgewpmdW5jdGlvbiBjdHlwZV9zcGFjZShtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfc3BhY2UoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3VwcGVyJykpIHsKZnVuY3Rpb24gY3R5cGVfdXBwZXIobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3VwcGVyKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV94ZGlnaXQnKSkgewpmdW5jdGlvbiBjdHlwZV94ZGlnaXQobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3hkaWdpdCgkdGV4dCk7IH0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcSW50bFxHcmFwaGVtZTsKClxkZWZpbmUoJ1NZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWCcsICgoZmxvYXQpIFxQQ1JFX1ZFUlNJT04gPCAxMCA/IChmbG9hdCkgXFBDUkVfVkVSU0lPTiA+PSA4LjMyIDogKGZsb2F0KSBcUENSRV9WRVJTSU9OID49IDEwLjM5KSA/ICdcWCcgOiBHcmFwaGVtZTo6R1JBUEhFTUVfQ0xVU1RFUl9SWCk7CgoKCgoKCgoKCgoKCgoKCgoKCgpmaW5hbCBjbGFzcyBHcmFwaGVtZQp7CgoKcHVibGljIGNvbnN0IEdSQVBIRU1FX0NMVVNURVJfUlggPSAnKD86XHJcbnwoPzpbIC1+XHh7MjAwQ31ceHsyMDBEfV18W+GGqC3hh7ldK3xb4YSALeGFn10qKD86W+qwgOqwnOqwuOqxlOqxsOqyjOqyqOqzhOqzoOqzvOq0mOq0tOq1kOq1rOq2iOq2pOq3gOq3nOq3uOq4lOq4sOq5jOq5qOq6hOq6oOq6vOq7mOq7tOq8kOq8rOq9iOq9pOq+gOq+nOq+uOq/lOq/sOuAjOuAqOuBhOuBoOuBvOuCmOuCtOuDkOuDrOuEiOuEpOuFgOuFnOuFuOuGlOuGsOuHjOuHqOuIhOuIoOuIvOuJmOuJtOuKkOuKrOuLiOuLpOuMgOuMnOuMuOuNlOuNsOuOjOuOqOuPhOuPoOuPvOuQmOuQtOuRkOuRrOuSiOuSpOuTgOuTnOuTuOuUlOuUsOuVjOuVqOuWhOuWoOuWvOuXmOuXtOuYkOuYrOuZiOuZpOuagOuanOuauOublOubsOucjOucqOudhOudoOudvOuemOuetOufkOufrOugiOugpOuhgOuhnOuhuOuilOuisOujjOujqOukhOukoOukvOulmOultOumkOumrOuniOunpOuogOuonOuouOuplOupsOuqjOuqqOurhOuroOurvOusmOustOutkOutrOuuiOuupOuvgOuvnOuvuOuwlOuwsOuxjOuxqOuyhOuyoOuyvOuzmOuztOu0kOu0rOu1iOu1pOu2gOu2nOu2uOu3lOu3sOu4jOu4qOu5hOu5oOu5vOu6mOu6tOu7kOu7rOu8iOu8pOu9gOu9nOu9uOu+lOu+sOu/jOu/qOyAhOyAoOyAvOyBmOyBtOyCkOyCrOyDiOyDpOyEgOyEnOyEuOyFlOyFsOyGjOyGqOyHhOyHoOyHvOyImOyItOyJkOyJrOyKiOyKpOyLgOyLnOyLuOyMlOyMsOyNjOyNqOyOhOyOoOyOvOyPmOyPtOyQkOyQrOyRiOyRpOySgOySnOySuOyTlOyTsOyUjOyUqOyVhOyVoOyVvOyWmOyWtOyXkOyXrOyYiOyYpOyZgOyZnOyZuOyalOyasOybjOybqOychOycoOycvOydmOydtOyekOyerOyfiOyfpOyggOygnOyguOyhlOyhsOyijOyiqOyjhOyjoOyjvOykmOyktOylkOylrOymiOympOyngOynnOynuOyolOyosOypjOypqOyqhOyqoOyqvOyrmOyrtOyskOysrOytiOytpOyugOyunOyuuOyvlOyvsOywjOywqOyxhOyxoOyxvOyymOyytOyzkOyzrOy0iOy0pOy1gOy1nOy1uOy2lOy2sOy3jOy3qOy4hOy4oOy4vOy5mOy5tOy6kOy6rOy7iOy7pOy8gOy8nOy8uOy9lOy9sOy+jOy+qOy/hOy/oOy/vO2AmO2AtO2BkO2BrO2CiO2CpO2DgO2DnO2DuO2ElO2EsO2FjO2FqO2GhO2GoO2GvO2HmO2HtO2IkO2IrO2JiO2JpO2KgO2KnO2KuO2LlO2LsO2MjO2MqO2NhO2NoO2NvO2OmO2OtO2PkO2PrO2QiO2QpO2RgO2RnO2RuO2SlO2SsO2TjO2TqO2UhO2UoO2UvO2VmO2VtO2WkO2WrO2XiO2XpO2YgO2YnO2YuO2ZlO2ZsO2ajO2aqO2bhO2boO2bvO2cmO2ctO2dkO2drO2eiF0/W+GFoC3hhqJdK3xb6rCALe2eo10pW+GGqC3hh7ldKnxb4YSALeGFn10rfFteXHB7Q2N9XHB7Q2Z9XHB7Wmx9XHB7WnB9XSlbXHB7TW59XHB7TWV9XHh7MDlCRX1ceHswOUQ3fVx4ezBCM0V9XHh7MEI1N31ceHswQkJFfVx4ezBCRDd9XHh7MENDMn1ceHswQ0Q1fVx4ezBDRDZ9XHh7MEQzRX1ceHswRDU3fVx4ezBEQ0Z9XHh7MERERn1ceHsyMDBDfVx4ezIwMER9XHh7MUQxNjV9XHh7MUQxNkV9LVx4ezFEMTcyfV0qfFtccHtDY31ccHtDZn1ccHtabH1ccHtacH1dKSc7Cgpwcml2YXRlIGNvbnN0IENBU0VfRk9MRCA9IFsKWyfCtScsICfFvycsICJceENEXHg4NSIsICfPgicsICJceENGXHg5MCIsICJceENGXHg5MSIsICJceENGXHg5NSIsICJceENGXHg5NiIsICJceENGXHhCMCIsICJceENGXHhCMSIsICJceENGXHhCNSIsICJceEUxXHhCQVx4OUIiLCAiXHhFMVx4QkVceEJFIl0sClsnzrwnLCAncycsICfOuScsICfPgycsICfOsicsICfOuCcsICfPhicsICfPgCcsICfOuicsICfPgScsICfOtScsICJceEUxXHhCOVx4QTEiLCAnzrknXSwKXTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfZXh0cmFjdCgkcywgJHNpemUsICR0eXBlID0gXEdSQVBIRU1FX0VYVFJfQ09VTlQsICRzdGFydCA9IDAsICYkbmV4dCA9IDApCnsKaWYgKDAgPiAkc3RhcnQpIHsKJHN0YXJ0ID0gXHN0cmxlbigkcykgKyAkc3RhcnQ7Cn0KCmlmICghXGlzX3NjYWxhcigkcykpIHsKJGhhc0Vycm9yID0gZmFsc2U7CnNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uICgpIHVzZSAoJiRoYXNFcnJvcikgeyAkaGFzRXJyb3IgPSB0cnVlOyB9KTsKJG5leHQgPSBzdWJzdHIoJHMsICRzdGFydCk7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwppZiAoJGhhc0Vycm9yKSB7CnN1YnN0cigkcywgJHN0YXJ0KTsKJHMgPSAnJzsKfSBlbHNlIHsKJHMgPSAkbmV4dDsKfQp9IGVsc2UgewokcyA9IHN1YnN0cigkcywgJHN0YXJ0KTsKfQokc2l6ZSA9IChpbnQpICRzaXplOwokdHlwZSA9IChpbnQpICR0eXBlOwokc3RhcnQgPSAoaW50KSAkc3RhcnQ7CgppZiAoXEdSQVBIRU1FX0VYVFJfQ09VTlQgIT09ICR0eXBlICYmIFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTICE9PSAkdHlwZSAmJiBcR1JBUEhFTUVfRVhUUl9NQVhDSEFSUyAhPT0gJHR5cGUpIHsKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdncmFwaGVtZV9leHRyYWN0KCk6IEFyZ3VtZW50ICMzICgkdHlwZSkgbXVzdCBiZSBvbmUgb2YgR1JBUEhFTUVfRVhUUl9DT1VOVCwgR1JBUEhFTUVfRVhUUl9NQVhCWVRFUywgb3IgR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycpOwp9CgppZiAoIWlzc2V0KCRzWzBdKSB8fCAwID4gJHNpemUgfHwgMCA+ICRzdGFydCkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKDAgPT09ICRzaXplKSB7CnJldHVybiAnJzsKfQoKJG5leHQgPSAkc3RhcnQ7CgokcyA9IHByZWdfc3BsaXQoJy8oJy5TWU1GT05ZX0dSQVBIRU1FX0NMVVNURVJfUlguJykvdScsICJcclxuIi4kcywgJHNpemUgKyAxLCBcUFJFR19TUExJVF9OT19FTVBUWSB8IFxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOwoKaWYgKCFpc3NldCgkc1sxXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgokaSA9IDE7CiRyZXQgPSAnJzsKCmRvIHsKaWYgKFxHUkFQSEVNRV9FWFRSX0NPVU5UID09PSAkdHlwZSkgewotLSRzaXplOwp9IGVsc2VpZiAoXEdSQVBIRU1FX0VYVFJfTUFYQllURVMgPT09ICR0eXBlKSB7CiRzaXplIC09IFxzdHJsZW4oJHNbJGldKTsKfSBlbHNlIHsKJHNpemUgLT0gaWNvbnZfc3RybGVuKCRzWyRpXSwgJ1VURi04Ly9JR05PUkUnKTsKfQoKaWYgKCRzaXplID49IDApIHsKJHJldCAuPSAkc1skaV07Cn0KfSB3aGlsZSAoaXNzZXQoJHNbKyskaV0pICYmICRzaXplID4gMCk7CgokbmV4dCArPSBcc3RybGVuKCRyZXQpOwoKcmV0dXJuICRyZXQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RybGVuKCRzKQp7CnByZWdfcmVwbGFjZSgnLycuU1lNRk9OWV9HUkFQSEVNRV9DTFVTVEVSX1JYLicvdScsICcnLCAkcywgLTEsICRsZW4pOwoKcmV0dXJuIDAgPT09ICRsZW4gJiYgJycgIT09ICRzID8gbnVsbCA6ICRsZW47Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3Vic3RyKCRzLCAkc3RhcnQsICRsZW4gPSBudWxsKQp7CmlmIChudWxsID09PSAkbGVuKSB7CiRsZW4gPSAyMTQ3NDgzNjQ3Owp9CgpwcmVnX21hdGNoX2FsbCgnLycuU1lNRk9OWV9HUkFQSEVNRV9DTFVTVEVSX1JYLicvdScsICRzLCAkcyk7Cgokc2xlbiA9IFxjb3VudCgkc1swXSk7CiRzdGFydCA9IChpbnQpICRzdGFydDsKCmlmICgwID4gJHN0YXJ0KSB7CiRzdGFydCArPSAkc2xlbjsKfQppZiAoMCA+ICRzdGFydCkgewppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKcmV0dXJuIGZhbHNlOwp9Cgokc3RhcnQgPSAwOwp9CmlmICgkc3RhcnQgPj0gJHNsZW4pIHsKcmV0dXJuIFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCA/ICcnIDogZmFsc2U7Cn0KCiRyZW0gPSAkc2xlbiAtICRzdGFydDsKCmlmICgwID4gJGxlbikgewokbGVuICs9ICRyZW07Cn0KaWYgKDAgPT09ICRsZW4pIHsKcmV0dXJuICcnOwp9CmlmICgwID4gJGxlbikgewpyZXR1cm4gXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwID8gJycgOiBmYWxzZTsKfQppZiAoJGxlbiA+ICRyZW0pIHsKJGxlbiA9ICRyZW07Cn0KCnJldHVybiBpbXBsb2RlKCcnLCBcYXJyYXlfc2xpY2UoJHNbMF0sICRzdGFydCwgJGxlbikpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cnBvcygkcywgJG5lZWRsZSwgJG9mZnNldCA9IDApCnsKcmV0dXJuIHNlbGY6OmdyYXBoZW1lX3Bvc2l0aW9uKCRzLCAkbmVlZGxlLCAkb2Zmc2V0LCAwKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJpcG9zKCRzLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKewpyZXR1cm4gc2VsZjo6Z3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsIDEpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cnJwb3MoJHMsICRuZWVkbGUsICRvZmZzZXQgPSAwKQp7CnJldHVybiBzZWxmOjpncmFwaGVtZV9wb3NpdGlvbigkcywgJG5lZWRsZSwgJG9mZnNldCwgMik7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3Rycmlwb3MoJHMsICRuZWVkbGUsICRvZmZzZXQgPSAwKQp7CnJldHVybiBzZWxmOjpncmFwaGVtZV9wb3NpdGlvbigkcywgJG5lZWRsZSwgJG9mZnNldCwgMyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXN0cigkcywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSA9IGZhbHNlKQp7CnJldHVybiBtYl9zdHJpc3RyKCRzLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlLCAnVVRGLTgnKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJzdHIoJHMsICRuZWVkbGUsICRiZWZvcmVOZWVkbGUgPSBmYWxzZSkKewpyZXR1cm4gbWJfc3Ryc3RyKCRzLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlLCAnVVRGLTgnKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsICRtb2RlKQp7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQgJiYgIXByZWdfbWF0Y2goJy8uL3VzJywgJG5lZWRsZSkpIHsKcmV0dXJuIGZhbHNlOwp9CiRzID0gKHN0cmluZykgJHM7CmlmICghcHJlZ19tYXRjaCgnLy4vdXMnLCAkcykpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkb2Zmc2V0ID4gMCkgewokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgJG9mZnNldCk7Cn0gZWxzZWlmICgkb2Zmc2V0IDwgMCkgewppZiAoMiA+ICRtb2RlKSB7CiRvZmZzZXQgKz0gc2VsZjo6Z3JhcGhlbWVfc3RybGVuKCRzKTsKJHMgPSBzZWxmOjpncmFwaGVtZV9zdWJzdHIoJHMsICRvZmZzZXQpOwppZiAoMCA+ICRvZmZzZXQpIHsKJG9mZnNldCA9IDA7Cn0KfSBlbHNlaWYgKDAgPiAkb2Zmc2V0ICs9IHNlbGY6OmdyYXBoZW1lX3N0cmxlbigkbmVlZGxlKSkgewokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgMCwgJG9mZnNldCk7CiRvZmZzZXQgPSAwOwp9IGVsc2Ugewokb2Zmc2V0ID0gMDsKfQp9CgoKCgokY2FzZUluc2Vuc2l0aXZlID0gJG1vZGUgJiAxOwokcmV2ZXJzZSA9ICRtb2RlICYgMjsKaWYgKCRjYXNlSW5zZW5zaXRpdmUpIHsKCgoKJG1vZGUgPSBcZGVmaW5lZCgnTUJfQ0FTRV9GT0xEX1NJTVBMRScpID8gXE1CX0NBU0VfRk9MRF9TSU1QTEUgOiBcTUJfQ0FTRV9MT1dFUjsKJHMgPSBtYl9jb252ZXJ0X2Nhc2UoJHMsICRtb2RlLCAnVVRGLTgnKTsKJG5lZWRsZSA9IG1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCAkbW9kZSwgJ1VURi04Jyk7CgppZiAoIVxkZWZpbmVkKCdNQl9DQVNFX0ZPTERfU0lNUExFJykpIHsKJHMgPSBzdHJfcmVwbGFjZShzZWxmOjpDQVNFX0ZPTERbMF0sIHNlbGY6OkNBU0VfRk9MRFsxXSwgJHMpOwokbmVlZGxlID0gc3RyX3JlcGxhY2Uoc2VsZjo6Q0FTRV9GT0xEWzBdLCBzZWxmOjpDQVNFX0ZPTERbMV0sICRuZWVkbGUpOwp9Cn0KaWYgKCRyZXZlcnNlKSB7CiRuZWVkbGVQb3MgPSBzdHJycG9zKCRzLCAkbmVlZGxlKTsKfSBlbHNlIHsKJG5lZWRsZVBvcyA9IHN0cnBvcygkcywgJG5lZWRsZSk7Cn0KCnJldHVybiBmYWxzZSAhPT0gJG5lZWRsZVBvcyA/IHNlbGY6OmdyYXBoZW1lX3N0cmxlbihzdWJzdHIoJHMsIDAsICRuZWVkbGVQb3MpKSArICRvZmZzZXQgOiBmYWxzZTsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWUgYXMgcDsKCmlmIChleHRlbnNpb25fbG9hZGVkKCdpbnRsJykpIHsKcmV0dXJuOwp9CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnJldHVybiByZXF1aXJlIF9fRElSX18uJy9ib290c3RyYXA4MC5waHAnOwp9CgppZiAoIWRlZmluZWQoJ0dSQVBIRU1FX0VYVFJfQ09VTlQnKSkgewpkZWZpbmUoJ0dSQVBIRU1FX0VYVFJfQ09VTlQnLCAwKTsKfQppZiAoIWRlZmluZWQoJ0dSQVBIRU1FX0VYVFJfTUFYQllURVMnKSkgewpkZWZpbmUoJ0dSQVBIRU1FX0VYVFJfTUFYQllURVMnLCAxKTsKfQppZiAoIWRlZmluZWQoJ0dSQVBIRU1FX0VYVFJfTUFYQ0hBUlMnKSkgewpkZWZpbmUoJ0dSQVBIRU1FX0VYVFJfTUFYQ0hBUlMnLCAyKTsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX2V4dHJhY3QnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9leHRyYWN0KCRoYXlzdGFjaywgJHNpemUsICR0eXBlID0gMCwgJHN0YXJ0ID0gMCwgJiRuZXh0ID0gMCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfZXh0cmFjdCgkaGF5c3RhY2ssICRzaXplLCAkdHlwZSwgJHN0YXJ0LCAkbmV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyaXBvcycpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmlzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSA9IGZhbHNlKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RybGVuJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RybGVuKCRpbnB1dCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RybGVuKCRpbnB1dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RycG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDApIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnJpcG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJycG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Ryc3RyJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSA9IGZhbHNlKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdWJzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdWJzdHIoJHN0cmluZywgJG9mZnNldCwgJGxlbmd0aCA9IG51bGwpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N1YnN0cigkc3RyaW5nLCAkb2Zmc2V0LCAkbGVuZ3RoKTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXEdyYXBoZW1lIGFzIHA7CgppZiAoIWRlZmluZWQoJ0dSQVBIRU1FX0VYVFJfQ09VTlQnKSkgewpkZWZpbmUoJ0dSQVBIRU1FX0VYVFJfQ09VTlQnLCAwKTsKfQppZiAoIWRlZmluZWQoJ0dSQVBIRU1FX0VYVFJfTUFYQllURVMnKSkgewpkZWZpbmUoJ0dSQVBIRU1FX0VYVFJfTUFYQllURVMnLCAxKTsKfQppZiAoIWRlZmluZWQoJ0dSQVBIRU1FX0VYVFJfTUFYQ0hBUlMnKSkgewpkZWZpbmUoJ0dSQVBIRU1FX0VYVFJfTUFYQ0hBUlMnLCAyKTsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX2V4dHJhY3QnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9leHRyYWN0KD9zdHJpbmcgJGhheXN0YWNrLCA/aW50ICRzaXplLCA/aW50ICR0eXBlID0gR1JBUEhFTUVfRVhUUl9DT1VOVCwgP2ludCAkb2Zmc2V0ID0gMCwgJiRuZXh0ID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9leHRyYWN0KChzdHJpbmcpICRoYXlzdGFjaywgKGludCkgJHNpemUsIChpbnQpICR0eXBlLCAoaW50KSAkb2Zmc2V0LCAkbmV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyaXBvcycpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCk6IGludHxmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpcG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlzdHIoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2Jvb2wgJGJlZm9yZU5lZWRsZSA9IGZhbHNlKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cmlzdHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZU5lZWRsZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RybGVuJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RybGVuKD9zdHJpbmcgJHN0cmluZyk6IGludHxmYWxzZXxudWxsIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cmxlbigoc3RyaW5nKSAkc3RyaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCk6IGludHxmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJyaXBvcycpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cnJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDApOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Rycmlwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJycG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RycnBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnJwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJzdHIoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2Jvb2wgJGJlZm9yZU5lZWRsZSA9IGZhbHNlKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnN0cigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlTmVlZGxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdWJzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdWJzdHIoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRvZmZzZXQsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Vic3RyKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRvZmZzZXQsICRsZW5ndGgpOyB9Cn0KCkNvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcSW50bFxOb3JtYWxpemVyOwoKCgoKCgoKCgoKCmNsYXNzIE5vcm1hbGl6ZXIKewpwdWJsaWMgY29uc3QgRk9STV9EID0gXE5vcm1hbGl6ZXI6OkZPUk1fRDsKcHVibGljIGNvbnN0IEZPUk1fS0QgPSBcTm9ybWFsaXplcjo6Rk9STV9LRDsKcHVibGljIGNvbnN0IEZPUk1fQyA9IFxOb3JtYWxpemVyOjpGT1JNX0M7CnB1YmxpYyBjb25zdCBGT1JNX0tDID0gXE5vcm1hbGl6ZXI6OkZPUk1fS0M7CnB1YmxpYyBjb25zdCBORkQgPSBcTm9ybWFsaXplcjo6TkZEOwpwdWJsaWMgY29uc3QgTkZLRCA9IFxOb3JtYWxpemVyOjpORktEOwpwdWJsaWMgY29uc3QgTkZDID0gXE5vcm1hbGl6ZXI6Ok5GQzsKcHVibGljIGNvbnN0IE5GS0MgPSBcTm9ybWFsaXplcjo6TkZLQzsKCnByaXZhdGUgc3RhdGljICRDOwpwcml2YXRlIHN0YXRpYyAkRDsKcHJpdmF0ZSBzdGF0aWMgJEtEOwpwcml2YXRlIHN0YXRpYyAkY0M7CnByaXZhdGUgc3RhdGljICR1bGVuTWFzayA9IFsiXHhDMCIgPT4gMiwgIlx4RDAiID0+IDIsICJceEUwIiA9PiAzLCAiXHhGMCIgPT4gNF07CnByaXZhdGUgc3RhdGljICRBU0NJSSA9ICJceDIwXHg2NVx4NjlceDYxXHg3M1x4NkVceDc0XHg3Mlx4NkZceDZDXHg3NVx4NjRceDVEXHg1Qlx4NjNceDZEXHg3MFx4MjdceDBBXHg2N1x4N0NceDY4XHg3Nlx4MkVceDY2XHg2Mlx4MkNceDNBXHgzRFx4MkRceDcxXHgzMVx4MzBceDQzXHgzMlx4MkFceDc5XHg3OFx4MjlceDI4XHg0Q1x4MzlceDQxXHg1M1x4MkZceDUwXHgyMlx4NDVceDZBXHg0RFx4NDlceDZCXHgzM1x4M0VceDM1XHg1NFx4M0NceDQ0XHgzNFx4N0RceDQyXHg3Qlx4MzhceDQ2XHg3N1x4NTJceDM2XHgzN1x4NTVceDQ3XHg0RVx4M0JceDRBXHg3QVx4NTZceDIzXHg0OFx4NEZceDU3XHg1Rlx4MjZceDIxXHg0Qlx4M0ZceDU4XHg1MVx4MjVceDU5XHg1Q1x4MDlceDVBXHgyQlx4N0VceDVFXHgyNFx4NDBceDYwXHg3Rlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MEJceDBDXHgwRFx4MEVceDBGXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MUFceDFCXHgxQ1x4MURceDFFXHgxRiI7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTm9ybWFsaXplZChzdHJpbmcgJHMsIGludCAkZm9ybSA9IHNlbGY6OkZPUk1fQykKewppZiAoIVxpbl9hcnJheSgkZm9ybSwgW3NlbGY6Ok5GRCwgc2VsZjo6TkZLRCwgc2VsZjo6TkZDLCBzZWxmOjpORktDXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICghaXNzZXQoJHNbc3Ryc3BuKCRzLCBzZWxmOjokQVNDSUkpXSkpIHsKcmV0dXJuIHRydWU7Cn0KaWYgKHNlbGY6Ok5GQyA9PSAkZm9ybSAmJiBwcmVnX21hdGNoKCcvL3UnLCAkcykgJiYgIXByZWdfbWF0Y2goJy9bXlx4MDAtXHh7MkZGfV0vdScsICRzKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIHNlbGY6Om5vcm1hbGl6ZSgkcywgJGZvcm0pID09PSAkczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nICRzLCBpbnQgJGZvcm0gPSBzZWxmOjpGT1JNX0MpCnsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcykpIHsKcmV0dXJuIGZhbHNlOwp9Cgpzd2l0Y2ggKCRmb3JtKSB7CmNhc2Ugc2VsZjo6TkZDOiAkQyA9IHRydWU7ICRLID0gZmFsc2U7IGJyZWFrOwpjYXNlIHNlbGY6Ok5GRDogJEMgPSBmYWxzZTsgJEsgPSBmYWxzZTsgYnJlYWs7CmNhc2Ugc2VsZjo6TkZLQzogJEMgPSB0cnVlOyAkSyA9IHRydWU7IGJyZWFrOwpjYXNlIHNlbGY6Ok5GS0Q6ICRDID0gZmFsc2U7ICRLID0gdHJ1ZTsgYnJlYWs7CmRlZmF1bHQ6CmlmIChcZGVmaW5lZCgnTm9ybWFsaXplcjo6Tk9ORScpICYmIFxOb3JtYWxpemVyOjpOT05FID09ICRmb3JtKSB7CnJldHVybiAkczsKfQoKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdub3JtYWxpemVyX25vcm1hbGl6ZSgpOiBBcmd1bWVudCAjMiAoJGZvcm0pIG11c3QgYmUgYSBhIHZhbGlkIG5vcm1hbGl6YXRpb24gZm9ybScpOwp9CgppZiAoJycgPT09ICRzKSB7CnJldHVybiAnJzsKfQoKaWYgKCRLICYmIG51bGwgPT09IHNlbGY6OiRLRCkgewpzZWxmOjokS0QgPSBzZWxmOjpnZXREYXRhKCdjb21wYXRpYmlsaXR5RGVjb21wb3NpdGlvbicpOwp9CgppZiAobnVsbCA9PT0gc2VsZjo6JEQpIHsKc2VsZjo6JEQgPSBzZWxmOjpnZXREYXRhKCdjYW5vbmljYWxEZWNvbXBvc2l0aW9uJyk7CnNlbGY6OiRjQyA9IHNlbGY6OmdldERhdGEoJ2NvbWJpbmluZ0NsYXNzJyk7Cn0KCmlmIChudWxsICE9PSAkbWJFbmNvZGluZyA9ICgyICAmIChpbnQpIFxpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykpID8gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKSA6IG51bGwpIHsKbWJfaW50ZXJuYWxfZW5jb2RpbmcoJzhiaXQnKTsKfQoKJHIgPSBzZWxmOjpkZWNvbXBvc2UoJHMsICRLKTsKCmlmICgkQykgewppZiAobnVsbCA9PT0gc2VsZjo6JEMpIHsKc2VsZjo6JEMgPSBzZWxmOjpnZXREYXRhKCdjYW5vbmljYWxDb21wb3NpdGlvbicpOwp9CgokciA9IHNlbGY6OnJlY29tcG9zZSgkcik7Cn0KaWYgKG51bGwgIT09ICRtYkVuY29kaW5nKSB7Cm1iX2ludGVybmFsX2VuY29kaW5nKCRtYkVuY29kaW5nKTsKfQoKcmV0dXJuICRyOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZWNvbXBvc2UoJHMpCnsKJEFTQ0lJID0gc2VsZjo6JEFTQ0lJOwokY29tcE1hcCA9IHNlbGY6OiRDOwokY29tYkNsYXNzID0gc2VsZjo6JGNDOwokdWxlbk1hc2sgPSBzZWxmOjokdWxlbk1hc2s7CgokcmVzdWx0ID0gJHRhaWwgPSAnJzsKCiRpID0gJHNbMF0gPCAiXHg4MCIgPyAxIDogJHVsZW5NYXNrWyRzWzBdICYgIlx4RjAiXTsKJGxlbiA9IFxzdHJsZW4oJHMpOwoKJGxhc3RVY2hyID0gc3Vic3RyKCRzLCAwLCAkaSk7CiRsYXN0VWNscyA9IGlzc2V0KCRjb21iQ2xhc3NbJGxhc3RVY2hyXSkgPyAyNTYgOiAwOwoKd2hpbGUgKCRpIDwgJGxlbikgewppZiAoJHNbJGldIDwgIlx4ODAiKSB7CgoKaWYgKCR0YWlsKSB7CiRsYXN0VWNociAuPSAkdGFpbDsKJHRhaWwgPSAnJzsKfQoKaWYgKCRqID0gc3Ryc3BuKCRzLCAkQVNDSUksICRpICsgMSkpIHsKJGxhc3RVY2hyIC49IHN1YnN0cigkcywgJGksICRqKTsKJGkgKz0gJGo7Cn0KCiRyZXN1bHQgLj0gJGxhc3RVY2hyOwokbGFzdFVjaHIgPSAkc1skaV07CiRsYXN0VWNscyA9IDA7CisrJGk7CmNvbnRpbnVlOwp9CgokdWxlbiA9ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKCmlmICgkbGFzdFVjaHIgPCAiXHhFMVx4ODRceDgwIiB8fCAiXHhFMVx4ODRceDkyIiA8ICRsYXN0VWNocgp8fCAkdWNociA8ICJceEUxXHg4NVx4QTEiIHx8ICJceEUxXHg4NVx4QjUiIDwgJHVjaHIKfHwgJGxhc3RVY2xzKSB7CgoKJHVjbHMgPSAkY29tYkNsYXNzWyR1Y2hyXSA/PyAwOwoKaWYgKGlzc2V0KCRjb21wTWFwWyRsYXN0VWNoci4kdWNocl0pICYmICghJGxhc3RVY2xzIHx8ICRsYXN0VWNscyA8ICR1Y2xzKSkgewokbGFzdFVjaHIgPSAkY29tcE1hcFskbGFzdFVjaHIuJHVjaHJdOwp9IGVsc2VpZiAoJGxhc3RVY2xzID0gJHVjbHMpIHsKJHRhaWwgLj0gJHVjaHI7Cn0gZWxzZSB7CmlmICgkdGFpbCkgewokbGFzdFVjaHIgLj0gJHRhaWw7CiR0YWlsID0gJyc7Cn0KCiRyZXN1bHQgLj0gJGxhc3RVY2hyOwokbGFzdFVjaHIgPSAkdWNocjsKfQp9IGVsc2UgewoKCiRMID0gXG9yZCgkbGFzdFVjaHJbMl0pIC0gMHg4MDsKJFYgPSBcb3JkKCR1Y2hyWzJdKSAtIDB4QTE7CiRUID0gMDsKCiR1Y2hyID0gc3Vic3RyKCRzLCAkaSArICR1bGVuLCAzKTsKCmlmICgiXHhFMVx4ODZceEE3IiA8PSAkdWNociAmJiAkdWNociA8PSAiXHhFMVx4ODdceDgyIikgewokVCA9IFxvcmQoJHVjaHJbMl0pIC0gMHhBNzsKMCA+ICRUICYmICRUICs9IDB4NDA7CiR1bGVuICs9IDM7Cn0KCiRMID0gMHhBQzAwICsgKCRMICogMjEgKyAkVikgKiAyOCArICRUOwokbGFzdFVjaHIgPSBcY2hyKDB4RTAgfCAkTCA+PiAxMikuXGNocigweDgwIHwgJEwgPj4gNiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRMICYgMHgzRik7Cn0KCiRpICs9ICR1bGVuOwp9CgpyZXR1cm4gJHJlc3VsdC4kbGFzdFVjaHIuJHRhaWw7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGRlY29tcG9zZSgkcywgJGMpCnsKJHJlc3VsdCA9ICcnOwoKJEFTQ0lJID0gc2VsZjo6JEFTQ0lJOwokZGVjb21wTWFwID0gc2VsZjo6JEQ7CiRjb21iQ2xhc3MgPSBzZWxmOjokY0M7CiR1bGVuTWFzayA9IHNlbGY6OiR1bGVuTWFzazsKaWYgKCRjKSB7CiRjb21wYXRNYXAgPSBzZWxmOjokS0Q7Cn0KCiRjID0gW107CiRpID0gMDsKJGxlbiA9IFxzdHJsZW4oJHMpOwoKd2hpbGUgKCRpIDwgJGxlbikgewppZiAoJHNbJGldIDwgIlx4ODAiKSB7CgoKaWYgKCRjKSB7Cmtzb3J0KCRjKTsKJHJlc3VsdCAuPSBpbXBsb2RlKCcnLCAkYyk7CiRjID0gW107Cn0KCiRqID0gMSArIHN0cnNwbigkcywgJEFTQ0lJLCAkaSArIDEpOwokcmVzdWx0IC49IHN1YnN0cigkcywgJGksICRqKTsKJGkgKz0gJGo7CmNvbnRpbnVlOwp9CgokdWxlbiA9ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKJGkgKz0gJHVsZW47CgppZiAoJHVjaHIgPCAiXHhFQVx4QjBceDgwIiB8fCAiXHhFRFx4OUVceEEzIiA8ICR1Y2hyKSB7CgoKaWYgKCR1Y2hyICE9PSAkaiA9ICRjb21wYXRNYXBbJHVjaHJdID8/ICgkZGVjb21wTWFwWyR1Y2hyXSA/PyAkdWNocikpIHsKJHVjaHIgPSAkajsKCiRqID0gXHN0cmxlbigkdWNocik7CiR1bGVuID0gJHVjaHJbMF0gPCAiXHg4MCIgPyAxIDogJHVsZW5NYXNrWyR1Y2hyWzBdICYgIlx4RjAiXTsKCmlmICgkdWxlbiAhPSAkaikgewoKCiRqIC09ICR1bGVuOwokaSAtPSAkajsKCmlmICgwID4gJGkpIHsKJHMgPSBzdHJfcmVwZWF0KCcgJywgLSRpKS4kczsKJGxlbiAtPSAkaTsKJGkgPSAwOwp9Cgp3aGlsZSAoJGotLSkgewokc1skaSArICRqXSA9ICR1Y2hyWyR1bGVuICsgJGpdOwp9CgokdWNociA9IHN1YnN0cigkdWNociwgMCwgJHVsZW4pOwp9Cn0KaWYgKGlzc2V0KCRjb21iQ2xhc3NbJHVjaHJdKSkgewoKCmlmICghaXNzZXQoJGNbJGNvbWJDbGFzc1skdWNocl1dKSkgewokY1skY29tYkNsYXNzWyR1Y2hyXV0gPSAnJzsKfQokY1skY29tYkNsYXNzWyR1Y2hyXV0gLj0gJHVjaHI7CmNvbnRpbnVlOwp9Cn0gZWxzZSB7CgoKJHVjaHIgPSB1bnBhY2soJ0MqJywgJHVjaHIpOwokaiA9ICgoJHVjaHJbMV0gLSAyMjQpIDw8IDEyKSArICgoJHVjaHJbMl0gLSAxMjgpIDw8IDYpICsgJHVjaHJbM10gLSAweEFDODA7CgokdWNociA9ICJceEUxXHg4NCIuXGNocigweDgwICsgKGludCkgKCRqIC8gNTg4KSkKLiJceEUxXHg4NSIuXGNocigweEExICsgKGludCkgKCgkaiAlIDU4OCkgLyAyOCkpOwoKaWYgKCRqICU9IDI4KSB7CiR1Y2hyIC49ICRqIDwgMjUKPyAoIlx4RTFceDg2Ii5cY2hyKDB4QTcgKyAkaikpCjogKCJceEUxXHg4NyIuXGNocigweDY3ICsgJGopKTsKfQp9CmlmICgkYykgewprc29ydCgkYyk7CiRyZXN1bHQgLj0gaW1wbG9kZSgnJywgJGMpOwokYyA9IFtdOwp9CgokcmVzdWx0IC49ICR1Y2hyOwp9CgppZiAoJGMpIHsKa3NvcnQoJGMpOwokcmVzdWx0IC49IGltcGxvZGUoJycsICRjKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldERhdGEoJGZpbGUpCnsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gX19ESVJfXy4nL1Jlc291cmNlcy91bmlkYXRhLycuJGZpbGUuJy5waHAnKSkgewpyZXR1cm4gcmVxdWlyZSAkZmlsZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAKCmNsYXNzIE5vcm1hbGl6ZXIgZXh0ZW5kcyBTeW1mb255XFBvbHlmaWxsXEludGxcTm9ybWFsaXplclxOb3JtYWxpemVyCnsKCgoKcHVibGljIGNvbnN0IE5PTkUgPSAyOwpwdWJsaWMgY29uc3QgRk9STV9EID0gNDsKcHVibGljIGNvbnN0IEZPUk1fS0QgPSA4OwpwdWJsaWMgY29uc3QgRk9STV9DID0gMTY7CnB1YmxpYyBjb25zdCBGT1JNX0tDID0gMzI7CnB1YmxpYyBjb25zdCBORkQgPSA0OwpwdWJsaWMgY29uc3QgTkZLRCA9IDg7CnB1YmxpYyBjb25zdCBORkMgPSAxNjsKcHVibGljIGNvbnN0IE5GS0MgPSAzMjsKfQo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ0HMgCcgPT4gJ8OAJywKJ0HMgScgPT4gJ8OBJywKJ0HMgicgPT4gJ8OCJywKJ0HMgycgPT4gJ8ODJywKJ0HMiCcgPT4gJ8OEJywKJ0HMiicgPT4gJ8OFJywKJ0PMpycgPT4gJ8OHJywKJ0XMgCcgPT4gJ8OIJywKJ0XMgScgPT4gJ8OJJywKJ0XMgicgPT4gJ8OKJywKJ0XMiCcgPT4gJ8OLJywKJ0nMgCcgPT4gJ8OMJywKJ0nMgScgPT4gJ8ONJywKJ0nMgicgPT4gJ8OOJywKJ0nMiCcgPT4gJ8OPJywKJ07MgycgPT4gJ8ORJywKJ0/MgCcgPT4gJ8OSJywKJ0/MgScgPT4gJ8OTJywKJ0/MgicgPT4gJ8OUJywKJ0/MgycgPT4gJ8OVJywKJ0/MiCcgPT4gJ8OWJywKJ1XMgCcgPT4gJ8OZJywKJ1XMgScgPT4gJ8OaJywKJ1XMgicgPT4gJ8ObJywKJ1XMiCcgPT4gJ8OcJywKJ1nMgScgPT4gJ8OdJywKJ2HMgCcgPT4gJ8OgJywKJ2HMgScgPT4gJ8OhJywKJ2HMgicgPT4gJ8OiJywKJ2HMgycgPT4gJ8OjJywKJ2HMiCcgPT4gJ8OkJywKJ2HMiicgPT4gJ8OlJywKJ2PMpycgPT4gJ8OnJywKJ2XMgCcgPT4gJ8OoJywKJ2XMgScgPT4gJ8OpJywKJ2XMgicgPT4gJ8OqJywKJ2XMiCcgPT4gJ8OrJywKJ2nMgCcgPT4gJ8OsJywKJ2nMgScgPT4gJ8OtJywKJ2nMgicgPT4gJ8OuJywKJ2nMiCcgPT4gJ8OvJywKJ27MgycgPT4gJ8OxJywKJ2/MgCcgPT4gJ8OyJywKJ2/MgScgPT4gJ8OzJywKJ2/MgicgPT4gJ8O0JywKJ2/MgycgPT4gJ8O1JywKJ2/MiCcgPT4gJ8O2JywKJ3XMgCcgPT4gJ8O5JywKJ3XMgScgPT4gJ8O6JywKJ3XMgicgPT4gJ8O7JywKJ3XMiCcgPT4gJ8O8JywKJ3nMgScgPT4gJ8O9JywKJ3nMiCcgPT4gJ8O/JywKJ0HMhCcgPT4gJ8SAJywKJ2HMhCcgPT4gJ8SBJywKJ0HMhicgPT4gJ8SCJywKJ2HMhicgPT4gJ8SDJywKJ0HMqCcgPT4gJ8SEJywKJ2HMqCcgPT4gJ8SFJywKJ0PMgScgPT4gJ8SGJywKJ2PMgScgPT4gJ8SHJywKJ0PMgicgPT4gJ8SIJywKJ2PMgicgPT4gJ8SJJywKJ0PMhycgPT4gJ8SKJywKJ2PMhycgPT4gJ8SLJywKJ0PMjCcgPT4gJ8SMJywKJ2PMjCcgPT4gJ8SNJywKJ0TMjCcgPT4gJ8SOJywKJ2TMjCcgPT4gJ8SPJywKJ0XMhCcgPT4gJ8SSJywKJ2XMhCcgPT4gJ8STJywKJ0XMhicgPT4gJ8SUJywKJ2XMhicgPT4gJ8SVJywKJ0XMhycgPT4gJ8SWJywKJ2XMhycgPT4gJ8SXJywKJ0XMqCcgPT4gJ8SYJywKJ2XMqCcgPT4gJ8SZJywKJ0XMjCcgPT4gJ8SaJywKJ2XMjCcgPT4gJ8SbJywKJ0fMgicgPT4gJ8ScJywKJ2fMgicgPT4gJ8SdJywKJ0fMhicgPT4gJ8SeJywKJ2fMhicgPT4gJ8SfJywKJ0fMhycgPT4gJ8SgJywKJ2fMhycgPT4gJ8ShJywKJ0fMpycgPT4gJ8SiJywKJ2fMpycgPT4gJ8SjJywKJ0jMgicgPT4gJ8SkJywKJ2jMgicgPT4gJ8SlJywKJ0nMgycgPT4gJ8SoJywKJ2nMgycgPT4gJ8SpJywKJ0nMhCcgPT4gJ8SqJywKJ2nMhCcgPT4gJ8SrJywKJ0nMhicgPT4gJ8SsJywKJ2nMhicgPT4gJ8StJywKJ0nMqCcgPT4gJ8SuJywKJ2nMqCcgPT4gJ8SvJywKJ0nMhycgPT4gJ8SwJywKJ0rMgicgPT4gJ8S0JywKJ2rMgicgPT4gJ8S1JywKJ0vMpycgPT4gJ8S2JywKJ2vMpycgPT4gJ8S3JywKJ0zMgScgPT4gJ8S5JywKJ2zMgScgPT4gJ8S6JywKJ0zMpycgPT4gJ8S7JywKJ2zMpycgPT4gJ8S8JywKJ0zMjCcgPT4gJ8S9JywKJ2zMjCcgPT4gJ8S+JywKJ07MgScgPT4gJ8WDJywKJ27MgScgPT4gJ8WEJywKJ07MpycgPT4gJ8WFJywKJ27MpycgPT4gJ8WGJywKJ07MjCcgPT4gJ8WHJywKJ27MjCcgPT4gJ8WIJywKJ0/MhCcgPT4gJ8WMJywKJ2/MhCcgPT4gJ8WNJywKJ0/MhicgPT4gJ8WOJywKJ2/MhicgPT4gJ8WPJywKJ0/MiycgPT4gJ8WQJywKJ2/MiycgPT4gJ8WRJywKJ1LMgScgPT4gJ8WUJywKJ3LMgScgPT4gJ8WVJywKJ1LMpycgPT4gJ8WWJywKJ3LMpycgPT4gJ8WXJywKJ1LMjCcgPT4gJ8WYJywKJ3LMjCcgPT4gJ8WZJywKJ1PMgScgPT4gJ8WaJywKJ3PMgScgPT4gJ8WbJywKJ1PMgicgPT4gJ8WcJywKJ3PMgicgPT4gJ8WdJywKJ1PMpycgPT4gJ8WeJywKJ3PMpycgPT4gJ8WfJywKJ1PMjCcgPT4gJ8WgJywKJ3PMjCcgPT4gJ8WhJywKJ1TMpycgPT4gJ8WiJywKJ3TMpycgPT4gJ8WjJywKJ1TMjCcgPT4gJ8WkJywKJ3TMjCcgPT4gJ8WlJywKJ1XMgycgPT4gJ8WoJywKJ3XMgycgPT4gJ8WpJywKJ1XMhCcgPT4gJ8WqJywKJ3XMhCcgPT4gJ8WrJywKJ1XMhicgPT4gJ8WsJywKJ3XMhicgPT4gJ8WtJywKJ1XMiicgPT4gJ8WuJywKJ3XMiicgPT4gJ8WvJywKJ1XMiycgPT4gJ8WwJywKJ3XMiycgPT4gJ8WxJywKJ1XMqCcgPT4gJ8WyJywKJ3XMqCcgPT4gJ8WzJywKJ1fMgicgPT4gJ8W0JywKJ3fMgicgPT4gJ8W1JywKJ1nMgicgPT4gJ8W2JywKJ3nMgicgPT4gJ8W3JywKJ1nMiCcgPT4gJ8W4JywKJ1rMgScgPT4gJ8W5JywKJ3rMgScgPT4gJ8W6JywKJ1rMhycgPT4gJ8W7JywKJ3rMhycgPT4gJ8W8JywKJ1rMjCcgPT4gJ8W9JywKJ3rMjCcgPT4gJ8W+JywKJ0/MmycgPT4gJ8agJywKJ2/MmycgPT4gJ8ahJywKJ1XMmycgPT4gJ8avJywKJ3XMmycgPT4gJ8awJywKJ0HMjCcgPT4gJ8eNJywKJ2HMjCcgPT4gJ8eOJywKJ0nMjCcgPT4gJ8ePJywKJ2nMjCcgPT4gJ8eQJywKJ0/MjCcgPT4gJ8eRJywKJ2/MjCcgPT4gJ8eSJywKJ1XMjCcgPT4gJ8eTJywKJ3XMjCcgPT4gJ8eUJywKJ8OczIQnID0+ICfHlScsCifDvMyEJyA9PiAnx5YnLAonw5zMgScgPT4gJ8eXJywKJ8O8zIEnID0+ICfHmCcsCifDnMyMJyA9PiAnx5knLAonw7zMjCcgPT4gJ8eaJywKJ8OczIAnID0+ICfHmycsCifDvMyAJyA9PiAnx5wnLAonw4TMhCcgPT4gJ8eeJywKJ8OkzIQnID0+ICfHnycsCifIpsyEJyA9PiAnx6AnLAonyKfMhCcgPT4gJ8ehJywKJ8OGzIQnID0+ICfHoicsCifDpsyEJyA9PiAnx6MnLAonR8yMJyA9PiAnx6YnLAonZ8yMJyA9PiAnx6cnLAonS8yMJyA9PiAnx6gnLAona8yMJyA9PiAnx6knLAonT8yoJyA9PiAnx6onLAonb8yoJyA9PiAnx6snLAonx6rMhCcgPT4gJ8esJywKJ8erzIQnID0+ICfHrScsCifGt8yMJyA9PiAnx64nLAonypLMjCcgPT4gJ8evJywKJ2rMjCcgPT4gJ8ewJywKJ0fMgScgPT4gJ8e0JywKJ2fMgScgPT4gJ8e1JywKJ07MgCcgPT4gJ8e4JywKJ27MgCcgPT4gJ8e5JywKJ8OFzIEnID0+ICfHuicsCifDpcyBJyA9PiAnx7snLAonw4bMgScgPT4gJ8e8JywKJ8OmzIEnID0+ICfHvScsCifDmMyBJyA9PiAnx74nLAonw7jMgScgPT4gJ8e/JywKJ0HMjycgPT4gJ8iAJywKJ2HMjycgPT4gJ8iBJywKJ0HMkScgPT4gJ8iCJywKJ2HMkScgPT4gJ8iDJywKJ0XMjycgPT4gJ8iEJywKJ2XMjycgPT4gJ8iFJywKJ0XMkScgPT4gJ8iGJywKJ2XMkScgPT4gJ8iHJywKJ0nMjycgPT4gJ8iIJywKJ2nMjycgPT4gJ8iJJywKJ0nMkScgPT4gJ8iKJywKJ2nMkScgPT4gJ8iLJywKJ0/MjycgPT4gJ8iMJywKJ2/MjycgPT4gJ8iNJywKJ0/MkScgPT4gJ8iOJywKJ2/MkScgPT4gJ8iPJywKJ1LMjycgPT4gJ8iQJywKJ3LMjycgPT4gJ8iRJywKJ1LMkScgPT4gJ8iSJywKJ3LMkScgPT4gJ8iTJywKJ1XMjycgPT4gJ8iUJywKJ3XMjycgPT4gJ8iVJywKJ1XMkScgPT4gJ8iWJywKJ3XMkScgPT4gJ8iXJywKJ1PMpicgPT4gJ8iYJywKJ3PMpicgPT4gJ8iZJywKJ1TMpicgPT4gJ8iaJywKJ3TMpicgPT4gJ8ibJywKJ0jMjCcgPT4gJ8ieJywKJ2jMjCcgPT4gJ8ifJywKJ0HMhycgPT4gJ8imJywKJ2HMhycgPT4gJ8inJywKJ0XMpycgPT4gJ8ioJywKJ2XMpycgPT4gJ8ipJywKJ8OWzIQnID0+ICfIqicsCifDtsyEJyA9PiAnyKsnLAonw5XMhCcgPT4gJ8isJywKJ8O1zIQnID0+ICfIrScsCidPzIcnID0+ICfIricsCidvzIcnID0+ICfIrycsCifIrsyEJyA9PiAnyLAnLAonyK/MhCcgPT4gJ8ixJywKJ1nMhCcgPT4gJ8iyJywKJ3nMhCcgPT4gJ8izJywKJ8KozIEnID0+ICfOhScsCifOkcyBJyA9PiAnzoYnLAonzpXMgScgPT4gJ86IJywKJ86XzIEnID0+ICfOiScsCifOmcyBJyA9PiAnzoonLAonzp/MgScgPT4gJ86MJywKJ86lzIEnID0+ICfOjicsCifOqcyBJyA9PiAnzo8nLAonz4rMgScgPT4gJ86QJywKJ86ZzIgnID0+ICfOqicsCifOpcyIJyA9PiAnzqsnLAonzrHMgScgPT4gJ86sJywKJ861zIEnID0+ICfOrScsCifOt8yBJyA9PiAnzq4nLAonzrnMgScgPT4gJ86vJywKJ8+LzIEnID0+ICfOsCcsCifOucyIJyA9PiAnz4onLAonz4XMiCcgPT4gJ8+LJywKJ86/zIEnID0+ICfPjCcsCifPhcyBJyA9PiAnz40nLAonz4nMgScgPT4gJ8+OJywKJ8+SzIEnID0+ICfPkycsCifPksyIJyA9PiAnz5QnLAon0JXMgCcgPT4gJ9CAJywKJ9CVzIgnID0+ICfQgScsCifQk8yBJyA9PiAn0IMnLAon0IbMiCcgPT4gJ9CHJywKJ9CazIEnID0+ICfQjCcsCifQmMyAJyA9PiAn0I0nLAon0KPMhicgPT4gJ9COJywKJ9CYzIYnID0+ICfQmScsCifQuMyGJyA9PiAn0LknLAon0LXMgCcgPT4gJ9GQJywKJ9C1zIgnID0+ICfRkScsCifQs8yBJyA9PiAn0ZMnLAon0ZbMiCcgPT4gJ9GXJywKJ9C6zIEnID0+ICfRnCcsCifQuMyAJyA9PiAn0Z0nLAon0YPMhicgPT4gJ9GeJywKJ9G0zI8nID0+ICfRticsCifRtcyPJyA9PiAn0bcnLAon0JbMhicgPT4gJ9OBJywKJ9C2zIYnID0+ICfTgicsCifQkMyGJyA9PiAn05AnLAon0LDMhicgPT4gJ9ORJywKJ9CQzIgnID0+ICfTkicsCifQsMyIJyA9PiAn05MnLAon0JXMhicgPT4gJ9OWJywKJ9C1zIYnID0+ICfTlycsCifTmMyIJyA9PiAn05onLAon05nMiCcgPT4gJ9ObJywKJ9CWzIgnID0+ICfTnCcsCifQtsyIJyA9PiAn050nLAon0JfMiCcgPT4gJ9OeJywKJ9C3zIgnID0+ICfTnycsCifQmMyEJyA9PiAn06InLAon0LjMhCcgPT4gJ9OjJywKJ9CYzIgnID0+ICfTpCcsCifQuMyIJyA9PiAn06UnLAon0J7MiCcgPT4gJ9OmJywKJ9C+zIgnID0+ICfTpycsCifTqMyIJyA9PiAn06onLAon06nMiCcgPT4gJ9OrJywKJ9CtzIgnID0+ICfTrCcsCifRjcyIJyA9PiAn060nLAon0KPMhCcgPT4gJ9OuJywKJ9GDzIQnID0+ICfTrycsCifQo8yIJyA9PiAn07AnLAon0YPMiCcgPT4gJ9OxJywKJ9CjzIsnID0+ICfTsicsCifRg8yLJyA9PiAn07MnLAon0KfMiCcgPT4gJ9O0JywKJ9GHzIgnID0+ICfTtScsCifQq8yIJyA9PiAn07gnLAon0YvMiCcgPT4gJ9O5JywKJ9in2ZMnID0+ICfYoicsCifYp9mUJyA9PiAn2KMnLAon2YjZlCcgPT4gJ9ikJywKJ9in2ZUnID0+ICfYpScsCifZitmUJyA9PiAn2KYnLAon25XZlCcgPT4gJ9uAJywKJ9uB2ZQnID0+ICfbgicsCifbktmUJyA9PiAn25MnLAon4KSo4KS8JyA9PiAn4KSpJywKJ+CksOCkvCcgPT4gJ+CksScsCifgpLPgpLwnID0+ICfgpLQnLAon4KeH4Ka+JyA9PiAn4KeLJywKJ+Cnh+CnlycgPT4gJ+CnjCcsCifgrYfgrZYnID0+ICfgrYgnLAon4K2H4Ky+JyA9PiAn4K2LJywKJ+Cth+CtlycgPT4gJ+CtjCcsCifgrpLgr5cnID0+ICfgrpQnLAon4K+G4K6+JyA9PiAn4K+KJywKJ+Cvh+CuvicgPT4gJ+CviycsCifgr4bgr5cnID0+ICfgr4wnLAon4LGG4LGWJyA9PiAn4LGIJywKJ+Cyv+CzlScgPT4gJ+CzgCcsCifgs4bgs5UnID0+ICfgs4cnLAon4LOG4LOWJyA9PiAn4LOIJywKJ+CzhuCzgicgPT4gJ+CziicsCifgs4rgs5UnID0+ICfgs4snLAon4LWG4LS+JyA9PiAn4LWKJywKJ+C1h+C0vicgPT4gJ+C1iycsCifgtYbgtZcnID0+ICfgtYwnLAon4LeZ4LeKJyA9PiAn4LeaJywKJ+C3meC3jycgPT4gJ+C3nCcsCifgt5zgt4onID0+ICfgt50nLAon4LeZ4LefJyA9PiAn4LeeJywKJ+GApeGAricgPT4gJ+GApicsCifhrIXhrLUnID0+ICfhrIYnLAon4ayH4ay1JyA9PiAn4ayIJywKJ+GsieGstScgPT4gJ+GsiicsCifhrIvhrLUnID0+ICfhrIwnLAon4ayN4ay1JyA9PiAn4ayOJywKJ+GskeGstScgPT4gJ+GskicsCifhrLrhrLUnID0+ICfhrLsnLAon4ay84ay1JyA9PiAn4ay9JywKJ+GsvuGstScgPT4gJ+GtgCcsCifhrL/hrLUnID0+ICfhrYEnLAon4a2C4ay1JyA9PiAn4a2DJywKJ0HMpScgPT4gJ+G4gCcsCidhzKUnID0+ICfhuIEnLAonQsyHJyA9PiAn4biCJywKJ2LMhycgPT4gJ+G4gycsCidCzKMnID0+ICfhuIQnLAonYsyjJyA9PiAn4biFJywKJ0LMsScgPT4gJ+G4hicsCidizLEnID0+ICfhuIcnLAonw4fMgScgPT4gJ+G4iCcsCifDp8yBJyA9PiAn4biJJywKJ0TMhycgPT4gJ+G4iicsCidkzIcnID0+ICfhuIsnLAonRMyjJyA9PiAn4biMJywKJ2TMoycgPT4gJ+G4jScsCidEzLEnID0+ICfhuI4nLAonZMyxJyA9PiAn4biPJywKJ0TMpycgPT4gJ+G4kCcsCidkzKcnID0+ICfhuJEnLAonRMytJyA9PiAn4biSJywKJ2TMrScgPT4gJ+G4kycsCifEksyAJyA9PiAn4biUJywKJ8STzIAnID0+ICfhuJUnLAonxJLMgScgPT4gJ+G4licsCifEk8yBJyA9PiAn4biXJywKJ0XMrScgPT4gJ+G4mCcsCidlzK0nID0+ICfhuJknLAonRcywJyA9PiAn4biaJywKJ2XMsCcgPT4gJ+G4mycsCifIqMyGJyA9PiAn4bicJywKJ8ipzIYnID0+ICfhuJ0nLAonRsyHJyA9PiAn4bieJywKJ2bMhycgPT4gJ+G4nycsCidHzIQnID0+ICfhuKAnLAonZ8yEJyA9PiAn4bihJywKJ0jMhycgPT4gJ+G4oicsCidozIcnID0+ICfhuKMnLAonSMyjJyA9PiAn4bikJywKJ2jMoycgPT4gJ+G4pScsCidIzIgnID0+ICfhuKYnLAonaMyIJyA9PiAn4binJywKJ0jMpycgPT4gJ+G4qCcsCidozKcnID0+ICfhuKknLAonSMyuJyA9PiAn4biqJywKJ2jMricgPT4gJ+G4qycsCidJzLAnID0+ICfhuKwnLAonacywJyA9PiAn4bitJywKJ8OPzIEnID0+ICfhuK4nLAonw6/MgScgPT4gJ+G4rycsCidLzIEnID0+ICfhuLAnLAona8yBJyA9PiAn4bixJywKJ0vMoycgPT4gJ+G4sicsCidrzKMnID0+ICfhuLMnLAonS8yxJyA9PiAn4bi0JywKJ2vMsScgPT4gJ+G4tScsCidMzKMnID0+ICfhuLYnLAonbMyjJyA9PiAn4bi3JywKJ+G4tsyEJyA9PiAn4bi4JywKJ+G4t8yEJyA9PiAn4bi5JywKJ0zMsScgPT4gJ+G4uicsCidszLEnID0+ICfhuLsnLAonTMytJyA9PiAn4bi8JywKJ2zMrScgPT4gJ+G4vScsCidNzIEnID0+ICfhuL4nLAonbcyBJyA9PiAn4bi/JywKJ03MhycgPT4gJ+G5gCcsCidtzIcnID0+ICfhuYEnLAonTcyjJyA9PiAn4bmCJywKJ23MoycgPT4gJ+G5gycsCidOzIcnID0+ICfhuYQnLAonbsyHJyA9PiAn4bmFJywKJ07MoycgPT4gJ+G5hicsCiduzKMnID0+ICfhuYcnLAonTsyxJyA9PiAn4bmIJywKJ27MsScgPT4gJ+G5iScsCidOzK0nID0+ICfhuYonLAonbsytJyA9PiAn4bmLJywKJ8OVzIEnID0+ICfhuYwnLAonw7XMgScgPT4gJ+G5jScsCifDlcyIJyA9PiAn4bmOJywKJ8O1zIgnID0+ICfhuY8nLAonxYzMgCcgPT4gJ+G5kCcsCifFjcyAJyA9PiAn4bmRJywKJ8WMzIEnID0+ICfhuZInLAonxY3MgScgPT4gJ+G5kycsCidQzIEnID0+ICfhuZQnLAoncMyBJyA9PiAn4bmVJywKJ1DMhycgPT4gJ+G5licsCidwzIcnID0+ICfhuZcnLAonUsyHJyA9PiAn4bmYJywKJ3LMhycgPT4gJ+G5mScsCidSzKMnID0+ICfhuZonLAoncsyjJyA9PiAn4bmbJywKJ+G5msyEJyA9PiAn4bmcJywKJ+G5m8yEJyA9PiAn4bmdJywKJ1LMsScgPT4gJ+G5nicsCidyzLEnID0+ICfhuZ8nLAonU8yHJyA9PiAn4bmgJywKJ3PMhycgPT4gJ+G5oScsCidTzKMnID0+ICfhuaInLAonc8yjJyA9PiAn4bmjJywKJ8WazIcnID0+ICfhuaQnLAonxZvMhycgPT4gJ+G5pScsCifFoMyHJyA9PiAn4bmmJywKJ8WhzIcnID0+ICfhuacnLAon4bmizIcnID0+ICfhuagnLAon4bmjzIcnID0+ICfhuaknLAonVMyHJyA9PiAn4bmqJywKJ3TMhycgPT4gJ+G5qycsCidUzKMnID0+ICfhuawnLAondMyjJyA9PiAn4bmtJywKJ1TMsScgPT4gJ+G5ricsCid0zLEnID0+ICfhua8nLAonVMytJyA9PiAn4bmwJywKJ3TMrScgPT4gJ+G5sScsCidVzKQnID0+ICfhubInLAondcykJyA9PiAn4bmzJywKJ1XMsCcgPT4gJ+G5tCcsCid1zLAnID0+ICfhubUnLAonVcytJyA9PiAn4bm2JywKJ3XMrScgPT4gJ+G5tycsCifFqMyBJyA9PiAn4bm4JywKJ8WpzIEnID0+ICfhubknLAonxarMiCcgPT4gJ+G5uicsCifFq8yIJyA9PiAn4bm7JywKJ1bMgycgPT4gJ+G5vCcsCid2zIMnID0+ICfhub0nLAonVsyjJyA9PiAn4bm+JywKJ3bMoycgPT4gJ+G5vycsCidXzIAnID0+ICfhuoAnLAond8yAJyA9PiAn4bqBJywKJ1fMgScgPT4gJ+G6gicsCid3zIEnID0+ICfhuoMnLAonV8yIJyA9PiAn4bqEJywKJ3fMiCcgPT4gJ+G6hScsCidXzIcnID0+ICfhuoYnLAond8yHJyA9PiAn4bqHJywKJ1fMoycgPT4gJ+G6iCcsCid3zKMnID0+ICfhuoknLAonWMyHJyA9PiAn4bqKJywKJ3jMhycgPT4gJ+G6iycsCidYzIgnID0+ICfhuownLAoneMyIJyA9PiAn4bqNJywKJ1nMhycgPT4gJ+G6jicsCid5zIcnID0+ICfhuo8nLAonWsyCJyA9PiAn4bqQJywKJ3rMgicgPT4gJ+G6kScsCidazKMnID0+ICfhupInLAonesyjJyA9PiAn4bqTJywKJ1rMsScgPT4gJ+G6lCcsCid6zLEnID0+ICfhupUnLAonaMyxJyA9PiAn4bqWJywKJ3TMiCcgPT4gJ+G6lycsCid3zIonID0+ICfhupgnLAonecyKJyA9PiAn4bqZJywKJ8W/zIcnID0+ICfhupsnLAonQcyjJyA9PiAn4bqgJywKJ2HMoycgPT4gJ+G6oScsCidBzIknID0+ICfhuqInLAonYcyJJyA9PiAn4bqjJywKJ8OCzIEnID0+ICfhuqQnLAonw6LMgScgPT4gJ+G6pScsCifDgsyAJyA9PiAn4bqmJywKJ8OizIAnID0+ICfhuqcnLAonw4LMiScgPT4gJ+G6qCcsCifDosyJJyA9PiAn4bqpJywKJ8OCzIMnID0+ICfhuqonLAonw6LMgycgPT4gJ+G6qycsCifhuqDMgicgPT4gJ+G6rCcsCifhuqHMgicgPT4gJ+G6rScsCifEgsyBJyA9PiAn4bquJywKJ8SDzIEnID0+ICfhuq8nLAonxILMgCcgPT4gJ+G6sCcsCifEg8yAJyA9PiAn4bqxJywKJ8SCzIknID0+ICfhurInLAonxIPMiScgPT4gJ+G6sycsCifEgsyDJyA9PiAn4bq0JywKJ8SDzIMnID0+ICfhurUnLAon4bqgzIYnID0+ICfhurYnLAon4bqhzIYnID0+ICfhurcnLAonRcyjJyA9PiAn4bq4JywKJ2XMoycgPT4gJ+G6uScsCidFzIknID0+ICfhuronLAonZcyJJyA9PiAn4bq7JywKJ0XMgycgPT4gJ+G6vCcsCidlzIMnID0+ICfhur0nLAonw4rMgScgPT4gJ+G6vicsCifDqsyBJyA9PiAn4bq/JywKJ8OKzIAnID0+ICfhu4AnLAonw6rMgCcgPT4gJ+G7gScsCifDisyJJyA9PiAn4buCJywKJ8OqzIknID0+ICfhu4MnLAonw4rMgycgPT4gJ+G7hCcsCifDqsyDJyA9PiAn4buFJywKJ+G6uMyCJyA9PiAn4buGJywKJ+G6ucyCJyA9PiAn4buHJywKJ0nMiScgPT4gJ+G7iCcsCidpzIknID0+ICfhu4knLAonScyjJyA9PiAn4buKJywKJ2nMoycgPT4gJ+G7iycsCidPzKMnID0+ICfhu4wnLAonb8yjJyA9PiAn4buNJywKJ0/MiScgPT4gJ+G7jicsCidvzIknID0+ICfhu48nLAonw5TMgScgPT4gJ+G7kCcsCifDtMyBJyA9PiAn4buRJywKJ8OUzIAnID0+ICfhu5InLAonw7TMgCcgPT4gJ+G7kycsCifDlMyJJyA9PiAn4buUJywKJ8O0zIknID0+ICfhu5UnLAonw5TMgycgPT4gJ+G7licsCifDtMyDJyA9PiAn4buXJywKJ+G7jMyCJyA9PiAn4buYJywKJ+G7jcyCJyA9PiAn4buZJywKJ8agzIEnID0+ICfhu5onLAonxqHMgScgPT4gJ+G7mycsCifGoMyAJyA9PiAn4bucJywKJ8ahzIAnID0+ICfhu50nLAonxqDMiScgPT4gJ+G7nicsCifGocyJJyA9PiAn4bufJywKJ8agzIMnID0+ICfhu6AnLAonxqHMgycgPT4gJ+G7oScsCifGoMyjJyA9PiAn4buiJywKJ8ahzKMnID0+ICfhu6MnLAonVcyjJyA9PiAn4bukJywKJ3XMoycgPT4gJ+G7pScsCidVzIknID0+ICfhu6YnLAondcyJJyA9PiAn4bunJywKJ8avzIEnID0+ICfhu6gnLAonxrDMgScgPT4gJ+G7qScsCifGr8yAJyA9PiAn4buqJywKJ8awzIAnID0+ICfhu6snLAonxq/MiScgPT4gJ+G7rCcsCifGsMyJJyA9PiAn4butJywKJ8avzIMnID0+ICfhu64nLAonxrDMgycgPT4gJ+G7rycsCifGr8yjJyA9PiAn4buwJywKJ8awzKMnID0+ICfhu7EnLAonWcyAJyA9PiAn4buyJywKJ3nMgCcgPT4gJ+G7sycsCidZzKMnID0+ICfhu7QnLAonecyjJyA9PiAn4bu1JywKJ1nMiScgPT4gJ+G7ticsCid5zIknID0+ICfhu7cnLAonWcyDJyA9PiAn4bu4JywKJ3nMgycgPT4gJ+G7uScsCifOscyTJyA9PiAn4byAJywKJ86xzJQnID0+ICfhvIEnLAon4byAzIAnID0+ICfhvIInLAon4byBzIAnID0+ICfhvIMnLAon4byAzIEnID0+ICfhvIQnLAon4byBzIEnID0+ICfhvIUnLAon4byAzYInID0+ICfhvIYnLAon4byBzYInID0+ICfhvIcnLAonzpHMkycgPT4gJ+G8iCcsCifOkcyUJyA9PiAn4byJJywKJ+G8iMyAJyA9PiAn4byKJywKJ+G8icyAJyA9PiAn4byLJywKJ+G8iMyBJyA9PiAn4byMJywKJ+G8icyBJyA9PiAn4byNJywKJ+G8iM2CJyA9PiAn4byOJywKJ+G8ic2CJyA9PiAn4byPJywKJ861zJMnID0+ICfhvJAnLAonzrXMlCcgPT4gJ+G8kScsCifhvJDMgCcgPT4gJ+G8kicsCifhvJHMgCcgPT4gJ+G8kycsCifhvJDMgScgPT4gJ+G8lCcsCifhvJHMgScgPT4gJ+G8lScsCifOlcyTJyA9PiAn4byYJywKJ86VzJQnID0+ICfhvJknLAon4byYzIAnID0+ICfhvJonLAon4byZzIAnID0+ICfhvJsnLAon4byYzIEnID0+ICfhvJwnLAon4byZzIEnID0+ICfhvJ0nLAonzrfMkycgPT4gJ+G8oCcsCifOt8yUJyA9PiAn4byhJywKJ+G8oMyAJyA9PiAn4byiJywKJ+G8ocyAJyA9PiAn4byjJywKJ+G8oMyBJyA9PiAn4bykJywKJ+G8ocyBJyA9PiAn4bylJywKJ+G8oM2CJyA9PiAn4bymJywKJ+G8oc2CJyA9PiAn4bynJywKJ86XzJMnID0+ICfhvKgnLAonzpfMlCcgPT4gJ+G8qScsCifhvKjMgCcgPT4gJ+G8qicsCifhvKnMgCcgPT4gJ+G8qycsCifhvKjMgScgPT4gJ+G8rCcsCifhvKnMgScgPT4gJ+G8rScsCifhvKjNgicgPT4gJ+G8ricsCifhvKnNgicgPT4gJ+G8rycsCifOucyTJyA9PiAn4bywJywKJ865zJQnID0+ICfhvLEnLAon4bywzIAnID0+ICfhvLInLAon4byxzIAnID0+ICfhvLMnLAon4bywzIEnID0+ICfhvLQnLAon4byxzIEnID0+ICfhvLUnLAon4bywzYInID0+ICfhvLYnLAon4byxzYInID0+ICfhvLcnLAonzpnMkycgPT4gJ+G8uCcsCifOmcyUJyA9PiAn4by5JywKJ+G8uMyAJyA9PiAn4by6JywKJ+G8ucyAJyA9PiAn4by7JywKJ+G8uMyBJyA9PiAn4by8JywKJ+G8ucyBJyA9PiAn4by9JywKJ+G8uM2CJyA9PiAn4by+JywKJ+G8uc2CJyA9PiAn4by/JywKJ86/zJMnID0+ICfhvYAnLAonzr/MlCcgPT4gJ+G9gScsCifhvYDMgCcgPT4gJ+G9gicsCifhvYHMgCcgPT4gJ+G9gycsCifhvYDMgScgPT4gJ+G9hCcsCifhvYHMgScgPT4gJ+G9hScsCifOn8yTJyA9PiAn4b2IJywKJ86fzJQnID0+ICfhvYknLAon4b2IzIAnID0+ICfhvYonLAon4b2JzIAnID0+ICfhvYsnLAon4b2IzIEnID0+ICfhvYwnLAon4b2JzIEnID0+ICfhvY0nLAonz4XMkycgPT4gJ+G9kCcsCifPhcyUJyA9PiAn4b2RJywKJ+G9kMyAJyA9PiAn4b2SJywKJ+G9kcyAJyA9PiAn4b2TJywKJ+G9kMyBJyA9PiAn4b2UJywKJ+G9kcyBJyA9PiAn4b2VJywKJ+G9kM2CJyA9PiAn4b2WJywKJ+G9kc2CJyA9PiAn4b2XJywKJ86lzJQnID0+ICfhvZknLAon4b2ZzIAnID0+ICfhvZsnLAon4b2ZzIEnID0+ICfhvZ0nLAon4b2ZzYInID0+ICfhvZ8nLAonz4nMkycgPT4gJ+G9oCcsCifPicyUJyA9PiAn4b2hJywKJ+G9oMyAJyA9PiAn4b2iJywKJ+G9ocyAJyA9PiAn4b2jJywKJ+G9oMyBJyA9PiAn4b2kJywKJ+G9ocyBJyA9PiAn4b2lJywKJ+G9oM2CJyA9PiAn4b2mJywKJ+G9oc2CJyA9PiAn4b2nJywKJ86pzJMnID0+ICfhvagnLAonzqnMlCcgPT4gJ+G9qScsCifhvajMgCcgPT4gJ+G9qicsCifhvanMgCcgPT4gJ+G9qycsCifhvajMgScgPT4gJ+G9rCcsCifhvanMgScgPT4gJ+G9rScsCifhvajNgicgPT4gJ+G9ricsCifhvanNgicgPT4gJ+G9rycsCifOscyAJyA9PiAn4b2wJywKJ861zIAnID0+ICfhvbInLAonzrfMgCcgPT4gJ+G9tCcsCifOucyAJyA9PiAn4b22JywKJ86/zIAnID0+ICfhvbgnLAonz4XMgCcgPT4gJ+G9uicsCifPicyAJyA9PiAn4b28JywKJ+G8gM2FJyA9PiAn4b6AJywKJ+G8gc2FJyA9PiAn4b6BJywKJ+G8gs2FJyA9PiAn4b6CJywKJ+G8g82FJyA9PiAn4b6DJywKJ+G8hM2FJyA9PiAn4b6EJywKJ+G8hc2FJyA9PiAn4b6FJywKJ+G8hs2FJyA9PiAn4b6GJywKJ+G8h82FJyA9PiAn4b6HJywKJ+G8iM2FJyA9PiAn4b6IJywKJ+G8ic2FJyA9PiAn4b6JJywKJ+G8is2FJyA9PiAn4b6KJywKJ+G8i82FJyA9PiAn4b6LJywKJ+G8jM2FJyA9PiAn4b6MJywKJ+G8jc2FJyA9PiAn4b6NJywKJ+G8js2FJyA9PiAn4b6OJywKJ+G8j82FJyA9PiAn4b6PJywKJ+G8oM2FJyA9PiAn4b6QJywKJ+G8oc2FJyA9PiAn4b6RJywKJ+G8os2FJyA9PiAn4b6SJywKJ+G8o82FJyA9PiAn4b6TJywKJ+G8pM2FJyA9PiAn4b6UJywKJ+G8pc2FJyA9PiAn4b6VJywKJ+G8ps2FJyA9PiAn4b6WJywKJ+G8p82FJyA9PiAn4b6XJywKJ+G8qM2FJyA9PiAn4b6YJywKJ+G8qc2FJyA9PiAn4b6ZJywKJ+G8qs2FJyA9PiAn4b6aJywKJ+G8q82FJyA9PiAn4b6bJywKJ+G8rM2FJyA9PiAn4b6cJywKJ+G8rc2FJyA9PiAn4b6dJywKJ+G8rs2FJyA9PiAn4b6eJywKJ+G8r82FJyA9PiAn4b6fJywKJ+G9oM2FJyA9PiAn4b6gJywKJ+G9oc2FJyA9PiAn4b6hJywKJ+G9os2FJyA9PiAn4b6iJywKJ+G9o82FJyA9PiAn4b6jJywKJ+G9pM2FJyA9PiAn4b6kJywKJ+G9pc2FJyA9PiAn4b6lJywKJ+G9ps2FJyA9PiAn4b6mJywKJ+G9p82FJyA9PiAn4b6nJywKJ+G9qM2FJyA9PiAn4b6oJywKJ+G9qc2FJyA9PiAn4b6pJywKJ+G9qs2FJyA9PiAn4b6qJywKJ+G9q82FJyA9PiAn4b6rJywKJ+G9rM2FJyA9PiAn4b6sJywKJ+G9rc2FJyA9PiAn4b6tJywKJ+G9rs2FJyA9PiAn4b6uJywKJ+G9r82FJyA9PiAn4b6vJywKJ86xzIYnID0+ICfhvrAnLAonzrHMhCcgPT4gJ+G+sScsCifhvbDNhScgPT4gJ+G+sicsCifOsc2FJyA9PiAn4b6zJywKJ86szYUnID0+ICfhvrQnLAonzrHNgicgPT4gJ+G+ticsCifhvrbNhScgPT4gJ+G+tycsCifOkcyGJyA9PiAn4b64JywKJ86RzIQnID0+ICfhvrknLAonzpHMgCcgPT4gJ+G+uicsCifOkc2FJyA9PiAn4b68JywKJ8KozYInID0+ICfhv4EnLAon4b20zYUnID0+ICfhv4InLAonzrfNhScgPT4gJ+G/gycsCifOrs2FJyA9PiAn4b+EJywKJ863zYInID0+ICfhv4YnLAon4b+GzYUnID0+ICfhv4cnLAonzpXMgCcgPT4gJ+G/iCcsCifOl8yAJyA9PiAn4b+KJywKJ86XzYUnID0+ICfhv4wnLAon4b6/zIAnID0+ICfhv40nLAon4b6/zIEnID0+ICfhv44nLAon4b6/zYInID0+ICfhv48nLAonzrnMhicgPT4gJ+G/kCcsCifOucyEJyA9PiAn4b+RJywKJ8+KzIAnID0+ICfhv5InLAonzrnNgicgPT4gJ+G/licsCifPis2CJyA9PiAn4b+XJywKJ86ZzIYnID0+ICfhv5gnLAonzpnMhCcgPT4gJ+G/mScsCifOmcyAJyA9PiAn4b+aJywKJ+G/vsyAJyA9PiAn4b+dJywKJ+G/vsyBJyA9PiAn4b+eJywKJ+G/vs2CJyA9PiAn4b+fJywKJ8+FzIYnID0+ICfhv6AnLAonz4XMhCcgPT4gJ+G/oScsCifPi8yAJyA9PiAn4b+iJywKJ8+BzJMnID0+ICfhv6QnLAonz4HMlCcgPT4gJ+G/pScsCifPhc2CJyA9PiAn4b+mJywKJ8+LzYInID0+ICfhv6cnLAonzqXMhicgPT4gJ+G/qCcsCifOpcyEJyA9PiAn4b+pJywKJ86lzIAnID0+ICfhv6onLAonzqHMlCcgPT4gJ+G/rCcsCifCqMyAJyA9PiAn4b+tJywKJ+G9vM2FJyA9PiAn4b+yJywKJ8+JzYUnID0+ICfhv7MnLAonz47NhScgPT4gJ+G/tCcsCifPic2CJyA9PiAn4b+2JywKJ+G/ts2FJyA9PiAn4b+3JywKJ86fzIAnID0+ICfhv7gnLAonzqnMgCcgPT4gJ+G/uicsCifOqc2FJyA9PiAn4b+8JywKJ+KGkMy4JyA9PiAn4oaaJywKJ+KGksy4JyA9PiAn4oabJywKJ+KGlMy4JyA9PiAn4oauJywKJ+KHkMy4JyA9PiAn4oeNJywKJ+KHlMy4JyA9PiAn4oeOJywKJ+KHksy4JyA9PiAn4oePJywKJ+KIg8y4JyA9PiAn4oiEJywKJ+KIiMy4JyA9PiAn4oiJJywKJ+KIi8y4JyA9PiAn4oiMJywKJ+KIo8y4JyA9PiAn4oikJywKJ+KIpcy4JyA9PiAn4oimJywKJ+KIvMy4JyA9PiAn4omBJywKJ+KJg8y4JyA9PiAn4omEJywKJ+KJhcy4JyA9PiAn4omHJywKJ+KJiMy4JyA9PiAn4omJJywKJz3MuCcgPT4gJ+KJoCcsCifiiaHMuCcgPT4gJ+KJoicsCifiiY3MuCcgPT4gJ+KJrScsCic8zLgnID0+ICfiia4nLAonPsy4JyA9PiAn4omvJywKJ+KJpMy4JyA9PiAn4omwJywKJ+KJpcy4JyA9PiAn4omxJywKJ+KJssy4JyA9PiAn4om0JywKJ+KJs8y4JyA9PiAn4om1JywKJ+KJtsy4JyA9PiAn4om4JywKJ+KJt8y4JyA9PiAn4om5JywKJ+KJusy4JyA9PiAn4oqAJywKJ+KJu8y4JyA9PiAn4oqBJywKJ+KKgsy4JyA9PiAn4oqEJywKJ+KKg8y4JyA9PiAn4oqFJywKJ+KKhsy4JyA9PiAn4oqIJywKJ+KKh8y4JyA9PiAn4oqJJywKJ+KKosy4JyA9PiAn4oqsJywKJ+KKqMy4JyA9PiAn4oqtJywKJ+KKqcy4JyA9PiAn4oquJywKJ+KKq8y4JyA9PiAn4oqvJywKJ+KJvMy4JyA9PiAn4ougJywKJ+KJvcy4JyA9PiAn4ouhJywKJ+KKkcy4JyA9PiAn4ouiJywKJ+KKksy4JyA9PiAn4oujJywKJ+KKssy4JyA9PiAn4ouqJywKJ+KKs8y4JyA9PiAn4ourJywKJ+KKtMy4JyA9PiAn4ousJywKJ+KKtcy4JyA9PiAn4outJywKJ+OBi+OCmScgPT4gJ+OBjCcsCifjgY3jgpknID0+ICfjgY4nLAon44GP44KZJyA9PiAn44GQJywKJ+OBkeOCmScgPT4gJ+OBkicsCifjgZPjgpknID0+ICfjgZQnLAon44GV44KZJyA9PiAn44GWJywKJ+OBl+OCmScgPT4gJ+OBmCcsCifjgZnjgpknID0+ICfjgZonLAon44Gb44KZJyA9PiAn44GcJywKJ+OBneOCmScgPT4gJ+OBnicsCifjgZ/jgpknID0+ICfjgaAnLAon44Gh44KZJyA9PiAn44GiJywKJ+OBpOOCmScgPT4gJ+OBpScsCifjgabjgpknID0+ICfjgacnLAon44Go44KZJyA9PiAn44GpJywKJ+OBr+OCmScgPT4gJ+OBsCcsCifjga/jgponID0+ICfjgbEnLAon44Gy44KZJyA9PiAn44GzJywKJ+OBsuOCmicgPT4gJ+OBtCcsCifjgbXjgpknID0+ICfjgbYnLAon44G144KaJyA9PiAn44G3JywKJ+OBuOOCmScgPT4gJ+OBuScsCifjgbjjgponID0+ICfjgbonLAon44G744KZJyA9PiAn44G8JywKJ+OBu+OCmicgPT4gJ+OBvScsCifjgYbjgpknID0+ICfjgpQnLAon44Kd44KZJyA9PiAn44KeJywKJ+OCq+OCmScgPT4gJ+OCrCcsCifjgq3jgpknID0+ICfjgq4nLAon44Kv44KZJyA9PiAn44KwJywKJ+OCseOCmScgPT4gJ+OCsicsCifjgrPjgpknID0+ICfjgrQnLAon44K144KZJyA9PiAn44K2JywKJ+OCt+OCmScgPT4gJ+OCuCcsCifjgrnjgpknID0+ICfjgronLAon44K744KZJyA9PiAn44K8JywKJ+OCveOCmScgPT4gJ+OCvicsCifjgr/jgpknID0+ICfjg4AnLAon44OB44KZJyA9PiAn44OCJywKJ+ODhOOCmScgPT4gJ+ODhScsCifjg4bjgpknID0+ICfjg4cnLAon44OI44KZJyA9PiAn44OJJywKJ+ODj+OCmScgPT4gJ+ODkCcsCifjg4/jgponID0+ICfjg5EnLAon44OS44KZJyA9PiAn44OTJywKJ+ODkuOCmicgPT4gJ+ODlCcsCifjg5XjgpknID0+ICfjg5YnLAon44OV44KaJyA9PiAn44OXJywKJ+ODmOOCmScgPT4gJ+ODmScsCifjg5jjgponID0+ICfjg5onLAon44Ob44KZJyA9PiAn44OcJywKJ+ODm+OCmicgPT4gJ+ODnScsCifjgqbjgpknID0+ICfjg7QnLAon44Ov44KZJyA9PiAn44O3JywKJ+ODsOOCmScgPT4gJ+ODuCcsCifjg7HjgpknID0+ICfjg7knLAon44Oy44KZJyA9PiAn44O6JywKJ+ODveOCmScgPT4gJ+ODvicsCifwkYKZ8JGCuicgPT4gJ/CRgponLAon8JGCm/CRgronID0+ICfwkYKcJywKJ/CRgqXwkYK6JyA9PiAn8JGCqycsCifwkYSx8JGEpycgPT4gJ/CRhK4nLAon8JGEsvCRhKcnID0+ICfwkYSvJywKJ/CRjYfwkYy+JyA9PiAn8JGNiycsCifwkY2H8JGNlycgPT4gJ/CRjYwnLAon8JGSufCRkronID0+ICfwkZK7JywKJ/CRkrnwkZKwJyA9PiAn8JGSvCcsCifwkZK58JGSvScgPT4gJ/CRkr4nLAon8JGWuPCRlq8nID0+ICfwkZa6JywKJ/CRlrnwkZavJyA9PiAn8JGWuycsCifwkaS18JGksCcgPT4gJ/CRpLgnLAopOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ8OAJyA9PiAnQcyAJywKJ8OBJyA9PiAnQcyBJywKJ8OCJyA9PiAnQcyCJywKJ8ODJyA9PiAnQcyDJywKJ8OEJyA9PiAnQcyIJywKJ8OFJyA9PiAnQcyKJywKJ8OHJyA9PiAnQ8ynJywKJ8OIJyA9PiAnRcyAJywKJ8OJJyA9PiAnRcyBJywKJ8OKJyA9PiAnRcyCJywKJ8OLJyA9PiAnRcyIJywKJ8OMJyA9PiAnScyAJywKJ8ONJyA9PiAnScyBJywKJ8OOJyA9PiAnScyCJywKJ8OPJyA9PiAnScyIJywKJ8ORJyA9PiAnTsyDJywKJ8OSJyA9PiAnT8yAJywKJ8OTJyA9PiAnT8yBJywKJ8OUJyA9PiAnT8yCJywKJ8OVJyA9PiAnT8yDJywKJ8OWJyA9PiAnT8yIJywKJ8OZJyA9PiAnVcyAJywKJ8OaJyA9PiAnVcyBJywKJ8ObJyA9PiAnVcyCJywKJ8OcJyA9PiAnVcyIJywKJ8OdJyA9PiAnWcyBJywKJ8OgJyA9PiAnYcyAJywKJ8OhJyA9PiAnYcyBJywKJ8OiJyA9PiAnYcyCJywKJ8OjJyA9PiAnYcyDJywKJ8OkJyA9PiAnYcyIJywKJ8OlJyA9PiAnYcyKJywKJ8OnJyA9PiAnY8ynJywKJ8OoJyA9PiAnZcyAJywKJ8OpJyA9PiAnZcyBJywKJ8OqJyA9PiAnZcyCJywKJ8OrJyA9PiAnZcyIJywKJ8OsJyA9PiAnacyAJywKJ8OtJyA9PiAnacyBJywKJ8OuJyA9PiAnacyCJywKJ8OvJyA9PiAnacyIJywKJ8OxJyA9PiAnbsyDJywKJ8OyJyA9PiAnb8yAJywKJ8OzJyA9PiAnb8yBJywKJ8O0JyA9PiAnb8yCJywKJ8O1JyA9PiAnb8yDJywKJ8O2JyA9PiAnb8yIJywKJ8O5JyA9PiAndcyAJywKJ8O6JyA9PiAndcyBJywKJ8O7JyA9PiAndcyCJywKJ8O8JyA9PiAndcyIJywKJ8O9JyA9PiAnecyBJywKJ8O/JyA9PiAnecyIJywKJ8SAJyA9PiAnQcyEJywKJ8SBJyA9PiAnYcyEJywKJ8SCJyA9PiAnQcyGJywKJ8SDJyA9PiAnYcyGJywKJ8SEJyA9PiAnQcyoJywKJ8SFJyA9PiAnYcyoJywKJ8SGJyA9PiAnQ8yBJywKJ8SHJyA9PiAnY8yBJywKJ8SIJyA9PiAnQ8yCJywKJ8SJJyA9PiAnY8yCJywKJ8SKJyA9PiAnQ8yHJywKJ8SLJyA9PiAnY8yHJywKJ8SMJyA9PiAnQ8yMJywKJ8SNJyA9PiAnY8yMJywKJ8SOJyA9PiAnRMyMJywKJ8SPJyA9PiAnZMyMJywKJ8SSJyA9PiAnRcyEJywKJ8STJyA9PiAnZcyEJywKJ8SUJyA9PiAnRcyGJywKJ8SVJyA9PiAnZcyGJywKJ8SWJyA9PiAnRcyHJywKJ8SXJyA9PiAnZcyHJywKJ8SYJyA9PiAnRcyoJywKJ8SZJyA9PiAnZcyoJywKJ8SaJyA9PiAnRcyMJywKJ8SbJyA9PiAnZcyMJywKJ8ScJyA9PiAnR8yCJywKJ8SdJyA9PiAnZ8yCJywKJ8SeJyA9PiAnR8yGJywKJ8SfJyA9PiAnZ8yGJywKJ8SgJyA9PiAnR8yHJywKJ8ShJyA9PiAnZ8yHJywKJ8SiJyA9PiAnR8ynJywKJ8SjJyA9PiAnZ8ynJywKJ8SkJyA9PiAnSMyCJywKJ8SlJyA9PiAnaMyCJywKJ8SoJyA9PiAnScyDJywKJ8SpJyA9PiAnacyDJywKJ8SqJyA9PiAnScyEJywKJ8SrJyA9PiAnacyEJywKJ8SsJyA9PiAnScyGJywKJ8StJyA9PiAnacyGJywKJ8SuJyA9PiAnScyoJywKJ8SvJyA9PiAnacyoJywKJ8SwJyA9PiAnScyHJywKJ8S0JyA9PiAnSsyCJywKJ8S1JyA9PiAnasyCJywKJ8S2JyA9PiAnS8ynJywKJ8S3JyA9PiAna8ynJywKJ8S5JyA9PiAnTMyBJywKJ8S6JyA9PiAnbMyBJywKJ8S7JyA9PiAnTMynJywKJ8S8JyA9PiAnbMynJywKJ8S9JyA9PiAnTMyMJywKJ8S+JyA9PiAnbMyMJywKJ8WDJyA9PiAnTsyBJywKJ8WEJyA9PiAnbsyBJywKJ8WFJyA9PiAnTsynJywKJ8WGJyA9PiAnbsynJywKJ8WHJyA9PiAnTsyMJywKJ8WIJyA9PiAnbsyMJywKJ8WMJyA9PiAnT8yEJywKJ8WNJyA9PiAnb8yEJywKJ8WOJyA9PiAnT8yGJywKJ8WPJyA9PiAnb8yGJywKJ8WQJyA9PiAnT8yLJywKJ8WRJyA9PiAnb8yLJywKJ8WUJyA9PiAnUsyBJywKJ8WVJyA9PiAncsyBJywKJ8WWJyA9PiAnUsynJywKJ8WXJyA9PiAncsynJywKJ8WYJyA9PiAnUsyMJywKJ8WZJyA9PiAncsyMJywKJ8WaJyA9PiAnU8yBJywKJ8WbJyA9PiAnc8yBJywKJ8WcJyA9PiAnU8yCJywKJ8WdJyA9PiAnc8yCJywKJ8WeJyA9PiAnU8ynJywKJ8WfJyA9PiAnc8ynJywKJ8WgJyA9PiAnU8yMJywKJ8WhJyA9PiAnc8yMJywKJ8WiJyA9PiAnVMynJywKJ8WjJyA9PiAndMynJywKJ8WkJyA9PiAnVMyMJywKJ8WlJyA9PiAndMyMJywKJ8WoJyA9PiAnVcyDJywKJ8WpJyA9PiAndcyDJywKJ8WqJyA9PiAnVcyEJywKJ8WrJyA9PiAndcyEJywKJ8WsJyA9PiAnVcyGJywKJ8WtJyA9PiAndcyGJywKJ8WuJyA9PiAnVcyKJywKJ8WvJyA9PiAndcyKJywKJ8WwJyA9PiAnVcyLJywKJ8WxJyA9PiAndcyLJywKJ8WyJyA9PiAnVcyoJywKJ8WzJyA9PiAndcyoJywKJ8W0JyA9PiAnV8yCJywKJ8W1JyA9PiAnd8yCJywKJ8W2JyA9PiAnWcyCJywKJ8W3JyA9PiAnecyCJywKJ8W4JyA9PiAnWcyIJywKJ8W5JyA9PiAnWsyBJywKJ8W6JyA9PiAnesyBJywKJ8W7JyA9PiAnWsyHJywKJ8W8JyA9PiAnesyHJywKJ8W9JyA9PiAnWsyMJywKJ8W+JyA9PiAnesyMJywKJ8agJyA9PiAnT8ybJywKJ8ahJyA9PiAnb8ybJywKJ8avJyA9PiAnVcybJywKJ8awJyA9PiAndcybJywKJ8eNJyA9PiAnQcyMJywKJ8eOJyA9PiAnYcyMJywKJ8ePJyA9PiAnScyMJywKJ8eQJyA9PiAnacyMJywKJ8eRJyA9PiAnT8yMJywKJ8eSJyA9PiAnb8yMJywKJ8eTJyA9PiAnVcyMJywKJ8eUJyA9PiAndcyMJywKJ8eVJyA9PiAnVcyIzIQnLAonx5YnID0+ICd1zIjMhCcsCifHlycgPT4gJ1XMiMyBJywKJ8eYJyA9PiAndcyIzIEnLAonx5knID0+ICdVzIjMjCcsCifHmicgPT4gJ3XMiMyMJywKJ8ebJyA9PiAnVcyIzIAnLAonx5wnID0+ICd1zIjMgCcsCifHnicgPT4gJ0HMiMyEJywKJ8efJyA9PiAnYcyIzIQnLAonx6AnID0+ICdBzIfMhCcsCifHoScgPT4gJ2HMh8yEJywKJ8eiJyA9PiAnw4bMhCcsCifHoycgPT4gJ8OmzIQnLAonx6YnID0+ICdHzIwnLAonx6cnID0+ICdnzIwnLAonx6gnID0+ICdLzIwnLAonx6knID0+ICdrzIwnLAonx6onID0+ICdPzKgnLAonx6snID0+ICdvzKgnLAonx6wnID0+ICdPzKjMhCcsCifHrScgPT4gJ2/MqMyEJywKJ8euJyA9PiAnxrfMjCcsCifHrycgPT4gJ8qSzIwnLAonx7AnID0+ICdqzIwnLAonx7QnID0+ICdHzIEnLAonx7UnID0+ICdnzIEnLAonx7gnID0+ICdOzIAnLAonx7knID0+ICduzIAnLAonx7onID0+ICdBzIrMgScsCifHuycgPT4gJ2HMisyBJywKJ8e8JyA9PiAnw4bMgScsCifHvScgPT4gJ8OmzIEnLAonx74nID0+ICfDmMyBJywKJ8e/JyA9PiAnw7jMgScsCifIgCcgPT4gJ0HMjycsCifIgScgPT4gJ2HMjycsCifIgicgPT4gJ0HMkScsCifIgycgPT4gJ2HMkScsCifIhCcgPT4gJ0XMjycsCifIhScgPT4gJ2XMjycsCifIhicgPT4gJ0XMkScsCifIhycgPT4gJ2XMkScsCifIiCcgPT4gJ0nMjycsCifIiScgPT4gJ2nMjycsCifIiicgPT4gJ0nMkScsCifIiycgPT4gJ2nMkScsCifIjCcgPT4gJ0/MjycsCifIjScgPT4gJ2/MjycsCifIjicgPT4gJ0/MkScsCifIjycgPT4gJ2/MkScsCifIkCcgPT4gJ1LMjycsCifIkScgPT4gJ3LMjycsCifIkicgPT4gJ1LMkScsCifIkycgPT4gJ3LMkScsCifIlCcgPT4gJ1XMjycsCifIlScgPT4gJ3XMjycsCifIlicgPT4gJ1XMkScsCifIlycgPT4gJ3XMkScsCifImCcgPT4gJ1PMpicsCifImScgPT4gJ3PMpicsCifImicgPT4gJ1TMpicsCifImycgPT4gJ3TMpicsCifInicgPT4gJ0jMjCcsCifInycgPT4gJ2jMjCcsCifIpicgPT4gJ0HMhycsCifIpycgPT4gJ2HMhycsCifIqCcgPT4gJ0XMpycsCifIqScgPT4gJ2XMpycsCifIqicgPT4gJ0/MiMyEJywKJ8irJyA9PiAnb8yIzIQnLAonyKwnID0+ICdPzIPMhCcsCifIrScgPT4gJ2/Mg8yEJywKJ8iuJyA9PiAnT8yHJywKJ8ivJyA9PiAnb8yHJywKJ8iwJyA9PiAnT8yHzIQnLAonyLEnID0+ICdvzIfMhCcsCifIsicgPT4gJ1nMhCcsCifIsycgPT4gJ3nMhCcsCifNgCcgPT4gJ8yAJywKJ82BJyA9PiAnzIEnLAonzYMnID0+ICfMkycsCifNhCcgPT4gJ8yIzIEnLAonzbQnID0+ICfKuScsCifNvicgPT4gJzsnLAonzoUnID0+ICfCqMyBJywKJ86GJyA9PiAnzpHMgScsCifOhycgPT4gJ8K3JywKJ86IJyA9PiAnzpXMgScsCifOiScgPT4gJ86XzIEnLAonzoonID0+ICfOmcyBJywKJ86MJyA9PiAnzp/MgScsCifOjicgPT4gJ86lzIEnLAonzo8nID0+ICfOqcyBJywKJ86QJyA9PiAnzrnMiMyBJywKJ86qJyA9PiAnzpnMiCcsCifOqycgPT4gJ86lzIgnLAonzqwnID0+ICfOscyBJywKJ86tJyA9PiAnzrXMgScsCifOricgPT4gJ863zIEnLAonzq8nID0+ICfOucyBJywKJ86wJyA9PiAnz4XMiMyBJywKJ8+KJyA9PiAnzrnMiCcsCifPiycgPT4gJ8+FzIgnLAonz4wnID0+ICfOv8yBJywKJ8+NJyA9PiAnz4XMgScsCifPjicgPT4gJ8+JzIEnLAonz5MnID0+ICfPksyBJywKJ8+UJyA9PiAnz5LMiCcsCifQgCcgPT4gJ9CVzIAnLAon0IEnID0+ICfQlcyIJywKJ9CDJyA9PiAn0JPMgScsCifQhycgPT4gJ9CGzIgnLAon0IwnID0+ICfQmsyBJywKJ9CNJyA9PiAn0JjMgCcsCifQjicgPT4gJ9CjzIYnLAon0JknID0+ICfQmMyGJywKJ9C5JyA9PiAn0LjMhicsCifRkCcgPT4gJ9C1zIAnLAon0ZEnID0+ICfQtcyIJywKJ9GTJyA9PiAn0LPMgScsCifRlycgPT4gJ9GWzIgnLAon0ZwnID0+ICfQusyBJywKJ9GdJyA9PiAn0LjMgCcsCifRnicgPT4gJ9GDzIYnLAon0bYnID0+ICfRtMyPJywKJ9G3JyA9PiAn0bXMjycsCifTgScgPT4gJ9CWzIYnLAon04InID0+ICfQtsyGJywKJ9OQJyA9PiAn0JDMhicsCifTkScgPT4gJ9CwzIYnLAon05InID0+ICfQkMyIJywKJ9OTJyA9PiAn0LDMiCcsCifTlicgPT4gJ9CVzIYnLAon05cnID0+ICfQtcyGJywKJ9OaJyA9PiAn05jMiCcsCifTmycgPT4gJ9OZzIgnLAon05wnID0+ICfQlsyIJywKJ9OdJyA9PiAn0LbMiCcsCifTnicgPT4gJ9CXzIgnLAon058nID0+ICfQt8yIJywKJ9OiJyA9PiAn0JjMhCcsCifToycgPT4gJ9C4zIQnLAon06QnID0+ICfQmMyIJywKJ9OlJyA9PiAn0LjMiCcsCifTpicgPT4gJ9CezIgnLAon06cnID0+ICfQvsyIJywKJ9OqJyA9PiAn06jMiCcsCifTqycgPT4gJ9OpzIgnLAon06wnID0+ICfQrcyIJywKJ9OtJyA9PiAn0Y3MiCcsCifTricgPT4gJ9CjzIQnLAon068nID0+ICfRg8yEJywKJ9OwJyA9PiAn0KPMiCcsCifTsScgPT4gJ9GDzIgnLAon07InID0+ICfQo8yLJywKJ9OzJyA9PiAn0YPMiycsCifTtCcgPT4gJ9CnzIgnLAon07UnID0+ICfRh8yIJywKJ9O4JyA9PiAn0KvMiCcsCifTuScgPT4gJ9GLzIgnLAon2KInID0+ICfYp9mTJywKJ9ijJyA9PiAn2KfZlCcsCifYpCcgPT4gJ9mI2ZQnLAon2KUnID0+ICfYp9mVJywKJ9imJyA9PiAn2YrZlCcsCifbgCcgPT4gJ9uV2ZQnLAon24InID0+ICfbgdmUJywKJ9uTJyA9PiAn25LZlCcsCifgpKknID0+ICfgpKjgpLwnLAon4KSxJyA9PiAn4KSw4KS8JywKJ+CktCcgPT4gJ+Cks+CkvCcsCifgpZgnID0+ICfgpJXgpLwnLAon4KWZJyA9PiAn4KSW4KS8JywKJ+ClmicgPT4gJ+Ckl+CkvCcsCifgpZsnID0+ICfgpJzgpLwnLAon4KWcJyA9PiAn4KSh4KS8JywKJ+ClnScgPT4gJ+CkouCkvCcsCifgpZ4nID0+ICfgpKvgpLwnLAon4KWfJyA9PiAn4KSv4KS8JywKJ+CniycgPT4gJ+Cnh+CmvicsCifgp4wnID0+ICfgp4fgp5cnLAon4KecJyA9PiAn4Kah4Ka8JywKJ+CnnScgPT4gJ+CmouCmvCcsCifgp58nID0+ICfgpq/gprwnLAon4KizJyA9PiAn4Kiy4Ki8JywKJ+CoticgPT4gJ+CouOCovCcsCifgqZknID0+ICfgqJbgqLwnLAon4KmaJyA9PiAn4KiX4Ki8JywKJ+CpmycgPT4gJ+ConOCovCcsCifgqZ4nID0+ICfgqKvgqLwnLAon4K2IJyA9PiAn4K2H4K2WJywKJ+CtiycgPT4gJ+Cth+CsvicsCifgrYwnID0+ICfgrYfgrZcnLAon4K2cJyA9PiAn4Kyh4Ky8JywKJ+CtnScgPT4gJ+CsouCsvCcsCifgrpQnID0+ICfgrpLgr5cnLAon4K+KJyA9PiAn4K+G4K6+JywKJ+CviycgPT4gJ+Cvh+CuvicsCifgr4wnID0+ICfgr4bgr5cnLAon4LGIJyA9PiAn4LGG4LGWJywKJ+CzgCcgPT4gJ+Cyv+CzlScsCifgs4cnID0+ICfgs4bgs5UnLAon4LOIJyA9PiAn4LOG4LOWJywKJ+CziicgPT4gJ+CzhuCzgicsCifgs4snID0+ICfgs4bgs4Lgs5UnLAon4LWKJyA9PiAn4LWG4LS+JywKJ+C1iycgPT4gJ+C1h+C0vicsCifgtYwnID0+ICfgtYbgtZcnLAon4LeaJyA9PiAn4LeZ4LeKJywKJ+C3nCcgPT4gJ+C3meC3jycsCifgt50nID0+ICfgt5ngt4/gt4onLAon4LeeJyA9PiAn4LeZ4LefJywKJ+C9gycgPT4gJ+C9guC+tycsCifgvY0nID0+ICfgvYzgvrcnLAon4L2SJyA9PiAn4L2R4L63JywKJ+C9lycgPT4gJ+C9luC+tycsCifgvZwnID0+ICfgvZvgvrcnLAon4L2pJyA9PiAn4L2A4L61JywKJ+C9sycgPT4gJ+C9seC9sicsCifgvbUnID0+ICfgvbHgvbQnLAon4L22JyA9PiAn4L6y4L6AJywKJ+C9uCcgPT4gJ+C+s+C+gCcsCifgvoEnID0+ICfgvbHgvoAnLAon4L6TJyA9PiAn4L6S4L63JywKJ+C+nScgPT4gJ+C+nOC+tycsCifgvqInID0+ICfgvqHgvrcnLAon4L6nJyA9PiAn4L6m4L63JywKJ+C+rCcgPT4gJ+C+q+C+tycsCifgvrknID0+ICfgvpDgvrUnLAon4YCmJyA9PiAn4YCl4YCuJywKJ+GshicgPT4gJ+GsheGstScsCifhrIgnID0+ICfhrIfhrLUnLAon4ayKJyA9PiAn4ayJ4ay1JywKJ+GsjCcgPT4gJ+Gsi+GstScsCifhrI4nID0+ICfhrI3hrLUnLAon4aySJyA9PiAn4ayR4ay1JywKJ+GsuycgPT4gJ+GsuuGstScsCifhrL0nID0+ICfhrLzhrLUnLAon4a2AJyA9PiAn4ay+4ay1JywKJ+GtgScgPT4gJ+Gsv+GstScsCifhrYMnID0+ICfhrYLhrLUnLAon4biAJyA9PiAnQcylJywKJ+G4gScgPT4gJ2HMpScsCifhuIInID0+ICdCzIcnLAon4biDJyA9PiAnYsyHJywKJ+G4hCcgPT4gJ0LMoycsCifhuIUnID0+ICdizKMnLAon4biGJyA9PiAnQsyxJywKJ+G4hycgPT4gJ2LMsScsCifhuIgnID0+ICdDzKfMgScsCifhuIknID0+ICdjzKfMgScsCifhuIonID0+ICdEzIcnLAon4biLJyA9PiAnZMyHJywKJ+G4jCcgPT4gJ0TMoycsCifhuI0nID0+ICdkzKMnLAon4biOJyA9PiAnRMyxJywKJ+G4jycgPT4gJ2TMsScsCifhuJAnID0+ICdEzKcnLAon4biRJyA9PiAnZMynJywKJ+G4kicgPT4gJ0TMrScsCifhuJMnID0+ICdkzK0nLAon4biUJyA9PiAnRcyEzIAnLAon4biVJyA9PiAnZcyEzIAnLAon4biWJyA9PiAnRcyEzIEnLAon4biXJyA9PiAnZcyEzIEnLAon4biYJyA9PiAnRcytJywKJ+G4mScgPT4gJ2XMrScsCifhuJonID0+ICdFzLAnLAon4bibJyA9PiAnZcywJywKJ+G4nCcgPT4gJ0XMp8yGJywKJ+G4nScgPT4gJ2XMp8yGJywKJ+G4nicgPT4gJ0bMhycsCifhuJ8nID0+ICdmzIcnLAon4bigJyA9PiAnR8yEJywKJ+G4oScgPT4gJ2fMhCcsCifhuKInID0+ICdIzIcnLAon4bijJyA9PiAnaMyHJywKJ+G4pCcgPT4gJ0jMoycsCifhuKUnID0+ICdozKMnLAon4bimJyA9PiAnSMyIJywKJ+G4pycgPT4gJ2jMiCcsCifhuKgnID0+ICdIzKcnLAon4bipJyA9PiAnaMynJywKJ+G4qicgPT4gJ0jMricsCifhuKsnID0+ICdozK4nLAon4bisJyA9PiAnScywJywKJ+G4rScgPT4gJ2nMsCcsCifhuK4nID0+ICdJzIjMgScsCifhuK8nID0+ICdpzIjMgScsCifhuLAnID0+ICdLzIEnLAon4bixJyA9PiAna8yBJywKJ+G4sicgPT4gJ0vMoycsCifhuLMnID0+ICdrzKMnLAon4bi0JyA9PiAnS8yxJywKJ+G4tScgPT4gJ2vMsScsCifhuLYnID0+ICdMzKMnLAon4bi3JyA9PiAnbMyjJywKJ+G4uCcgPT4gJ0zMo8yEJywKJ+G4uScgPT4gJ2zMo8yEJywKJ+G4uicgPT4gJ0zMsScsCifhuLsnID0+ICdszLEnLAon4bi8JyA9PiAnTMytJywKJ+G4vScgPT4gJ2zMrScsCifhuL4nID0+ICdNzIEnLAon4bi/JyA9PiAnbcyBJywKJ+G5gCcgPT4gJ03MhycsCifhuYEnID0+ICdtzIcnLAon4bmCJyA9PiAnTcyjJywKJ+G5gycgPT4gJ23MoycsCifhuYQnID0+ICdOzIcnLAon4bmFJyA9PiAnbsyHJywKJ+G5hicgPT4gJ07MoycsCifhuYcnID0+ICduzKMnLAon4bmIJyA9PiAnTsyxJywKJ+G5iScgPT4gJ27MsScsCifhuYonID0+ICdOzK0nLAon4bmLJyA9PiAnbsytJywKJ+G5jCcgPT4gJ0/Mg8yBJywKJ+G5jScgPT4gJ2/Mg8yBJywKJ+G5jicgPT4gJ0/Mg8yIJywKJ+G5jycgPT4gJ2/Mg8yIJywKJ+G5kCcgPT4gJ0/MhMyAJywKJ+G5kScgPT4gJ2/MhMyAJywKJ+G5kicgPT4gJ0/MhMyBJywKJ+G5kycgPT4gJ2/MhMyBJywKJ+G5lCcgPT4gJ1DMgScsCifhuZUnID0+ICdwzIEnLAon4bmWJyA9PiAnUMyHJywKJ+G5lycgPT4gJ3DMhycsCifhuZgnID0+ICdSzIcnLAon4bmZJyA9PiAncsyHJywKJ+G5micgPT4gJ1LMoycsCifhuZsnID0+ICdyzKMnLAon4bmcJyA9PiAnUsyjzIQnLAon4bmdJyA9PiAncsyjzIQnLAon4bmeJyA9PiAnUsyxJywKJ+G5nycgPT4gJ3LMsScsCifhuaAnID0+ICdTzIcnLAon4bmhJyA9PiAnc8yHJywKJ+G5oicgPT4gJ1PMoycsCifhuaMnID0+ICdzzKMnLAon4bmkJyA9PiAnU8yBzIcnLAon4bmlJyA9PiAnc8yBzIcnLAon4bmmJyA9PiAnU8yMzIcnLAon4bmnJyA9PiAnc8yMzIcnLAon4bmoJyA9PiAnU8yjzIcnLAon4bmpJyA9PiAnc8yjzIcnLAon4bmqJyA9PiAnVMyHJywKJ+G5qycgPT4gJ3TMhycsCifhuawnID0+ICdUzKMnLAon4bmtJyA9PiAndMyjJywKJ+G5ricgPT4gJ1TMsScsCifhua8nID0+ICd0zLEnLAon4bmwJyA9PiAnVMytJywKJ+G5sScgPT4gJ3TMrScsCifhubInID0+ICdVzKQnLAon4bmzJyA9PiAndcykJywKJ+G5tCcgPT4gJ1XMsCcsCifhubUnID0+ICd1zLAnLAon4bm2JyA9PiAnVcytJywKJ+G5tycgPT4gJ3XMrScsCifhubgnID0+ICdVzIPMgScsCifhubknID0+ICd1zIPMgScsCifhubonID0+ICdVzITMiCcsCifhubsnID0+ICd1zITMiCcsCifhubwnID0+ICdWzIMnLAon4bm9JyA9PiAndsyDJywKJ+G5vicgPT4gJ1bMoycsCifhub8nID0+ICd2zKMnLAon4bqAJyA9PiAnV8yAJywKJ+G6gScgPT4gJ3fMgCcsCifhuoInID0+ICdXzIEnLAon4bqDJyA9PiAnd8yBJywKJ+G6hCcgPT4gJ1fMiCcsCifhuoUnID0+ICd3zIgnLAon4bqGJyA9PiAnV8yHJywKJ+G6hycgPT4gJ3fMhycsCifhuognID0+ICdXzKMnLAon4bqJJyA9PiAnd8yjJywKJ+G6iicgPT4gJ1jMhycsCifhuosnID0+ICd4zIcnLAon4bqMJyA9PiAnWMyIJywKJ+G6jScgPT4gJ3jMiCcsCifhuo4nID0+ICdZzIcnLAon4bqPJyA9PiAnecyHJywKJ+G6kCcgPT4gJ1rMgicsCifhupEnID0+ICd6zIInLAon4bqSJyA9PiAnWsyjJywKJ+G6kycgPT4gJ3rMoycsCifhupQnID0+ICdazLEnLAon4bqVJyA9PiAnesyxJywKJ+G6licgPT4gJ2jMsScsCifhupcnID0+ICd0zIgnLAon4bqYJyA9PiAnd8yKJywKJ+G6mScgPT4gJ3nMiicsCifhupsnID0+ICfFv8yHJywKJ+G6oCcgPT4gJ0HMoycsCifhuqEnID0+ICdhzKMnLAon4bqiJyA9PiAnQcyJJywKJ+G6oycgPT4gJ2HMiScsCifhuqQnID0+ICdBzILMgScsCifhuqUnID0+ICdhzILMgScsCifhuqYnID0+ICdBzILMgCcsCifhuqcnID0+ICdhzILMgCcsCifhuqgnID0+ICdBzILMiScsCifhuqknID0+ICdhzILMiScsCifhuqonID0+ICdBzILMgycsCifhuqsnID0+ICdhzILMgycsCifhuqwnID0+ICdBzKPMgicsCifhuq0nID0+ICdhzKPMgicsCifhuq4nID0+ICdBzIbMgScsCifhuq8nID0+ICdhzIbMgScsCifhurAnID0+ICdBzIbMgCcsCifhurEnID0+ICdhzIbMgCcsCifhurInID0+ICdBzIbMiScsCifhurMnID0+ICdhzIbMiScsCifhurQnID0+ICdBzIbMgycsCifhurUnID0+ICdhzIbMgycsCifhurYnID0+ICdBzKPMhicsCifhurcnID0+ICdhzKPMhicsCifhurgnID0+ICdFzKMnLAon4bq5JyA9PiAnZcyjJywKJ+G6uicgPT4gJ0XMiScsCifhursnID0+ICdlzIknLAon4bq8JyA9PiAnRcyDJywKJ+G6vScgPT4gJ2XMgycsCifhur4nID0+ICdFzILMgScsCifhur8nID0+ICdlzILMgScsCifhu4AnID0+ICdFzILMgCcsCifhu4EnID0+ICdlzILMgCcsCifhu4InID0+ICdFzILMiScsCifhu4MnID0+ICdlzILMiScsCifhu4QnID0+ICdFzILMgycsCifhu4UnID0+ICdlzILMgycsCifhu4YnID0+ICdFzKPMgicsCifhu4cnID0+ICdlzKPMgicsCifhu4gnID0+ICdJzIknLAon4buJJyA9PiAnacyJJywKJ+G7iicgPT4gJ0nMoycsCifhu4snID0+ICdpzKMnLAon4buMJyA9PiAnT8yjJywKJ+G7jScgPT4gJ2/MoycsCifhu44nID0+ICdPzIknLAon4buPJyA9PiAnb8yJJywKJ+G7kCcgPT4gJ0/MgsyBJywKJ+G7kScgPT4gJ2/MgsyBJywKJ+G7kicgPT4gJ0/MgsyAJywKJ+G7kycgPT4gJ2/MgsyAJywKJ+G7lCcgPT4gJ0/MgsyJJywKJ+G7lScgPT4gJ2/MgsyJJywKJ+G7licgPT4gJ0/MgsyDJywKJ+G7lycgPT4gJ2/MgsyDJywKJ+G7mCcgPT4gJ0/Mo8yCJywKJ+G7mScgPT4gJ2/Mo8yCJywKJ+G7micgPT4gJ0/Mm8yBJywKJ+G7mycgPT4gJ2/Mm8yBJywKJ+G7nCcgPT4gJ0/Mm8yAJywKJ+G7nScgPT4gJ2/Mm8yAJywKJ+G7nicgPT4gJ0/Mm8yJJywKJ+G7nycgPT4gJ2/Mm8yJJywKJ+G7oCcgPT4gJ0/Mm8yDJywKJ+G7oScgPT4gJ2/Mm8yDJywKJ+G7oicgPT4gJ0/Mm8yjJywKJ+G7oycgPT4gJ2/Mm8yjJywKJ+G7pCcgPT4gJ1XMoycsCifhu6UnID0+ICd1zKMnLAon4bumJyA9PiAnVcyJJywKJ+G7pycgPT4gJ3XMiScsCifhu6gnID0+ICdVzJvMgScsCifhu6knID0+ICd1zJvMgScsCifhu6onID0+ICdVzJvMgCcsCifhu6snID0+ICd1zJvMgCcsCifhu6wnID0+ICdVzJvMiScsCifhu60nID0+ICd1zJvMiScsCifhu64nID0+ICdVzJvMgycsCifhu68nID0+ICd1zJvMgycsCifhu7AnID0+ICdVzJvMoycsCifhu7EnID0+ICd1zJvMoycsCifhu7InID0+ICdZzIAnLAon4buzJyA9PiAnecyAJywKJ+G7tCcgPT4gJ1nMoycsCifhu7UnID0+ICd5zKMnLAon4bu2JyA9PiAnWcyJJywKJ+G7tycgPT4gJ3nMiScsCifhu7gnID0+ICdZzIMnLAon4bu5JyA9PiAnecyDJywKJ+G8gCcgPT4gJ86xzJMnLAon4byBJyA9PiAnzrHMlCcsCifhvIInID0+ICfOscyTzIAnLAon4byDJyA9PiAnzrHMlMyAJywKJ+G8hCcgPT4gJ86xzJPMgScsCifhvIUnID0+ICfOscyUzIEnLAon4byGJyA9PiAnzrHMk82CJywKJ+G8hycgPT4gJ86xzJTNgicsCifhvIgnID0+ICfOkcyTJywKJ+G8iScgPT4gJ86RzJQnLAon4byKJyA9PiAnzpHMk8yAJywKJ+G8iycgPT4gJ86RzJTMgCcsCifhvIwnID0+ICfOkcyTzIEnLAon4byNJyA9PiAnzpHMlMyBJywKJ+G8jicgPT4gJ86RzJPNgicsCifhvI8nID0+ICfOkcyUzYInLAon4byQJyA9PiAnzrXMkycsCifhvJEnID0+ICfOtcyUJywKJ+G8kicgPT4gJ861zJPMgCcsCifhvJMnID0+ICfOtcyUzIAnLAon4byUJyA9PiAnzrXMk8yBJywKJ+G8lScgPT4gJ861zJTMgScsCifhvJgnID0+ICfOlcyTJywKJ+G8mScgPT4gJ86VzJQnLAon4byaJyA9PiAnzpXMk8yAJywKJ+G8mycgPT4gJ86VzJTMgCcsCifhvJwnID0+ICfOlcyTzIEnLAon4bydJyA9PiAnzpXMlMyBJywKJ+G8oCcgPT4gJ863zJMnLAon4byhJyA9PiAnzrfMlCcsCifhvKInID0+ICfOt8yTzIAnLAon4byjJyA9PiAnzrfMlMyAJywKJ+G8pCcgPT4gJ863zJPMgScsCifhvKUnID0+ICfOt8yUzIEnLAon4bymJyA9PiAnzrfMk82CJywKJ+G8pycgPT4gJ863zJTNgicsCifhvKgnID0+ICfOl8yTJywKJ+G8qScgPT4gJ86XzJQnLAon4byqJyA9PiAnzpfMk8yAJywKJ+G8qycgPT4gJ86XzJTMgCcsCifhvKwnID0+ICfOl8yTzIEnLAon4bytJyA9PiAnzpfMlMyBJywKJ+G8ricgPT4gJ86XzJPNgicsCifhvK8nID0+ICfOl8yUzYInLAon4bywJyA9PiAnzrnMkycsCifhvLEnID0+ICfOucyUJywKJ+G8sicgPT4gJ865zJPMgCcsCifhvLMnID0+ICfOucyUzIAnLAon4by0JyA9PiAnzrnMk8yBJywKJ+G8tScgPT4gJ865zJTMgScsCifhvLYnID0+ICfOucyTzYInLAon4by3JyA9PiAnzrnMlM2CJywKJ+G8uCcgPT4gJ86ZzJMnLAon4by5JyA9PiAnzpnMlCcsCifhvLonID0+ICfOmcyTzIAnLAon4by7JyA9PiAnzpnMlMyAJywKJ+G8vCcgPT4gJ86ZzJPMgScsCifhvL0nID0+ICfOmcyUzIEnLAon4by+JyA9PiAnzpnMk82CJywKJ+G8vycgPT4gJ86ZzJTNgicsCifhvYAnID0+ICfOv8yTJywKJ+G9gScgPT4gJ86/zJQnLAon4b2CJyA9PiAnzr/Mk8yAJywKJ+G9gycgPT4gJ86/zJTMgCcsCifhvYQnID0+ICfOv8yTzIEnLAon4b2FJyA9PiAnzr/MlMyBJywKJ+G9iCcgPT4gJ86fzJMnLAon4b2JJyA9PiAnzp/MlCcsCifhvYonID0+ICfOn8yTzIAnLAon4b2LJyA9PiAnzp/MlMyAJywKJ+G9jCcgPT4gJ86fzJPMgScsCifhvY0nID0+ICfOn8yUzIEnLAon4b2QJyA9PiAnz4XMkycsCifhvZEnID0+ICfPhcyUJywKJ+G9kicgPT4gJ8+FzJPMgCcsCifhvZMnID0+ICfPhcyUzIAnLAon4b2UJyA9PiAnz4XMk8yBJywKJ+G9lScgPT4gJ8+FzJTMgScsCifhvZYnID0+ICfPhcyTzYInLAon4b2XJyA9PiAnz4XMlM2CJywKJ+G9mScgPT4gJ86lzJQnLAon4b2bJyA9PiAnzqXMlMyAJywKJ+G9nScgPT4gJ86lzJTMgScsCifhvZ8nID0+ICfOpcyUzYInLAon4b2gJyA9PiAnz4nMkycsCifhvaEnID0+ICfPicyUJywKJ+G9oicgPT4gJ8+JzJPMgCcsCifhvaMnID0+ICfPicyUzIAnLAon4b2kJyA9PiAnz4nMk8yBJywKJ+G9pScgPT4gJ8+JzJTMgScsCifhvaYnID0+ICfPicyTzYInLAon4b2nJyA9PiAnz4nMlM2CJywKJ+G9qCcgPT4gJ86pzJMnLAon4b2pJyA9PiAnzqnMlCcsCifhvaonID0+ICfOqcyTzIAnLAon4b2rJyA9PiAnzqnMlMyAJywKJ+G9rCcgPT4gJ86pzJPMgScsCifhva0nID0+ICfOqcyUzIEnLAon4b2uJyA9PiAnzqnMk82CJywKJ+G9rycgPT4gJ86pzJTNgicsCifhvbAnID0+ICfOscyAJywKJ+G9sScgPT4gJ86xzIEnLAon4b2yJyA9PiAnzrXMgCcsCifhvbMnID0+ICfOtcyBJywKJ+G9tCcgPT4gJ863zIAnLAon4b21JyA9PiAnzrfMgScsCifhvbYnID0+ICfOucyAJywKJ+G9tycgPT4gJ865zIEnLAon4b24JyA9PiAnzr/MgCcsCifhvbknID0+ICfOv8yBJywKJ+G9uicgPT4gJ8+FzIAnLAon4b27JyA9PiAnz4XMgScsCifhvbwnID0+ICfPicyAJywKJ+G9vScgPT4gJ8+JzIEnLAon4b6AJyA9PiAnzrHMk82FJywKJ+G+gScgPT4gJ86xzJTNhScsCifhvoInID0+ICfOscyTzIDNhScsCifhvoMnID0+ICfOscyUzIDNhScsCifhvoQnID0+ICfOscyTzIHNhScsCifhvoUnID0+ICfOscyUzIHNhScsCifhvoYnID0+ICfOscyTzYLNhScsCifhvocnID0+ICfOscyUzYLNhScsCifhvognID0+ICfOkcyTzYUnLAon4b6JJyA9PiAnzpHMlM2FJywKJ+G+iicgPT4gJ86RzJPMgM2FJywKJ+G+iycgPT4gJ86RzJTMgM2FJywKJ+G+jCcgPT4gJ86RzJPMgc2FJywKJ+G+jScgPT4gJ86RzJTMgc2FJywKJ+G+jicgPT4gJ86RzJPNgs2FJywKJ+G+jycgPT4gJ86RzJTNgs2FJywKJ+G+kCcgPT4gJ863zJPNhScsCifhvpEnID0+ICfOt8yUzYUnLAon4b6SJyA9PiAnzrfMk8yAzYUnLAon4b6TJyA9PiAnzrfMlMyAzYUnLAon4b6UJyA9PiAnzrfMk8yBzYUnLAon4b6VJyA9PiAnzrfMlMyBzYUnLAon4b6WJyA9PiAnzrfMk82CzYUnLAon4b6XJyA9PiAnzrfMlM2CzYUnLAon4b6YJyA9PiAnzpfMk82FJywKJ+G+mScgPT4gJ86XzJTNhScsCifhvponID0+ICfOl8yTzIDNhScsCifhvpsnID0+ICfOl8yUzIDNhScsCifhvpwnID0+ICfOl8yTzIHNhScsCifhvp0nID0+ICfOl8yUzIHNhScsCifhvp4nID0+ICfOl8yTzYLNhScsCifhvp8nID0+ICfOl8yUzYLNhScsCifhvqAnID0+ICfPicyTzYUnLAon4b6hJyA9PiAnz4nMlM2FJywKJ+G+oicgPT4gJ8+JzJPMgM2FJywKJ+G+oycgPT4gJ8+JzJTMgM2FJywKJ+G+pCcgPT4gJ8+JzJPMgc2FJywKJ+G+pScgPT4gJ8+JzJTMgc2FJywKJ+G+picgPT4gJ8+JzJPNgs2FJywKJ+G+pycgPT4gJ8+JzJTNgs2FJywKJ+G+qCcgPT4gJ86pzJPNhScsCifhvqknID0+ICfOqcyUzYUnLAon4b6qJyA9PiAnzqnMk8yAzYUnLAon4b6rJyA9PiAnzqnMlMyAzYUnLAon4b6sJyA9PiAnzqnMk8yBzYUnLAon4b6tJyA9PiAnzqnMlMyBzYUnLAon4b6uJyA9PiAnzqnMk82CzYUnLAon4b6vJyA9PiAnzqnMlM2CzYUnLAon4b6wJyA9PiAnzrHMhicsCifhvrEnID0+ICfOscyEJywKJ+G+sicgPT4gJ86xzIDNhScsCifhvrMnID0+ICfOsc2FJywKJ+G+tCcgPT4gJ86xzIHNhScsCifhvrYnID0+ICfOsc2CJywKJ+G+tycgPT4gJ86xzYLNhScsCifhvrgnID0+ICfOkcyGJywKJ+G+uScgPT4gJ86RzIQnLAon4b66JyA9PiAnzpHMgCcsCifhvrsnID0+ICfOkcyBJywKJ+G+vCcgPT4gJ86RzYUnLAon4b6+JyA9PiAnzrknLAon4b+BJyA9PiAnwqjNgicsCifhv4InID0+ICfOt8yAzYUnLAon4b+DJyA9PiAnzrfNhScsCifhv4QnID0+ICfOt8yBzYUnLAon4b+GJyA9PiAnzrfNgicsCifhv4cnID0+ICfOt82CzYUnLAon4b+IJyA9PiAnzpXMgCcsCifhv4knID0+ICfOlcyBJywKJ+G/iicgPT4gJ86XzIAnLAon4b+LJyA9PiAnzpfMgScsCifhv4wnID0+ICfOl82FJywKJ+G/jScgPT4gJ+G+v8yAJywKJ+G/jicgPT4gJ+G+v8yBJywKJ+G/jycgPT4gJ+G+v82CJywKJ+G/kCcgPT4gJ865zIYnLAon4b+RJyA9PiAnzrnMhCcsCifhv5InID0+ICfOucyIzIAnLAon4b+TJyA9PiAnzrnMiMyBJywKJ+G/licgPT4gJ865zYInLAon4b+XJyA9PiAnzrnMiM2CJywKJ+G/mCcgPT4gJ86ZzIYnLAon4b+ZJyA9PiAnzpnMhCcsCifhv5onID0+ICfOmcyAJywKJ+G/mycgPT4gJ86ZzIEnLAon4b+dJyA9PiAn4b++zIAnLAon4b+eJyA9PiAn4b++zIEnLAon4b+fJyA9PiAn4b++zYInLAon4b+gJyA9PiAnz4XMhicsCifhv6EnID0+ICfPhcyEJywKJ+G/oicgPT4gJ8+FzIjMgCcsCifhv6MnID0+ICfPhcyIzIEnLAon4b+kJyA9PiAnz4HMkycsCifhv6UnID0+ICfPgcyUJywKJ+G/picgPT4gJ8+FzYInLAon4b+nJyA9PiAnz4XMiM2CJywKJ+G/qCcgPT4gJ86lzIYnLAon4b+pJyA9PiAnzqXMhCcsCifhv6onID0+ICfOpcyAJywKJ+G/qycgPT4gJ86lzIEnLAon4b+sJyA9PiAnzqHMlCcsCifhv60nID0+ICfCqMyAJywKJ+G/ricgPT4gJ8KozIEnLAon4b+vJyA9PiAnYCcsCifhv7InID0+ICfPicyAzYUnLAon4b+zJyA9PiAnz4nNhScsCifhv7QnID0+ICfPicyBzYUnLAon4b+2JyA9PiAnz4nNgicsCifhv7cnID0+ICfPic2CzYUnLAon4b+4JyA9PiAnzp/MgCcsCifhv7knID0+ICfOn8yBJywKJ+G/uicgPT4gJ86pzIAnLAon4b+7JyA9PiAnzqnMgScsCifhv7wnID0+ICfOqc2FJywKJ+G/vScgPT4gJ8K0JywKJ+KAgCcgPT4gJ+KAgicsCifigIEnID0+ICfigIMnLAon4oSmJyA9PiAnzqknLAon4oSqJyA9PiAnSycsCifihKsnID0+ICdBzIonLAon4oaaJyA9PiAn4oaQzLgnLAon4oabJyA9PiAn4oaSzLgnLAon4oauJyA9PiAn4oaUzLgnLAon4oeNJyA9PiAn4oeQzLgnLAon4oeOJyA9PiAn4oeUzLgnLAon4oePJyA9PiAn4oeSzLgnLAon4oiEJyA9PiAn4oiDzLgnLAon4oiJJyA9PiAn4oiIzLgnLAon4oiMJyA9PiAn4oiLzLgnLAon4oikJyA9PiAn4oijzLgnLAon4oimJyA9PiAn4oilzLgnLAon4omBJyA9PiAn4oi8zLgnLAon4omEJyA9PiAn4omDzLgnLAon4omHJyA9PiAn4omFzLgnLAon4omJJyA9PiAn4omIzLgnLAon4omgJyA9PiAnPcy4JywKJ+KJoicgPT4gJ+KJocy4JywKJ+KJrScgPT4gJ+KJjcy4JywKJ+KJricgPT4gJzzMuCcsCifiia8nID0+ICc+zLgnLAon4omwJyA9PiAn4omkzLgnLAon4omxJyA9PiAn4omlzLgnLAon4om0JyA9PiAn4omyzLgnLAon4om1JyA9PiAn4omzzLgnLAon4om4JyA9PiAn4om2zLgnLAon4om5JyA9PiAn4om3zLgnLAon4oqAJyA9PiAn4om6zLgnLAon4oqBJyA9PiAn4om7zLgnLAon4oqEJyA9PiAn4oqCzLgnLAon4oqFJyA9PiAn4oqDzLgnLAon4oqIJyA9PiAn4oqGzLgnLAon4oqJJyA9PiAn4oqHzLgnLAon4oqsJyA9PiAn4oqizLgnLAon4oqtJyA9PiAn4oqozLgnLAon4oquJyA9PiAn4oqpzLgnLAon4oqvJyA9PiAn4oqrzLgnLAon4ougJyA9PiAn4om8zLgnLAon4ouhJyA9PiAn4om9zLgnLAon4ouiJyA9PiAn4oqRzLgnLAon4oujJyA9PiAn4oqSzLgnLAon4ouqJyA9PiAn4oqyzLgnLAon4ourJyA9PiAn4oqzzLgnLAon4ousJyA9PiAn4oq0zLgnLAon4outJyA9PiAn4oq1zLgnLAon4oypJyA9PiAn44CIJywKJ+KMqicgPT4gJ+OAiScsCifiq5wnID0+ICfiq53MuCcsCifjgYwnID0+ICfjgYvjgpknLAon44GOJyA9PiAn44GN44KZJywKJ+OBkCcgPT4gJ+OBj+OCmScsCifjgZInID0+ICfjgZHjgpknLAon44GUJyA9PiAn44GT44KZJywKJ+OBlicgPT4gJ+OBleOCmScsCifjgZgnID0+ICfjgZfjgpknLAon44GaJyA9PiAn44GZ44KZJywKJ+OBnCcgPT4gJ+OBm+OCmScsCifjgZ4nID0+ICfjgZ3jgpknLAon44GgJyA9PiAn44Gf44KZJywKJ+OBoicgPT4gJ+OBoeOCmScsCifjgaUnID0+ICfjgaTjgpknLAon44GnJyA9PiAn44Gm44KZJywKJ+OBqScgPT4gJ+OBqOOCmScsCifjgbAnID0+ICfjga/jgpknLAon44GxJyA9PiAn44Gv44KaJywKJ+OBsycgPT4gJ+OBsuOCmScsCifjgbQnID0+ICfjgbLjgponLAon44G2JyA9PiAn44G144KZJywKJ+OBtycgPT4gJ+OBteOCmicsCifjgbknID0+ICfjgbjjgpknLAon44G6JyA9PiAn44G444KaJywKJ+OBvCcgPT4gJ+OBu+OCmScsCifjgb0nID0+ICfjgbvjgponLAon44KUJyA9PiAn44GG44KZJywKJ+OCnicgPT4gJ+OCneOCmScsCifjgqwnID0+ICfjgqvjgpknLAon44KuJyA9PiAn44Kt44KZJywKJ+OCsCcgPT4gJ+OCr+OCmScsCifjgrInID0+ICfjgrHjgpknLAon44K0JyA9PiAn44Kz44KZJywKJ+OCticgPT4gJ+OCteOCmScsCifjgrgnID0+ICfjgrfjgpknLAon44K6JyA9PiAn44K544KZJywKJ+OCvCcgPT4gJ+OCu+OCmScsCifjgr4nID0+ICfjgr3jgpknLAon44OAJyA9PiAn44K/44KZJywKJ+ODgicgPT4gJ+ODgeOCmScsCifjg4UnID0+ICfjg4TjgpknLAon44OHJyA9PiAn44OG44KZJywKJ+ODiScgPT4gJ+ODiOOCmScsCifjg5AnID0+ICfjg4/jgpknLAon44ORJyA9PiAn44OP44KaJywKJ+ODkycgPT4gJ+ODkuOCmScsCifjg5QnID0+ICfjg5LjgponLAon44OWJyA9PiAn44OV44KZJywKJ+ODlycgPT4gJ+ODleOCmicsCifjg5knID0+ICfjg5jjgpknLAon44OaJyA9PiAn44OY44KaJywKJ+ODnCcgPT4gJ+ODm+OCmScsCifjg50nID0+ICfjg5vjgponLAon44O0JyA9PiAn44Km44KZJywKJ+ODtycgPT4gJ+ODr+OCmScsCifjg7gnID0+ICfjg7DjgpknLAon44O5JyA9PiAn44Ox44KZJywKJ+ODuicgPT4gJ+ODsuOCmScsCifjg74nID0+ICfjg73jgpknLAon76SAJyA9PiAn6LGIJywKJ++kgScgPT4gJ+abtCcsCifvpIInID0+ICfou4onLAon76SDJyA9PiAn6LOIJywKJ++khCcgPT4gJ+a7kScsCifvpIUnID0+ICfkuLInLAon76SGJyA9PiAn5Y+lJywKJ++khycgPT4gJ+m+nCcsCifvpIgnID0+ICfpvpwnLAon76SJJyA9PiAn5aWRJywKJ++kiicgPT4gJ+mHkScsCifvpIsnID0+ICfllocnLAon76SMJyA9PiAn5aWIJywKJ++kjScgPT4gJ+aHticsCifvpI4nID0+ICfnmaknLAon76SPJyA9PiAn576FJywKJ++kkCcgPT4gJ+iYvycsCifvpJEnID0+ICfonronLAon76SSJyA9PiAn6KO4JywKJ++kkycgPT4gJ+mCjycsCifvpJQnID0+ICfmqIInLAon76SVJyA9PiAn5rSbJywKJ++klicgPT4gJ+eDmScsCifvpJcnID0+ICfnj54nLAon76SYJyA9PiAn6JC9JywKJ++kmScgPT4gJ+mFqicsCifvpJonID0+ICfpp7EnLAon76SbJyA9PiAn5LqCJywKJ++knCcgPT4gJ+WNtScsCifvpJ0nID0+ICfmrIQnLAon76SeJyA9PiAn54ibJywKJ++knycgPT4gJ+iYrScsCifvpKAnID0+ICfpuJ4nLAon76ShJyA9PiAn5bWQJywKJ++koicgPT4gJ+a/qycsCifvpKMnID0+ICfol40nLAon76SkJyA9PiAn6KWkJywKJ++kpScgPT4gJ+aLiScsCifvpKYnID0+ICfoh5gnLAon76SnJyA9PiAn6KCfJywKJ++kqCcgPT4gJ+W7iicsCifvpKknID0+ICfmnJcnLAon76SqJyA9PiAn5rWqJywKJ++kqycgPT4gJ+eLvCcsCifvpKwnID0+ICfpg44nLAon76StJyA9PiAn5L6GJywKJ++kricgPT4gJ+WGtycsCifvpK8nID0+ICfli54nLAon76SwJyA9PiAn5pOEJywKJ++ksScgPT4gJ+arkycsCifvpLInID0+ICfniJAnLAon76SzJyA9PiAn55unJywKJ++ktCcgPT4gJ+iAgScsCifvpLUnID0+ICfomIYnLAon76S2JyA9PiAn6JmcJywKJ++ktycgPT4gJ+i3rycsCifvpLgnID0+ICfpnLInLAon76S5JyA9PiAn6a2vJywKJ++kuicgPT4gJ+m3uicsCifvpLsnID0+ICfnoownLAon76S8JyA9PiAn56W/JywKJ++kvScgPT4gJ+e2oCcsCifvpL4nID0+ICfoj4knLAon76S/JyA9PiAn6YyEJywKJ++lgCcgPT4gJ+m5vycsCifvpYEnID0+ICfoq5YnLAon76WCJyA9PiAn5aOfJywKJ++lgycgPT4gJ+W8hCcsCifvpYQnID0+ICfnsaAnLAon76WFJyA9PiAn6IG+JywKJ++lhicgPT4gJ+eJoicsCifvpYcnID0+ICfno4onLAon76WIJyA9PiAn6LOCJywKJ++liScgPT4gJ+mbtycsCifvpYonID0+ICflo5gnLAon76WLJyA9PiAn5bGiJywKJ++ljCcgPT4gJ+aokycsCifvpY0nID0+ICfmt5onLAon76WOJyA9PiAn5ryPJywKJ++ljycgPT4gJ+e0rycsCifvpZAnID0+ICfnuLcnLAon76WRJyA9PiAn6ZmLJywKJ++lkicgPT4gJ+WLkicsCifvpZMnID0+ICfogosnLAon76WUJyA9PiAn5YecJywKJ++llScgPT4gJ+WHjCcsCifvpZYnID0+ICfnqJwnLAon76WXJyA9PiAn57a+JywKJ++lmCcgPT4gJ+iPsScsCifvpZknID0+ICfpmbUnLAon76WaJyA9PiAn6K6AJywKJ++lmycgPT4gJ+aLjycsCifvpZwnID0+ICfmqIInLAon76WdJyA9PiAn6Ku+JywKJ++lnicgPT4gJ+S4uScsCifvpZ8nID0+ICflr6cnLAon76WgJyA9PiAn5oCSJywKJ++loScgPT4gJ+eOhycsCifvpaInID0+ICfnlbAnLAon76WjJyA9PiAn5YyXJywKJ++lpCcgPT4gJ+ejuycsCifvpaUnID0+ICfkvr8nLAon76WmJyA9PiAn5b6pJywKJ++lpycgPT4gJ+S4jScsCifvpagnID0+ICfms4wnLAon76WpJyA9PiAn5pW4JywKJ++lqicgPT4gJ+e0oicsCifvpasnID0+ICflj4MnLAon76WsJyA9PiAn5aGeJywKJ++lrScgPT4gJ+ecgScsCifvpa4nID0+ICfokYknLAon76WvJyA9PiAn6KqqJywKJ++lsCcgPT4gJ+auuicsCifvpbEnID0+ICfovrAnLAon76WyJyA9PiAn5rKIJywKJ++lsycgPT4gJ+aLvicsCifvpbQnID0+ICfoi6UnLAon76W1JyA9PiAn5o6gJywKJ++lticgPT4gJ+eVpScsCifvpbcnID0+ICfkuq4nLAon76W4JyA9PiAn5YWpJywKJ++luScgPT4gJ+WHiScsCifvpbonID0+ICfmooEnLAon76W7JyA9PiAn57OnJywKJ++lvCcgPT4gJ+iJrycsCifvpb0nID0+ICfoq5InLAon76W+JyA9PiAn6YePJywKJ++lvycgPT4gJ+WLtScsCifvpoAnID0+ICflkYInLAon76aBJyA9PiAn5aWzJywKJ++mgicgPT4gJ+W7rCcsCifvpoMnID0+ICfml4UnLAon76aEJyA9PiAn5r++JywKJ++mhScgPT4gJ+ekqicsCifvpoYnID0+ICfplq0nLAon76aHJyA9PiAn6amqJywKJ++miCcgPT4gJ+m6lycsCifvpoknID0+ICfpu44nLAon76aKJyA9PiAn5YqbJywKJ++miycgPT4gJ+abhicsCifvpownID0+ICfmrbcnLAon76aNJyA9PiAn6L2iJywKJ++mjicgPT4gJ+W5tCcsCifvpo8nID0+ICfmhpAnLAon76aQJyA9PiAn5oiAJywKJ++mkScgPT4gJ+aSmicsCifvppInID0+ICfmvKMnLAon76aTJyA9PiAn54WJJywKJ++mlCcgPT4gJ+eSiScsCifvppUnID0+ICfnp4onLAon76aWJyA9PiAn57e0JywKJ++mlycgPT4gJ+iBrycsCifvppgnID0+ICfovKYnLAon76aZJyA9PiAn6JOuJywKJ++mmicgPT4gJ+mAoycsCifvppsnID0+ICfpjYonLAon76acJyA9PiAn5YiXJywKJ++mnScgPT4gJ+WKoycsCifvpp4nID0+ICflkr0nLAon76afJyA9PiAn54OIJywKJ++moCcgPT4gJ+ijgicsCifvpqEnID0+ICfoqqonLAon76aiJyA9PiAn5buJJywKJ++moycgPT4gJ+W/tScsCifvpqQnID0+ICfmjbsnLAon76alJyA9PiAn5q6uJywKJ++mpicgPT4gJ+ewvicsCifvpqcnID0+ICfnjbUnLAon76aoJyA9PiAn5LukJywKJ++mqScgPT4gJ+WbuScsCifvpqonID0+ICflr6cnLAon76arJyA9PiAn5ba6JywKJ++mrCcgPT4gJ+aAnCcsCifvpq0nID0+ICfnjrInLAon76auJyA9PiAn55GpJywKJ++mrycgPT4gJ+e+micsCifvprAnID0+ICfogYYnLAon76axJyA9PiAn6Yi0JywKJ++msicgPT4gJ+mbticsCifvprMnID0+ICfpnYgnLAon76a0JyA9PiAn6aCYJywKJ++mtScgPT4gJ+S+iycsCifvprYnID0+ICfnpq4nLAon76a3JyA9PiAn6Ya0JywKJ++muCcgPT4gJ+mauCcsCifvprknID0+ICfmg6EnLAon76a6JyA9PiAn5LqGJywKJ++muycgPT4gJ+WDmicsCifvprwnID0+ICflr64nLAon76a9JyA9PiAn5bC/JywKJ++mvicgPT4gJ+aWmScsCifvpr8nID0+ICfmqIInLAon76eAJyA9PiAn54eOJywKJ++ngScgPT4gJ+eZgicsCifvp4InID0+ICfok7wnLAon76eDJyA9PiAn6YG8JywKJ++nhCcgPT4gJ+m+jScsCifvp4UnID0+ICfmmognLAon76eGJyA9PiAn6ZiuJywKJ++nhycgPT4gJ+WKiScsCifvp4gnID0+ICfmnbsnLAon76eJJyA9PiAn5p+zJywKJ++niicgPT4gJ+a1gScsCifvp4snID0+ICfmupwnLAon76eMJyA9PiAn55CJJywKJ++njScgPT4gJ+eVmScsCifvp44nID0+ICfnoasnLAon76ePJyA9PiAn57SQJywKJ++nkCcgPT4gJ+mhnicsCifvp5EnID0+ICflha0nLAon76eSJyA9PiAn5oiuJywKJ++nkycgPT4gJ+mZuCcsCifvp5QnID0+ICflgKsnLAon76eVJyA9PiAn5bSZJywKJ++nlicgPT4gJ+a3qicsCifvp5cnID0+ICfovKonLAon76eYJyA9PiAn5b6LJywKJ++nmScgPT4gJ+aFhCcsCifvp5onID0+ICfmoJcnLAon76ebJyA9PiAn546HJywKJ++nnCcgPT4gJ+mahicsCifvp50nID0+ICfliKknLAon76eeJyA9PiAn5ZCPJywKJ++nnycgPT4gJ+WxpScsCifvp6AnID0+ICfmmJMnLAon76ehJyA9PiAn5p2OJywKJ++noicgPT4gJ+aiqCcsCifvp6MnID0+ICfms6UnLAon76ekJyA9PiAn55CGJywKJ++npScgPT4gJ+eXoicsCifvp6YnID0+ICfnvbknLAon76enJyA9PiAn6KOPJywKJ++nqCcgPT4gJ+ijoScsCifvp6knID0+ICfph4wnLAon76eqJyA9PiAn6ZuiJywKJ++nqycgPT4gJ+WMvycsCifvp6wnID0+ICfmuronLAon76etJyA9PiAn5ZCdJywKJ++nricgPT4gJ+eHkCcsCifvp68nID0+ICfnkpgnLAon76ewJyA9PiAn6Je6JywKJ++nsScgPT4gJ+maoycsCifvp7InID0+ICfpsZcnLAon76ezJyA9PiAn6bqfJywKJ++ntCcgPT4gJ+aelycsCifvp7UnID0+ICfmt4snLAon76e2JyA9PiAn6IeoJywKJ++ntycgPT4gJ+eriycsCifvp7gnID0+ICfnrKAnLAon76e5JyA9PiAn57KSJywKJ++nuicgPT4gJ+eLgCcsCifvp7snID0+ICfngpknLAon76e8JyA9PiAn6K2YJywKJ++nvScgPT4gJ+S7gCcsCifvp74nID0+ICfojLYnLAon76e/JyA9PiAn5Yi6JywKJ++ogCcgPT4gJ+WIhycsCifvqIEnID0+ICfluqYnLAon76iCJyA9PiAn5ouTJywKJ++ogycgPT4gJ+ezlicsCifvqIQnID0+ICflroUnLAon76iFJyA9PiAn5rSeJywKJ++ohicgPT4gJ+aatCcsCifvqIcnID0+ICfovLsnLAon76iIJyA9PiAn6KGMJywKJ++oiScgPT4gJ+mZjScsCifvqIonID0+ICfoposnLAon76iLJyA9PiAn5buTJywKJ++ojCcgPT4gJ+WFgCcsCifvqI0nID0+ICfll4AnLAon76iQJyA9PiAn5aGaJywKJ++okicgPT4gJ+aZtCcsCifvqJUnID0+ICflh54nLAon76iWJyA9PiAn54yqJywKJ++olycgPT4gJ+ebiicsCifvqJgnID0+ICfnpLwnLAon76iZJyA9PiAn56WeJywKJ++omicgPT4gJ+elpScsCifvqJsnID0+ICfnpo8nLAon76icJyA9PiAn6Z2WJywKJ++onScgPT4gJ+eyvicsCifvqJ4nID0+ICfnvr0nLAon76igJyA9PiAn6JiSJywKJ++ooicgPT4gJ+iruCcsCifvqKUnID0+ICfpgLgnLAon76imJyA9PiAn6YO9JywKJ++oqicgPT4gJ+mjrycsCifvqKsnID0+ICfpo7wnLAon76isJyA9PiAn6aSoJywKJ++orScgPT4gJ+m2tCcsCifvqK4nID0+ICfpg54nLAon76ivJyA9PiAn6Zq3JywKJ++osCcgPT4gJ+S+ricsCifvqLEnID0+ICflg6cnLAon76iyJyA9PiAn5YWNJywKJ++osycgPT4gJ+WLiScsCifvqLQnID0+ICfli6QnLAon76i1JyA9PiAn5Y2RJywKJ++oticgPT4gJ+WWnScsCifvqLcnID0+ICflmIYnLAon76i4JyA9PiAn5ZmoJywKJ++ouScgPT4gJ+WhgCcsCifvqLonID0+ICfloqgnLAon76i7JyA9PiAn5bGkJywKJ++ovCcgPT4gJ+WxricsCifvqL0nID0+ICfmgpQnLAon76i+JyA9PiAn5oWoJywKJ++ovycgPT4gJ+aGjicsCifvqYAnID0+ICfmh7InLAon76mBJyA9PiAn5pWPJywKJ++pgicgPT4gJ+aXoicsCifvqYMnID0+ICfmmpEnLAon76mEJyA9PiAn5qKFJywKJ++phScgPT4gJ+a1tycsCifvqYYnID0+ICfmuJonLAon76mHJyA9PiAn5ryiJywKJ++piCcgPT4gJ+eFricsCifvqYknID0+ICfniKsnLAon76mKJyA9PiAn55CiJywKJ++piycgPT4gJ+eikScsCifvqYwnID0+ICfnpL4nLAon76mNJyA9PiAn56WJJywKJ++pjicgPT4gJ+eliCcsCifvqY8nID0+ICfnpZAnLAon76mQJyA9PiAn56WWJywKJ++pkScgPT4gJ+elnScsCifvqZInID0+ICfnpo0nLAon76mTJyA9PiAn56aOJywKJ++plCcgPT4gJ+epgCcsCifvqZUnID0+ICfnqoEnLAon76mWJyA9PiAn56+AJywKJ++plycgPT4gJ+e3tCcsCifvqZgnID0+ICfnuIknLAon76mZJyA9PiAn57mBJywKJ++pmicgPT4gJ+e9sicsCifvqZsnID0+ICfogIUnLAon76mcJyA9PiAn6IetJywKJ++pnScgPT4gJ+iJuScsCifvqZ4nID0+ICfoibknLAon76mfJyA9PiAn6JGXJywKJ++poCcgPT4gJ+ikkCcsCifvqaEnID0+ICfoppYnLAon76miJyA9PiAn6KyBJywKJ++poycgPT4gJ+isuScsCifvqaQnID0+ICfos5MnLAon76mlJyA9PiAn6LSIJywKJ++ppicgPT4gJ+i+ticsCifvqacnID0+ICfpgLgnLAon76moJyA9PiAn6ZujJywKJ++pqScgPT4gJ+mfvycsCifvqaonID0+ICfpoLsnLAon76mrJyA9PiAn5oG1JywKJ++prCcgPT4gJ/Cki64nLAon76mtJyA9PiAn6IiYJywKJ++psCcgPT4gJ+S4picsCifvqbEnID0+ICflhrUnLAon76myJyA9PiAn5YWoJywKJ++psycgPT4gJ+S+gCcsCifvqbQnID0+ICflhYUnLAon76m1JyA9PiAn5YaAJywKJ++pticgPT4gJ+WLhycsCifvqbcnID0+ICfli7onLAon76m4JyA9PiAn5ZadJywKJ++puScgPT4gJ+WVlScsCifvqbonID0+ICfllpknLAon76m7JyA9PiAn5ZeiJywKJ++pvCcgPT4gJ+WhmicsCifvqb0nID0+ICflorMnLAon76m+JyA9PiAn5aWEJywKJ++pvycgPT4gJ+WllCcsCifvqoAnID0+ICflqaInLAon76qBJyA9PiAn5ayoJywKJ++qgicgPT4gJ+W7kicsCifvqoMnID0+ICflu5knLAon76qEJyA9PiAn5b2pJywKJ++qhScgPT4gJ+W+rScsCifvqoYnID0+ICfmg5gnLAon76qHJyA9PiAn5oWOJywKJ++qiCcgPT4gJ+aEiCcsCifvqoknID0+ICfmho4nLAon76qKJyA9PiAn5oWgJywKJ++qiycgPT4gJ+aHsicsCifvqownID0+ICfmiLQnLAon76qNJyA9PiAn5o+EJywKJ++qjicgPT4gJ+aQnCcsCifvqo8nID0+ICfmkZInLAon76qQJyA9PiAn5pWWJywKJ++qkScgPT4gJ+aZtCcsCifvqpInID0+ICfmnJcnLAon76qTJyA9PiAn5pybJywKJ++qlCcgPT4gJ+adlicsCifvqpUnID0+ICfmrbknLAon76qWJyA9PiAn5q66JywKJ++qlycgPT4gJ+a1gScsCifvqpgnID0+ICfmu5snLAon76qZJyA9PiAn5ruLJywKJ++qmicgPT4gJ+a8oicsCifvqpsnID0+ICfngJ4nLAon76qcJyA9PiAn54WuJywKJ++qnScgPT4gJ+eepycsCifvqp4nID0+ICfniLUnLAon76qfJyA9PiAn54qvJywKJ++qoCcgPT4gJ+eMqicsCifvqqEnID0+ICfnkbEnLAon76qiJyA9PiAn55SGJywKJ++qoycgPT4gJ+eUuycsCifvqqQnID0+ICfnmJ0nLAon76qlJyA9PiAn55ifJywKJ++qpicgPT4gJ+ebiicsCifvqqcnID0+ICfnm5snLAon76qoJyA9PiAn55u0JywKJ++qqScgPT4gJ+ediicsCifvqqonID0+ICfnnYAnLAon76qrJyA9PiAn56OMJywKJ++qrCcgPT4gJ+eqsScsCifvqq0nID0+ICfnr4AnLAon76quJyA9PiAn57G7JywKJ++qrycgPT4gJ+e1mycsCifvqrAnID0+ICfnt7QnLAon76qxJyA9PiAn57y+JywKJ++qsicgPT4gJ+iAhScsCifvqrMnID0+ICfojZInLAon76q0JyA9PiAn6I+vJywKJ++qtScgPT4gJ+iduScsCifvqrYnID0+ICfopYEnLAon76q3JyA9PiAn6KaGJywKJ++quCcgPT4gJ+imlicsCifvqrknID0+ICfoqr8nLAon76q6JyA9PiAn6Ku4JywKJ++quycgPT4gJ+iriycsCifvqrwnID0+ICforIEnLAon76q9JyA9PiAn6Ku+JywKJ++qvicgPT4gJ+irrScsCifvqr8nID0+ICforLknLAon76uAJyA9PiAn6K6KJywKJ++rgScgPT4gJ+i0iCcsCifvq4InID0+ICfovLgnLAon76uDJyA9PiAn6YGyJywKJ++rhCcgPT4gJ+mGmScsCifvq4UnID0+ICfpibYnLAon76uGJyA9PiAn6Zm8JywKJ++rhycgPT4gJ+mboycsCifvq4gnID0+ICfpnZYnLAon76uJJyA9PiAn6Z+bJywKJ++riicgPT4gJ+mfvycsCifvq4snID0+ICfpoIsnLAon76uMJyA9PiAn6aC7JywKJ++rjScgPT4gJ+mskicsCifvq44nID0+ICfpvpwnLAon76uPJyA9PiAn8KKhiicsCifvq5AnID0+ICfwoqGEJywKJ++rkScgPT4gJ/Cjj5UnLAon76uSJyA9PiAn466dJywKJ++rkycgPT4gJ+SAmCcsCifvq5QnID0+ICfkgLknLAon76uVJyA9PiAn8KWJiScsCifvq5YnID0+ICfwpbOQJywKJ++rlycgPT4gJ/Cnu5MnLAon76uYJyA9PiAn6b2DJywKJ++rmScgPT4gJ+m+jicsCifvrJ0nID0+ICfXmda0JywKJ++snycgPT4gJ9ey1rcnLAon76yqJyA9PiAn16nXgScsCifvrKsnID0+ICfXqdeCJywKJ++srCcgPT4gJ9ep1rzXgScsCifvrK0nID0+ICfXqda814InLAon76yuJyA9PiAn15DWtycsCifvrK8nID0+ICfXkNa4JywKJ++ssCcgPT4gJ9eQ1rwnLAon76yxJyA9PiAn15HWvCcsCifvrLInID0+ICfXkta8JywKJ++ssycgPT4gJ9eT1rwnLAon76y0JyA9PiAn15TWvCcsCifvrLUnID0+ICfXlda8JywKJ++sticgPT4gJ9eW1rwnLAon76y4JyA9PiAn15jWvCcsCifvrLknID0+ICfXmda8JywKJ++suicgPT4gJ9ea1rwnLAon76y7JyA9PiAn15vWvCcsCifvrLwnID0+ICfXnNa8JywKJ++svicgPT4gJ9ee1rwnLAon762AJyA9PiAn16DWvCcsCifvrYEnID0+ICfXoda8JywKJ++tgycgPT4gJ9ej1rwnLAon762EJyA9PiAn16TWvCcsCifvrYYnID0+ICfXpta8JywKJ++thycgPT4gJ9en1rwnLAon762IJyA9PiAn16jWvCcsCifvrYknID0+ICfXqda8JywKJ++tiicgPT4gJ9eq1rwnLAon762LJyA9PiAn15XWuScsCifvrYwnID0+ICfXkda/JywKJ++tjScgPT4gJ9eb1r8nLAon762OJyA9PiAn16TWvycsCifwkYKaJyA9PiAn8JGCmfCRgronLAon8JGCnCcgPT4gJ/CRgpvwkYK6JywKJ/CRgqsnID0+ICfwkYKl8JGCuicsCifwkYSuJyA9PiAn8JGEsfCRhKcnLAon8JGErycgPT4gJ/CRhLLwkYSnJywKJ/CRjYsnID0+ICfwkY2H8JGMvicsCifwkY2MJyA9PiAn8JGNh/CRjZcnLAon8JGSuycgPT4gJ/CRkrnwkZK6JywKJ/CRkrwnID0+ICfwkZK58JGSsCcsCifwkZK+JyA9PiAn8JGSufCRkr0nLAon8JGWuicgPT4gJ/CRlrjwkZavJywKJ/CRlrsnID0+ICfwkZa58JGWrycsCifwkaS4JyA9PiAn8JGktfCRpLAnLAon8J2FnicgPT4gJ/CdhZfwnYWlJywKJ/CdhZ8nID0+ICfwnYWY8J2FpScsCifwnYWgJyA9PiAn8J2FmPCdhaXwnYWuJywKJ/CdhaEnID0+ICfwnYWY8J2FpfCdha8nLAon8J2FoicgPT4gJ/CdhZjwnYWl8J2FsCcsCifwnYWjJyA9PiAn8J2FmPCdhaXwnYWxJywKJ/CdhaQnID0+ICfwnYWY8J2FpfCdhbInLAon8J2GuycgPT4gJ/CdhrnwnYWlJywKJ/CdhrwnID0+ICfwnYa68J2FpScsCifwnYa9JyA9PiAn8J2GufCdhaXwnYWuJywKJ/Cdhr4nID0+ICfwnYa68J2FpfCdha4nLAon8J2GvycgPT4gJ/CdhrnwnYWl8J2FrycsCifwnYeAJyA9PiAn8J2GuvCdhaXwnYWvJywKJ/CvoIAnID0+ICfkuL0nLAon8K+ggScgPT4gJ+S4uCcsCifwr6CCJyA9PiAn5LmBJywKJ/CvoIMnID0+ICfwoISiJywKJ/CvoIQnID0+ICfkvaAnLAon8K+ghScgPT4gJ+S+ricsCifwr6CGJyA9PiAn5L67JywKJ/CvoIcnID0+ICflgIInLAon8K+giCcgPT4gJ+WBuicsCifwr6CJJyA9PiAn5YKZJywKJ/CvoIonID0+ICflg6cnLAon8K+giycgPT4gJ+WDjycsCifwr6CMJyA9PiAn45KeJywKJ/CvoI0nID0+ICfwoJi6JywKJ/CvoI4nID0+ICflhY0nLAon8K+gjycgPT4gJ+WFlCcsCifwr6CQJyA9PiAn5YWkJywKJ/CvoJEnID0+ICflhbcnLAon8K+gkicgPT4gJ/CglJwnLAon8K+gkycgPT4gJ+OSuScsCifwr6CUJyA9PiAn5YWnJywKJ/CvoJUnID0+ICflho0nLAon8K+glicgPT4gJ/CglYsnLAon8K+glycgPT4gJ+WGlycsCifwr6CYJyA9PiAn5YakJywKJ/CvoJknID0+ICfku4wnLAon8K+gmicgPT4gJ+WGrCcsCifwr6CbJyA9PiAn5Ya1JywKJ/CvoJwnID0+ICfwqYefJywKJ/CvoJ0nID0+ICflh7UnLAon8K+gnicgPT4gJ+WIgycsCifwr6CfJyA9PiAn45OfJywKJ/CvoKAnID0+ICfliLsnLAon8K+goScgPT4gJ+WJhicsCifwr6CiJyA9PiAn5YmyJywKJ/CvoKMnID0+ICflibcnLAon8K+gpCcgPT4gJ+OUlScsCifwr6ClJyA9PiAn5YuHJywKJ/CvoKYnID0+ICfli4knLAon8K+gpycgPT4gJ+WLpCcsCifwr6CoJyA9PiAn5Yu6JywKJ/CvoKknID0+ICfljIUnLAon8K+gqicgPT4gJ+WMhicsCifwr6CrJyA9PiAn5YyXJywKJ/CvoKwnID0+ICfljYknLAon8K+grScgPT4gJ+WNkScsCifwr6CuJyA9PiAn5Y2aJywKJ/CvoK8nID0+ICfljbMnLAon8K+gsCcgPT4gJ+WNvScsCifwr6CxJyA9PiAn5Y2/JywKJ/CvoLInID0+ICfljb8nLAon8K+gsycgPT4gJ+WNvycsCifwr6C0JyA9PiAn8KCorCcsCifwr6C1JyA9PiAn54GwJywKJ/CvoLYnID0+ICflj4onLAon8K+gtycgPT4gJ+WPnycsCifwr6C4JyA9PiAn8KCtoycsCifwr6C5JyA9PiAn5Y+rJywKJ/CvoLonID0+ICflj7EnLAon8K+guycgPT4gJ+WQhicsCifwr6C8JyA9PiAn5ZKeJywKJ/CvoL0nID0+ICflkLgnLAon8K+gvicgPT4gJ+WRiCcsCifwr6C/JyA9PiAn5ZGoJywKJ/CvoYAnID0+ICflkqInLAon8K+hgScgPT4gJ+WTticsCifwr6GCJyA9PiAn5ZSQJywKJ/CvoYMnID0+ICfllZMnLAon8K+hhCcgPT4gJ+WVoycsCifwr6GFJyA9PiAn5ZaEJywKJ/CvoYYnID0+ICflloQnLAon8K+hhycgPT4gJ+WWmScsCifwr6GIJyA9PiAn5ZarJywKJ/CvoYknID0+ICfllrMnLAon8K+hiicgPT4gJ+WXgicsCifwr6GLJyA9PiAn5ZyWJywKJ/CvoYwnID0+ICflmIYnLAon8K+hjScgPT4gJ+WclycsCifwr6GOJyA9PiAn5ZmRJywKJ/CvoY8nID0+ICflmbQnLAon8K+hkCcgPT4gJ+WIhycsCifwr6GRJyA9PiAn5aOuJywKJ/CvoZInID0+ICfln44nLAon8K+hkycgPT4gJ+WftCcsCifwr6GUJyA9PiAn5aCNJywKJ/CvoZUnID0+ICflnosnLAon8K+hlicgPT4gJ+WgsicsCifwr6GXJyA9PiAn5aCxJywKJ/CvoZgnID0+ICfloqwnLAon8K+hmScgPT4gJ/Chk6QnLAon8K+hmicgPT4gJ+WjsicsCifwr6GbJyA9PiAn5aO3JywKJ/CvoZwnID0+ICflpIYnLAon8K+hnScgPT4gJ+WkmicsCifwr6GeJyA9PiAn5aSiJywKJ/CvoZ8nID0+ICflpaInLAon8K+hoCcgPT4gJ/ChmqgnLAon8K+hoScgPT4gJ/Chm6onLAon8K+hoicgPT4gJ+WnrCcsCifwr6GjJyA9PiAn5aibJywKJ/CvoaQnID0+ICflqKcnLAon8K+hpScgPT4gJ+WnmCcsCifwr6GmJyA9PiAn5ammJywKJ/CvoacnID0+ICfjm64nLAon8K+hqCcgPT4gJ+ObvCcsCifwr6GpJyA9PiAn5ayIJywKJ/CvoaonID0+ICflrL4nLAon8K+hqycgPT4gJ+WsvicsCifwr6GsJyA9PiAn8KGniCcsCifwr6GtJyA9PiAn5a+DJywKJ/Cvoa4nID0+ICflr5gnLAon8K+hrycgPT4gJ+WvpycsCifwr6GwJyA9PiAn5a+zJywKJ/CvobEnID0+ICfwoayYJywKJ/CvobInID0+ICflr78nLAon8K+hsycgPT4gJ+WwhicsCifwr6G0JyA9PiAn5b2TJywKJ/CvobUnID0+ICflsKInLAon8K+hticgPT4gJ+OegScsCifwr6G3JyA9PiAn5bGgJywKJ/CvobgnID0+ICflsa4nLAon8K+huScgPT4gJ+WzgCcsCifwr6G6JyA9PiAn5bKNJywKJ/CvobsnID0+ICfwobekJywKJ/CvobwnID0+ICfltYMnLAon8K+hvScgPT4gJ/Cht6YnLAon8K+hvicgPT4gJ+W1ricsCifwr6G/JyA9PiAn5bWrJywKJ/CvooAnID0+ICfltbwnLAon8K+igScgPT4gJ+W3oScsCifwr6KCJyA9PiAn5beiJywKJ/CvooMnID0+ICfjoK8nLAon8K+ihCcgPT4gJ+W3vScsCifwr6KFJyA9PiAn5bioJywKJ/CvooYnID0+ICfluL0nLAon8K+ihycgPT4gJ+W5qScsCifwr6KIJyA9PiAn46GiJywKJ/CvooknID0+ICfwooaDJywKJ/CvooonID0+ICfjobwnLAon8K+iiycgPT4gJ+W6sCcsCifwr6KMJyA9PiAn5bqzJywKJ/Cvoo0nID0+ICflurYnLAon8K+ijicgPT4gJ+W7iicsCifwr6KPJyA9PiAn8KqOkicsCifwr6KQJyA9PiAn5bu+JywKJ/CvopEnID0+ICfwooyxJywKJ/CvopInID0+ICfwooyxJywKJ/CvopMnID0+ICfoiIEnLAon8K+ilCcgPT4gJ+W8oicsCifwr6KVJyA9PiAn5byiJywKJ/CvopYnID0+ICfjo4cnLAon8K+ilycgPT4gJ/CjirgnLAon8K+imCcgPT4gJ/Cmh5onLAon8K+imScgPT4gJ+W9oicsCifwr6KaJyA9PiAn5b2rJywKJ/CvopsnID0+ICfjo6MnLAon8K+inCcgPT4gJ+W+micsCifwr6KdJyA9PiAn5b+NJywKJ/Cvop4nID0+ICflv5cnLAon8K+inycgPT4gJ+W/uScsCifwr6KgJyA9PiAn5oKBJywKJ/CvoqEnID0+ICfjpLonLAon8K+ioicgPT4gJ+OknCcsCifwr6KjJyA9PiAn5oKUJywKJ/CvoqQnID0+ICfwopuUJywKJ/CvoqUnID0+ICfmg4cnLAon8K+ipicgPT4gJ+aFiCcsCifwr6KnJyA9PiAn5oWMJywKJ/CvoqgnID0+ICfmhY4nLAon8K+iqScgPT4gJ+aFjCcsCifwr6KqJyA9PiAn5oW6JywKJ/CvoqsnID0+ICfmho4nLAon8K+irCcgPT4gJ+aGsicsCifwr6KtJyA9PiAn5oakJywKJ/Cvoq4nID0+ICfmhq8nLAon8K+irycgPT4gJ+aHnicsCifwr6KwJyA9PiAn5oeyJywKJ/CvorEnID0+ICfmh7YnLAon8K+isicgPT4gJ+aIkCcsCifwr6KzJyA9PiAn5oibJywKJ/CvorQnID0+ICfmiZ0nLAon8K+itScgPT4gJ+aKsScsCifwr6K2JyA9PiAn5ouUJywKJ/CvorcnID0+ICfmjZAnLAon8K+iuCcgPT4gJ/CirIwnLAon8K+iuScgPT4gJ+aMvScsCifwr6K6JyA9PiAn5ou8JywKJ/CvorsnID0+ICfmjagnLAon8K+ivCcgPT4gJ+aOgycsCifwr6K9JyA9PiAn5o+kJywKJ/Cvor4nID0+ICfwoq+xJywKJ/Cvor8nID0+ICfmkKInLAon8K+jgCcgPT4gJ+aPhScsCifwr6OBJyA9PiAn5o6pJywKJ/Cvo4InID0+ICfjqK4nLAon8K+jgycgPT4gJ+aRqScsCifwr6OEJyA9PiAn5pG+JywKJ/Cvo4UnID0+ICfmkp0nLAon8K+jhicgPT4gJ+aRtycsCifwr6OHJyA9PiAn46msJywKJ/Cvo4gnID0+ICfmlY8nLAon8K+jiScgPT4gJ+aVrCcsCifwr6OKJyA9PiAn8KOAiicsCifwr6OLJyA9PiAn5pejJywKJ/Cvo4wnID0+ICfmm7gnLAon8K+jjScgPT4gJ+aZiScsCifwr6OOJyA9PiAn46yZJywKJ/Cvo48nID0+ICfmmpEnLAon8K+jkCcgPT4gJ+OsiCcsCifwr6ORJyA9PiAn46ukJywKJ/Cvo5InID0+ICflhpInLAon8K+jkycgPT4gJ+WGlScsCifwr6OUJyA9PiAn5pyAJywKJ/Cvo5UnID0+ICfmmpwnLAon8K+jlicgPT4gJ+iCrScsCifwr6OXJyA9PiAn5I+ZJywKJ/Cvo5gnID0+ICfmnJcnLAon8K+jmScgPT4gJ+acmycsCifwr6OaJyA9PiAn5pyhJywKJ/Cvo5snID0+ICfmnZ4nLAon8K+jnCcgPT4gJ+adkycsCifwr6OdJyA9PiAn8KOPgycsCifwr6OeJyA9PiAn462JJywKJ/Cvo58nID0+ICfmn7onLAon8K+joCcgPT4gJ+aehScsCifwr6OhJyA9PiAn5qGSJywKJ/Cvo6InID0+ICfmooUnLAon8K+joycgPT4gJ/Cjka0nLAon8K+jpCcgPT4gJ+aijicsCifwr6OlJyA9PiAn5qCfJywKJ/Cvo6YnID0+ICfmpJQnLAon8K+jpycgPT4gJ+OunScsCifwr6OoJyA9PiAn5qWCJywKJ/Cvo6knID0+ICfmpqMnLAon8K+jqicgPT4gJ+anqicsCifwr6OrJyA9PiAn5qqoJywKJ/Cvo6wnID0+ICfwo5qjJywKJ/Cvo60nID0+ICfmq5snLAon8K+jricgPT4gJ+OwmCcsCifwr6OvJyA9PiAn5qyhJywKJ/Cvo7AnID0+ICfwo6KnJywKJ/Cvo7EnID0+ICfmrZQnLAon8K+jsicgPT4gJ+OxjicsCifwr6OzJyA9PiAn5q2yJywKJ/Cvo7QnID0+ICfmrp8nLAon8K+jtScgPT4gJ+auuicsCifwr6O2JyA9PiAn5q67JywKJ/Cvo7cnID0+ICfwo6qNJywKJ/Cvo7gnID0+ICfwobSLJywKJ/Cvo7knID0+ICfwo6u6JywKJ/Cvo7onID0+ICfmsY4nLAon8K+juycgPT4gJ/CjsrwnLAon8K+jvCcgPT4gJ+ayvycsCifwr6O9JyA9PiAn5rONJywKJ/Cvo74nID0+ICfmsacnLAon8K+jvycgPT4gJ+a0licsCifwr6SAJyA9PiAn5rS+JywKJ/CvpIEnID0+ICfmtbcnLAon8K+kgicgPT4gJ+a1gScsCifwr6SDJyA9PiAn5rWpJywKJ/CvpIQnID0+ICfmtbgnLAon8K+khScgPT4gJ+a2hScsCifwr6SGJyA9PiAn8KO0nicsCifwr6SHJyA9PiAn5rS0JywKJ/CvpIgnID0+ICfmuK8nLAon8K+kiScgPT4gJ+a5ricsCifwr6SKJyA9PiAn47SzJywKJ/CvpIsnID0+ICfmu4snLAon8K+kjCcgPT4gJ+a7hycsCifwr6SNJyA9PiAn8KO7kScsCifwr6SOJyA9PiAn5re5JywKJ/CvpI8nID0+ICfmva4nLAon8K+kkCcgPT4gJ/CjvZ4nLAon8K+kkScgPT4gJ/Cjvo4nLAon8K+kkicgPT4gJ+a/hicsCifwr6STJyA9PiAn54C5JywKJ/CvpJQnID0+ICfngJ4nLAon8K+klScgPT4gJ+eAmycsCifwr6SWJyA9PiAn47aWJywKJ/CvpJcnID0+ICfngYonLAon8K+kmCcgPT4gJ+eBvScsCifwr6SZJyA9PiAn54G3JywKJ/CvpJonID0+ICfngq0nLAon8K+kmycgPT4gJ/CglKUnLAon8K+knCcgPT4gJ+eFhScsCifwr6SdJyA9PiAn8KSJoycsCifwr6SeJyA9PiAn54acJywKJ/CvpJ8nID0+ICfwpI6rJywKJ/CvpKAnID0+ICfniKgnLAon8K+koScgPT4gJ+eItScsCifwr6SiJyA9PiAn54mQJywKJ/CvpKMnID0+ICfwpJiIJywKJ/CvpKQnID0+ICfnioAnLAon8K+kpScgPT4gJ+eKlScsCifwr6SmJyA9PiAn8KSctScsCifwr6SnJyA9PiAn8KSglCcsCifwr6SoJyA9PiAn5426JywKJ/CvpKknID0+ICfnjosnLAon8K+kqicgPT4gJ+O6rCcsCifwr6SrJyA9PiAn546lJywKJ/CvpKwnID0+ICfjurgnLAon8K+krScgPT4gJ+O6uCcsCifwr6SuJyA9PiAn55GHJywKJ/CvpK8nID0+ICfnkZwnLAon8K+ksCcgPT4gJ+eRsScsCifwr6SxJyA9PiAn55KFJywKJ/CvpLInID0+ICfnk4onLAon8K+ksycgPT4gJ+O8mycsCifwr6S0JyA9PiAn55SkJywKJ/CvpLUnID0+ICfwpLC2JywKJ/CvpLYnID0+ICfnlL4nLAon8K+ktycgPT4gJ/CkspInLAon8K+kuCcgPT4gJ+eVsCcsCifwr6S5JyA9PiAn8KKGnycsCifwr6S6JyA9PiAn55iQJywKJ/CvpLsnID0+ICfwpL6hJywKJ/CvpLwnID0+ICfwpL64JywKJ/CvpL0nID0+ICfwpYGEJywKJ/CvpL4nID0+ICfjv7wnLAon8K+kvycgPT4gJ+SAiCcsCifwr6WAJyA9PiAn55u0JywKJ/CvpYEnID0+ICfwpYOzJywKJ/CvpYInID0+ICfwpYOyJywKJ/CvpYMnID0+ICfwpYSZJywKJ/CvpYQnID0+ICfwpYSzJywKJ/CvpYUnID0+ICfnnJ4nLAon8K+lhicgPT4gJ+ecnycsCifwr6WHJyA9PiAn55yfJywKJ/CvpYgnID0+ICfnnYonLAon8K+liScgPT4gJ+SAuScsCifwr6WKJyA9PiAn556LJywKJ/CvpYsnID0+ICfkgYYnLAon8K+ljCcgPT4gJ+SClicsCifwr6WNJyA9PiAn8KWQnScsCifwr6WOJyA9PiAn56GOJywKJ/CvpY8nID0+ICfnoownLAon8K+lkCcgPT4gJ+ejjCcsCifwr6WRJyA9PiAn5IOjJywKJ/CvpZInID0+ICfwpZimJywKJ/CvpZMnID0+ICfnpZYnLAon8K+llCcgPT4gJ/ClmponLAon8K+llScgPT4gJ/Clm4UnLAon8K+llicgPT4gJ+emjycsCifwr6WXJyA9PiAn56erJywKJ/CvpZgnID0+ICfkhK8nLAon8K+lmScgPT4gJ+epgCcsCifwr6WaJyA9PiAn56mKJywKJ/CvpZsnID0+ICfnqY8nLAon8K+lnCcgPT4gJ/ClpbwnLAon8K+lnScgPT4gJ/ClqqcnLAon8K+lnicgPT4gJ/ClqqcnLAon8K+lnycgPT4gJ+erricsCifwr6WgJyA9PiAn5IiCJywKJ/CvpaEnID0+ICfwpa6rJywKJ/CvpaInID0+ICfnr4YnLAon8K+loycgPT4gJ+eviScsCifwr6WkJyA9PiAn5IinJywKJ/CvpaUnID0+ICfwpbKAJywKJ/CvpaYnID0+ICfns5InLAon8K+lpycgPT4gJ+SKoCcsCifwr6WoJyA9PiAn57OoJywKJ/CvpaknID0+ICfns6MnLAon8K+lqicgPT4gJ+e0gCcsCifwr6WrJyA9PiAn8KW+hicsCifwr6WsJyA9PiAn57WjJywKJ/Cvpa0nID0+ICfkjIEnLAon8K+lricgPT4gJ+e3hycsCifwr6WvJyA9PiAn57iCJywKJ/CvpbAnID0+ICfnuYUnLAon8K+lsScgPT4gJ+SMtCcsCifwr6WyJyA9PiAn8KaIqCcsCifwr6WzJyA9PiAn8KaJhycsCifwr6W0JyA9PiAn5I2ZJywKJ/CvpbUnID0+ICfwpouZJywKJ/CvpbYnID0+ICfnvbonLAon8K+ltycgPT4gJ/CmjL4nLAon8K+luCcgPT4gJ+e+lScsCifwr6W5JyA9PiAn57+6JywKJ/CvpbonID0+ICfogIUnLAon8K+luycgPT4gJ/Cmk5onLAon8K+lvCcgPT4gJ/CmlKMnLAon8K+lvScgPT4gJ+iBoCcsCifwr6W+JyA9PiAn8KaWqCcsCifwr6W/JyA9PiAn6IGwJywKJ/CvpoAnID0+ICfwo42fJywKJ/CvpoEnID0+ICfkj5UnLAon8K+mgicgPT4gJ+iCsicsCifwr6aDJyA9PiAn6ISDJywKJ/CvpoQnID0+ICfkkIsnLAon8K+mhScgPT4gJ+iEvicsCifwr6aGJyA9PiAn5aq1JywKJ/CvpocnID0+ICfwpp6nJywKJ/CvpognID0+ICfwpp61JywKJ/CvpoknID0+ICfwo46TJywKJ/CvpoonID0+ICfwo46cJywKJ/CvposnID0+ICfoiIEnLAon8K+mjCcgPT4gJ+iIhCcsCifwr6aNJyA9PiAn6L6eJywKJ/Cvpo4nID0+ICfkkasnLAon8K+mjycgPT4gJ+iKkScsCifwr6aQJyA9PiAn6IqLJywKJ/CvppEnID0+ICfoip0nLAon8K+mkicgPT4gJ+WKsycsCifwr6aTJyA9PiAn6IqxJywKJ/CvppQnID0+ICfoirMnLAon8K+mlScgPT4gJ+iKvScsCifwr6aWJyA9PiAn6IumJywKJ/CvppcnID0+ICfwpqy8JywKJ/CvppgnID0+ICfoi6UnLAon8K+mmScgPT4gJ+iMnScsCifwr6aaJyA9PiAn6I2jJywKJ/CvppsnID0+ICfojq0nLAon8K+mnCcgPT4gJ+iMoycsCifwr6adJyA9PiAn6I69JywKJ/Cvpp4nID0+ICfoj6cnLAon8K+mnycgPT4gJ+iRlycsCifwr6agJyA9PiAn6I2TJywKJ/CvpqEnID0+ICfoj4onLAon8K+moicgPT4gJ+iPjCcsCifwr6ajJyA9PiAn6I+cJywKJ/CvpqQnID0+ICfwprC2JywKJ/CvpqUnID0+ICfwprWrJywKJ/CvpqYnID0+ICfwprOVJywKJ/CvpqcnID0+ICfklKsnLAon8K+mqCcgPT4gJ+iTsScsCifwr6apJyA9PiAn6JOzJywKJ/CvpqonID0+ICfolJYnLAon8K+mqycgPT4gJ/Cnj4onLAon8K+mrCcgPT4gJ+iVpCcsCifwr6atJyA9PiAn8Ka8rCcsCifwr6auJyA9PiAn5JWdJywKJ/Cvpq8nID0+ICfklaEnLAon8K+msCcgPT4gJ/CmvrEnLAon8K+msScgPT4gJ/Cng5InLAon8K+msicgPT4gJ+SVqycsCifwr6azJyA9PiAn6JmQJywKJ/CvprQnID0+ICfomZwnLAon8K+mtScgPT4gJ+iZpycsCifwr6a2JyA9PiAn6JmpJywKJ/CvprcnID0+ICfomqknLAon8K+muCcgPT4gJ+iaiCcsCifwr6a5JyA9PiAn6JyOJywKJ/CvpronID0+ICfom6InLAon8K+muycgPT4gJ+iduScsCifwr6a8JyA9PiAn6JyoJywKJ/Cvpr0nID0+ICfonasnLAon8K+mvicgPT4gJ+iehicsCifwr6a/JyA9PiAn5JeXJywKJ/Cvp4AnID0+ICfon6EnLAon8K+ngScgPT4gJ+iggScsCifwr6eCJyA9PiAn5Je5JywKJ/Cvp4MnID0+ICfooaAnLAon8K+nhCcgPT4gJ+ihoycsCifwr6eFJyA9PiAn8KeZpycsCifwr6eGJyA9PiAn6KOXJywKJ/Cvp4cnID0+ICfoo54nLAon8K+niCcgPT4gJ+SYtScsCifwr6eJJyA9PiAn6KO6JywKJ/Cvp4onID0+ICfjkrsnLAon8K+niycgPT4gJ/Cnoq4nLAon8K+njCcgPT4gJ/CnpaYnLAon8K+njScgPT4gJ+SavicsCifwr6eOJyA9PiAn5JuHJywKJ/Cvp48nID0+ICfoqqAnLAon8K+nkCcgPT4gJ+irrScsCifwr6eRJyA9PiAn6K6KJywKJ/Cvp5InID0+ICfosZUnLAon8K+nkycgPT4gJ/CnsqgnLAon8K+nlCcgPT4gJ+iyqycsCifwr6eVJyA9PiAn6LOBJywKJ/Cvp5YnID0+ICfotJsnLAon8K+nlycgPT4gJ+i1tycsCifwr6eYJyA9PiAn8Ke8rycsCifwr6eZJyA9PiAn8KCghCcsCifwr6eaJyA9PiAn6LeLJywKJ/Cvp5snID0+ICfotrwnLAon8K+nnCcgPT4gJ+i3sCcsCifwr6edJyA9PiAn8KCjnicsCifwr6eeJyA9PiAn6LuUJywKJ/Cvp58nID0+ICfovLgnLAon8K+noCcgPT4gJ/Col5InLAon8K+noScgPT4gJ/Col60nLAon8K+noicgPT4gJ+mClCcsCifwr6ejJyA9PiAn6YOxJywKJ/Cvp6QnID0+ICfphJEnLAon8K+npScgPT4gJ/ConK4nLAon8K+npicgPT4gJ+mEmycsCifwr6enJyA9PiAn6Yi4JywKJ/Cvp6gnID0+ICfpi5cnLAon8K+nqScgPT4gJ+mLmCcsCifwr6eqJyA9PiAn6Ym8JywKJ/Cvp6snID0+ICfpj7knLAon8K+nrCcgPT4gJ+mQlScsCifwr6etJyA9PiAn8KivuicsCifwr6euJyA9PiAn6ZaLJywKJ/Cvp68nID0+ICfkppUnLAon8K+nsCcgPT4gJ+mWtycsCifwr6exJyA9PiAn8Ki1tycsCifwr6eyJyA9PiAn5KemJywKJ/Cvp7MnID0+ICfpm4MnLAon8K+ntCcgPT4gJ+W2sicsCifwr6e1JyA9PiAn6ZyjJywKJ/Cvp7YnID0+ICfwqYWFJywKJ/Cvp7cnID0+ICfwqYiaJywKJ/Cvp7gnID0+ICfkqa4nLAon8K+nuScgPT4gJ+SpticsCifwr6e6JyA9PiAn6Z+gJywKJ/Cvp7snID0+ICfwqZCKJywKJ/Cvp7wnID0+ICfkqrInLAon8K+nvScgPT4gJ/CpkpYnLAon8K+nvicgPT4gJ+mgiycsCifwr6e/JyA9PiAn6aCLJywKJ/CvqIAnID0+ICfpoKknLAon8K+ogScgPT4gJ/CplrYnLAon8K+ogicgPT4gJ+mjoicsCifwr6iDJyA9PiAn5KyzJywKJ/CvqIQnID0+ICfppKknLAon8K+ohScgPT4gJ+mmpycsCifwr6iGJyA9PiAn6aeCJywKJ/CvqIcnID0+ICfpp74nLAon8K+oiCcgPT4gJ+SvjicsCifwr6iJJyA9PiAn8KmssCcsCifwr6iKJyA9PiAn6aySJywKJ/CvqIsnID0+ICfpsYAnLAon8K+ojCcgPT4gJ+mzvScsCifwr6iNJyA9PiAn5LOOJywKJ/CvqI4nID0+ICfks60nLAon8K+ojycgPT4gJ+m1pycsCifwr6iQJyA9PiAn8KqDjicsCifwr6iRJyA9PiAn5LO4JywKJ/CvqJInID0+ICfwqoSFJywKJ/CvqJMnID0+ICfwqoiOJywKJ/CvqJQnID0+ICfwqoqRJywKJ/CvqJUnID0+ICfpursnLAon8K+olicgPT4gJ+S1licsCifwr6iXJyA9PiAn6bu5JywKJ/CvqJgnID0+ICfpu74nLAon8K+omScgPT4gJ+m8hScsCifwr6iaJyA9PiAn6byPJywKJ/CvqJsnID0+ICfpvJYnLAon8K+onCcgPT4gJ+m8uycsCifwr6idJyA9PiAn8KqYgCcsCik7Cjw/cGhwCgpyZXR1cm4gYXJyYXkgKAonzIAnID0+IDIzMCwKJ8yBJyA9PiAyMzAsCifMgicgPT4gMjMwLAonzIMnID0+IDIzMCwKJ8yEJyA9PiAyMzAsCifMhScgPT4gMjMwLAonzIYnID0+IDIzMCwKJ8yHJyA9PiAyMzAsCifMiCcgPT4gMjMwLAonzIknID0+IDIzMCwKJ8yKJyA9PiAyMzAsCifMiycgPT4gMjMwLAonzIwnID0+IDIzMCwKJ8yNJyA9PiAyMzAsCifMjicgPT4gMjMwLAonzI8nID0+IDIzMCwKJ8yQJyA9PiAyMzAsCifMkScgPT4gMjMwLAonzJInID0+IDIzMCwKJ8yTJyA9PiAyMzAsCifMlCcgPT4gMjMwLAonzJUnID0+IDIzMiwKJ8yWJyA9PiAyMjAsCifMlycgPT4gMjIwLAonzJgnID0+IDIyMCwKJ8yZJyA9PiAyMjAsCifMmicgPT4gMjMyLAonzJsnID0+IDIxNiwKJ8ycJyA9PiAyMjAsCifMnScgPT4gMjIwLAonzJ4nID0+IDIyMCwKJ8yfJyA9PiAyMjAsCifMoCcgPT4gMjIwLAonzKEnID0+IDIwMiwKJ8yiJyA9PiAyMDIsCifMoycgPT4gMjIwLAonzKQnID0+IDIyMCwKJ8ylJyA9PiAyMjAsCifMpicgPT4gMjIwLAonzKcnID0+IDIwMiwKJ8yoJyA9PiAyMDIsCifMqScgPT4gMjIwLAonzKonID0+IDIyMCwKJ8yrJyA9PiAyMjAsCifMrCcgPT4gMjIwLAonzK0nID0+IDIyMCwKJ8yuJyA9PiAyMjAsCifMrycgPT4gMjIwLAonzLAnID0+IDIyMCwKJ8yxJyA9PiAyMjAsCifMsicgPT4gMjIwLAonzLMnID0+IDIyMCwKJ8y0JyA9PiAxLAonzLUnID0+IDEsCifMticgPT4gMSwKJ8y3JyA9PiAxLAonzLgnID0+IDEsCifMuScgPT4gMjIwLAonzLonID0+IDIyMCwKJ8y7JyA9PiAyMjAsCifMvCcgPT4gMjIwLAonzL0nID0+IDIzMCwKJ8y+JyA9PiAyMzAsCifMvycgPT4gMjMwLAonzYAnID0+IDIzMCwKJ82BJyA9PiAyMzAsCifNgicgPT4gMjMwLAonzYMnID0+IDIzMCwKJ82EJyA9PiAyMzAsCifNhScgPT4gMjQwLAonzYYnID0+IDIzMCwKJ82HJyA9PiAyMjAsCifNiCcgPT4gMjIwLAonzYknID0+IDIyMCwKJ82KJyA9PiAyMzAsCifNiycgPT4gMjMwLAonzYwnID0+IDIzMCwKJ82NJyA9PiAyMjAsCifNjicgPT4gMjIwLAonzZAnID0+IDIzMCwKJ82RJyA9PiAyMzAsCifNkicgPT4gMjMwLAonzZMnID0+IDIyMCwKJ82UJyA9PiAyMjAsCifNlScgPT4gMjIwLAonzZYnID0+IDIyMCwKJ82XJyA9PiAyMzAsCifNmCcgPT4gMjMyLAonzZknID0+IDIyMCwKJ82aJyA9PiAyMjAsCifNmycgPT4gMjMwLAonzZwnID0+IDIzMywKJ82dJyA9PiAyMzQsCifNnicgPT4gMjM0LAonzZ8nID0+IDIzMywKJ82gJyA9PiAyMzQsCifNoScgPT4gMjM0LAonzaInID0+IDIzMywKJ82jJyA9PiAyMzAsCifNpCcgPT4gMjMwLAonzaUnID0+IDIzMCwKJ82mJyA9PiAyMzAsCifNpycgPT4gMjMwLAonzagnID0+IDIzMCwKJ82pJyA9PiAyMzAsCifNqicgPT4gMjMwLAonzasnID0+IDIzMCwKJ82sJyA9PiAyMzAsCifNrScgPT4gMjMwLAonza4nID0+IDIzMCwKJ82vJyA9PiAyMzAsCifSgycgPT4gMjMwLAon0oQnID0+IDIzMCwKJ9KFJyA9PiAyMzAsCifShicgPT4gMjMwLAon0ocnID0+IDIzMCwKJ9aRJyA9PiAyMjAsCifWkicgPT4gMjMwLAon1pMnID0+IDIzMCwKJ9aUJyA9PiAyMzAsCifWlScgPT4gMjMwLAon1pYnID0+IDIyMCwKJ9aXJyA9PiAyMzAsCifWmCcgPT4gMjMwLAon1pknID0+IDIzMCwKJ9aaJyA9PiAyMjIsCifWmycgPT4gMjIwLAon1pwnID0+IDIzMCwKJ9adJyA9PiAyMzAsCifWnicgPT4gMjMwLAon1p8nID0+IDIzMCwKJ9agJyA9PiAyMzAsCifWoScgPT4gMjMwLAon1qInID0+IDIyMCwKJ9ajJyA9PiAyMjAsCifWpCcgPT4gMjIwLAon1qUnID0+IDIyMCwKJ9amJyA9PiAyMjAsCifWpycgPT4gMjIwLAon1qgnID0+IDIzMCwKJ9apJyA9PiAyMzAsCifWqicgPT4gMjIwLAon1qsnID0+IDIzMCwKJ9asJyA9PiAyMzAsCifWrScgPT4gMjIyLAon1q4nID0+IDIyOCwKJ9avJyA9PiAyMzAsCifWsCcgPT4gMTAsCifWsScgPT4gMTEsCifWsicgPT4gMTIsCifWsycgPT4gMTMsCifWtCcgPT4gMTQsCifWtScgPT4gMTUsCifWticgPT4gMTYsCifWtycgPT4gMTcsCifWuCcgPT4gMTgsCifWuScgPT4gMTksCifWuicgPT4gMTksCifWuycgPT4gMjAsCifWvCcgPT4gMjEsCifWvScgPT4gMjIsCifWvycgPT4gMjMsCifXgScgPT4gMjQsCifXgicgPT4gMjUsCifXhCcgPT4gMjMwLAon14UnID0+IDIyMCwKJ9eHJyA9PiAxOCwKJ9iQJyA9PiAyMzAsCifYkScgPT4gMjMwLAon2JInID0+IDIzMCwKJ9iTJyA9PiAyMzAsCifYlCcgPT4gMjMwLAon2JUnID0+IDIzMCwKJ9iWJyA9PiAyMzAsCifYlycgPT4gMjMwLAon2JgnID0+IDMwLAon2JknID0+IDMxLAon2JonID0+IDMyLAon2YsnID0+IDI3LAon2YwnID0+IDI4LAon2Y0nID0+IDI5LAon2Y4nID0+IDMwLAon2Y8nID0+IDMxLAon2ZAnID0+IDMyLAon2ZEnID0+IDMzLAon2ZInID0+IDM0LAon2ZMnID0+IDIzMCwKJ9mUJyA9PiAyMzAsCifZlScgPT4gMjIwLAon2ZYnID0+IDIyMCwKJ9mXJyA9PiAyMzAsCifZmCcgPT4gMjMwLAon2ZknID0+IDIzMCwKJ9maJyA9PiAyMzAsCifZmycgPT4gMjMwLAon2ZwnID0+IDIyMCwKJ9mdJyA9PiAyMzAsCifZnicgPT4gMjMwLAon2Z8nID0+IDIyMCwKJ9mwJyA9PiAzNSwKJ9uWJyA9PiAyMzAsCifblycgPT4gMjMwLAon25gnID0+IDIzMCwKJ9uZJyA9PiAyMzAsCifbmicgPT4gMjMwLAon25snID0+IDIzMCwKJ9ucJyA9PiAyMzAsCifbnycgPT4gMjMwLAon26AnID0+IDIzMCwKJ9uhJyA9PiAyMzAsCifboicgPT4gMjMwLAon26MnID0+IDIyMCwKJ9ukJyA9PiAyMzAsCifbpycgPT4gMjMwLAon26gnID0+IDIzMCwKJ9uqJyA9PiAyMjAsCifbqycgPT4gMjMwLAon26wnID0+IDIzMCwKJ9utJyA9PiAyMjAsCifckScgPT4gMzYsCifcsCcgPT4gMjMwLAon3LEnID0+IDIyMCwKJ9yyJyA9PiAyMzAsCifcsycgPT4gMjMwLAon3LQnID0+IDIyMCwKJ9y1JyA9PiAyMzAsCifcticgPT4gMjMwLAon3LcnID0+IDIyMCwKJ9y4JyA9PiAyMjAsCifcuScgPT4gMjIwLAon3LonID0+IDIzMCwKJ9y7JyA9PiAyMjAsCifcvCcgPT4gMjIwLAon3L0nID0+IDIzMCwKJ9y+JyA9PiAyMjAsCifcvycgPT4gMjMwLAon3YAnID0+IDIzMCwKJ92BJyA9PiAyMzAsCifdgicgPT4gMjIwLAon3YMnID0+IDIzMCwKJ92EJyA9PiAyMjAsCifdhScgPT4gMjMwLAon3YYnID0+IDIyMCwKJ92HJyA9PiAyMzAsCifdiCcgPT4gMjIwLAon3YknID0+IDIzMCwKJ92KJyA9PiAyMzAsCiffqycgPT4gMjMwLAon36wnID0+IDIzMCwKJ9+tJyA9PiAyMzAsCiffricgPT4gMjMwLAon368nID0+IDIzMCwKJ9+wJyA9PiAyMzAsCiffsScgPT4gMjMwLAon37InID0+IDIyMCwKJ9+zJyA9PiAyMzAsCiffvScgPT4gMjIwLAon4KCWJyA9PiAyMzAsCifgoJcnID0+IDIzMCwKJ+CgmCcgPT4gMjMwLAon4KCZJyA9PiAyMzAsCifgoJsnID0+IDIzMCwKJ+CgnCcgPT4gMjMwLAon4KCdJyA9PiAyMzAsCifgoJ4nID0+IDIzMCwKJ+CgnycgPT4gMjMwLAon4KCgJyA9PiAyMzAsCifgoKEnID0+IDIzMCwKJ+CgoicgPT4gMjMwLAon4KCjJyA9PiAyMzAsCifgoKUnID0+IDIzMCwKJ+CgpicgPT4gMjMwLAon4KCnJyA9PiAyMzAsCifgoKknID0+IDIzMCwKJ+CgqicgPT4gMjMwLAon4KCrJyA9PiAyMzAsCifgoKwnID0+IDIzMCwKJ+CgrScgPT4gMjMwLAon4KGZJyA9PiAyMjAsCifgoZonID0+IDIyMCwKJ+ChmycgPT4gMjIwLAon4KOTJyA9PiAyMjAsCifgo5QnID0+IDIzMCwKJ+CjlScgPT4gMjMwLAon4KOWJyA9PiAyMzAsCifgo5cnID0+IDIzMCwKJ+CjmCcgPT4gMjMwLAon4KOZJyA9PiAyMzAsCifgo5onID0+IDIzMCwKJ+CjmycgPT4gMjMwLAon4KOcJyA9PiAyMzAsCifgo50nID0+IDIzMCwKJ+CjnicgPT4gMjMwLAon4KOfJyA9PiAyMzAsCifgo6AnID0+IDIzMCwKJ+CjoScgPT4gMjMwLAon4KOjJyA9PiAyMjAsCifgo6QnID0+IDIzMCwKJ+CjpScgPT4gMjMwLAon4KOmJyA9PiAyMjAsCifgo6cnID0+IDIzMCwKJ+CjqCcgPT4gMjMwLAon4KOpJyA9PiAyMjAsCifgo6onID0+IDIzMCwKJ+CjqycgPT4gMjMwLAon4KOsJyA9PiAyMzAsCifgo60nID0+IDIyMCwKJ+CjricgPT4gMjIwLAon4KOvJyA9PiAyMjAsCifgo7AnID0+IDI3LAon4KOxJyA9PiAyOCwKJ+CjsicgPT4gMjksCifgo7MnID0+IDIzMCwKJ+CjtCcgPT4gMjMwLAon4KO1JyA9PiAyMzAsCifgo7YnID0+IDIyMCwKJ+CjtycgPT4gMjMwLAon4KO4JyA9PiAyMzAsCifgo7knID0+IDIyMCwKJ+CjuicgPT4gMjIwLAon4KO7JyA9PiAyMzAsCifgo7wnID0+IDIzMCwKJ+CjvScgPT4gMjMwLAon4KO+JyA9PiAyMzAsCifgo78nID0+IDIzMCwKJ+CkvCcgPT4gNywKJ+CljScgPT4gOSwKJ+ClkScgPT4gMjMwLAon4KWSJyA9PiAyMjAsCifgpZMnID0+IDIzMCwKJ+CllCcgPT4gMjMwLAon4Ka8JyA9PiA3LAon4KeNJyA9PiA5LAon4Ke+JyA9PiAyMzAsCifgqLwnID0+IDcsCifgqY0nID0+IDksCifgqrwnID0+IDcsCifgq40nID0+IDksCifgrLwnID0+IDcsCifgrY0nID0+IDksCifgr40nID0+IDksCifgsY0nID0+IDksCifgsZUnID0+IDg0LAon4LGWJyA9PiA5MSwKJ+CyvCcgPT4gNywKJ+CzjScgPT4gOSwKJ+C0uycgPT4gOSwKJ+C0vCcgPT4gOSwKJ+C1jScgPT4gOSwKJ+C3iicgPT4gOSwKJ+C4uCcgPT4gMTAzLAon4Li5JyA9PiAxMDMsCifguLonID0+IDksCifguYgnID0+IDEwNywKJ+C5iScgPT4gMTA3LAon4LmKJyA9PiAxMDcsCifguYsnID0+IDEwNywKJ+C6uCcgPT4gMTE4LAon4Lq5JyA9PiAxMTgsCifguronID0+IDksCifgu4gnID0+IDEyMiwKJ+C7iScgPT4gMTIyLAon4LuKJyA9PiAxMjIsCifgu4snID0+IDEyMiwKJ+C8mCcgPT4gMjIwLAon4LyZJyA9PiAyMjAsCifgvLUnID0+IDIyMCwKJ+C8tycgPT4gMjIwLAon4Ly5JyA9PiAyMTYsCifgvbEnID0+IDEyOSwKJ+C9sicgPT4gMTMwLAon4L20JyA9PiAxMzIsCifgvbonID0+IDEzMCwKJ+C9uycgPT4gMTMwLAon4L28JyA9PiAxMzAsCifgvb0nID0+IDEzMCwKJ+C+gCcgPT4gMTMwLAon4L6CJyA9PiAyMzAsCifgvoMnID0+IDIzMCwKJ+C+hCcgPT4gOSwKJ+C+hicgPT4gMjMwLAon4L6HJyA9PiAyMzAsCifgv4YnID0+IDIyMCwKJ+GAtycgPT4gNywKJ+GAuScgPT4gOSwKJ+GAuicgPT4gOSwKJ+GCjScgPT4gMjIwLAon4Y2dJyA9PiAyMzAsCifhjZ4nID0+IDIzMCwKJ+GNnycgPT4gMjMwLAon4ZyUJyA9PiA5LAon4Zy0JyA9PiA5LAon4Z+SJyA9PiA5LAon4Z+dJyA9PiAyMzAsCifhoqknID0+IDIyOCwKJ+GkuScgPT4gMjIyLAon4aS6JyA9PiAyMzAsCifhpLsnID0+IDIyMCwKJ+GolycgPT4gMjMwLAon4aiYJyA9PiAyMjAsCifhqaAnID0+IDksCifhqbUnID0+IDIzMCwKJ+GpticgPT4gMjMwLAon4am3JyA9PiAyMzAsCifhqbgnID0+IDIzMCwKJ+GpuScgPT4gMjMwLAon4am6JyA9PiAyMzAsCifhqbsnID0+IDIzMCwKJ+GpvCcgPT4gMjMwLAon4am/JyA9PiAyMjAsCifhqrAnID0+IDIzMCwKJ+GqsScgPT4gMjMwLAon4aqyJyA9PiAyMzAsCifhqrMnID0+IDIzMCwKJ+GqtCcgPT4gMjMwLAon4aq1JyA9PiAyMjAsCifhqrYnID0+IDIyMCwKJ+GqtycgPT4gMjIwLAon4aq4JyA9PiAyMjAsCifhqrknID0+IDIyMCwKJ+GquicgPT4gMjIwLAon4aq7JyA9PiAyMzAsCifhqrwnID0+IDIzMCwKJ+GqvScgPT4gMjIwLAon4aq/JyA9PiAyMjAsCifhq4AnID0+IDIyMCwKJ+GstCcgPT4gNywKJ+GthCcgPT4gOSwKJ+GtqycgPT4gMjMwLAon4a2sJyA9PiAyMjAsCifhra0nID0+IDIzMCwKJ+GtricgPT4gMjMwLAon4a2vJyA9PiAyMzAsCifhrbAnID0+IDIzMCwKJ+GtsScgPT4gMjMwLAon4a2yJyA9PiAyMzAsCifhrbMnID0+IDIzMCwKJ+GuqicgPT4gOSwKJ+GuqycgPT4gOSwKJ+GvpicgPT4gNywKJ+GvsicgPT4gOSwKJ+GvsycgPT4gOSwKJ+GwtycgPT4gNywKJ+GzkCcgPT4gMjMwLAon4bORJyA9PiAyMzAsCifhs5InID0+IDIzMCwKJ+GzlCcgPT4gMSwKJ+GzlScgPT4gMjIwLAon4bOWJyA9PiAyMjAsCifhs5cnID0+IDIyMCwKJ+GzmCcgPT4gMjIwLAon4bOZJyA9PiAyMjAsCifhs5onID0+IDIzMCwKJ+GzmycgPT4gMjMwLAon4bOcJyA9PiAyMjAsCifhs50nID0+IDIyMCwKJ+GznicgPT4gMjIwLAon4bOfJyA9PiAyMjAsCifhs6AnID0+IDIzMCwKJ+GzoicgPT4gMSwKJ+GzoycgPT4gMSwKJ+GzpCcgPT4gMSwKJ+GzpScgPT4gMSwKJ+GzpicgPT4gMSwKJ+GzpycgPT4gMSwKJ+GzqCcgPT4gMSwKJ+GzrScgPT4gMjIwLAon4bO0JyA9PiAyMzAsCifhs7gnID0+IDIzMCwKJ+GzuScgPT4gMjMwLAon4beAJyA9PiAyMzAsCifht4EnID0+IDIzMCwKJ+G3gicgPT4gMjIwLAon4beDJyA9PiAyMzAsCifht4QnID0+IDIzMCwKJ+G3hScgPT4gMjMwLAon4beGJyA9PiAyMzAsCifht4cnID0+IDIzMCwKJ+G3iCcgPT4gMjMwLAon4beJJyA9PiAyMzAsCifht4onID0+IDIyMCwKJ+G3iycgPT4gMjMwLAon4beMJyA9PiAyMzAsCifht40nID0+IDIzNCwKJ+G3jicgPT4gMjE0LAon4bePJyA9PiAyMjAsCifht5AnID0+IDIwMiwKJ+G3kScgPT4gMjMwLAon4beSJyA9PiAyMzAsCifht5MnID0+IDIzMCwKJ+G3lCcgPT4gMjMwLAon4beVJyA9PiAyMzAsCifht5YnID0+IDIzMCwKJ+G3lycgPT4gMjMwLAon4beYJyA9PiAyMzAsCifht5knID0+IDIzMCwKJ+G3micgPT4gMjMwLAon4bebJyA9PiAyMzAsCifht5wnID0+IDIzMCwKJ+G3nScgPT4gMjMwLAon4beeJyA9PiAyMzAsCifht58nID0+IDIzMCwKJ+G3oCcgPT4gMjMwLAon4behJyA9PiAyMzAsCifht6InID0+IDIzMCwKJ+G3oycgPT4gMjMwLAon4bekJyA9PiAyMzAsCifht6UnID0+IDIzMCwKJ+G3picgPT4gMjMwLAon4benJyA9PiAyMzAsCifht6gnID0+IDIzMCwKJ+G3qScgPT4gMjMwLAon4beqJyA9PiAyMzAsCifht6snID0+IDIzMCwKJ+G3rCcgPT4gMjMwLAon4betJyA9PiAyMzAsCifht64nID0+IDIzMCwKJ+G3rycgPT4gMjMwLAon4bewJyA9PiAyMzAsCifht7EnID0+IDIzMCwKJ+G3sicgPT4gMjMwLAon4bezJyA9PiAyMzAsCifht7QnID0+IDIzMCwKJ+G3tScgPT4gMjMwLAon4be2JyA9PiAyMzIsCifht7cnID0+IDIyOCwKJ+G3uCcgPT4gMjI4LAon4be5JyA9PiAyMjAsCifht7snID0+IDIzMCwKJ+G3vCcgPT4gMjMzLAon4be9JyA9PiAyMjAsCifht74nID0+IDIzMCwKJ+G3vycgPT4gMjIwLAon4oOQJyA9PiAyMzAsCifig5EnID0+IDIzMCwKJ+KDkicgPT4gMSwKJ+KDkycgPT4gMSwKJ+KDlCcgPT4gMjMwLAon4oOVJyA9PiAyMzAsCifig5YnID0+IDIzMCwKJ+KDlycgPT4gMjMwLAon4oOYJyA9PiAxLAon4oOZJyA9PiAxLAon4oOaJyA9PiAxLAon4oObJyA9PiAyMzAsCifig5wnID0+IDIzMCwKJ+KDoScgPT4gMjMwLAon4oOlJyA9PiAxLAon4oOmJyA9PiAxLAon4oOnJyA9PiAyMzAsCifig6gnID0+IDIyMCwKJ+KDqScgPT4gMjMwLAon4oOqJyA9PiAxLAon4oOrJyA9PiAxLAon4oOsJyA9PiAyMjAsCifig60nID0+IDIyMCwKJ+KDricgPT4gMjIwLAon4oOvJyA9PiAyMjAsCifig7AnID0+IDIzMCwKJ+KzrycgPT4gMjMwLAon4rOwJyA9PiAyMzAsCifis7EnID0+IDIzMCwKJ+K1vycgPT4gOSwKJ+K3oCcgPT4gMjMwLAon4rehJyA9PiAyMzAsCifit6InID0+IDIzMCwKJ+K3oycgPT4gMjMwLAon4rekJyA9PiAyMzAsCifit6UnID0+IDIzMCwKJ+K3picgPT4gMjMwLAon4renJyA9PiAyMzAsCifit6gnID0+IDIzMCwKJ+K3qScgPT4gMjMwLAon4reqJyA9PiAyMzAsCifit6snID0+IDIzMCwKJ+K3rCcgPT4gMjMwLAon4retJyA9PiAyMzAsCifit64nID0+IDIzMCwKJ+K3rycgPT4gMjMwLAon4rewJyA9PiAyMzAsCifit7EnID0+IDIzMCwKJ+K3sicgPT4gMjMwLAon4rezJyA9PiAyMzAsCifit7QnID0+IDIzMCwKJ+K3tScgPT4gMjMwLAon4re2JyA9PiAyMzAsCifit7cnID0+IDIzMCwKJ+K3uCcgPT4gMjMwLAon4re5JyA9PiAyMzAsCifit7onID0+IDIzMCwKJ+K3uycgPT4gMjMwLAon4re8JyA9PiAyMzAsCifit70nID0+IDIzMCwKJ+K3vicgPT4gMjMwLAon4re/JyA9PiAyMzAsCifjgKonID0+IDIxOCwKJ+OAqycgPT4gMjI4LAon44CsJyA9PiAyMzIsCifjgK0nID0+IDIyMiwKJ+OAricgPT4gMjI0LAon44CvJyA9PiAyMjQsCifjgpknID0+IDgsCifjgponID0+IDgsCifqma8nID0+IDIzMCwKJ+qZtCcgPT4gMjMwLAon6pm1JyA9PiAyMzAsCifqmbYnID0+IDIzMCwKJ+qZtycgPT4gMjMwLAon6pm4JyA9PiAyMzAsCifqmbknID0+IDIzMCwKJ+qZuicgPT4gMjMwLAon6pm7JyA9PiAyMzAsCifqmbwnID0+IDIzMCwKJ+qZvScgPT4gMjMwLAon6pqeJyA9PiAyMzAsCifqmp8nID0+IDIzMCwKJ+qbsCcgPT4gMjMwLAon6puxJyA9PiAyMzAsCifqoIYnID0+IDksCifqoKwnID0+IDksCifqo4QnID0+IDksCifqo6AnID0+IDIzMCwKJ+qjoScgPT4gMjMwLAon6qOiJyA9PiAyMzAsCifqo6MnID0+IDIzMCwKJ+qjpCcgPT4gMjMwLAon6qOlJyA9PiAyMzAsCifqo6YnID0+IDIzMCwKJ+qjpycgPT4gMjMwLAon6qOoJyA9PiAyMzAsCifqo6knID0+IDIzMCwKJ+qjqicgPT4gMjMwLAon6qOrJyA9PiAyMzAsCifqo6wnID0+IDIzMCwKJ+qjrScgPT4gMjMwLAon6qOuJyA9PiAyMzAsCifqo68nID0+IDIzMCwKJ+qjsCcgPT4gMjMwLAon6qOxJyA9PiAyMzAsCifqpKsnID0+IDIyMCwKJ+qkrCcgPT4gMjIwLAon6qStJyA9PiAyMjAsCifqpZMnID0+IDksCifqprMnID0+IDcsCifqp4AnID0+IDksCifqqrAnID0+IDIzMCwKJ+qqsicgPT4gMjMwLAon6qqzJyA9PiAyMzAsCifqqrQnID0+IDIyMCwKJ+qqtycgPT4gMjMwLAon6qq4JyA9PiAyMzAsCifqqr4nID0+IDIzMCwKJ+qqvycgPT4gMjMwLAon6quBJyA9PiAyMzAsCifqq7YnID0+IDksCifqr60nID0+IDksCifvrJ4nID0+IDI2LAon77igJyA9PiAyMzAsCifvuKEnID0+IDIzMCwKJ++4oicgPT4gMjMwLAon77ijJyA9PiAyMzAsCifvuKQnID0+IDIzMCwKJ++4pScgPT4gMjMwLAon77imJyA9PiAyMzAsCifvuKcnID0+IDIyMCwKJ++4qCcgPT4gMjIwLAon77ipJyA9PiAyMjAsCifvuKonID0+IDIyMCwKJ++4qycgPT4gMjIwLAon77isJyA9PiAyMjAsCifvuK0nID0+IDIyMCwKJ++4ricgPT4gMjMwLAon77ivJyA9PiAyMzAsCifwkIe9JyA9PiAyMjAsCifwkIugJyA9PiAyMjAsCifwkI22JyA9PiAyMzAsCifwkI23JyA9PiAyMzAsCifwkI24JyA9PiAyMzAsCifwkI25JyA9PiAyMzAsCifwkI26JyA9PiAyMzAsCifwkKiNJyA9PiAyMjAsCifwkKiPJyA9PiAyMzAsCifwkKi4JyA9PiAyMzAsCifwkKi5JyA9PiAxLAon8JCouicgPT4gMjIwLAon8JCovycgPT4gOSwKJ/CQq6UnID0+IDIzMCwKJ/CQq6YnID0+IDIyMCwKJ/CQtKQnID0+IDIzMCwKJ/CQtKUnID0+IDIzMCwKJ/CQtKYnID0+IDIzMCwKJ/CQtKcnID0+IDIzMCwKJ/CQuqsnID0+IDIzMCwKJ/CQuqwnID0+IDIzMCwKJ/CQvYYnID0+IDIyMCwKJ/CQvYcnID0+IDIyMCwKJ/CQvYgnID0+IDIzMCwKJ/CQvYknID0+IDIzMCwKJ/CQvYonID0+IDIzMCwKJ/CQvYsnID0+IDIyMCwKJ/CQvYwnID0+IDIzMCwKJ/CQvY0nID0+IDIyMCwKJ/CQvY4nID0+IDIyMCwKJ/CQvY8nID0+IDIyMCwKJ/CQvZAnID0+IDIyMCwKJ/CRgYYnID0+IDksCifwkYG/JyA9PiA5LAon8JGCuScgPT4gOSwKJ/CRgronID0+IDcsCifwkYSAJyA9PiAyMzAsCifwkYSBJyA9PiAyMzAsCifwkYSCJyA9PiAyMzAsCifwkYSzJyA9PiA5LAon8JGEtCcgPT4gOSwKJ/CRhbMnID0+IDcsCifwkYeAJyA9PiA5LAon8JGHiicgPT4gNywKJ/CRiLUnID0+IDksCifwkYi2JyA9PiA3LAon8JGLqScgPT4gNywKJ/CRi6onID0+IDksCifwkYy7JyA9PiA3LAon8JGMvCcgPT4gNywKJ/CRjY0nID0+IDksCifwkY2mJyA9PiAyMzAsCifwkY2nJyA9PiAyMzAsCifwkY2oJyA9PiAyMzAsCifwkY2pJyA9PiAyMzAsCifwkY2qJyA9PiAyMzAsCifwkY2rJyA9PiAyMzAsCifwkY2sJyA9PiAyMzAsCifwkY2wJyA9PiAyMzAsCifwkY2xJyA9PiAyMzAsCifwkY2yJyA9PiAyMzAsCifwkY2zJyA9PiAyMzAsCifwkY20JyA9PiAyMzAsCifwkZGCJyA9PiA5LAon8JGRhicgPT4gNywKJ/CRkZ4nID0+IDIzMCwKJ/CRk4InID0+IDksCifwkZODJyA9PiA3LAon8JGWvycgPT4gOSwKJ/CRl4AnID0+IDcsCifwkZi/JyA9PiA5LAon8JGaticgPT4gOSwKJ/CRmrcnID0+IDcsCifwkZyrJyA9PiA5LAon8JGguScgPT4gOSwKJ/CRoLonID0+IDcsCifwkaS9JyA9PiA5LAon8JGkvicgPT4gOSwKJ/CRpYMnID0+IDcsCifwkaegJyA9PiA5LAon8JGotCcgPT4gOSwKJ/CRqYcnID0+IDksCifwkaqZJyA9PiA5LAon8JGwvycgPT4gOSwKJ/CRtYInID0+IDcsCifwkbWEJyA9PiA5LAon8JG1hScgPT4gOSwKJ/CRtpcnID0+IDksCifwlquwJyA9PiAxLAon8JarsScgPT4gMSwKJ/CWq7InID0+IDEsCifwlquzJyA9PiAxLAon8JartCcgPT4gMSwKJ/CWrLAnID0+IDIzMCwKJ/CWrLEnID0+IDIzMCwKJ/CWrLInID0+IDIzMCwKJ/CWrLMnID0+IDIzMCwKJ/CWrLQnID0+IDIzMCwKJ/CWrLUnID0+IDIzMCwKJ/CWrLYnID0+IDIzMCwKJ/CWv7AnID0+IDYsCifwlr+xJyA9PiA2LAon8JuynicgPT4gMSwKJ/CdhaUnID0+IDIxNiwKJ/CdhaYnID0+IDIxNiwKJ/CdhacnID0+IDEsCifwnYWoJyA9PiAxLAon8J2FqScgPT4gMSwKJ/Cdha0nID0+IDIyNiwKJ/Cdha4nID0+IDIxNiwKJ/Cdha8nID0+IDIxNiwKJ/CdhbAnID0+IDIxNiwKJ/CdhbEnID0+IDIxNiwKJ/CdhbInID0+IDIxNiwKJ/CdhbsnID0+IDIyMCwKJ/CdhbwnID0+IDIyMCwKJ/Cdhb0nID0+IDIyMCwKJ/Cdhb4nID0+IDIyMCwKJ/Cdhb8nID0+IDIyMCwKJ/CdhoAnID0+IDIyMCwKJ/CdhoEnID0+IDIyMCwKJ/CdhoInID0+IDIyMCwKJ/CdhoUnID0+IDIzMCwKJ/CdhoYnID0+IDIzMCwKJ/CdhocnID0+IDIzMCwKJ/CdhognID0+IDIzMCwKJ/CdhoknID0+IDIzMCwKJ/CdhoonID0+IDIyMCwKJ/CdhosnID0+IDIyMCwKJ/CdhqonID0+IDIzMCwKJ/CdhqsnID0+IDIzMCwKJ/CdhqwnID0+IDIzMCwKJ/Cdhq0nID0+IDIzMCwKJ/CdiYInID0+IDIzMCwKJ/CdiYMnID0+IDIzMCwKJ/CdiYQnID0+IDIzMCwKJ/CegIAnID0+IDIzMCwKJ/CegIEnID0+IDIzMCwKJ/CegIInID0+IDIzMCwKJ/CegIMnID0+IDIzMCwKJ/CegIQnID0+IDIzMCwKJ/CegIUnID0+IDIzMCwKJ/CegIYnID0+IDIzMCwKJ/CegIgnID0+IDIzMCwKJ/CegIknID0+IDIzMCwKJ/CegIonID0+IDIzMCwKJ/CegIsnID0+IDIzMCwKJ/CegIwnID0+IDIzMCwKJ/CegI0nID0+IDIzMCwKJ/CegI4nID0+IDIzMCwKJ/CegI8nID0+IDIzMCwKJ/CegJAnID0+IDIzMCwKJ/CegJEnID0+IDIzMCwKJ/CegJInID0+IDIzMCwKJ/CegJMnID0+IDIzMCwKJ/CegJQnID0+IDIzMCwKJ/CegJUnID0+IDIzMCwKJ/CegJYnID0+IDIzMCwKJ/CegJcnID0+IDIzMCwKJ/CegJgnID0+IDIzMCwKJ/CegJsnID0+IDIzMCwKJ/CegJwnID0+IDIzMCwKJ/CegJ0nID0+IDIzMCwKJ/CegJ4nID0+IDIzMCwKJ/CegJ8nID0+IDIzMCwKJ/CegKAnID0+IDIzMCwKJ/CegKEnID0+IDIzMCwKJ/CegKMnID0+IDIzMCwKJ/CegKQnID0+IDIzMCwKJ/CegKYnID0+IDIzMCwKJ/CegKcnID0+IDIzMCwKJ/CegKgnID0+IDIzMCwKJ/CegKknID0+IDIzMCwKJ/CegKonID0+IDIzMCwKJ/CehLAnID0+IDIzMCwKJ/CehLEnID0+IDIzMCwKJ/CehLInID0+IDIzMCwKJ/CehLMnID0+IDIzMCwKJ/CehLQnID0+IDIzMCwKJ/CehLUnID0+IDIzMCwKJ/CehLYnID0+IDIzMCwKJ/Cei6wnID0+IDIzMCwKJ/Cei60nID0+IDIzMCwKJ/Cei64nID0+IDIzMCwKJ/Cei68nID0+IDIzMCwKJ/Ceo5AnID0+IDIyMCwKJ/Ceo5EnID0+IDIyMCwKJ/Ceo5InID0+IDIyMCwKJ/Ceo5MnID0+IDIyMCwKJ/Ceo5QnID0+IDIyMCwKJ/Ceo5UnID0+IDIyMCwKJ/Ceo5YnID0+IDIyMCwKJ/CepYQnID0+IDIzMCwKJ/CepYUnID0+IDIzMCwKJ/CepYYnID0+IDIzMCwKJ/CepYcnID0+IDIzMCwKJ/CepYgnID0+IDIzMCwKJ/CepYknID0+IDIzMCwKJ/CepYonID0+IDcsCik7Cjw/cGhwCgpyZXR1cm4gYXJyYXkgKAonwqAnID0+ICcgJywKJ8KoJyA9PiAnIMyIJywKJ8KqJyA9PiAnYScsCifCrycgPT4gJyDMhCcsCifCsicgPT4gJzInLAonwrMnID0+ICczJywKJ8K0JyA9PiAnIMyBJywKJ8K1JyA9PiAnzrwnLAonwrgnID0+ICcgzKcnLAonwrknID0+ICcxJywKJ8K6JyA9PiAnbycsCifCvCcgPT4gJzHigYQ0JywKJ8K9JyA9PiAnMeKBhDInLAonwr4nID0+ICcz4oGENCcsCifEsicgPT4gJ0lKJywKJ8SzJyA9PiAnaWonLAonxL8nID0+ICdMwrcnLAonxYAnID0+ICdswrcnLAonxYknID0+ICfKvG4nLAonxb8nID0+ICdzJywKJ8eEJyA9PiAnRFrMjCcsCifHhScgPT4gJ0R6zIwnLAonx4YnID0+ICdkesyMJywKJ8eHJyA9PiAnTEonLAonx4gnID0+ICdMaicsCifHiScgPT4gJ2xqJywKJ8eKJyA9PiAnTkonLAonx4snID0+ICdOaicsCifHjCcgPT4gJ25qJywKJ8exJyA9PiAnRFonLAonx7InID0+ICdEeicsCifHsycgPT4gJ2R6JywKJ8qwJyA9PiAnaCcsCifKsScgPT4gJ8mmJywKJ8qyJyA9PiAnaicsCifKsycgPT4gJ3InLAonyrQnID0+ICfJuScsCifKtScgPT4gJ8m7JywKJ8q2JyA9PiAnyoEnLAonyrcnID0+ICd3JywKJ8q4JyA9PiAneScsCifLmCcgPT4gJyDMhicsCifLmScgPT4gJyDMhycsCifLmicgPT4gJyDMiicsCifLmycgPT4gJyDMqCcsCifLnCcgPT4gJyDMgycsCifLnScgPT4gJyDMiycsCifLoCcgPT4gJ8mjJywKJ8uhJyA9PiAnbCcsCifLoicgPT4gJ3MnLAony6MnID0+ICd4JywKJ8ukJyA9PiAnypUnLAonzbonID0+ICcgzYUnLAonzoQnID0+ICcgzIEnLAonzoUnID0+ICcgzIjMgScsCifPkCcgPT4gJ86yJywKJ8+RJyA9PiAnzrgnLAonz5InID0+ICfOpScsCifPkycgPT4gJ86lzIEnLAonz5QnID0+ICfOpcyIJywKJ8+VJyA9PiAnz4YnLAonz5YnID0+ICfPgCcsCifPsCcgPT4gJ866JywKJ8+xJyA9PiAnz4EnLAonz7InID0+ICfPgicsCifPtCcgPT4gJ86YJywKJ8+1JyA9PiAnzrUnLAonz7knID0+ICfOoycsCifWhycgPT4gJ9Wl1oInLAon2bUnID0+ICfYp9m0JywKJ9m2JyA9PiAn2YjZtCcsCifZtycgPT4gJ9uH2bQnLAon2bgnID0+ICfZitm0JywKJ+C4sycgPT4gJ+C5jeC4sicsCifgurMnID0+ICfgu43gurInLAon4LucJyA9PiAn4Lqr4LqZJywKJ+C7nScgPT4gJ+C6q+C6oScsCifgvIwnID0+ICfgvIsnLAon4L23JyA9PiAn4L6y4L2x4L6AJywKJ+C9uScgPT4gJ+C+s+C9seC+gCcsCifhg7wnID0+ICfhg5wnLAon4bSsJyA9PiAnQScsCifhtK0nID0+ICfDhicsCifhtK4nID0+ICdCJywKJ+G0sCcgPT4gJ0QnLAon4bSxJyA9PiAnRScsCifhtLInID0+ICfGjicsCifhtLMnID0+ICdHJywKJ+G0tCcgPT4gJ0gnLAon4bS1JyA9PiAnSScsCifhtLYnID0+ICdKJywKJ+G0tycgPT4gJ0snLAon4bS4JyA9PiAnTCcsCifhtLknID0+ICdNJywKJ+G0uicgPT4gJ04nLAon4bS8JyA9PiAnTycsCifhtL0nID0+ICfIoicsCifhtL4nID0+ICdQJywKJ+G0vycgPT4gJ1InLAon4bWAJyA9PiAnVCcsCifhtYEnID0+ICdVJywKJ+G1gicgPT4gJ1cnLAon4bWDJyA9PiAnYScsCifhtYQnID0+ICfJkCcsCifhtYUnID0+ICfJkScsCifhtYYnID0+ICfhtIInLAon4bWHJyA9PiAnYicsCifhtYgnID0+ICdkJywKJ+G1iScgPT4gJ2UnLAon4bWKJyA9PiAnyZknLAon4bWLJyA9PiAnyZsnLAon4bWMJyA9PiAnyZwnLAon4bWNJyA9PiAnZycsCifhtY8nID0+ICdrJywKJ+G1kCcgPT4gJ20nLAon4bWRJyA9PiAnxYsnLAon4bWSJyA9PiAnbycsCifhtZMnID0+ICfJlCcsCifhtZQnID0+ICfhtJYnLAon4bWVJyA9PiAn4bSXJywKJ+G1licgPT4gJ3AnLAon4bWXJyA9PiAndCcsCifhtZgnID0+ICd1JywKJ+G1mScgPT4gJ+G0nScsCifhtZonID0+ICfJrycsCifhtZsnID0+ICd2JywKJ+G1nCcgPT4gJ+G0pScsCifhtZ0nID0+ICfOsicsCifhtZ4nID0+ICfOsycsCifhtZ8nID0+ICfOtCcsCifhtaAnID0+ICfPhicsCifhtaEnID0+ICfPhycsCifhtaInID0+ICdpJywKJ+G1oycgPT4gJ3InLAon4bWkJyA9PiAndScsCifhtaUnID0+ICd2JywKJ+G1picgPT4gJ86yJywKJ+G1pycgPT4gJ86zJywKJ+G1qCcgPT4gJ8+BJywKJ+G1qScgPT4gJ8+GJywKJ+G1qicgPT4gJ8+HJywKJ+G1uCcgPT4gJ9C9JywKJ+G2mycgPT4gJ8mSJywKJ+G2nCcgPT4gJ2MnLAon4badJyA9PiAnyZUnLAon4baeJyA9PiAnw7AnLAon4bafJyA9PiAnyZwnLAon4bagJyA9PiAnZicsCifhtqEnID0+ICfJnycsCifhtqInID0+ICfJoScsCifhtqMnID0+ICfJpScsCifhtqQnID0+ICfJqCcsCifhtqUnID0+ICfJqScsCifhtqYnID0+ICfJqicsCifhtqcnID0+ICfhtbsnLAon4baoJyA9PiAnyp0nLAon4bapJyA9PiAnya0nLAon4baqJyA9PiAn4baFJywKJ+G2qycgPT4gJ8qfJywKJ+G2rCcgPT4gJ8mxJywKJ+G2rScgPT4gJ8mwJywKJ+G2ricgPT4gJ8myJywKJ+G2rycgPT4gJ8mzJywKJ+G2sCcgPT4gJ8m0JywKJ+G2sScgPT4gJ8m1JywKJ+G2sicgPT4gJ8m4JywKJ+G2sycgPT4gJ8qCJywKJ+G2tCcgPT4gJ8qDJywKJ+G2tScgPT4gJ8arJywKJ+G2ticgPT4gJ8qJJywKJ+G2tycgPT4gJ8qKJywKJ+G2uCcgPT4gJ+G0nCcsCifhtrknID0+ICfKiycsCifhtronID0+ICfKjCcsCifhtrsnID0+ICd6JywKJ+G2vCcgPT4gJ8qQJywKJ+G2vScgPT4gJ8qRJywKJ+G2vicgPT4gJ8qSJywKJ+G2vycgPT4gJ864JywKJ+G6micgPT4gJ2HKvicsCifhupsnID0+ICdzzIcnLAon4b69JyA9PiAnIMyTJywKJ+G+vycgPT4gJyDMkycsCifhv4AnID0+ICcgzYInLAon4b+BJyA9PiAnIMyIzYInLAon4b+NJyA9PiAnIMyTzIAnLAon4b+OJyA9PiAnIMyTzIEnLAon4b+PJyA9PiAnIMyTzYInLAon4b+dJyA9PiAnIMyUzIAnLAon4b+eJyA9PiAnIMyUzIEnLAon4b+fJyA9PiAnIMyUzYInLAon4b+tJyA9PiAnIMyIzIAnLAon4b+uJyA9PiAnIMyIzIEnLAon4b+9JyA9PiAnIMyBJywKJ+G/vicgPT4gJyDMlCcsCifigIAnID0+ICcgJywKJ+KAgScgPT4gJyAnLAon4oCCJyA9PiAnICcsCifigIMnID0+ICcgJywKJ+KAhCcgPT4gJyAnLAon4oCFJyA9PiAnICcsCifigIYnID0+ICcgJywKJ+KAhycgPT4gJyAnLAon4oCIJyA9PiAnICcsCifigIknID0+ICcgJywKJ+KAiicgPT4gJyAnLAon4oCRJyA9PiAn4oCQJywKJ+KAlycgPT4gJyDMsycsCifigKQnID0+ICcuJywKJ+KApScgPT4gJy4uJywKJ+KApicgPT4gJy4uLicsCifigK8nID0+ICcgJywKJ+KAsycgPT4gJ+KAsuKAsicsCifigLQnID0+ICfigLLigLLigLInLAon4oC2JyA9PiAn4oC14oC1JywKJ+KAtycgPT4gJ+KAteKAteKAtScsCifigLwnID0+ICchIScsCifigL4nID0+ICcgzIUnLAon4oGHJyA9PiAnPz8nLAon4oGIJyA9PiAnPyEnLAon4oGJJyA9PiAnIT8nLAon4oGXJyA9PiAn4oCy4oCy4oCy4oCyJywKJ+KBnycgPT4gJyAnLAon4oGwJyA9PiAnMCcsCifigbEnID0+ICdpJywKJ+KBtCcgPT4gJzQnLAon4oG1JyA9PiAnNScsCifigbYnID0+ICc2JywKJ+KBtycgPT4gJzcnLAon4oG4JyA9PiAnOCcsCifigbknID0+ICc5JywKJ+KBuicgPT4gJysnLAon4oG7JyA9PiAn4oiSJywKJ+KBvCcgPT4gJz0nLAon4oG9JyA9PiAnKCcsCifigb4nID0+ICcpJywKJ+KBvycgPT4gJ24nLAon4oKAJyA9PiAnMCcsCifigoEnID0+ICcxJywKJ+KCgicgPT4gJzInLAon4oKDJyA9PiAnMycsCifigoQnID0+ICc0JywKJ+KChScgPT4gJzUnLAon4oKGJyA9PiAnNicsCifigocnID0+ICc3JywKJ+KCiCcgPT4gJzgnLAon4oKJJyA9PiAnOScsCifigoonID0+ICcrJywKJ+KCiycgPT4gJ+KIkicsCifigownID0+ICc9JywKJ+KCjScgPT4gJygnLAon4oKOJyA9PiAnKScsCifigpAnID0+ICdhJywKJ+KCkScgPT4gJ2UnLAon4oKSJyA9PiAnbycsCifigpMnID0+ICd4JywKJ+KClCcgPT4gJ8mZJywKJ+KClScgPT4gJ2gnLAon4oKWJyA9PiAnaycsCifigpcnID0+ICdsJywKJ+KCmCcgPT4gJ20nLAon4oKZJyA9PiAnbicsCifigponID0+ICdwJywKJ+KCmycgPT4gJ3MnLAon4oKcJyA9PiAndCcsCifigqgnID0+ICdScycsCifihIAnID0+ICdhL2MnLAon4oSBJyA9PiAnYS9zJywKJ+KEgicgPT4gJ0MnLAon4oSDJyA9PiAnwrBDJywKJ+KEhScgPT4gJ2MvbycsCifihIYnID0+ICdjL3UnLAon4oSHJyA9PiAnxpAnLAon4oSJJyA9PiAnwrBGJywKJ+KEiicgPT4gJ2cnLAon4oSLJyA9PiAnSCcsCifihIwnID0+ICdIJywKJ+KEjScgPT4gJ0gnLAon4oSOJyA9PiAnaCcsCifihI8nID0+ICfEpycsCifihJAnID0+ICdJJywKJ+KEkScgPT4gJ0knLAon4oSSJyA9PiAnTCcsCifihJMnID0+ICdsJywKJ+KElScgPT4gJ04nLAon4oSWJyA9PiAnTm8nLAon4oSZJyA9PiAnUCcsCifihJonID0+ICdRJywKJ+KEmycgPT4gJ1InLAon4oScJyA9PiAnUicsCifihJ0nID0+ICdSJywKJ+KEoCcgPT4gJ1NNJywKJ+KEoScgPT4gJ1RFTCcsCifihKInID0+ICdUTScsCifihKQnID0+ICdaJywKJ+KEqCcgPT4gJ1onLAon4oSsJyA9PiAnQicsCifihK0nID0+ICdDJywKJ+KErycgPT4gJ2UnLAon4oSwJyA9PiAnRScsCifihLEnID0+ICdGJywKJ+KEsycgPT4gJ00nLAon4oS0JyA9PiAnbycsCifihLUnID0+ICfXkCcsCifihLYnID0+ICfXkScsCifihLcnID0+ICfXkicsCifihLgnID0+ICfXkycsCifihLknID0+ICdpJywKJ+KEuycgPT4gJ0ZBWCcsCifihLwnID0+ICfPgCcsCifihL0nID0+ICfOsycsCifihL4nID0+ICfOkycsCifihL8nID0+ICfOoCcsCifihYAnID0+ICfiiJEnLAon4oWFJyA9PiAnRCcsCifihYYnID0+ICdkJywKJ+KFhycgPT4gJ2UnLAon4oWIJyA9PiAnaScsCifihYknID0+ICdqJywKJ+KFkCcgPT4gJzHigYQ3JywKJ+KFkScgPT4gJzHigYQ5JywKJ+KFkicgPT4gJzHigYQxMCcsCifihZMnID0+ICcx4oGEMycsCifihZQnID0+ICcy4oGEMycsCifihZUnID0+ICcx4oGENScsCifihZYnID0+ICcy4oGENScsCifihZcnID0+ICcz4oGENScsCifihZgnID0+ICc04oGENScsCifihZknID0+ICcx4oGENicsCifihZonID0+ICc14oGENicsCifihZsnID0+ICcx4oGEOCcsCifihZwnID0+ICcz4oGEOCcsCifihZ0nID0+ICc14oGEOCcsCifihZ4nID0+ICc34oGEOCcsCifihZ8nID0+ICcx4oGEJywKJ+KFoCcgPT4gJ0knLAon4oWhJyA9PiAnSUknLAon4oWiJyA9PiAnSUlJJywKJ+KFoycgPT4gJ0lWJywKJ+KFpCcgPT4gJ1YnLAon4oWlJyA9PiAnVkknLAon4oWmJyA9PiAnVklJJywKJ+KFpycgPT4gJ1ZJSUknLAon4oWoJyA9PiAnSVgnLAon4oWpJyA9PiAnWCcsCifihaonID0+ICdYSScsCifihasnID0+ICdYSUknLAon4oWsJyA9PiAnTCcsCifiha0nID0+ICdDJywKJ+KFricgPT4gJ0QnLAon4oWvJyA9PiAnTScsCifihbAnID0+ICdpJywKJ+KFsScgPT4gJ2lpJywKJ+KFsicgPT4gJ2lpaScsCifihbMnID0+ICdpdicsCifihbQnID0+ICd2JywKJ+KFtScgPT4gJ3ZpJywKJ+KFticgPT4gJ3ZpaScsCifihbcnID0+ICd2aWlpJywKJ+KFuCcgPT4gJ2l4JywKJ+KFuScgPT4gJ3gnLAon4oW6JyA9PiAneGknLAon4oW7JyA9PiAneGlpJywKJ+KFvCcgPT4gJ2wnLAon4oW9JyA9PiAnYycsCifihb4nID0+ICdkJywKJ+KFvycgPT4gJ20nLAon4oaJJyA9PiAnMOKBhDMnLAon4oisJyA9PiAn4oir4oirJywKJ+KIrScgPT4gJ+KIq+KIq+KIqycsCifiiK8nID0+ICfiiK7iiK4nLAon4oiwJyA9PiAn4oiu4oiu4oiuJywKJ+KRoCcgPT4gJzEnLAon4pGhJyA9PiAnMicsCifikaInID0+ICczJywKJ+KRoycgPT4gJzQnLAon4pGkJyA9PiAnNScsCifikaUnID0+ICc2JywKJ+KRpicgPT4gJzcnLAon4pGnJyA9PiAnOCcsCifikagnID0+ICc5JywKJ+KRqScgPT4gJzEwJywKJ+KRqicgPT4gJzExJywKJ+KRqycgPT4gJzEyJywKJ+KRrCcgPT4gJzEzJywKJ+KRrScgPT4gJzE0JywKJ+KRricgPT4gJzE1JywKJ+KRrycgPT4gJzE2JywKJ+KRsCcgPT4gJzE3JywKJ+KRsScgPT4gJzE4JywKJ+KRsicgPT4gJzE5JywKJ+KRsycgPT4gJzIwJywKJ+KRtCcgPT4gJygxKScsCifikbUnID0+ICcoMiknLAon4pG2JyA9PiAnKDMpJywKJ+KRtycgPT4gJyg0KScsCifikbgnID0+ICcoNSknLAon4pG5JyA9PiAnKDYpJywKJ+KRuicgPT4gJyg3KScsCifikbsnID0+ICcoOCknLAon4pG8JyA9PiAnKDkpJywKJ+KRvScgPT4gJygxMCknLAon4pG+JyA9PiAnKDExKScsCifikb8nID0+ICcoMTIpJywKJ+KSgCcgPT4gJygxMyknLAon4pKBJyA9PiAnKDE0KScsCifikoInID0+ICcoMTUpJywKJ+KSgycgPT4gJygxNiknLAon4pKEJyA9PiAnKDE3KScsCifikoUnID0+ICcoMTgpJywKJ+KShicgPT4gJygxOSknLAon4pKHJyA9PiAnKDIwKScsCifikognID0+ICcxLicsCifikoknID0+ICcyLicsCifikoonID0+ICczLicsCifikosnID0+ICc0LicsCifikownID0+ICc1LicsCifiko0nID0+ICc2LicsCifiko4nID0+ICc3LicsCifiko8nID0+ICc4LicsCifikpAnID0+ICc5LicsCifikpEnID0+ICcxMC4nLAon4pKSJyA9PiAnMTEuJywKJ+KSkycgPT4gJzEyLicsCifikpQnID0+ICcxMy4nLAon4pKVJyA9PiAnMTQuJywKJ+KSlicgPT4gJzE1LicsCifikpcnID0+ICcxNi4nLAon4pKYJyA9PiAnMTcuJywKJ+KSmScgPT4gJzE4LicsCifikponID0+ICcxOS4nLAon4pKbJyA9PiAnMjAuJywKJ+KSnCcgPT4gJyhhKScsCifikp0nID0+ICcoYiknLAon4pKeJyA9PiAnKGMpJywKJ+KSnycgPT4gJyhkKScsCifikqAnID0+ICcoZSknLAon4pKhJyA9PiAnKGYpJywKJ+KSoicgPT4gJyhnKScsCifikqMnID0+ICcoaCknLAon4pKkJyA9PiAnKGkpJywKJ+KSpScgPT4gJyhqKScsCifikqYnID0+ICcoayknLAon4pKnJyA9PiAnKGwpJywKJ+KSqCcgPT4gJyhtKScsCifikqknID0+ICcobiknLAon4pKqJyA9PiAnKG8pJywKJ+KSqycgPT4gJyhwKScsCifikqwnID0+ICcocSknLAon4pKtJyA9PiAnKHIpJywKJ+KSricgPT4gJyhzKScsCifikq8nID0+ICcodCknLAon4pKwJyA9PiAnKHUpJywKJ+KSsScgPT4gJyh2KScsCifikrInID0+ICcodyknLAon4pKzJyA9PiAnKHgpJywKJ+KStCcgPT4gJyh5KScsCifikrUnID0+ICcoeiknLAon4pK2JyA9PiAnQScsCifikrcnID0+ICdCJywKJ+KSuCcgPT4gJ0MnLAon4pK5JyA9PiAnRCcsCifikronID0+ICdFJywKJ+KSuycgPT4gJ0YnLAon4pK8JyA9PiAnRycsCifikr0nID0+ICdIJywKJ+KSvicgPT4gJ0knLAon4pK/JyA9PiAnSicsCifik4AnID0+ICdLJywKJ+KTgScgPT4gJ0wnLAon4pOCJyA9PiAnTScsCifik4MnID0+ICdOJywKJ+KThCcgPT4gJ08nLAon4pOFJyA9PiAnUCcsCifik4YnID0+ICdRJywKJ+KThycgPT4gJ1InLAon4pOIJyA9PiAnUycsCifik4knID0+ICdUJywKJ+KTiicgPT4gJ1UnLAon4pOLJyA9PiAnVicsCifik4wnID0+ICdXJywKJ+KTjScgPT4gJ1gnLAon4pOOJyA9PiAnWScsCifik48nID0+ICdaJywKJ+KTkCcgPT4gJ2EnLAon4pORJyA9PiAnYicsCifik5InID0+ICdjJywKJ+KTkycgPT4gJ2QnLAon4pOUJyA9PiAnZScsCifik5UnID0+ICdmJywKJ+KTlicgPT4gJ2cnLAon4pOXJyA9PiAnaCcsCifik5gnID0+ICdpJywKJ+KTmScgPT4gJ2onLAon4pOaJyA9PiAnaycsCifik5snID0+ICdsJywKJ+KTnCcgPT4gJ20nLAon4pOdJyA9PiAnbicsCifik54nID0+ICdvJywKJ+KTnycgPT4gJ3AnLAon4pOgJyA9PiAncScsCifik6EnID0+ICdyJywKJ+KToicgPT4gJ3MnLAon4pOjJyA9PiAndCcsCifik6QnID0+ICd1JywKJ+KTpScgPT4gJ3YnLAon4pOmJyA9PiAndycsCifik6cnID0+ICd4JywKJ+KTqCcgPT4gJ3knLAon4pOpJyA9PiAneicsCifik6onID0+ICcwJywKJ+KojCcgPT4gJ+KIq+KIq+KIq+KIqycsCifiqbQnID0+ICc6Oj0nLAon4qm1JyA9PiAnPT0nLAon4qm2JyA9PiAnPT09JywKJ+KxvCcgPT4gJ2onLAon4rG9JyA9PiAnVicsCifita8nID0+ICfitaEnLAon4rqfJyA9PiAn5q+NJywKJ+K7sycgPT4gJ+m+nycsCifivIAnID0+ICfkuIAnLAon4ryBJyA9PiAn5LioJywKJ+K8gicgPT4gJ+S4ticsCifivIMnID0+ICfkuL8nLAon4ryEJyA9PiAn5LmZJywKJ+K8hScgPT4gJ+S6hScsCifivIYnID0+ICfkuownLAon4ryHJyA9PiAn5LqgJywKJ+K8iCcgPT4gJ+S6uicsCifivIknID0+ICflhL8nLAon4ryKJyA9PiAn5YWlJywKJ+K8iycgPT4gJ+WFqycsCifivIwnID0+ICflhoInLAon4ryNJyA9PiAn5YaWJywKJ+K8jicgPT4gJ+WGqycsCifivI8nID0+ICflh6AnLAon4ryQJyA9PiAn5Ye1JywKJ+K8kScgPT4gJ+WIgCcsCifivJInID0+ICflipsnLAon4ryTJyA9PiAn5Yu5JywKJ+K8lCcgPT4gJ+WMlScsCifivJUnID0+ICfljJonLAon4ryWJyA9PiAn5Yy4JywKJ+K8lycgPT4gJ+WNgScsCifivJgnID0+ICfljZwnLAon4ryZJyA9PiAn5Y2pJywKJ+K8micgPT4gJ+WOgicsCifivJsnID0+ICfljrYnLAon4rycJyA9PiAn5Y+IJywKJ+K8nScgPT4gJ+WPoycsCifivJ4nID0+ICflm5cnLAon4ryfJyA9PiAn5ZyfJywKJ+K8oCcgPT4gJ+WjqycsCifivKEnID0+ICflpIInLAon4ryiJyA9PiAn5aSKJywKJ+K8oycgPT4gJ+WklScsCifivKQnID0+ICflpKcnLAon4rylJyA9PiAn5aWzJywKJ+K8picgPT4gJ+WtkCcsCifivKcnID0+ICflroAnLAon4ryoJyA9PiAn5a+4JywKJ+K8qScgPT4gJ+WwjycsCifivKonID0+ICflsKInLAon4ryrJyA9PiAn5bC4JywKJ+K8rCcgPT4gJ+WxricsCifivK0nID0+ICflsbEnLAon4ryuJyA9PiAn5bebJywKJ+K8rycgPT4gJ+W3pScsCifivLAnID0+ICflt7EnLAon4ryxJyA9PiAn5be+JywKJ+K8sicgPT4gJ+W5sicsCifivLMnID0+ICflubonLAon4ry0JyA9PiAn5bm/JywKJ+K8tScgPT4gJ+W7tCcsCifivLYnID0+ICflu74nLAon4ry3JyA9PiAn5byLJywKJ+K8uCcgPT4gJ+W8kycsCifivLknID0+ICflvZAnLAon4ry6JyA9PiAn5b2hJywKJ+K8uycgPT4gJ+W9sycsCifivLwnID0+ICflv4MnLAon4ry9JyA9PiAn5oiIJywKJ+K8vicgPT4gJ+aIticsCifivL8nID0+ICfmiYsnLAon4r2AJyA9PiAn5pSvJywKJ+K9gScgPT4gJ+aUtCcsCifivYInID0+ICfmlocnLAon4r2DJyA9PiAn5paXJywKJ+K9hCcgPT4gJ+aWpCcsCifivYUnID0+ICfmlrknLAon4r2GJyA9PiAn5pegJywKJ+K9hycgPT4gJ+aXpScsCifivYgnID0+ICfmm7AnLAon4r2JJyA9PiAn5pyIJywKJ+K9iicgPT4gJ+acqCcsCifivYsnID0+ICfmrKAnLAon4r2MJyA9PiAn5q2iJywKJ+K9jScgPT4gJ+atuScsCifivY4nID0+ICfmrrMnLAon4r2PJyA9PiAn5q+LJywKJ+K9kCcgPT4gJ+avlCcsCifivZEnID0+ICfmr5snLAon4r2SJyA9PiAn5rCPJywKJ+K9kycgPT4gJ+awlCcsCifivZQnID0+ICfmsLQnLAon4r2VJyA9PiAn54GrJywKJ+K9licgPT4gJ+eIqicsCifivZcnID0+ICfniLYnLAon4r2YJyA9PiAn54i7JywKJ+K9mScgPT4gJ+eIvycsCifivZonID0+ICfniYcnLAon4r2bJyA9PiAn54mZJywKJ+K9nCcgPT4gJ+eJmycsCifivZ0nID0+ICfniqwnLAon4r2eJyA9PiAn546EJywKJ+K9nycgPT4gJ+eOiScsCifivaAnID0+ICfnk5wnLAon4r2hJyA9PiAn55OmJywKJ+K9oicgPT4gJ+eUmCcsCifivaMnID0+ICfnlJ8nLAon4r2kJyA9PiAn55SoJywKJ+K9pScgPT4gJ+eUsCcsCifivaYnID0+ICfnlosnLAon4r2nJyA9PiAn55aSJywKJ+K9qCcgPT4gJ+eZticsCifivaknID0+ICfnmb0nLAon4r2qJyA9PiAn55quJywKJ+K9qycgPT4gJ+eavycsCifivawnID0+ICfnm64nLAon4r2tJyA9PiAn55+bJywKJ+K9ricgPT4gJ+efoicsCifiva8nID0+ICfnn7MnLAon4r2wJyA9PiAn56S6JywKJ+K9sScgPT4gJ+emuCcsCifivbInID0+ICfnpr4nLAon4r2zJyA9PiAn56m0JywKJ+K9tCcgPT4gJ+eriycsCifivbUnID0+ICfnq7knLAon4r22JyA9PiAn57GzJywKJ+K9tycgPT4gJ+ezuCcsCifivbgnID0+ICfnvLYnLAon4r25JyA9PiAn572RJywKJ+K9uicgPT4gJ+e+iicsCifivbsnID0+ICfnvr0nLAon4r28JyA9PiAn6ICBJywKJ+K9vScgPT4gJ+iAjCcsCifivb4nID0+ICfogJInLAon4r2/JyA9PiAn6ICzJywKJ+K+gCcgPT4gJ+iBvycsCifivoEnID0+ICfogoknLAon4r6CJyA9PiAn6IejJywKJ+K+gycgPT4gJ+iHqicsCifivoQnID0+ICfoh7MnLAon4r6FJyA9PiAn6Ie8JywKJ+K+hicgPT4gJ+iIjCcsCifivocnID0+ICfoiJsnLAon4r6IJyA9PiAn6IifJywKJ+K+iScgPT4gJ+iJricsCifivoonID0+ICfoibInLAon4r6LJyA9PiAn6Im4JywKJ+K+jCcgPT4gJ+iZjScsCifivo0nID0+ICfomasnLAon4r6OJyA9PiAn6KGAJywKJ+K+jycgPT4gJ+ihjCcsCifivpAnID0+ICfooaMnLAon4r6RJyA9PiAn6KW+JywKJ+K+kicgPT4gJ+imiycsCifivpMnID0+ICfop5InLAon4r6UJyA9PiAn6KiAJywKJ+K+lScgPT4gJ+iwtycsCifivpYnID0+ICfosYYnLAon4r6XJyA9PiAn6LGVJywKJ+K+mCcgPT4gJ+ixuCcsCifivpknID0+ICfosp0nLAon4r6aJyA9PiAn6LWkJywKJ+K+mycgPT4gJ+i1sCcsCifivpwnID0+ICfotrMnLAon4r6dJyA9PiAn6LqrJywKJ+K+nicgPT4gJ+i7iicsCifivp8nID0+ICfovpsnLAon4r6gJyA9PiAn6L6wJywKJ+K+oScgPT4gJ+i+tScsCifivqInID0+ICfpgpEnLAon4r6jJyA9PiAn6YWJJywKJ+K+pCcgPT4gJ+mHhicsCifivqUnID0+ICfph4wnLAon4r6mJyA9PiAn6YeRJywKJ+K+pycgPT4gJ+mVtycsCifivqgnID0+ICfploAnLAon4r6pJyA9PiAn6ZicJywKJ+K+qicgPT4gJ+maticsCifivqsnID0+ICfpmrknLAon4r6sJyA9PiAn6ZuoJywKJ+K+rScgPT4gJ+mdkScsCifivq4nID0+ICfpnZ4nLAon4r6vJyA9PiAn6Z2iJywKJ+K+sCcgPT4gJ+mdqScsCifivrEnID0+ICfpn4snLAon4r6yJyA9PiAn6Z+tJywKJ+K+sycgPT4gJ+mfsycsCifivrQnID0+ICfpoIEnLAon4r61JyA9PiAn6aKoJywKJ+K+ticgPT4gJ+mjmycsCifivrcnID0+ICfpo58nLAon4r64JyA9PiAn6aaWJywKJ+K+uScgPT4gJ+mmmScsCifivronID0+ICfppqwnLAon4r67JyA9PiAn6aqoJywKJ+K+vCcgPT4gJ+mrmCcsCifivr0nID0+ICfpq58nLAon4r6+JyA9PiAn6aylJywKJ+K+vycgPT4gJ+msrycsCifiv4AnID0+ICfprLInLAon4r+BJyA9PiAn6ay8JywKJ+K/gicgPT4gJ+mtmicsCifiv4MnID0+ICfps6UnLAon4r+EJyA9PiAn6bm1JywKJ+K/hScgPT4gJ+m5vycsCifiv4YnID0+ICfpuqUnLAon4r+HJyA9PiAn6bq7JywKJ+K/iCcgPT4gJ+m7gycsCifiv4knID0+ICfpu40nLAon4r+KJyA9PiAn6buRJywKJ+K/iycgPT4gJ+m7uScsCifiv4wnID0+ICfpu70nLAon4r+NJyA9PiAn6byOJywKJ+K/jicgPT4gJ+m8kycsCifiv48nID0+ICfpvKAnLAon4r+QJyA9PiAn6by7JywKJ+K/kScgPT4gJ+m9iicsCifiv5InID0+ICfpvZInLAon4r+TJyA9PiAn6b6NJywKJ+K/lCcgPT4gJ+m+nCcsCifiv5UnID0+ICfpvqAnLAon44CAJyA9PiAnICcsCifjgLYnID0+ICfjgJInLAon44C4JyA9PiAn5Y2BJywKJ+OAuScgPT4gJ+WNhCcsCifjgLonID0+ICfljYUnLAon44KbJyA9PiAnIOOCmScsCifjgpwnID0+ICcg44KaJywKJ+OCnycgPT4gJ+OCiOOCiicsCifjg78nID0+ICfjgrPjg4gnLAon44SxJyA9PiAn4YSAJywKJ+OEsicgPT4gJ+GEgScsCifjhLMnID0+ICfhhqonLAon44S0JyA9PiAn4YSCJywKJ+OEtScgPT4gJ+GGrCcsCifjhLYnID0+ICfhhq0nLAon44S3JyA9PiAn4YSDJywKJ+OEuCcgPT4gJ+GEhCcsCifjhLknID0+ICfhhIUnLAon44S6JyA9PiAn4YawJywKJ+OEuycgPT4gJ+GGsScsCifjhLwnID0+ICfhhrInLAon44S9JyA9PiAn4YazJywKJ+OEvicgPT4gJ+GGtCcsCifjhL8nID0+ICfhhrUnLAon44WAJyA9PiAn4YSaJywKJ+OFgScgPT4gJ+GEhicsCifjhYInID0+ICfhhIcnLAon44WDJyA9PiAn4YSIJywKJ+OFhCcgPT4gJ+GEoScsCifjhYUnID0+ICfhhIknLAon44WGJyA9PiAn4YSKJywKJ+OFhycgPT4gJ+GEiycsCifjhYgnID0+ICfhhIwnLAon44WJJyA9PiAn4YSNJywKJ+OFiicgPT4gJ+GEjicsCifjhYsnID0+ICfhhI8nLAon44WMJyA9PiAn4YSQJywKJ+OFjScgPT4gJ+GEkScsCifjhY4nID0+ICfhhJInLAon44WPJyA9PiAn4YWhJywKJ+OFkCcgPT4gJ+GFoicsCifjhZEnID0+ICfhhaMnLAon44WSJyA9PiAn4YWkJywKJ+OFkycgPT4gJ+GFpScsCifjhZQnID0+ICfhhaYnLAon44WVJyA9PiAn4YWnJywKJ+OFlicgPT4gJ+GFqCcsCifjhZcnID0+ICfhhaknLAon44WYJyA9PiAn4YWqJywKJ+OFmScgPT4gJ+GFqycsCifjhZonID0+ICfhhawnLAon44WbJyA9PiAn4YWtJywKJ+OFnCcgPT4gJ+GFricsCifjhZ0nID0+ICfhha8nLAon44WeJyA9PiAn4YWwJywKJ+OFnycgPT4gJ+GFsScsCifjhaAnID0+ICfhhbInLAon44WhJyA9PiAn4YWzJywKJ+OFoicgPT4gJ+GFtCcsCifjhaMnID0+ICfhhbUnLAon44WkJyA9PiAn4YWgJywKJ+OFpScgPT4gJ+GElCcsCifjhaYnID0+ICfhhJUnLAon44WnJyA9PiAn4YeHJywKJ+OFqCcgPT4gJ+GHiCcsCifjhaknID0+ICfhh4wnLAon44WqJyA9PiAn4YeOJywKJ+OFqycgPT4gJ+GHkycsCifjhawnID0+ICfhh5cnLAon44WtJyA9PiAn4YeZJywKJ+OFricgPT4gJ+GEnCcsCifjha8nID0+ICfhh50nLAon44WwJyA9PiAn4YefJywKJ+OFsScgPT4gJ+GEnScsCifjhbInID0+ICfhhJ4nLAon44WzJyA9PiAn4YSgJywKJ+OFtCcgPT4gJ+GEoicsCifjhbUnID0+ICfhhKMnLAon44W2JyA9PiAn4YSnJywKJ+OFtycgPT4gJ+GEqScsCifjhbgnID0+ICfhhKsnLAon44W5JyA9PiAn4YSsJywKJ+OFuicgPT4gJ+GErScsCifjhbsnID0+ICfhhK4nLAon44W8JyA9PiAn4YSvJywKJ+OFvScgPT4gJ+GEsicsCifjhb4nID0+ICfhhLYnLAon44W/JyA9PiAn4YWAJywKJ+OGgCcgPT4gJ+GFhycsCifjhoEnID0+ICfhhYwnLAon44aCJyA9PiAn4YexJywKJ+OGgycgPT4gJ+GHsicsCifjhoQnID0+ICfhhZcnLAon44aFJyA9PiAn4YWYJywKJ+OGhicgPT4gJ+GFmScsCifjhocnID0+ICfhhoQnLAon44aIJyA9PiAn4YaFJywKJ+OGiScgPT4gJ+GGiCcsCifjhoonID0+ICfhhpEnLAon44aLJyA9PiAn4YaSJywKJ+OGjCcgPT4gJ+GGlCcsCifjho0nID0+ICfhhp4nLAon44aOJyA9PiAn4YahJywKJ+OGkicgPT4gJ+S4gCcsCifjhpMnID0+ICfkuownLAon44aUJyA9PiAn5LiJJywKJ+OGlScgPT4gJ+WbmycsCifjhpYnID0+ICfkuIonLAon44aXJyA9PiAn5LitJywKJ+OGmCcgPT4gJ+S4iycsCifjhpknID0+ICfnlLInLAon44aaJyA9PiAn5LmZJywKJ+OGmycgPT4gJ+S4mScsCifjhpwnID0+ICfkuIEnLAon44adJyA9PiAn5aSpJywKJ+OGnicgPT4gJ+WcsCcsCifjhp8nID0+ICfkuronLAon44iAJyA9PiAnKOGEgCknLAon44iBJyA9PiAnKOGEgiknLAon44iCJyA9PiAnKOGEgyknLAon44iDJyA9PiAnKOGEhSknLAon44iEJyA9PiAnKOGEhiknLAon44iFJyA9PiAnKOGEhyknLAon44iGJyA9PiAnKOGEiSknLAon44iHJyA9PiAnKOGEiyknLAon44iIJyA9PiAnKOGEjCknLAon44iJJyA9PiAnKOGEjiknLAon44iKJyA9PiAnKOGEjyknLAon44iLJyA9PiAnKOGEkCknLAon44iMJyA9PiAnKOGEkSknLAon44iNJyA9PiAnKOGEkiknLAon44iOJyA9PiAnKOGEgOGFoSknLAon44iPJyA9PiAnKOGEguGFoSknLAon44iQJyA9PiAnKOGEg+GFoSknLAon44iRJyA9PiAnKOGEheGFoSknLAon44iSJyA9PiAnKOGEhuGFoSknLAon44iTJyA9PiAnKOGEh+GFoSknLAon44iUJyA9PiAnKOGEieGFoSknLAon44iVJyA9PiAnKOGEi+GFoSknLAon44iWJyA9PiAnKOGEjOGFoSknLAon44iXJyA9PiAnKOGEjuGFoSknLAon44iYJyA9PiAnKOGEj+GFoSknLAon44iZJyA9PiAnKOGEkOGFoSknLAon44iaJyA9PiAnKOGEkeGFoSknLAon44ibJyA9PiAnKOGEkuGFoSknLAon44icJyA9PiAnKOGEjOGFriknLAon44idJyA9PiAnKOGEi+GFqeGEjOGFpeGGqyknLAon44ieJyA9PiAnKOGEi+GFqeGEkuGFriknLAon44igJyA9PiAnKOS4gCknLAon44ihJyA9PiAnKOS6jCknLAon44iiJyA9PiAnKOS4iSknLAon44ijJyA9PiAnKOWbmyknLAon44ikJyA9PiAnKOS6lCknLAon44ilJyA9PiAnKOWFrSknLAon44imJyA9PiAnKOS4gyknLAon44inJyA9PiAnKOWFqyknLAon44ioJyA9PiAnKOS5nSknLAon44ipJyA9PiAnKOWNgSknLAon44iqJyA9PiAnKOaciCknLAon44irJyA9PiAnKOeBqyknLAon44isJyA9PiAnKOawtCknLAon44itJyA9PiAnKOacqCknLAon44iuJyA9PiAnKOmHkSknLAon44ivJyA9PiAnKOWcnyknLAon44iwJyA9PiAnKOaXpSknLAon44ixJyA9PiAnKOagqiknLAon44iyJyA9PiAnKOaciSknLAon44izJyA9PiAnKOekviknLAon44i0JyA9PiAnKOWQjSknLAon44i1JyA9PiAnKOeJuSknLAon44i2JyA9PiAnKOiyoSknLAon44i3JyA9PiAnKOelnSknLAon44i4JyA9PiAnKOWKtCknLAon44i5JyA9PiAnKOS7oyknLAon44i6JyA9PiAnKOWRvCknLAon44i7JyA9PiAnKOWtpiknLAon44i8JyA9PiAnKOeboyknLAon44i9JyA9PiAnKOS8gSknLAon44i+JyA9PiAnKOizhyknLAon44i/JyA9PiAnKOWNlCknLAon44mAJyA9PiAnKOelrSknLAon44mBJyA9PiAnKOS8kSknLAon44mCJyA9PiAnKOiHqiknLAon44mDJyA9PiAnKOiHsyknLAon44mEJyA9PiAn5ZWPJywKJ+OJhScgPT4gJ+W5vCcsCifjiYYnID0+ICfmlocnLAon44mHJyA9PiAn566PJywKJ+OJkCcgPT4gJ1BURScsCifjiZEnID0+ICcyMScsCifjiZInID0+ICcyMicsCifjiZMnID0+ICcyMycsCifjiZQnID0+ICcyNCcsCifjiZUnID0+ICcyNScsCifjiZYnID0+ICcyNicsCifjiZcnID0+ICcyNycsCifjiZgnID0+ICcyOCcsCifjiZknID0+ICcyOScsCifjiZonID0+ICczMCcsCifjiZsnID0+ICczMScsCifjiZwnID0+ICczMicsCifjiZ0nID0+ICczMycsCifjiZ4nID0+ICczNCcsCifjiZ8nID0+ICczNScsCifjiaAnID0+ICfhhIAnLAon44mhJyA9PiAn4YSCJywKJ+OJoicgPT4gJ+GEgycsCifjiaMnID0+ICfhhIUnLAon44mkJyA9PiAn4YSGJywKJ+OJpScgPT4gJ+GEhycsCifjiaYnID0+ICfhhIknLAon44mnJyA9PiAn4YSLJywKJ+OJqCcgPT4gJ+GEjCcsCifjiaknID0+ICfhhI4nLAon44mqJyA9PiAn4YSPJywKJ+OJqycgPT4gJ+GEkCcsCifjiawnID0+ICfhhJEnLAon44mtJyA9PiAn4YSSJywKJ+OJricgPT4gJ+GEgOGFoScsCifjia8nID0+ICfhhILhhaEnLAon44mwJyA9PiAn4YSD4YWhJywKJ+OJsScgPT4gJ+GEheGFoScsCifjibInID0+ICfhhIbhhaEnLAon44mzJyA9PiAn4YSH4YWhJywKJ+OJtCcgPT4gJ+GEieGFoScsCifjibUnID0+ICfhhIvhhaEnLAon44m2JyA9PiAn4YSM4YWhJywKJ+OJtycgPT4gJ+GEjuGFoScsCifjibgnID0+ICfhhI/hhaEnLAon44m5JyA9PiAn4YSQ4YWhJywKJ+OJuicgPT4gJ+GEkeGFoScsCifjibsnID0+ICfhhJLhhaEnLAon44m8JyA9PiAn4YSO4YWh4Ya34YSA4YWpJywKJ+OJvScgPT4gJ+GEjOGFruGEi+GFtCcsCifjib4nID0+ICfhhIvhha4nLAon44qAJyA9PiAn5LiAJywKJ+OKgScgPT4gJ+S6jCcsCifjioInID0+ICfkuIknLAon44qDJyA9PiAn5ZubJywKJ+OKhCcgPT4gJ+S6lCcsCifjioUnID0+ICflha0nLAon44qGJyA9PiAn5LiDJywKJ+OKhycgPT4gJ+WFqycsCifjiognID0+ICfkuZ0nLAon44qJJyA9PiAn5Y2BJywKJ+OKiicgPT4gJ+aciCcsCifjiosnID0+ICfngasnLAon44qMJyA9PiAn5rC0JywKJ+OKjScgPT4gJ+acqCcsCifjio4nID0+ICfph5EnLAon44qPJyA9PiAn5ZyfJywKJ+OKkCcgPT4gJ+aXpScsCifjipEnID0+ICfmoKonLAon44qSJyA9PiAn5pyJJywKJ+OKkycgPT4gJ+ekvicsCifjipQnID0+ICflkI0nLAon44qVJyA9PiAn54m5JywKJ+OKlicgPT4gJ+iyoScsCifjipcnID0+ICfnpZ0nLAon44qYJyA9PiAn5Yq0JywKJ+OKmScgPT4gJ+enmCcsCifjiponID0+ICfnlLcnLAon44qbJyA9PiAn5aWzJywKJ+OKnCcgPT4gJ+mBqScsCifjip0nID0+ICflhKonLAon44qeJyA9PiAn5Y2wJywKJ+OKnycgPT4gJ+azqCcsCifjiqAnID0+ICfpoIUnLAon44qhJyA9PiAn5LyRJywKJ+OKoicgPT4gJ+WGmScsCifjiqMnID0+ICfmraMnLAon44qkJyA9PiAn5LiKJywKJ+OKpScgPT4gJ+S4rScsCifjiqYnID0+ICfkuIsnLAon44qnJyA9PiAn5bemJywKJ+OKqCcgPT4gJ+WPsycsCifjiqknID0+ICfljLsnLAon44qqJyA9PiAn5a6XJywKJ+OKqycgPT4gJ+WtpicsCifjiqwnID0+ICfnm6MnLAon44qtJyA9PiAn5LyBJywKJ+OKricgPT4gJ+izhycsCifjiq8nID0+ICfljZQnLAon44qwJyA9PiAn5aScJywKJ+OKsScgPT4gJzM2JywKJ+OKsicgPT4gJzM3JywKJ+OKsycgPT4gJzM4JywKJ+OKtCcgPT4gJzM5JywKJ+OKtScgPT4gJzQwJywKJ+OKticgPT4gJzQxJywKJ+OKtycgPT4gJzQyJywKJ+OKuCcgPT4gJzQzJywKJ+OKuScgPT4gJzQ0JywKJ+OKuicgPT4gJzQ1JywKJ+OKuycgPT4gJzQ2JywKJ+OKvCcgPT4gJzQ3JywKJ+OKvScgPT4gJzQ4JywKJ+OKvicgPT4gJzQ5JywKJ+OKvycgPT4gJzUwJywKJ+OLgCcgPT4gJzHmnIgnLAon44uBJyA9PiAnMuaciCcsCifji4InID0+ICcz5pyIJywKJ+OLgycgPT4gJzTmnIgnLAon44uEJyA9PiAnNeaciCcsCifji4UnID0+ICc25pyIJywKJ+OLhicgPT4gJzfmnIgnLAon44uHJyA9PiAnOOaciCcsCifji4gnID0+ICc55pyIJywKJ+OLiScgPT4gJzEw5pyIJywKJ+OLiicgPT4gJzEx5pyIJywKJ+OLiycgPT4gJzEy5pyIJywKJ+OLjCcgPT4gJ0hnJywKJ+OLjScgPT4gJ2VyZycsCifji44nID0+ICdlVicsCifji48nID0+ICdMVEQnLAon44uQJyA9PiAn44KiJywKJ+OLkScgPT4gJ+OCpCcsCifji5InID0+ICfjgqYnLAon44uTJyA9PiAn44KoJywKJ+OLlCcgPT4gJ+OCqicsCifji5UnID0+ICfjgqsnLAon44uWJyA9PiAn44KtJywKJ+OLlycgPT4gJ+OCrycsCifji5gnID0+ICfjgrEnLAon44uZJyA9PiAn44KzJywKJ+OLmicgPT4gJ+OCtScsCifji5snID0+ICfjgrcnLAon44ucJyA9PiAn44K5JywKJ+OLnScgPT4gJ+OCuycsCifji54nID0+ICfjgr0nLAon44ufJyA9PiAn44K/JywKJ+OLoCcgPT4gJ+ODgScsCifji6EnID0+ICfjg4QnLAon44uiJyA9PiAn44OGJywKJ+OLoycgPT4gJ+ODiCcsCifji6QnID0+ICfjg4onLAon44ulJyA9PiAn44OLJywKJ+OLpicgPT4gJ+ODjCcsCifji6cnID0+ICfjg40nLAon44uoJyA9PiAn44OOJywKJ+OLqScgPT4gJ+ODjycsCifji6onID0+ICfjg5InLAon44urJyA9PiAn44OVJywKJ+OLrCcgPT4gJ+ODmCcsCifji60nID0+ICfjg5snLAon44uuJyA9PiAn44OeJywKJ+OLrycgPT4gJ+ODnycsCifji7AnID0+ICfjg6AnLAon44uxJyA9PiAn44OhJywKJ+OLsicgPT4gJ+ODoicsCifji7MnID0+ICfjg6QnLAon44u0JyA9PiAn44OmJywKJ+OLtScgPT4gJ+ODqCcsCifji7YnID0+ICfjg6knLAon44u3JyA9PiAn44OqJywKJ+OLuCcgPT4gJ+ODqycsCifji7knID0+ICfjg6wnLAon44u6JyA9PiAn44OtJywKJ+OLuycgPT4gJ+ODrycsCifji7wnID0+ICfjg7AnLAon44u9JyA9PiAn44OxJywKJ+OLvicgPT4gJ+ODsicsCifji78nID0+ICfku6TlkownLAon44yAJyA9PiAn44Ki44OP44Ka44O844OIJywKJ+OMgScgPT4gJ+OCouODq+ODleOCoScsCifjjIInID0+ICfjgqLjg7Pjg5jjgprjgqInLAon44yDJyA9PiAn44Ki44O844OrJywKJ+OMhCcgPT4gJ+OCpOODi+ODs+OCr+OCmScsCifjjIUnID0+ICfjgqTjg7Pjg4EnLAon44yGJyA9PiAn44Km44Kp44OzJywKJ+OMhycgPT4gJ+OCqOOCueOCr+ODvOODiOOCmScsCifjjIgnID0+ICfjgqjjg7zjgqvjg7wnLAon44yJJyA9PiAn44Kq44Oz44K5JywKJ+OMiicgPT4gJ+OCquODvOODoCcsCifjjIsnID0+ICfjgqvjgqTjg6onLAon44yMJyA9PiAn44Kr44Op44OD44OIJywKJ+OMjScgPT4gJ+OCq+ODreODquODvCcsCifjjI4nID0+ICfjgqvjgpnjg63jg7MnLAon44yPJyA9PiAn44Kr44KZ44Oz44OeJywKJ+OMkCcgPT4gJ+OCreOCmeOCq+OCmScsCifjjJEnID0+ICfjgq3jgpnjg4vjg7wnLAon44ySJyA9PiAn44Kt44Ol44Oq44O8JywKJ+OMkycgPT4gJ+OCreOCmeODq+OCv+OCmeODvCcsCifjjJQnID0+ICfjgq3jg60nLAon44yVJyA9PiAn44Kt44Ot44Kv44KZ44Op44OgJywKJ+OMlicgPT4gJ+OCreODreODoeODvOODiOODqycsCifjjJcnID0+ICfjgq3jg63jg6/jg4Pjg4gnLAon44yYJyA9PiAn44Kv44KZ44Op44OgJywKJ+OMmScgPT4gJ+OCr+OCmeODqeODoOODiOODsycsCifjjJonID0+ICfjgq/jg6vjgrvjgpnjgqTjg60nLAon44ybJyA9PiAn44Kv44Ot44O844ONJywKJ+OMnCcgPT4gJ+OCseODvOOCuScsCifjjJ0nID0+ICfjgrPjg6vjg4onLAon44yeJyA9PiAn44Kz44O844Ob44KaJywKJ+OMnycgPT4gJ+OCteOCpOOCr+ODqycsCifjjKAnID0+ICfjgrXjg7Pjg4Hjg7zjg6AnLAon44yhJyA9PiAn44K344Oq44Oz44Kv44KZJywKJ+OMoicgPT4gJ+OCu+ODs+ODgScsCifjjKMnID0+ICfjgrvjg7Pjg4gnLAon44ykJyA9PiAn44K/44KZ44O844K5JywKJ+OMpScgPT4gJ+ODhuOCmeOCtycsCifjjKYnID0+ICfjg4jjgpnjg6snLAon44ynJyA9PiAn44OI44OzJywKJ+OMqCcgPT4gJ+ODiuODjicsCifjjKknID0+ICfjg47jg4Pjg4gnLAon44yqJyA9PiAn44OP44Kk44OEJywKJ+OMqycgPT4gJ+ODj+OCmuODvOOCu+ODs+ODiCcsCifjjKwnID0+ICfjg4/jgprjg7zjg4QnLAon44ytJyA9PiAn44OP44KZ44O844Os44OrJywKJ+OMricgPT4gJ+ODkuOCmuOCouOCueODiOODqycsCifjjK8nID0+ICfjg5Ljgprjgq/jg6snLAon44ywJyA9PiAn44OS44Ka44KzJywKJ+OMsScgPT4gJ+ODkuOCmeODqycsCifjjLInID0+ICfjg5XjgqHjg6njg4Pjg4jjgpknLAon44yzJyA9PiAn44OV44Kj44O844OIJywKJ+OMtCcgPT4gJ+ODleOCmeODg+OCt+OCp+ODqycsCifjjLUnID0+ICfjg5Xjg6njg7MnLAon44y2JyA9PiAn44OY44Kv44K/44O844OrJywKJ+OMtycgPT4gJ+ODmOOCmuOCvScsCifjjLgnID0+ICfjg5jjgprjg4vjg5InLAon44y5JyA9PiAn44OY44Or44OEJywKJ+OMuicgPT4gJ+ODmOOCmuODs+OCuScsCifjjLsnID0+ICfjg5jjgprjg7zjgrfjgpknLAon44y8JyA9PiAn44OY44KZ44O844K/JywKJ+OMvScgPT4gJ+ODm+OCmuOCpOODs+ODiCcsCifjjL4nID0+ICfjg5vjgpnjg6vjg4gnLAon44y/JyA9PiAn44Ob44OzJywKJ+ONgCcgPT4gJ+ODm+OCmuODs+ODiOOCmScsCifjjYEnID0+ICfjg5vjg7zjg6snLAon442CJyA9PiAn44Ob44O844OzJywKJ+ONgycgPT4gJ+ODnuOCpOOCr+ODrScsCifjjYQnID0+ICfjg57jgqTjg6snLAon442FJyA9PiAn44Oe44OD44OPJywKJ+ONhicgPT4gJ+ODnuODq+OCrycsCifjjYcnID0+ICfjg57jg7Pjgrfjg6fjg7MnLAon442IJyA9PiAn44Of44Kv44Ot44OzJywKJ+ONiScgPT4gJ+ODn+ODqicsCifjjYonID0+ICfjg5/jg6rjg4/jgpnjg7zjg6snLAon442LJyA9PiAn44Oh44Kr44KZJywKJ+ONjCcgPT4gJ+ODoeOCq+OCmeODiOODsycsCifjjY0nID0+ICfjg6Hjg7zjg4jjg6snLAon442OJyA9PiAn44Ok44O844OI44KZJywKJ+ONjycgPT4gJ+ODpOODvOODqycsCifjjZAnID0+ICfjg6bjgqLjg7MnLAon442RJyA9PiAn44Oq44OD44OI44OrJywKJ+ONkicgPT4gJ+ODquODqScsCifjjZMnID0+ICfjg6vjg5Ljgprjg7wnLAon442UJyA9PiAn44Or44O844OV44KZ44OrJywKJ+ONlScgPT4gJ+ODrOODoCcsCifjjZYnID0+ICfjg6zjg7Pjg4jjgrHjgpnjg7MnLAon442XJyA9PiAn44Ov44OD44OIJywKJ+ONmCcgPT4gJzDngrknLAon442ZJyA9PiAnMeeCuScsCifjjZonID0+ICcy54K5JywKJ+ONmycgPT4gJzPngrknLAon442cJyA9PiAnNOeCuScsCifjjZ0nID0+ICc154K5JywKJ+ONnicgPT4gJzbngrknLAon442fJyA9PiAnN+eCuScsCifjjaAnID0+ICc454K5JywKJ+ONoScgPT4gJznngrknLAon442iJyA9PiAnMTDngrknLAon442jJyA9PiAnMTHngrknLAon442kJyA9PiAnMTLngrknLAon442lJyA9PiAnMTPngrknLAon442mJyA9PiAnMTTngrknLAon442nJyA9PiAnMTXngrknLAon442oJyA9PiAnMTbngrknLAon442pJyA9PiAnMTfngrknLAon442qJyA9PiAnMTjngrknLAon442rJyA9PiAnMTnngrknLAon442sJyA9PiAnMjDngrknLAon442tJyA9PiAnMjHngrknLAon442uJyA9PiAnMjLngrknLAon442vJyA9PiAnMjPngrknLAon442wJyA9PiAnMjTngrknLAon442xJyA9PiAnaFBhJywKJ+ONsicgPT4gJ2RhJywKJ+ONsycgPT4gJ0FVJywKJ+ONtCcgPT4gJ2JhcicsCifjjbUnID0+ICdvVicsCifjjbYnID0+ICdwYycsCifjjbcnID0+ICdkbScsCifjjbgnID0+ICdkbTInLAon4425JyA9PiAnZG0zJywKJ+ONuicgPT4gJ0lVJywKJ+ONuycgPT4gJ+W5s+aIkCcsCifjjbwnID0+ICfmmK3lkownLAon4429JyA9PiAn5aSn5q2jJywKJ+ONvicgPT4gJ+aYjuayuycsCifjjb8nID0+ICfmoKrlvI/kvJrnpL4nLAon446AJyA9PiAncEEnLAon446BJyA9PiAnbkEnLAon446CJyA9PiAnzrxBJywKJ+OOgycgPT4gJ21BJywKJ+OOhCcgPT4gJ2tBJywKJ+OOhScgPT4gJ0tCJywKJ+OOhicgPT4gJ01CJywKJ+OOhycgPT4gJ0dCJywKJ+OOiCcgPT4gJ2NhbCcsCifjjoknID0+ICdrY2FsJywKJ+OOiicgPT4gJ3BGJywKJ+OOiycgPT4gJ25GJywKJ+OOjCcgPT4gJ868RicsCifjjo0nID0+ICfOvGcnLAon446OJyA9PiAnbWcnLAon446PJyA9PiAna2cnLAon446QJyA9PiAnSHonLAon446RJyA9PiAna0h6JywKJ+OOkicgPT4gJ01IeicsCifjjpMnID0+ICdHSHonLAon446UJyA9PiAnVEh6JywKJ+OOlScgPT4gJ868bCcsCifjjpYnID0+ICdtbCcsCifjjpcnID0+ICdkbCcsCifjjpgnID0+ICdrbCcsCifjjpknID0+ICdmbScsCifjjponID0+ICdubScsCifjjpsnID0+ICfOvG0nLAon446cJyA9PiAnbW0nLAon446dJyA9PiAnY20nLAon446eJyA9PiAna20nLAon446fJyA9PiAnbW0yJywKJ+OOoCcgPT4gJ2NtMicsCifjjqEnID0+ICdtMicsCifjjqInID0+ICdrbTInLAon446jJyA9PiAnbW0zJywKJ+OOpCcgPT4gJ2NtMycsCifjjqUnID0+ICdtMycsCifjjqYnID0+ICdrbTMnLAon446nJyA9PiAnbeKIlXMnLAon446oJyA9PiAnbeKIlXMyJywKJ+OOqScgPT4gJ1BhJywKJ+OOqicgPT4gJ2tQYScsCifjjqsnID0+ICdNUGEnLAon446sJyA9PiAnR1BhJywKJ+OOrScgPT4gJ3JhZCcsCifjjq4nID0+ICdyYWTiiJVzJywKJ+OOrycgPT4gJ3JhZOKIlXMyJywKJ+OOsCcgPT4gJ3BzJywKJ+OOsScgPT4gJ25zJywKJ+OOsicgPT4gJ868cycsCifjjrMnID0+ICdtcycsCifjjrQnID0+ICdwVicsCifjjrUnID0+ICduVicsCifjjrYnID0+ICfOvFYnLAon4463JyA9PiAnbVYnLAon4464JyA9PiAna1YnLAon4465JyA9PiAnTVYnLAon4466JyA9PiAncFcnLAon4467JyA9PiAnblcnLAon4468JyA9PiAnzrxXJywKJ+OOvScgPT4gJ21XJywKJ+OOvicgPT4gJ2tXJywKJ+OOvycgPT4gJ01XJywKJ+OPgCcgPT4gJ2vOqScsCifjj4EnID0+ICdNzqknLAon44+CJyA9PiAnYS5tLicsCifjj4MnID0+ICdCcScsCifjj4QnID0+ICdjYycsCifjj4UnID0+ICdjZCcsCifjj4YnID0+ICdD4oiVa2cnLAon44+HJyA9PiAnQ28uJywKJ+OPiCcgPT4gJ2RCJywKJ+OPiScgPT4gJ0d5JywKJ+OPiicgPT4gJ2hhJywKJ+OPiycgPT4gJ0hQJywKJ+OPjCcgPT4gJ2luJywKJ+OPjScgPT4gJ0tLJywKJ+OPjicgPT4gJ0tNJywKJ+OPjycgPT4gJ2t0JywKJ+OPkCcgPT4gJ2xtJywKJ+OPkScgPT4gJ2xuJywKJ+OPkicgPT4gJ2xvZycsCifjj5MnID0+ICdseCcsCifjj5QnID0+ICdtYicsCifjj5UnID0+ICdtaWwnLAon44+WJyA9PiAnbW9sJywKJ+OPlycgPT4gJ1BIJywKJ+OPmCcgPT4gJ3AubS4nLAon44+ZJyA9PiAnUFBNJywKJ+OPmicgPT4gJ1BSJywKJ+OPmycgPT4gJ3NyJywKJ+OPnCcgPT4gJ1N2JywKJ+OPnScgPT4gJ1diJywKJ+OPnicgPT4gJ1biiJVtJywKJ+OPnycgPT4gJ0HiiJVtJywKJ+OPoCcgPT4gJzHml6UnLAon44+hJyA9PiAnMuaXpScsCifjj6InID0+ICcz5pelJywKJ+OPoycgPT4gJzTml6UnLAon44+kJyA9PiAnNeaXpScsCifjj6UnID0+ICc25pelJywKJ+OPpicgPT4gJzfml6UnLAon44+nJyA9PiAnOOaXpScsCifjj6gnID0+ICc55pelJywKJ+OPqScgPT4gJzEw5pelJywKJ+OPqicgPT4gJzEx5pelJywKJ+OPqycgPT4gJzEy5pelJywKJ+OPrCcgPT4gJzEz5pelJywKJ+OPrScgPT4gJzE05pelJywKJ+OPricgPT4gJzE15pelJywKJ+OPrycgPT4gJzE25pelJywKJ+OPsCcgPT4gJzE35pelJywKJ+OPsScgPT4gJzE45pelJywKJ+OPsicgPT4gJzE55pelJywKJ+OPsycgPT4gJzIw5pelJywKJ+OPtCcgPT4gJzIx5pelJywKJ+OPtScgPT4gJzIy5pelJywKJ+OPticgPT4gJzIz5pelJywKJ+OPtycgPT4gJzI05pelJywKJ+OPuCcgPT4gJzI15pelJywKJ+OPuScgPT4gJzI25pelJywKJ+OPuicgPT4gJzI35pelJywKJ+OPuycgPT4gJzI45pelJywKJ+OPvCcgPT4gJzI55pelJywKJ+OPvScgPT4gJzMw5pelJywKJ+OPvicgPT4gJzMx5pelJywKJ+OPvycgPT4gJ2dhbCcsCifqmpwnID0+ICfRiicsCifqmp0nID0+ICfRjCcsCifqnbAnID0+ICfqna8nLAon6p+4JyA9PiAnxKYnLAon6p+5JyA9PiAnxZMnLAon6q2cJyA9PiAn6pynJywKJ+qtnScgPT4gJ+qstycsCifqrZ4nID0+ICfJqycsCifqrZ8nID0+ICfqrZInLAon6q2pJyA9PiAnyo0nLAon76yAJyA9PiAnZmYnLAon76yBJyA9PiAnZmknLAon76yCJyA9PiAnZmwnLAon76yDJyA9PiAnZmZpJywKJ++shCcgPT4gJ2ZmbCcsCifvrIUnID0+ICdzdCcsCifvrIYnID0+ICdzdCcsCifvrJMnID0+ICfVtNW2JywKJ++slCcgPT4gJ9W01aUnLAon76yVJyA9PiAn1bTVqycsCifvrJYnID0+ICfVvtW2JywKJ++slycgPT4gJ9W01a0nLAon76ygJyA9PiAn16InLAon76yhJyA9PiAn15AnLAon76yiJyA9PiAn15MnLAon76yjJyA9PiAn15QnLAon76ykJyA9PiAn15snLAon76ylJyA9PiAn15wnLAon76ymJyA9PiAn150nLAon76ynJyA9PiAn16gnLAon76yoJyA9PiAn16onLAon76ypJyA9PiAnKycsCifvrY8nID0+ICfXkNecJywKJ++tkCcgPT4gJ9mxJywKJ++tkScgPT4gJ9mxJywKJ++tkicgPT4gJ9m7JywKJ++tkycgPT4gJ9m7JywKJ++tlCcgPT4gJ9m7JywKJ++tlScgPT4gJ9m7JywKJ++tlicgPT4gJ9m+JywKJ++tlycgPT4gJ9m+JywKJ++tmCcgPT4gJ9m+JywKJ++tmScgPT4gJ9m+JywKJ++tmicgPT4gJ9qAJywKJ++tmycgPT4gJ9qAJywKJ++tnCcgPT4gJ9qAJywKJ++tnScgPT4gJ9qAJywKJ++tnicgPT4gJ9m6JywKJ++tnycgPT4gJ9m6JywKJ++toCcgPT4gJ9m6JywKJ++toScgPT4gJ9m6JywKJ++toicgPT4gJ9m/JywKJ++toycgPT4gJ9m/JywKJ++tpCcgPT4gJ9m/JywKJ++tpScgPT4gJ9m/JywKJ++tpicgPT4gJ9m5JywKJ++tpycgPT4gJ9m5JywKJ++tqCcgPT4gJ9m5JywKJ++tqScgPT4gJ9m5JywKJ++tqicgPT4gJ9qkJywKJ++tqycgPT4gJ9qkJywKJ++trCcgPT4gJ9qkJywKJ++trScgPT4gJ9qkJywKJ++tricgPT4gJ9qmJywKJ++trycgPT4gJ9qmJywKJ++tsCcgPT4gJ9qmJywKJ++tsScgPT4gJ9qmJywKJ++tsicgPT4gJ9qEJywKJ++tsycgPT4gJ9qEJywKJ++ttCcgPT4gJ9qEJywKJ++ttScgPT4gJ9qEJywKJ++tticgPT4gJ9qDJywKJ++ttycgPT4gJ9qDJywKJ++tuCcgPT4gJ9qDJywKJ++tuScgPT4gJ9qDJywKJ++tuicgPT4gJ9qGJywKJ++tuycgPT4gJ9qGJywKJ++tvCcgPT4gJ9qGJywKJ++tvScgPT4gJ9qGJywKJ++tvicgPT4gJ9qHJywKJ++tvycgPT4gJ9qHJywKJ++ugCcgPT4gJ9qHJywKJ++ugScgPT4gJ9qHJywKJ++ugicgPT4gJ9qNJywKJ++ugycgPT4gJ9qNJywKJ++uhCcgPT4gJ9qMJywKJ++uhScgPT4gJ9qMJywKJ++uhicgPT4gJ9qOJywKJ++uhycgPT4gJ9qOJywKJ++uiCcgPT4gJ9qIJywKJ++uiScgPT4gJ9qIJywKJ++uiicgPT4gJ9qYJywKJ++uiycgPT4gJ9qYJywKJ++ujCcgPT4gJ9qRJywKJ++ujScgPT4gJ9qRJywKJ++ujicgPT4gJ9qpJywKJ++ujycgPT4gJ9qpJywKJ++ukCcgPT4gJ9qpJywKJ++ukScgPT4gJ9qpJywKJ++ukicgPT4gJ9qvJywKJ++ukycgPT4gJ9qvJywKJ++ulCcgPT4gJ9qvJywKJ++ulScgPT4gJ9qvJywKJ++ulicgPT4gJ9qzJywKJ++ulycgPT4gJ9qzJywKJ++umCcgPT4gJ9qzJywKJ++umScgPT4gJ9qzJywKJ++umicgPT4gJ9qxJywKJ++umycgPT4gJ9qxJywKJ++unCcgPT4gJ9qxJywKJ++unScgPT4gJ9qxJywKJ++unicgPT4gJ9q6JywKJ++unycgPT4gJ9q6JywKJ++uoCcgPT4gJ9q7JywKJ++uoScgPT4gJ9q7JywKJ++uoicgPT4gJ9q7JywKJ++uoycgPT4gJ9q7JywKJ++upCcgPT4gJ9uV2ZQnLAon766lJyA9PiAn25XZlCcsCifvrqYnID0+ICfbgScsCifvrqcnID0+ICfbgScsCifvrqgnID0+ICfbgScsCifvrqknID0+ICfbgScsCifvrqonID0+ICfavicsCifvrqsnID0+ICfavicsCifvrqwnID0+ICfavicsCifvrq0nID0+ICfavicsCifvrq4nID0+ICfbkicsCifvrq8nID0+ICfbkicsCifvrrAnID0+ICfbktmUJywKJ++usScgPT4gJ9uS2ZQnLAon76+TJyA9PiAn2q0nLAon76+UJyA9PiAn2q0nLAon76+VJyA9PiAn2q0nLAon76+WJyA9PiAn2q0nLAon76+XJyA9PiAn24cnLAon76+YJyA9PiAn24cnLAon76+ZJyA9PiAn24YnLAon76+aJyA9PiAn24YnLAon76+bJyA9PiAn24gnLAon76+cJyA9PiAn24gnLAon76+dJyA9PiAn24fZtCcsCifvr54nID0+ICfbiycsCifvr58nID0+ICfbiycsCifvr6AnID0+ICfbhScsCifvr6EnID0+ICfbhScsCifvr6InID0+ICfbiScsCifvr6MnID0+ICfbiScsCifvr6QnID0+ICfbkCcsCifvr6UnID0+ICfbkCcsCifvr6YnID0+ICfbkCcsCifvr6cnID0+ICfbkCcsCifvr6gnID0+ICfZiScsCifvr6knID0+ICfZiScsCifvr6onID0+ICfZitmU2KcnLAon76+rJyA9PiAn2YrZlNinJywKJ++vrCcgPT4gJ9mK2ZTblScsCifvr60nID0+ICfZitmU25UnLAon76+uJyA9PiAn2YrZlNmIJywKJ++vrycgPT4gJ9mK2ZTZiCcsCifvr7AnID0+ICfZitmU24cnLAon76+xJyA9PiAn2YrZlNuHJywKJ++vsicgPT4gJ9mK2ZTbhicsCifvr7MnID0+ICfZitmU24YnLAon76+0JyA9PiAn2YrZlNuIJywKJ++vtScgPT4gJ9mK2ZTbiCcsCifvr7YnID0+ICfZitmU25AnLAon76+3JyA9PiAn2YrZlNuQJywKJ++vuCcgPT4gJ9mK2ZTbkCcsCifvr7knID0+ICfZitmU2YknLAon76+6JyA9PiAn2YrZlNmJJywKJ++vuycgPT4gJ9mK2ZTZiScsCifvr7wnID0+ICfbjCcsCifvr70nID0+ICfbjCcsCifvr74nID0+ICfbjCcsCifvr78nID0+ICfbjCcsCifvsIAnID0+ICfZitmU2KwnLAon77CBJyA9PiAn2YrZlNitJywKJ++wgicgPT4gJ9mK2ZTZhScsCifvsIMnID0+ICfZitmU2YknLAon77CEJyA9PiAn2YrZlNmKJywKJ++whScgPT4gJ9io2KwnLAon77CGJyA9PiAn2KjYrScsCifvsIcnID0+ICfYqNiuJywKJ++wiCcgPT4gJ9io2YUnLAon77CJJyA9PiAn2KjZiScsCifvsIonID0+ICfYqNmKJywKJ++wiycgPT4gJ9iq2KwnLAon77CMJyA9PiAn2KrYrScsCifvsI0nID0+ICfYqtiuJywKJ++wjicgPT4gJ9iq2YUnLAon77CPJyA9PiAn2KrZiScsCifvsJAnID0+ICfYqtmKJywKJ++wkScgPT4gJ9ir2KwnLAon77CSJyA9PiAn2KvZhScsCifvsJMnID0+ICfYq9mJJywKJ++wlCcgPT4gJ9ir2YonLAon77CVJyA9PiAn2KzYrScsCifvsJYnID0+ICfYrNmFJywKJ++wlycgPT4gJ9it2KwnLAon77CYJyA9PiAn2K3ZhScsCifvsJknID0+ICfYrtisJywKJ++wmicgPT4gJ9iu2K0nLAon77CbJyA9PiAn2K7ZhScsCifvsJwnID0+ICfYs9isJywKJ++wnScgPT4gJ9iz2K0nLAon77CeJyA9PiAn2LPYricsCifvsJ8nID0+ICfYs9mFJywKJ++woCcgPT4gJ9i12K0nLAon77ChJyA9PiAn2LXZhScsCifvsKInID0+ICfYttisJywKJ++woycgPT4gJ9i22K0nLAon77CkJyA9PiAn2LbYricsCifvsKUnID0+ICfYttmFJywKJ++wpicgPT4gJ9i32K0nLAon77CnJyA9PiAn2LfZhScsCifvsKgnID0+ICfYuNmFJywKJ++wqScgPT4gJ9i52KwnLAon77CqJyA9PiAn2LnZhScsCifvsKsnID0+ICfYutisJywKJ++wrCcgPT4gJ9i62YUnLAon77CtJyA9PiAn2YHYrCcsCifvsK4nID0+ICfZgditJywKJ++wrycgPT4gJ9mB2K4nLAon77CwJyA9PiAn2YHZhScsCifvsLEnID0+ICfZgdmJJywKJ++wsicgPT4gJ9mB2YonLAon77CzJyA9PiAn2YLYrScsCifvsLQnID0+ICfZgtmFJywKJ++wtScgPT4gJ9mC2YknLAon77C2JyA9PiAn2YLZiicsCifvsLcnID0+ICfZg9inJywKJ++wuCcgPT4gJ9mD2KwnLAon77C5JyA9PiAn2YPYrScsCifvsLonID0+ICfZg9iuJywKJ++wuycgPT4gJ9mD2YQnLAon77C8JyA9PiAn2YPZhScsCifvsL0nID0+ICfZg9mJJywKJ++wvicgPT4gJ9mD2YonLAon77C/JyA9PiAn2YTYrCcsCifvsYAnID0+ICfZhNitJywKJ++xgScgPT4gJ9mE2K4nLAon77GCJyA9PiAn2YTZhScsCifvsYMnID0+ICfZhNmJJywKJ++xhCcgPT4gJ9mE2YonLAon77GFJyA9PiAn2YXYrCcsCifvsYYnID0+ICfZhditJywKJ++xhycgPT4gJ9mF2K4nLAon77GIJyA9PiAn2YXZhScsCifvsYknID0+ICfZhdmJJywKJ++xiicgPT4gJ9mF2YonLAon77GLJyA9PiAn2YbYrCcsCifvsYwnID0+ICfZhtitJywKJ++xjScgPT4gJ9mG2K4nLAon77GOJyA9PiAn2YbZhScsCifvsY8nID0+ICfZhtmJJywKJ++xkCcgPT4gJ9mG2YonLAon77GRJyA9PiAn2YfYrCcsCifvsZInID0+ICfZh9mFJywKJ++xkycgPT4gJ9mH2YknLAon77GUJyA9PiAn2YfZiicsCifvsZUnID0+ICfZitisJywKJ++xlicgPT4gJ9mK2K0nLAon77GXJyA9PiAn2YrYricsCifvsZgnID0+ICfZitmFJywKJ++xmScgPT4gJ9mK2YknLAon77GaJyA9PiAn2YrZiicsCifvsZsnID0+ICfYsNmwJywKJ++xnCcgPT4gJ9ix2bAnLAon77GdJyA9PiAn2YnZsCcsCifvsZ4nID0+ICcg2YzZkScsCifvsZ8nID0+ICcg2Y3ZkScsCifvsaAnID0+ICcg2Y7ZkScsCifvsaEnID0+ICcg2Y/ZkScsCifvsaInID0+ICcg2ZDZkScsCifvsaMnID0+ICcg2ZHZsCcsCifvsaQnID0+ICfZitmU2LEnLAon77GlJyA9PiAn2YrZlNiyJywKJ++xpicgPT4gJ9mK2ZTZhScsCifvsacnID0+ICfZitmU2YYnLAon77GoJyA9PiAn2YrZlNmJJywKJ++xqScgPT4gJ9mK2ZTZiicsCifvsaonID0+ICfYqNixJywKJ++xqycgPT4gJ9io2LInLAon77GsJyA9PiAn2KjZhScsCifvsa0nID0+ICfYqNmGJywKJ++xricgPT4gJ9io2YknLAon77GvJyA9PiAn2KjZiicsCifvsbAnID0+ICfYqtixJywKJ++xsScgPT4gJ9iq2LInLAon77GyJyA9PiAn2KrZhScsCifvsbMnID0+ICfYqtmGJywKJ++xtCcgPT4gJ9iq2YknLAon77G1JyA9PiAn2KrZiicsCifvsbYnID0+ICfYq9ixJywKJ++xtycgPT4gJ9ir2LInLAon77G4JyA9PiAn2KvZhScsCifvsbknID0+ICfYq9mGJywKJ++xuicgPT4gJ9ir2YknLAon77G7JyA9PiAn2KvZiicsCifvsbwnID0+ICfZgdmJJywKJ++xvScgPT4gJ9mB2YonLAon77G+JyA9PiAn2YLZiScsCifvsb8nID0+ICfZgtmKJywKJ++ygCcgPT4gJ9mD2KcnLAon77KBJyA9PiAn2YPZhCcsCifvsoInID0+ICfZg9mFJywKJ++ygycgPT4gJ9mD2YknLAon77KEJyA9PiAn2YPZiicsCifvsoUnID0+ICfZhNmFJywKJ++yhicgPT4gJ9mE2YknLAon77KHJyA9PiAn2YTZiicsCifvsognID0+ICfZhdinJywKJ++yiScgPT4gJ9mF2YUnLAon77KKJyA9PiAn2YbYsScsCifvsosnID0+ICfZhtiyJywKJ++yjCcgPT4gJ9mG2YUnLAon77KNJyA9PiAn2YbZhicsCifvso4nID0+ICfZhtmJJywKJ++yjycgPT4gJ9mG2YonLAon77KQJyA9PiAn2YnZsCcsCifvspEnID0+ICfZitixJywKJ++ykicgPT4gJ9mK2LInLAon77KTJyA9PiAn2YrZhScsCifvspQnID0+ICfZitmGJywKJ++ylScgPT4gJ9mK2YknLAon77KWJyA9PiAn2YrZiicsCifvspcnID0+ICfZitmU2KwnLAon77KYJyA9PiAn2YrZlNitJywKJ++ymScgPT4gJ9mK2ZTYricsCifvsponID0+ICfZitmU2YUnLAon77KbJyA9PiAn2YrZlNmHJywKJ++ynCcgPT4gJ9io2KwnLAon77KdJyA9PiAn2KjYrScsCifvsp4nID0+ICfYqNiuJywKJ++ynycgPT4gJ9io2YUnLAon77KgJyA9PiAn2KjZhycsCifvsqEnID0+ICfYqtisJywKJ++yoicgPT4gJ9iq2K0nLAon77KjJyA9PiAn2KrYricsCifvsqQnID0+ICfYqtmFJywKJ++ypScgPT4gJ9iq2YcnLAon77KmJyA9PiAn2KvZhScsCifvsqcnID0+ICfYrNitJywKJ++yqCcgPT4gJ9is2YUnLAon77KpJyA9PiAn2K3YrCcsCifvsqonID0+ICfYrdmFJywKJ++yqycgPT4gJ9iu2KwnLAon77KsJyA9PiAn2K7ZhScsCifvsq0nID0+ICfYs9isJywKJ++yricgPT4gJ9iz2K0nLAon77KvJyA9PiAn2LPYricsCifvsrAnID0+ICfYs9mFJywKJ++ysScgPT4gJ9i12K0nLAon77KyJyA9PiAn2LXYricsCifvsrMnID0+ICfYtdmFJywKJ++ytCcgPT4gJ9i22KwnLAon77K1JyA9PiAn2LbYrScsCifvsrYnID0+ICfYttiuJywKJ++ytycgPT4gJ9i22YUnLAon77K4JyA9PiAn2LfYrScsCifvsrknID0+ICfYuNmFJywKJ++yuicgPT4gJ9i52KwnLAon77K7JyA9PiAn2LnZhScsCifvsrwnID0+ICfYutisJywKJ++yvScgPT4gJ9i62YUnLAon77K+JyA9PiAn2YHYrCcsCifvsr8nID0+ICfZgditJywKJ++zgCcgPT4gJ9mB2K4nLAon77OBJyA9PiAn2YHZhScsCifvs4InID0+ICfZgtitJywKJ++zgycgPT4gJ9mC2YUnLAon77OEJyA9PiAn2YPYrCcsCifvs4UnID0+ICfZg9itJywKJ++zhicgPT4gJ9mD2K4nLAon77OHJyA9PiAn2YPZhCcsCifvs4gnID0+ICfZg9mFJywKJ++ziScgPT4gJ9mE2KwnLAon77OKJyA9PiAn2YTYrScsCifvs4snID0+ICfZhNiuJywKJ++zjCcgPT4gJ9mE2YUnLAon77ONJyA9PiAn2YTZhycsCifvs44nID0+ICfZhdisJywKJ++zjycgPT4gJ9mF2K0nLAon77OQJyA9PiAn2YXYricsCifvs5EnID0+ICfZhdmFJywKJ++zkicgPT4gJ9mG2KwnLAon77OTJyA9PiAn2YbYrScsCifvs5QnID0+ICfZhtiuJywKJ++zlScgPT4gJ9mG2YUnLAon77OWJyA9PiAn2YbZhycsCifvs5cnID0+ICfZh9isJywKJ++zmCcgPT4gJ9mH2YUnLAon77OZJyA9PiAn2YfZsCcsCifvs5onID0+ICfZitisJywKJ++zmycgPT4gJ9mK2K0nLAon77OcJyA9PiAn2YrYricsCifvs50nID0+ICfZitmFJywKJ++znicgPT4gJ9mK2YcnLAon77OfJyA9PiAn2YrZlNmFJywKJ++zoCcgPT4gJ9mK2ZTZhycsCifvs6EnID0+ICfYqNmFJywKJ++zoicgPT4gJ9io2YcnLAon77OjJyA9PiAn2KrZhScsCifvs6QnID0+ICfYqtmHJywKJ++zpScgPT4gJ9ir2YUnLAon77OmJyA9PiAn2KvZhycsCifvs6cnID0+ICfYs9mFJywKJ++zqCcgPT4gJ9iz2YcnLAon77OpJyA9PiAn2LTZhScsCifvs6onID0+ICfYtNmHJywKJ++zqycgPT4gJ9mD2YQnLAon77OsJyA9PiAn2YPZhScsCifvs60nID0+ICfZhNmFJywKJ++zricgPT4gJ9mG2YUnLAon77OvJyA9PiAn2YbZhycsCifvs7AnID0+ICfZitmFJywKJ++zsScgPT4gJ9mK2YcnLAon77OyJyA9PiAn2YDZjtmRJywKJ++zsycgPT4gJ9mA2Y/ZkScsCifvs7QnID0+ICfZgNmQ2ZEnLAon77O1JyA9PiAn2LfZiScsCifvs7YnID0+ICfYt9mKJywKJ++ztycgPT4gJ9i52YknLAon77O4JyA9PiAn2LnZiicsCifvs7knID0+ICfYutmJJywKJ++zuicgPT4gJ9i62YonLAon77O7JyA9PiAn2LPZiScsCifvs7wnID0+ICfYs9mKJywKJ++zvScgPT4gJ9i02YknLAon77O+JyA9PiAn2LTZiicsCifvs78nID0+ICfYrdmJJywKJ++0gCcgPT4gJ9it2YonLAon77SBJyA9PiAn2KzZiScsCifvtIInID0+ICfYrNmKJywKJ++0gycgPT4gJ9iu2YknLAon77SEJyA9PiAn2K7ZiicsCifvtIUnID0+ICfYtdmJJywKJ++0hicgPT4gJ9i12YonLAon77SHJyA9PiAn2LbZiScsCifvtIgnID0+ICfYttmKJywKJ++0iScgPT4gJ9i02KwnLAon77SKJyA9PiAn2LTYrScsCifvtIsnID0+ICfYtNiuJywKJ++0jCcgPT4gJ9i02YUnLAon77SNJyA9PiAn2LTYsScsCifvtI4nID0+ICfYs9ixJywKJ++0jycgPT4gJ9i12LEnLAon77SQJyA9PiAn2LbYsScsCifvtJEnID0+ICfYt9mJJywKJ++0kicgPT4gJ9i32YonLAon77STJyA9PiAn2LnZiScsCifvtJQnID0+ICfYudmKJywKJ++0lScgPT4gJ9i62YknLAon77SWJyA9PiAn2LrZiicsCifvtJcnID0+ICfYs9mJJywKJ++0mCcgPT4gJ9iz2YonLAon77SZJyA9PiAn2LTZiScsCifvtJonID0+ICfYtNmKJywKJ++0mycgPT4gJ9it2YknLAon77ScJyA9PiAn2K3ZiicsCifvtJ0nID0+ICfYrNmJJywKJ++0nicgPT4gJ9is2YonLAon77SfJyA9PiAn2K7ZiScsCifvtKAnID0+ICfYrtmKJywKJ++0oScgPT4gJ9i12YknLAon77SiJyA9PiAn2LXZiicsCifvtKMnID0+ICfYttmJJywKJ++0pCcgPT4gJ9i22YonLAon77SlJyA9PiAn2LTYrCcsCifvtKYnID0+ICfYtNitJywKJ++0pycgPT4gJ9i02K4nLAon77SoJyA9PiAn2LTZhScsCifvtKknID0+ICfYtNixJywKJ++0qicgPT4gJ9iz2LEnLAon77SrJyA9PiAn2LXYsScsCifvtKwnID0+ICfYttixJywKJ++0rScgPT4gJ9i02KwnLAon77SuJyA9PiAn2LTYrScsCifvtK8nID0+ICfYtNiuJywKJ++0sCcgPT4gJ9i02YUnLAon77SxJyA9PiAn2LPZhycsCifvtLInID0+ICfYtNmHJywKJ++0sycgPT4gJ9i32YUnLAon77S0JyA9PiAn2LPYrCcsCifvtLUnID0+ICfYs9itJywKJ++0ticgPT4gJ9iz2K4nLAon77S3JyA9PiAn2LTYrCcsCifvtLgnID0+ICfYtNitJywKJ++0uScgPT4gJ9i02K4nLAon77S6JyA9PiAn2LfZhScsCifvtLsnID0+ICfYuNmFJywKJ++0vCcgPT4gJ9in2YsnLAon77S9JyA9PiAn2KfZiycsCifvtZAnID0+ICfYqtis2YUnLAon77WRJyA9PiAn2KrYrdisJywKJ++1kicgPT4gJ9iq2K3YrCcsCifvtZMnID0+ICfYqtit2YUnLAon77WUJyA9PiAn2KrYrtmFJywKJ++1lScgPT4gJ9iq2YXYrCcsCifvtZYnID0+ICfYqtmF2K0nLAon77WXJyA9PiAn2KrZhdiuJywKJ++1mCcgPT4gJ9is2YXYrScsCifvtZknID0+ICfYrNmF2K0nLAon77WaJyA9PiAn2K3ZhdmKJywKJ++1mycgPT4gJ9it2YXZiScsCifvtZwnID0+ICfYs9it2KwnLAon77WdJyA9PiAn2LPYrNitJywKJ++1nicgPT4gJ9iz2KzZiScsCifvtZ8nID0+ICfYs9mF2K0nLAon77WgJyA9PiAn2LPZhditJywKJ++1oScgPT4gJ9iz2YXYrCcsCifvtaInID0+ICfYs9mF2YUnLAon77WjJyA9PiAn2LPZhdmFJywKJ++1pCcgPT4gJ9i12K3YrScsCifvtaUnID0+ICfYtdit2K0nLAon77WmJyA9PiAn2LXZhdmFJywKJ++1pycgPT4gJ9i02K3ZhScsCifvtagnID0+ICfYtNit2YUnLAon77WpJyA9PiAn2LTYrNmKJywKJ++1qicgPT4gJ9i02YXYricsCifvtasnID0+ICfYtNmF2K4nLAon77WsJyA9PiAn2LTZhdmFJywKJ++1rScgPT4gJ9i02YXZhScsCifvta4nID0+ICfYttit2YknLAon77WvJyA9PiAn2LbYrtmFJywKJ++1sCcgPT4gJ9i22K7ZhScsCifvtbEnID0+ICfYt9mF2K0nLAon77WyJyA9PiAn2LfZhditJywKJ++1sycgPT4gJ9i32YXZhScsCifvtbQnID0+ICfYt9mF2YonLAon77W1JyA9PiAn2LnYrNmFJywKJ++1ticgPT4gJ9i52YXZhScsCifvtbcnID0+ICfYudmF2YUnLAon77W4JyA9PiAn2LnZhdmJJywKJ++1uScgPT4gJ9i62YXZhScsCifvtbonID0+ICfYutmF2YonLAon77W7JyA9PiAn2LrZhdmJJywKJ++1vCcgPT4gJ9mB2K7ZhScsCifvtb0nID0+ICfZgdiu2YUnLAon77W+JyA9PiAn2YLZhditJywKJ++1vycgPT4gJ9mC2YXZhScsCifvtoAnID0+ICfZhNit2YUnLAon77aBJyA9PiAn2YTYrdmKJywKJ++2gicgPT4gJ9mE2K3ZiScsCifvtoMnID0+ICfZhNis2KwnLAon77aEJyA9PiAn2YTYrNisJywKJ++2hScgPT4gJ9mE2K7ZhScsCifvtoYnID0+ICfZhNiu2YUnLAon77aHJyA9PiAn2YTZhditJywKJ++2iCcgPT4gJ9mE2YXYrScsCifvtoknID0+ICfZhdit2KwnLAon77aKJyA9PiAn2YXYrdmFJywKJ++2iycgPT4gJ9mF2K3ZiicsCifvtownID0+ICfZhdis2K0nLAon77aNJyA9PiAn2YXYrNmFJywKJ++2jicgPT4gJ9mF2K7YrCcsCifvto8nID0+ICfZhdiu2YUnLAon77aSJyA9PiAn2YXYrNiuJywKJ++2kycgPT4gJ9mH2YXYrCcsCifvtpQnID0+ICfZh9mF2YUnLAon77aVJyA9PiAn2YbYrdmFJywKJ++2licgPT4gJ9mG2K3ZiScsCifvtpcnID0+ICfZhtis2YUnLAon77aYJyA9PiAn2YbYrNmFJywKJ++2mScgPT4gJ9mG2KzZiScsCifvtponID0+ICfZhtmF2YonLAon77abJyA9PiAn2YbZhdmJJywKJ++2nCcgPT4gJ9mK2YXZhScsCifvtp0nID0+ICfZitmF2YUnLAon77aeJyA9PiAn2KjYrtmKJywKJ++2nycgPT4gJ9iq2KzZiicsCifvtqAnID0+ICfYqtis2YknLAon77ahJyA9PiAn2KrYrtmKJywKJ++2oicgPT4gJ9iq2K7ZiScsCifvtqMnID0+ICfYqtmF2YonLAon77akJyA9PiAn2KrZhdmJJywKJ++2pScgPT4gJ9is2YXZiicsCifvtqYnID0+ICfYrNit2YknLAon77anJyA9PiAn2KzZhdmJJywKJ++2qCcgPT4gJ9iz2K7ZiScsCifvtqknID0+ICfYtdit2YonLAon77aqJyA9PiAn2LTYrdmKJywKJ++2qycgPT4gJ9i22K3ZiicsCifvtqwnID0+ICfZhNis2YonLAon77atJyA9PiAn2YTZhdmKJywKJ++2ricgPT4gJ9mK2K3ZiicsCifvtq8nID0+ICfZitis2YonLAon77awJyA9PiAn2YrZhdmKJywKJ++2sScgPT4gJ9mF2YXZiicsCifvtrInID0+ICfZgtmF2YonLAon77azJyA9PiAn2YbYrdmKJywKJ++2tCcgPT4gJ9mC2YXYrScsCifvtrUnID0+ICfZhNit2YUnLAon77a2JyA9PiAn2LnZhdmKJywKJ++2tycgPT4gJ9mD2YXZiicsCifvtrgnID0+ICfZhtis2K0nLAon77a5JyA9PiAn2YXYrtmKJywKJ++2uicgPT4gJ9mE2KzZhScsCifvtrsnID0+ICfZg9mF2YUnLAon77a8JyA9PiAn2YTYrNmFJywKJ++2vScgPT4gJ9mG2KzYrScsCifvtr4nID0+ICfYrNit2YonLAon77a/JyA9PiAn2K3YrNmKJywKJ++3gCcgPT4gJ9mF2KzZiicsCifvt4EnID0+ICfZgdmF2YonLAon77eCJyA9PiAn2KjYrdmKJywKJ++3gycgPT4gJ9mD2YXZhScsCifvt4QnID0+ICfYudis2YUnLAon77eFJyA9PiAn2LXZhdmFJywKJ++3hicgPT4gJ9iz2K7ZiicsCifvt4cnID0+ICfZhtis2YonLAon77ewJyA9PiAn2LXZhNuSJywKJ++3sScgPT4gJ9mC2YTbkicsCifvt7InID0+ICfYp9mE2YTZhycsCifvt7MnID0+ICfYp9mD2KjYsScsCifvt7QnID0+ICfZhdit2YXYrycsCifvt7UnID0+ICfYtdmE2LnZhScsCifvt7YnID0+ICfYsdiz2YjZhCcsCifvt7cnID0+ICfYudmE2YrZhycsCifvt7gnID0+ICfZiNiz2YTZhScsCifvt7knID0+ICfYtdmE2YknLAon77e6JyA9PiAn2LXZhNmJINin2YTZhNmHINi52YTZitmHINmI2LPZhNmFJywKJ++3uycgPT4gJ9is2YQg2KzZhNin2YTZhycsCifvt7wnID0+ICfYsduM2KfZhCcsCifvuJAnID0+ICcsJywKJ++4kScgPT4gJ+OAgScsCifvuJInID0+ICfjgIInLAon77iTJyA9PiAnOicsCifvuJQnID0+ICc7JywKJ++4lScgPT4gJyEnLAon77iWJyA9PiAnPycsCifvuJcnID0+ICfjgJYnLAon77iYJyA9PiAn44CXJywKJ++4mScgPT4gJy4uLicsCifvuLAnID0+ICcuLicsCifvuLEnID0+ICfigJQnLAon77iyJyA9PiAn4oCTJywKJ++4sycgPT4gJ18nLAon77i0JyA9PiAnXycsCifvuLUnID0+ICcoJywKJ++4ticgPT4gJyknLAon77i3JyA9PiAneycsCifvuLgnID0+ICd9JywKJ++4uScgPT4gJ+OAlCcsCifvuLonID0+ICfjgJUnLAon77i7JyA9PiAn44CQJywKJ++4vCcgPT4gJ+OAkScsCifvuL0nID0+ICfjgIonLAon77i+JyA9PiAn44CLJywKJ++4vycgPT4gJ+OAiCcsCifvuYAnID0+ICfjgIknLAon77mBJyA9PiAn44CMJywKJ++5gicgPT4gJ+OAjScsCifvuYMnID0+ICfjgI4nLAon77mEJyA9PiAn44CPJywKJ++5hycgPT4gJ1snLAon77mIJyA9PiAnXScsCifvuYknID0+ICcgzIUnLAon77mKJyA9PiAnIMyFJywKJ++5iycgPT4gJyDMhScsCifvuYwnID0+ICcgzIUnLAon77mNJyA9PiAnXycsCifvuY4nID0+ICdfJywKJ++5jycgPT4gJ18nLAon77mQJyA9PiAnLCcsCifvuZEnID0+ICfjgIEnLAon77mSJyA9PiAnLicsCifvuZQnID0+ICc7JywKJ++5lScgPT4gJzonLAon77mWJyA9PiAnPycsCifvuZcnID0+ICchJywKJ++5mCcgPT4gJ+KAlCcsCifvuZknID0+ICcoJywKJ++5micgPT4gJyknLAon77mbJyA9PiAneycsCifvuZwnID0+ICd9JywKJ++5nScgPT4gJ+OAlCcsCifvuZ4nID0+ICfjgJUnLAon77mfJyA9PiAnIycsCifvuaAnID0+ICcmJywKJ++5oScgPT4gJyonLAon77miJyA9PiAnKycsCifvuaMnID0+ICctJywKJ++5pCcgPT4gJzwnLAon77mlJyA9PiAnPicsCifvuaYnID0+ICc9JywKJ++5qCcgPT4gJ1xcJywKJ++5qScgPT4gJyQnLAon77mqJyA9PiAnJScsCifvuasnID0+ICdAJywKJ++5sCcgPT4gJyDZiycsCifvubEnID0+ICfZgNmLJywKJ++5sicgPT4gJyDZjCcsCifvubQnID0+ICcg2Y0nLAon77m2JyA9PiAnINmOJywKJ++5tycgPT4gJ9mA2Y4nLAon77m4JyA9PiAnINmPJywKJ++5uScgPT4gJ9mA2Y8nLAon77m6JyA9PiAnINmQJywKJ++5uycgPT4gJ9mA2ZAnLAon77m8JyA9PiAnINmRJywKJ++5vScgPT4gJ9mA2ZEnLAon77m+JyA9PiAnINmSJywKJ++5vycgPT4gJ9mA2ZInLAon77qAJyA9PiAn2KEnLAon77qBJyA9PiAn2KfZkycsCifvuoInID0+ICfYp9mTJywKJ++6gycgPT4gJ9in2ZQnLAon77qEJyA9PiAn2KfZlCcsCifvuoUnID0+ICfZiNmUJywKJ++6hicgPT4gJ9mI2ZQnLAon77qHJyA9PiAn2KfZlScsCifvuognID0+ICfYp9mVJywKJ++6iScgPT4gJ9mK2ZQnLAon77qKJyA9PiAn2YrZlCcsCifvuosnID0+ICfZitmUJywKJ++6jCcgPT4gJ9mK2ZQnLAon77qNJyA9PiAn2KcnLAon77qOJyA9PiAn2KcnLAon77qPJyA9PiAn2KgnLAon77qQJyA9PiAn2KgnLAon77qRJyA9PiAn2KgnLAon77qSJyA9PiAn2KgnLAon77qTJyA9PiAn2KknLAon77qUJyA9PiAn2KknLAon77qVJyA9PiAn2KonLAon77qWJyA9PiAn2KonLAon77qXJyA9PiAn2KonLAon77qYJyA9PiAn2KonLAon77qZJyA9PiAn2KsnLAon77qaJyA9PiAn2KsnLAon77qbJyA9PiAn2KsnLAon77qcJyA9PiAn2KsnLAon77qdJyA9PiAn2KwnLAon77qeJyA9PiAn2KwnLAon77qfJyA9PiAn2KwnLAon77qgJyA9PiAn2KwnLAon77qhJyA9PiAn2K0nLAon77qiJyA9PiAn2K0nLAon77qjJyA9PiAn2K0nLAon77qkJyA9PiAn2K0nLAon77qlJyA9PiAn2K4nLAon77qmJyA9PiAn2K4nLAon77qnJyA9PiAn2K4nLAon77qoJyA9PiAn2K4nLAon77qpJyA9PiAn2K8nLAon77qqJyA9PiAn2K8nLAon77qrJyA9PiAn2LAnLAon77qsJyA9PiAn2LAnLAon77qtJyA9PiAn2LEnLAon77quJyA9PiAn2LEnLAon77qvJyA9PiAn2LInLAon77qwJyA9PiAn2LInLAon77qxJyA9PiAn2LMnLAon77qyJyA9PiAn2LMnLAon77qzJyA9PiAn2LMnLAon77q0JyA9PiAn2LMnLAon77q1JyA9PiAn2LQnLAon77q2JyA9PiAn2LQnLAon77q3JyA9PiAn2LQnLAon77q4JyA9PiAn2LQnLAon77q5JyA9PiAn2LUnLAon77q6JyA9PiAn2LUnLAon77q7JyA9PiAn2LUnLAon77q8JyA9PiAn2LUnLAon77q9JyA9PiAn2LYnLAon77q+JyA9PiAn2LYnLAon77q/JyA9PiAn2LYnLAon77uAJyA9PiAn2LYnLAon77uBJyA9PiAn2LcnLAon77uCJyA9PiAn2LcnLAon77uDJyA9PiAn2LcnLAon77uEJyA9PiAn2LcnLAon77uFJyA9PiAn2LgnLAon77uGJyA9PiAn2LgnLAon77uHJyA9PiAn2LgnLAon77uIJyA9PiAn2LgnLAon77uJJyA9PiAn2LknLAon77uKJyA9PiAn2LknLAon77uLJyA9PiAn2LknLAon77uMJyA9PiAn2LknLAon77uNJyA9PiAn2LonLAon77uOJyA9PiAn2LonLAon77uPJyA9PiAn2LonLAon77uQJyA9PiAn2LonLAon77uRJyA9PiAn2YEnLAon77uSJyA9PiAn2YEnLAon77uTJyA9PiAn2YEnLAon77uUJyA9PiAn2YEnLAon77uVJyA9PiAn2YInLAon77uWJyA9PiAn2YInLAon77uXJyA9PiAn2YInLAon77uYJyA9PiAn2YInLAon77uZJyA9PiAn2YMnLAon77uaJyA9PiAn2YMnLAon77ubJyA9PiAn2YMnLAon77ucJyA9PiAn2YMnLAon77udJyA9PiAn2YQnLAon77ueJyA9PiAn2YQnLAon77ufJyA9PiAn2YQnLAon77ugJyA9PiAn2YQnLAon77uhJyA9PiAn2YUnLAon77uiJyA9PiAn2YUnLAon77ujJyA9PiAn2YUnLAon77ukJyA9PiAn2YUnLAon77ulJyA9PiAn2YYnLAon77umJyA9PiAn2YYnLAon77unJyA9PiAn2YYnLAon77uoJyA9PiAn2YYnLAon77upJyA9PiAn2YcnLAon77uqJyA9PiAn2YcnLAon77urJyA9PiAn2YcnLAon77usJyA9PiAn2YcnLAon77utJyA9PiAn2YgnLAon77uuJyA9PiAn2YgnLAon77uvJyA9PiAn2YknLAon77uwJyA9PiAn2YknLAon77uxJyA9PiAn2YonLAon77uyJyA9PiAn2YonLAon77uzJyA9PiAn2YonLAon77u0JyA9PiAn2YonLAon77u1JyA9PiAn2YTYp9mTJywKJ++7ticgPT4gJ9mE2KfZkycsCifvu7cnID0+ICfZhNin2ZQnLAon77u4JyA9PiAn2YTYp9mUJywKJ++7uScgPT4gJ9mE2KfZlScsCifvu7onID0+ICfZhNin2ZUnLAon77u7JyA9PiAn2YTYpycsCifvu7wnID0+ICfZhNinJywKJ++8gScgPT4gJyEnLAon77yCJyA9PiAnIicsCifvvIMnID0+ICcjJywKJ++8hCcgPT4gJyQnLAon77yFJyA9PiAnJScsCifvvIYnID0+ICcmJywKJ++8hycgPT4gJ1wnJywKJ++8iCcgPT4gJygnLAon77yJJyA9PiAnKScsCifvvIonID0+ICcqJywKJ++8iycgPT4gJysnLAon77yMJyA9PiAnLCcsCifvvI0nID0+ICctJywKJ++8jicgPT4gJy4nLAon77yPJyA9PiAnLycsCifvvJAnID0+ICcwJywKJ++8kScgPT4gJzEnLAon77ySJyA9PiAnMicsCifvvJMnID0+ICczJywKJ++8lCcgPT4gJzQnLAon77yVJyA9PiAnNScsCifvvJYnID0+ICc2JywKJ++8lycgPT4gJzcnLAon77yYJyA9PiAnOCcsCifvvJknID0+ICc5JywKJ++8micgPT4gJzonLAon77ybJyA9PiAnOycsCifvvJwnID0+ICc8JywKJ++8nScgPT4gJz0nLAon77yeJyA9PiAnPicsCifvvJ8nID0+ICc/JywKJ++8oCcgPT4gJ0AnLAon77yhJyA9PiAnQScsCifvvKInID0+ICdCJywKJ++8oycgPT4gJ0MnLAon77ykJyA9PiAnRCcsCifvvKUnID0+ICdFJywKJ++8picgPT4gJ0YnLAon77ynJyA9PiAnRycsCifvvKgnID0+ICdIJywKJ++8qScgPT4gJ0knLAon77yqJyA9PiAnSicsCifvvKsnID0+ICdLJywKJ++8rCcgPT4gJ0wnLAon77ytJyA9PiAnTScsCifvvK4nID0+ICdOJywKJ++8rycgPT4gJ08nLAon77ywJyA9PiAnUCcsCifvvLEnID0+ICdRJywKJ++8sicgPT4gJ1InLAon77yzJyA9PiAnUycsCifvvLQnID0+ICdUJywKJ++8tScgPT4gJ1UnLAon77y2JyA9PiAnVicsCifvvLcnID0+ICdXJywKJ++8uCcgPT4gJ1gnLAon77y5JyA9PiAnWScsCifvvLonID0+ICdaJywKJ++8uycgPT4gJ1snLAon77y8JyA9PiAnXFwnLAon77y9JyA9PiAnXScsCifvvL4nID0+ICdeJywKJ++8vycgPT4gJ18nLAon772AJyA9PiAnYCcsCifvvYEnID0+ICdhJywKJ++9gicgPT4gJ2InLAon772DJyA9PiAnYycsCifvvYQnID0+ICdkJywKJ++9hScgPT4gJ2UnLAon772GJyA9PiAnZicsCifvvYcnID0+ICdnJywKJ++9iCcgPT4gJ2gnLAon772JJyA9PiAnaScsCifvvYonID0+ICdqJywKJ++9iycgPT4gJ2snLAon772MJyA9PiAnbCcsCifvvY0nID0+ICdtJywKJ++9jicgPT4gJ24nLAon772PJyA9PiAnbycsCifvvZAnID0+ICdwJywKJ++9kScgPT4gJ3EnLAon772SJyA9PiAncicsCifvvZMnID0+ICdzJywKJ++9lCcgPT4gJ3QnLAon772VJyA9PiAndScsCifvvZYnID0+ICd2JywKJ++9lycgPT4gJ3cnLAon772YJyA9PiAneCcsCifvvZknID0+ICd5JywKJ++9micgPT4gJ3onLAon772bJyA9PiAneycsCifvvZwnID0+ICd8JywKJ++9nScgPT4gJ30nLAon772eJyA9PiAnficsCifvvZ8nID0+ICfipoUnLAon772gJyA9PiAn4qaGJywKJ++9oScgPT4gJ+OAgicsCifvvaInID0+ICfjgIwnLAon772jJyA9PiAn44CNJywKJ++9pCcgPT4gJ+OAgScsCifvvaUnID0+ICfjg7snLAon772mJyA9PiAn44OyJywKJ++9pycgPT4gJ+OCoScsCifvvagnID0+ICfjgqMnLAon772pJyA9PiAn44KlJywKJ++9qicgPT4gJ+OCpycsCifvvasnID0+ICfjgqknLAon772sJyA9PiAn44OjJywKJ++9rScgPT4gJ+ODpScsCifvva4nID0+ICfjg6cnLAon772vJyA9PiAn44ODJywKJ++9sCcgPT4gJ+ODvCcsCifvvbEnID0+ICfjgqInLAon772yJyA9PiAn44KkJywKJ++9sycgPT4gJ+OCpicsCifvvbQnID0+ICfjgqgnLAon7721JyA9PiAn44KqJywKJ++9ticgPT4gJ+OCqycsCifvvbcnID0+ICfjgq0nLAon7724JyA9PiAn44KvJywKJ++9uScgPT4gJ+OCsScsCifvvbonID0+ICfjgrMnLAon7727JyA9PiAn44K1JywKJ++9vCcgPT4gJ+OCtycsCifvvb0nID0+ICfjgrknLAon772+JyA9PiAn44K7JywKJ++9vycgPT4gJ+OCvScsCifvvoAnID0+ICfjgr8nLAon776BJyA9PiAn44OBJywKJ+++gicgPT4gJ+ODhCcsCifvvoMnID0+ICfjg4YnLAon776EJyA9PiAn44OIJywKJ+++hScgPT4gJ+ODiicsCifvvoYnID0+ICfjg4snLAon776HJyA9PiAn44OMJywKJ+++iCcgPT4gJ+ODjScsCifvvoknID0+ICfjg44nLAon776KJyA9PiAn44OPJywKJ+++iycgPT4gJ+ODkicsCifvvownID0+ICfjg5UnLAon776NJyA9PiAn44OYJywKJ+++jicgPT4gJ+ODmycsCifvvo8nID0+ICfjg54nLAon776QJyA9PiAn44OfJywKJ+++kScgPT4gJ+ODoCcsCifvvpInID0+ICfjg6EnLAon776TJyA9PiAn44OiJywKJ+++lCcgPT4gJ+ODpCcsCifvvpUnID0+ICfjg6YnLAon776WJyA9PiAn44OoJywKJ+++lycgPT4gJ+ODqScsCifvvpgnID0+ICfjg6onLAon776ZJyA9PiAn44OrJywKJ+++micgPT4gJ+ODrCcsCifvvpsnID0+ICfjg60nLAon776cJyA9PiAn44OvJywKJ+++nScgPT4gJ+ODsycsCifvvp4nID0+ICfjgpknLAon776fJyA9PiAn44KaJywKJ+++oCcgPT4gJ+GFoCcsCifvvqEnID0+ICfhhIAnLAon776iJyA9PiAn4YSBJywKJ+++oycgPT4gJ+GGqicsCifvvqQnID0+ICfhhIInLAon776lJyA9PiAn4YasJywKJ+++picgPT4gJ+GGrScsCifvvqcnID0+ICfhhIMnLAon776oJyA9PiAn4YSEJywKJ+++qScgPT4gJ+GEhScsCifvvqonID0+ICfhhrAnLAon776rJyA9PiAn4YaxJywKJ+++rCcgPT4gJ+GGsicsCifvvq0nID0+ICfhhrMnLAon776uJyA9PiAn4Ya0JywKJ+++rycgPT4gJ+GGtScsCifvvrAnID0+ICfhhJonLAon776xJyA9PiAn4YSGJywKJ+++sicgPT4gJ+GEhycsCifvvrMnID0+ICfhhIgnLAon7760JyA9PiAn4YShJywKJ+++tScgPT4gJ+GEiScsCifvvrYnID0+ICfhhIonLAon7763JyA9PiAn4YSLJywKJ+++uCcgPT4gJ+GEjCcsCifvvrknID0+ICfhhI0nLAon7766JyA9PiAn4YSOJywKJ+++uycgPT4gJ+GEjycsCifvvrwnID0+ICfhhJAnLAon7769JyA9PiAn4YSRJywKJ+++vicgPT4gJ+GEkicsCifvv4InID0+ICfhhaEnLAon77+DJyA9PiAn4YWiJywKJ++/hCcgPT4gJ+GFoycsCifvv4UnID0+ICfhhaQnLAon77+GJyA9PiAn4YWlJywKJ++/hycgPT4gJ+GFpicsCifvv4onID0+ICfhhacnLAon77+LJyA9PiAn4YWoJywKJ++/jCcgPT4gJ+GFqScsCifvv40nID0+ICfhhaonLAon77+OJyA9PiAn4YWrJywKJ++/jycgPT4gJ+GFrCcsCifvv5InID0+ICfhha0nLAon77+TJyA9PiAn4YWuJywKJ++/lCcgPT4gJ+GFrycsCifvv5UnID0+ICfhhbAnLAon77+WJyA9PiAn4YWxJywKJ++/lycgPT4gJ+GFsicsCifvv5onID0+ICfhhbMnLAon77+bJyA9PiAn4YW0JywKJ++/nCcgPT4gJ+GFtScsCifvv6AnID0+ICfCoicsCifvv6EnID0+ICfCoycsCifvv6InID0+ICfCrCcsCifvv6MnID0+ICcgzIQnLAon77+kJyA9PiAnwqYnLAon77+lJyA9PiAnwqUnLAon77+mJyA9PiAn4oKpJywKJ++/qCcgPT4gJ+KUgicsCifvv6knID0+ICfihpAnLAon77+qJyA9PiAn4oaRJywKJ++/qycgPT4gJ+KGkicsCifvv6wnID0+ICfihpMnLAon77+tJyA9PiAn4pagJywKJ++/ricgPT4gJ+KXiycsCifwnZCAJyA9PiAnQScsCifwnZCBJyA9PiAnQicsCifwnZCCJyA9PiAnQycsCifwnZCDJyA9PiAnRCcsCifwnZCEJyA9PiAnRScsCifwnZCFJyA9PiAnRicsCifwnZCGJyA9PiAnRycsCifwnZCHJyA9PiAnSCcsCifwnZCIJyA9PiAnSScsCifwnZCJJyA9PiAnSicsCifwnZCKJyA9PiAnSycsCifwnZCLJyA9PiAnTCcsCifwnZCMJyA9PiAnTScsCifwnZCNJyA9PiAnTicsCifwnZCOJyA9PiAnTycsCifwnZCPJyA9PiAnUCcsCifwnZCQJyA9PiAnUScsCifwnZCRJyA9PiAnUicsCifwnZCSJyA9PiAnUycsCifwnZCTJyA9PiAnVCcsCifwnZCUJyA9PiAnVScsCifwnZCVJyA9PiAnVicsCifwnZCWJyA9PiAnVycsCifwnZCXJyA9PiAnWCcsCifwnZCYJyA9PiAnWScsCifwnZCZJyA9PiAnWicsCifwnZCaJyA9PiAnYScsCifwnZCbJyA9PiAnYicsCifwnZCcJyA9PiAnYycsCifwnZCdJyA9PiAnZCcsCifwnZCeJyA9PiAnZScsCifwnZCfJyA9PiAnZicsCifwnZCgJyA9PiAnZycsCifwnZChJyA9PiAnaCcsCifwnZCiJyA9PiAnaScsCifwnZCjJyA9PiAnaicsCifwnZCkJyA9PiAnaycsCifwnZClJyA9PiAnbCcsCifwnZCmJyA9PiAnbScsCifwnZCnJyA9PiAnbicsCifwnZCoJyA9PiAnbycsCifwnZCpJyA9PiAncCcsCifwnZCqJyA9PiAncScsCifwnZCrJyA9PiAncicsCifwnZCsJyA9PiAncycsCifwnZCtJyA9PiAndCcsCifwnZCuJyA9PiAndScsCifwnZCvJyA9PiAndicsCifwnZCwJyA9PiAndycsCifwnZCxJyA9PiAneCcsCifwnZCyJyA9PiAneScsCifwnZCzJyA9PiAneicsCifwnZC0JyA9PiAnQScsCifwnZC1JyA9PiAnQicsCifwnZC2JyA9PiAnQycsCifwnZC3JyA9PiAnRCcsCifwnZC4JyA9PiAnRScsCifwnZC5JyA9PiAnRicsCifwnZC6JyA9PiAnRycsCifwnZC7JyA9PiAnSCcsCifwnZC8JyA9PiAnSScsCifwnZC9JyA9PiAnSicsCifwnZC+JyA9PiAnSycsCifwnZC/JyA9PiAnTCcsCifwnZGAJyA9PiAnTScsCifwnZGBJyA9PiAnTicsCifwnZGCJyA9PiAnTycsCifwnZGDJyA9PiAnUCcsCifwnZGEJyA9PiAnUScsCifwnZGFJyA9PiAnUicsCifwnZGGJyA9PiAnUycsCifwnZGHJyA9PiAnVCcsCifwnZGIJyA9PiAnVScsCifwnZGJJyA9PiAnVicsCifwnZGKJyA9PiAnVycsCifwnZGLJyA9PiAnWCcsCifwnZGMJyA9PiAnWScsCifwnZGNJyA9PiAnWicsCifwnZGOJyA9PiAnYScsCifwnZGPJyA9PiAnYicsCifwnZGQJyA9PiAnYycsCifwnZGRJyA9PiAnZCcsCifwnZGSJyA9PiAnZScsCifwnZGTJyA9PiAnZicsCifwnZGUJyA9PiAnZycsCifwnZGWJyA9PiAnaScsCifwnZGXJyA9PiAnaicsCifwnZGYJyA9PiAnaycsCifwnZGZJyA9PiAnbCcsCifwnZGaJyA9PiAnbScsCifwnZGbJyA9PiAnbicsCifwnZGcJyA9PiAnbycsCifwnZGdJyA9PiAncCcsCifwnZGeJyA9PiAncScsCifwnZGfJyA9PiAncicsCifwnZGgJyA9PiAncycsCifwnZGhJyA9PiAndCcsCifwnZGiJyA9PiAndScsCifwnZGjJyA9PiAndicsCifwnZGkJyA9PiAndycsCifwnZGlJyA9PiAneCcsCifwnZGmJyA9PiAneScsCifwnZGnJyA9PiAneicsCifwnZGoJyA9PiAnQScsCifwnZGpJyA9PiAnQicsCifwnZGqJyA9PiAnQycsCifwnZGrJyA9PiAnRCcsCifwnZGsJyA9PiAnRScsCifwnZGtJyA9PiAnRicsCifwnZGuJyA9PiAnRycsCifwnZGvJyA9PiAnSCcsCifwnZGwJyA9PiAnSScsCifwnZGxJyA9PiAnSicsCifwnZGyJyA9PiAnSycsCifwnZGzJyA9PiAnTCcsCifwnZG0JyA9PiAnTScsCifwnZG1JyA9PiAnTicsCifwnZG2JyA9PiAnTycsCifwnZG3JyA9PiAnUCcsCifwnZG4JyA9PiAnUScsCifwnZG5JyA9PiAnUicsCifwnZG6JyA9PiAnUycsCifwnZG7JyA9PiAnVCcsCifwnZG8JyA9PiAnVScsCifwnZG9JyA9PiAnVicsCifwnZG+JyA9PiAnVycsCifwnZG/JyA9PiAnWCcsCifwnZKAJyA9PiAnWScsCifwnZKBJyA9PiAnWicsCifwnZKCJyA9PiAnYScsCifwnZKDJyA9PiAnYicsCifwnZKEJyA9PiAnYycsCifwnZKFJyA9PiAnZCcsCifwnZKGJyA9PiAnZScsCifwnZKHJyA9PiAnZicsCifwnZKIJyA9PiAnZycsCifwnZKJJyA9PiAnaCcsCifwnZKKJyA9PiAnaScsCifwnZKLJyA9PiAnaicsCifwnZKMJyA9PiAnaycsCifwnZKNJyA9PiAnbCcsCifwnZKOJyA9PiAnbScsCifwnZKPJyA9PiAnbicsCifwnZKQJyA9PiAnbycsCifwnZKRJyA9PiAncCcsCifwnZKSJyA9PiAncScsCifwnZKTJyA9PiAncicsCifwnZKUJyA9PiAncycsCifwnZKVJyA9PiAndCcsCifwnZKWJyA9PiAndScsCifwnZKXJyA9PiAndicsCifwnZKYJyA9PiAndycsCifwnZKZJyA9PiAneCcsCifwnZKaJyA9PiAneScsCifwnZKbJyA9PiAneicsCifwnZKcJyA9PiAnQScsCifwnZKeJyA9PiAnQycsCifwnZKfJyA9PiAnRCcsCifwnZKiJyA9PiAnRycsCifwnZKlJyA9PiAnSicsCifwnZKmJyA9PiAnSycsCifwnZKpJyA9PiAnTicsCifwnZKqJyA9PiAnTycsCifwnZKrJyA9PiAnUCcsCifwnZKsJyA9PiAnUScsCifwnZKuJyA9PiAnUycsCifwnZKvJyA9PiAnVCcsCifwnZKwJyA9PiAnVScsCifwnZKxJyA9PiAnVicsCifwnZKyJyA9PiAnVycsCifwnZKzJyA9PiAnWCcsCifwnZK0JyA9PiAnWScsCifwnZK1JyA9PiAnWicsCifwnZK2JyA9PiAnYScsCifwnZK3JyA9PiAnYicsCifwnZK4JyA9PiAnYycsCifwnZK5JyA9PiAnZCcsCifwnZK7JyA9PiAnZicsCifwnZK9JyA9PiAnaCcsCifwnZK+JyA9PiAnaScsCifwnZK/JyA9PiAnaicsCifwnZOAJyA9PiAnaycsCifwnZOBJyA9PiAnbCcsCifwnZOCJyA9PiAnbScsCifwnZODJyA9PiAnbicsCifwnZOFJyA9PiAncCcsCifwnZOGJyA9PiAncScsCifwnZOHJyA9PiAncicsCifwnZOIJyA9PiAncycsCifwnZOJJyA9PiAndCcsCifwnZOKJyA9PiAndScsCifwnZOLJyA9PiAndicsCifwnZOMJyA9PiAndycsCifwnZONJyA9PiAneCcsCifwnZOOJyA9PiAneScsCifwnZOPJyA9PiAneicsCifwnZOQJyA9PiAnQScsCifwnZORJyA9PiAnQicsCifwnZOSJyA9PiAnQycsCifwnZOTJyA9PiAnRCcsCifwnZOUJyA9PiAnRScsCifwnZOVJyA9PiAnRicsCifwnZOWJyA9PiAnRycsCifwnZOXJyA9PiAnSCcsCifwnZOYJyA9PiAnSScsCifwnZOZJyA9PiAnSicsCifwnZOaJyA9PiAnSycsCifwnZObJyA9PiAnTCcsCifwnZOcJyA9PiAnTScsCifwnZOdJyA9PiAnTicsCifwnZOeJyA9PiAnTycsCifwnZOfJyA9PiAnUCcsCifwnZOgJyA9PiAnUScsCifwnZOhJyA9PiAnUicsCifwnZOiJyA9PiAnUycsCifwnZOjJyA9PiAnVCcsCifwnZOkJyA9PiAnVScsCifwnZOlJyA9PiAnVicsCifwnZOmJyA9PiAnVycsCifwnZOnJyA9PiAnWCcsCifwnZOoJyA9PiAnWScsCifwnZOpJyA9PiAnWicsCifwnZOqJyA9PiAnYScsCifwnZOrJyA9PiAnYicsCifwnZOsJyA9PiAnYycsCifwnZOtJyA9PiAnZCcsCifwnZOuJyA9PiAnZScsCifwnZOvJyA9PiAnZicsCifwnZOwJyA9PiAnZycsCifwnZOxJyA9PiAnaCcsCifwnZOyJyA9PiAnaScsCifwnZOzJyA9PiAnaicsCifwnZO0JyA9PiAnaycsCifwnZO1JyA9PiAnbCcsCifwnZO2JyA9PiAnbScsCifwnZO3JyA9PiAnbicsCifwnZO4JyA9PiAnbycsCifwnZO5JyA9PiAncCcsCifwnZO6JyA9PiAncScsCifwnZO7JyA9PiAncicsCifwnZO8JyA9PiAncycsCifwnZO9JyA9PiAndCcsCifwnZO+JyA9PiAndScsCifwnZO/JyA9PiAndicsCifwnZSAJyA9PiAndycsCifwnZSBJyA9PiAneCcsCifwnZSCJyA9PiAneScsCifwnZSDJyA9PiAneicsCifwnZSEJyA9PiAnQScsCifwnZSFJyA9PiAnQicsCifwnZSHJyA9PiAnRCcsCifwnZSIJyA9PiAnRScsCifwnZSJJyA9PiAnRicsCifwnZSKJyA9PiAnRycsCifwnZSNJyA9PiAnSicsCifwnZSOJyA9PiAnSycsCifwnZSPJyA9PiAnTCcsCifwnZSQJyA9PiAnTScsCifwnZSRJyA9PiAnTicsCifwnZSSJyA9PiAnTycsCifwnZSTJyA9PiAnUCcsCifwnZSUJyA9PiAnUScsCifwnZSWJyA9PiAnUycsCifwnZSXJyA9PiAnVCcsCifwnZSYJyA9PiAnVScsCifwnZSZJyA9PiAnVicsCifwnZSaJyA9PiAnVycsCifwnZSbJyA9PiAnWCcsCifwnZScJyA9PiAnWScsCifwnZSeJyA9PiAnYScsCifwnZSfJyA9PiAnYicsCifwnZSgJyA9PiAnYycsCifwnZShJyA9PiAnZCcsCifwnZSiJyA9PiAnZScsCifwnZSjJyA9PiAnZicsCifwnZSkJyA9PiAnZycsCifwnZSlJyA9PiAnaCcsCifwnZSmJyA9PiAnaScsCifwnZSnJyA9PiAnaicsCifwnZSoJyA9PiAnaycsCifwnZSpJyA9PiAnbCcsCifwnZSqJyA9PiAnbScsCifwnZSrJyA9PiAnbicsCifwnZSsJyA9PiAnbycsCifwnZStJyA9PiAncCcsCifwnZSuJyA9PiAncScsCifwnZSvJyA9PiAncicsCifwnZSwJyA9PiAncycsCifwnZSxJyA9PiAndCcsCifwnZSyJyA9PiAndScsCifwnZSzJyA9PiAndicsCifwnZS0JyA9PiAndycsCifwnZS1JyA9PiAneCcsCifwnZS2JyA9PiAneScsCifwnZS3JyA9PiAneicsCifwnZS4JyA9PiAnQScsCifwnZS5JyA9PiAnQicsCifwnZS7JyA9PiAnRCcsCifwnZS8JyA9PiAnRScsCifwnZS9JyA9PiAnRicsCifwnZS+JyA9PiAnRycsCifwnZWAJyA9PiAnSScsCifwnZWBJyA9PiAnSicsCifwnZWCJyA9PiAnSycsCifwnZWDJyA9PiAnTCcsCifwnZWEJyA9PiAnTScsCifwnZWGJyA9PiAnTycsCifwnZWKJyA9PiAnUycsCifwnZWLJyA9PiAnVCcsCifwnZWMJyA9PiAnVScsCifwnZWNJyA9PiAnVicsCifwnZWOJyA9PiAnVycsCifwnZWPJyA9PiAnWCcsCifwnZWQJyA9PiAnWScsCifwnZWSJyA9PiAnYScsCifwnZWTJyA9PiAnYicsCifwnZWUJyA9PiAnYycsCifwnZWVJyA9PiAnZCcsCifwnZWWJyA9PiAnZScsCifwnZWXJyA9PiAnZicsCifwnZWYJyA9PiAnZycsCifwnZWZJyA9PiAnaCcsCifwnZWaJyA9PiAnaScsCifwnZWbJyA9PiAnaicsCifwnZWcJyA9PiAnaycsCifwnZWdJyA9PiAnbCcsCifwnZWeJyA9PiAnbScsCifwnZWfJyA9PiAnbicsCifwnZWgJyA9PiAnbycsCifwnZWhJyA9PiAncCcsCifwnZWiJyA9PiAncScsCifwnZWjJyA9PiAncicsCifwnZWkJyA9PiAncycsCifwnZWlJyA9PiAndCcsCifwnZWmJyA9PiAndScsCifwnZWnJyA9PiAndicsCifwnZWoJyA9PiAndycsCifwnZWpJyA9PiAneCcsCifwnZWqJyA9PiAneScsCifwnZWrJyA9PiAneicsCifwnZWsJyA9PiAnQScsCifwnZWtJyA9PiAnQicsCifwnZWuJyA9PiAnQycsCifwnZWvJyA9PiAnRCcsCifwnZWwJyA9PiAnRScsCifwnZWxJyA9PiAnRicsCifwnZWyJyA9PiAnRycsCifwnZWzJyA9PiAnSCcsCifwnZW0JyA9PiAnSScsCifwnZW1JyA9PiAnSicsCifwnZW2JyA9PiAnSycsCifwnZW3JyA9PiAnTCcsCifwnZW4JyA9PiAnTScsCifwnZW5JyA9PiAnTicsCifwnZW6JyA9PiAnTycsCifwnZW7JyA9PiAnUCcsCifwnZW8JyA9PiAnUScsCifwnZW9JyA9PiAnUicsCifwnZW+JyA9PiAnUycsCifwnZW/JyA9PiAnVCcsCifwnZaAJyA9PiAnVScsCifwnZaBJyA9PiAnVicsCifwnZaCJyA9PiAnVycsCifwnZaDJyA9PiAnWCcsCifwnZaEJyA9PiAnWScsCifwnZaFJyA9PiAnWicsCifwnZaGJyA9PiAnYScsCifwnZaHJyA9PiAnYicsCifwnZaIJyA9PiAnYycsCifwnZaJJyA9PiAnZCcsCifwnZaKJyA9PiAnZScsCifwnZaLJyA9PiAnZicsCifwnZaMJyA9PiAnZycsCifwnZaNJyA9PiAnaCcsCifwnZaOJyA9PiAnaScsCifwnZaPJyA9PiAnaicsCifwnZaQJyA9PiAnaycsCifwnZaRJyA9PiAnbCcsCifwnZaSJyA9PiAnbScsCifwnZaTJyA9PiAnbicsCifwnZaUJyA9PiAnbycsCifwnZaVJyA9PiAncCcsCifwnZaWJyA9PiAncScsCifwnZaXJyA9PiAncicsCifwnZaYJyA9PiAncycsCifwnZaZJyA9PiAndCcsCifwnZaaJyA9PiAndScsCifwnZabJyA9PiAndicsCifwnZacJyA9PiAndycsCifwnZadJyA9PiAneCcsCifwnZaeJyA9PiAneScsCifwnZafJyA9PiAneicsCifwnZagJyA9PiAnQScsCifwnZahJyA9PiAnQicsCifwnZaiJyA9PiAnQycsCifwnZajJyA9PiAnRCcsCifwnZakJyA9PiAnRScsCifwnZalJyA9PiAnRicsCifwnZamJyA9PiAnRycsCifwnZanJyA9PiAnSCcsCifwnZaoJyA9PiAnSScsCifwnZapJyA9PiAnSicsCifwnZaqJyA9PiAnSycsCifwnZarJyA9PiAnTCcsCifwnZasJyA9PiAnTScsCifwnZatJyA9PiAnTicsCifwnZauJyA9PiAnTycsCifwnZavJyA9PiAnUCcsCifwnZawJyA9PiAnUScsCifwnZaxJyA9PiAnUicsCifwnZayJyA9PiAnUycsCifwnZazJyA9PiAnVCcsCifwnZa0JyA9PiAnVScsCifwnZa1JyA9PiAnVicsCifwnZa2JyA9PiAnVycsCifwnZa3JyA9PiAnWCcsCifwnZa4JyA9PiAnWScsCifwnZa5JyA9PiAnWicsCifwnZa6JyA9PiAnYScsCifwnZa7JyA9PiAnYicsCifwnZa8JyA9PiAnYycsCifwnZa9JyA9PiAnZCcsCifwnZa+JyA9PiAnZScsCifwnZa/JyA9PiAnZicsCifwnZeAJyA9PiAnZycsCifwnZeBJyA9PiAnaCcsCifwnZeCJyA9PiAnaScsCifwnZeDJyA9PiAnaicsCifwnZeEJyA9PiAnaycsCifwnZeFJyA9PiAnbCcsCifwnZeGJyA9PiAnbScsCifwnZeHJyA9PiAnbicsCifwnZeIJyA9PiAnbycsCifwnZeJJyA9PiAncCcsCifwnZeKJyA9PiAncScsCifwnZeLJyA9PiAncicsCifwnZeMJyA9PiAncycsCifwnZeNJyA9PiAndCcsCifwnZeOJyA9PiAndScsCifwnZePJyA9PiAndicsCifwnZeQJyA9PiAndycsCifwnZeRJyA9PiAneCcsCifwnZeSJyA9PiAneScsCifwnZeTJyA9PiAneicsCifwnZeUJyA9PiAnQScsCifwnZeVJyA9PiAnQicsCifwnZeWJyA9PiAnQycsCifwnZeXJyA9PiAnRCcsCifwnZeYJyA9PiAnRScsCifwnZeZJyA9PiAnRicsCifwnZeaJyA9PiAnRycsCifwnZebJyA9PiAnSCcsCifwnZecJyA9PiAnSScsCifwnZedJyA9PiAnSicsCifwnZeeJyA9PiAnSycsCifwnZefJyA9PiAnTCcsCifwnZegJyA9PiAnTScsCifwnZehJyA9PiAnTicsCifwnZeiJyA9PiAnTycsCifwnZejJyA9PiAnUCcsCifwnZekJyA9PiAnUScsCifwnZelJyA9PiAnUicsCifwnZemJyA9PiAnUycsCifwnZenJyA9PiAnVCcsCifwnZeoJyA9PiAnVScsCifwnZepJyA9PiAnVicsCifwnZeqJyA9PiAnVycsCifwnZerJyA9PiAnWCcsCifwnZesJyA9PiAnWScsCifwnZetJyA9PiAnWicsCifwnZeuJyA9PiAnYScsCifwnZevJyA9PiAnYicsCifwnZewJyA9PiAnYycsCifwnZexJyA9PiAnZCcsCifwnZeyJyA9PiAnZScsCifwnZezJyA9PiAnZicsCifwnZe0JyA9PiAnZycsCifwnZe1JyA9PiAnaCcsCifwnZe2JyA9PiAnaScsCifwnZe3JyA9PiAnaicsCifwnZe4JyA9PiAnaycsCifwnZe5JyA9PiAnbCcsCifwnZe6JyA9PiAnbScsCifwnZe7JyA9PiAnbicsCifwnZe8JyA9PiAnbycsCifwnZe9JyA9PiAncCcsCifwnZe+JyA9PiAncScsCifwnZe/JyA9PiAncicsCifwnZiAJyA9PiAncycsCifwnZiBJyA9PiAndCcsCifwnZiCJyA9PiAndScsCifwnZiDJyA9PiAndicsCifwnZiEJyA9PiAndycsCifwnZiFJyA9PiAneCcsCifwnZiGJyA9PiAneScsCifwnZiHJyA9PiAneicsCifwnZiIJyA9PiAnQScsCifwnZiJJyA9PiAnQicsCifwnZiKJyA9PiAnQycsCifwnZiLJyA9PiAnRCcsCifwnZiMJyA9PiAnRScsCifwnZiNJyA9PiAnRicsCifwnZiOJyA9PiAnRycsCifwnZiPJyA9PiAnSCcsCifwnZiQJyA9PiAnSScsCifwnZiRJyA9PiAnSicsCifwnZiSJyA9PiAnSycsCifwnZiTJyA9PiAnTCcsCifwnZiUJyA9PiAnTScsCifwnZiVJyA9PiAnTicsCifwnZiWJyA9PiAnTycsCifwnZiXJyA9PiAnUCcsCifwnZiYJyA9PiAnUScsCifwnZiZJyA9PiAnUicsCifwnZiaJyA9PiAnUycsCifwnZibJyA9PiAnVCcsCifwnZicJyA9PiAnVScsCifwnZidJyA9PiAnVicsCifwnZieJyA9PiAnVycsCifwnZifJyA9PiAnWCcsCifwnZigJyA9PiAnWScsCifwnZihJyA9PiAnWicsCifwnZiiJyA9PiAnYScsCifwnZijJyA9PiAnYicsCifwnZikJyA9PiAnYycsCifwnZilJyA9PiAnZCcsCifwnZimJyA9PiAnZScsCifwnZinJyA9PiAnZicsCifwnZioJyA9PiAnZycsCifwnZipJyA9PiAnaCcsCifwnZiqJyA9PiAnaScsCifwnZirJyA9PiAnaicsCifwnZisJyA9PiAnaycsCifwnZitJyA9PiAnbCcsCifwnZiuJyA9PiAnbScsCifwnZivJyA9PiAnbicsCifwnZiwJyA9PiAnbycsCifwnZixJyA9PiAncCcsCifwnZiyJyA9PiAncScsCifwnZizJyA9PiAncicsCifwnZi0JyA9PiAncycsCifwnZi1JyA9PiAndCcsCifwnZi2JyA9PiAndScsCifwnZi3JyA9PiAndicsCifwnZi4JyA9PiAndycsCifwnZi5JyA9PiAneCcsCifwnZi6JyA9PiAneScsCifwnZi7JyA9PiAneicsCifwnZi8JyA9PiAnQScsCifwnZi9JyA9PiAnQicsCifwnZi+JyA9PiAnQycsCifwnZi/JyA9PiAnRCcsCifwnZmAJyA9PiAnRScsCifwnZmBJyA9PiAnRicsCifwnZmCJyA9PiAnRycsCifwnZmDJyA9PiAnSCcsCifwnZmEJyA9PiAnSScsCifwnZmFJyA9PiAnSicsCifwnZmGJyA9PiAnSycsCifwnZmHJyA9PiAnTCcsCifwnZmIJyA9PiAnTScsCifwnZmJJyA9PiAnTicsCifwnZmKJyA9PiAnTycsCifwnZmLJyA9PiAnUCcsCifwnZmMJyA9PiAnUScsCifwnZmNJyA9PiAnUicsCifwnZmOJyA9PiAnUycsCifwnZmPJyA9PiAnVCcsCifwnZmQJyA9PiAnVScsCifwnZmRJyA9PiAnVicsCifwnZmSJyA9PiAnVycsCifwnZmTJyA9PiAnWCcsCifwnZmUJyA9PiAnWScsCifwnZmVJyA9PiAnWicsCifwnZmWJyA9PiAnYScsCifwnZmXJyA9PiAnYicsCifwnZmYJyA9PiAnYycsCifwnZmZJyA9PiAnZCcsCifwnZmaJyA9PiAnZScsCifwnZmbJyA9PiAnZicsCifwnZmcJyA9PiAnZycsCifwnZmdJyA9PiAnaCcsCifwnZmeJyA9PiAnaScsCifwnZmfJyA9PiAnaicsCifwnZmgJyA9PiAnaycsCifwnZmhJyA9PiAnbCcsCifwnZmiJyA9PiAnbScsCifwnZmjJyA9PiAnbicsCifwnZmkJyA9PiAnbycsCifwnZmlJyA9PiAncCcsCifwnZmmJyA9PiAncScsCifwnZmnJyA9PiAncicsCifwnZmoJyA9PiAncycsCifwnZmpJyA9PiAndCcsCifwnZmqJyA9PiAndScsCifwnZmrJyA9PiAndicsCifwnZmsJyA9PiAndycsCifwnZmtJyA9PiAneCcsCifwnZmuJyA9PiAneScsCifwnZmvJyA9PiAneicsCifwnZmwJyA9PiAnQScsCifwnZmxJyA9PiAnQicsCifwnZmyJyA9PiAnQycsCifwnZmzJyA9PiAnRCcsCifwnZm0JyA9PiAnRScsCifwnZm1JyA9PiAnRicsCifwnZm2JyA9PiAnRycsCifwnZm3JyA9PiAnSCcsCifwnZm4JyA9PiAnSScsCifwnZm5JyA9PiAnSicsCifwnZm6JyA9PiAnSycsCifwnZm7JyA9PiAnTCcsCifwnZm8JyA9PiAnTScsCifwnZm9JyA9PiAnTicsCifwnZm+JyA9PiAnTycsCifwnZm/JyA9PiAnUCcsCifwnZqAJyA9PiAnUScsCifwnZqBJyA9PiAnUicsCifwnZqCJyA9PiAnUycsCifwnZqDJyA9PiAnVCcsCifwnZqEJyA9PiAnVScsCifwnZqFJyA9PiAnVicsCifwnZqGJyA9PiAnVycsCifwnZqHJyA9PiAnWCcsCifwnZqIJyA9PiAnWScsCifwnZqJJyA9PiAnWicsCifwnZqKJyA9PiAnYScsCifwnZqLJyA9PiAnYicsCifwnZqMJyA9PiAnYycsCifwnZqNJyA9PiAnZCcsCifwnZqOJyA9PiAnZScsCifwnZqPJyA9PiAnZicsCifwnZqQJyA9PiAnZycsCifwnZqRJyA9PiAnaCcsCifwnZqSJyA9PiAnaScsCifwnZqTJyA9PiAnaicsCifwnZqUJyA9PiAnaycsCifwnZqVJyA9PiAnbCcsCifwnZqWJyA9PiAnbScsCifwnZqXJyA9PiAnbicsCifwnZqYJyA9PiAnbycsCifwnZqZJyA9PiAncCcsCifwnZqaJyA9PiAncScsCifwnZqbJyA9PiAncicsCifwnZqcJyA9PiAncycsCifwnZqdJyA9PiAndCcsCifwnZqeJyA9PiAndScsCifwnZqfJyA9PiAndicsCifwnZqgJyA9PiAndycsCifwnZqhJyA9PiAneCcsCifwnZqiJyA9PiAneScsCifwnZqjJyA9PiAneicsCifwnZqkJyA9PiAnxLEnLAon8J2apScgPT4gJ8i3JywKJ/CdmqgnID0+ICfOkScsCifwnZqpJyA9PiAnzpInLAon8J2aqicgPT4gJ86TJywKJ/CdmqsnID0+ICfOlCcsCifwnZqsJyA9PiAnzpUnLAon8J2arScgPT4gJ86WJywKJ/Cdmq4nID0+ICfOlycsCifwnZqvJyA9PiAnzpgnLAon8J2asCcgPT4gJ86ZJywKJ/CdmrEnID0+ICfOmicsCifwnZqyJyA9PiAnzpsnLAon8J2asycgPT4gJ86cJywKJ/CdmrQnID0+ICfOnScsCifwnZq1JyA9PiAnzp4nLAon8J2aticgPT4gJ86fJywKJ/CdmrcnID0+ICfOoCcsCifwnZq4JyA9PiAnzqEnLAon8J2auScgPT4gJ86YJywKJ/CdmronID0+ICfOoycsCifwnZq7JyA9PiAnzqQnLAon8J2avCcgPT4gJ86lJywKJ/Cdmr0nID0+ICfOpicsCifwnZq+JyA9PiAnzqcnLAon8J2avycgPT4gJ86oJywKJ/Cdm4AnID0+ICfOqScsCifwnZuBJyA9PiAn4oiHJywKJ/Cdm4InID0+ICfOsScsCifwnZuDJyA9PiAnzrInLAon8J2bhCcgPT4gJ86zJywKJ/Cdm4UnID0+ICfOtCcsCifwnZuGJyA9PiAnzrUnLAon8J2bhycgPT4gJ862JywKJ/Cdm4gnID0+ICfOtycsCifwnZuJJyA9PiAnzrgnLAon8J2biicgPT4gJ865JywKJ/Cdm4snID0+ICfOuicsCifwnZuMJyA9PiAnzrsnLAon8J2bjScgPT4gJ868JywKJ/Cdm44nID0+ICfOvScsCifwnZuPJyA9PiAnzr4nLAon8J2bkCcgPT4gJ86/JywKJ/Cdm5EnID0+ICfPgCcsCifwnZuSJyA9PiAnz4EnLAon8J2bkycgPT4gJ8+CJywKJ/Cdm5QnID0+ICfPgycsCifwnZuVJyA9PiAnz4QnLAon8J2blicgPT4gJ8+FJywKJ/Cdm5cnID0+ICfPhicsCifwnZuYJyA9PiAnz4cnLAon8J2bmScgPT4gJ8+IJywKJ/Cdm5onID0+ICfPiScsCifwnZubJyA9PiAn4oiCJywKJ/Cdm5wnID0+ICfOtScsCifwnZudJyA9PiAnzrgnLAon8J2bnicgPT4gJ866JywKJ/Cdm58nID0+ICfPhicsCifwnZugJyA9PiAnz4EnLAon8J2boScgPT4gJ8+AJywKJ/Cdm6InID0+ICfOkScsCifwnZujJyA9PiAnzpInLAon8J2bpCcgPT4gJ86TJywKJ/Cdm6UnID0+ICfOlCcsCifwnZumJyA9PiAnzpUnLAon8J2bpycgPT4gJ86WJywKJ/Cdm6gnID0+ICfOlycsCifwnZupJyA9PiAnzpgnLAon8J2bqicgPT4gJ86ZJywKJ/Cdm6snID0+ICfOmicsCifwnZusJyA9PiAnzpsnLAon8J2brScgPT4gJ86cJywKJ/Cdm64nID0+ICfOnScsCifwnZuvJyA9PiAnzp4nLAon8J2bsCcgPT4gJ86fJywKJ/Cdm7EnID0+ICfOoCcsCifwnZuyJyA9PiAnzqEnLAon8J2bsycgPT4gJ86YJywKJ/Cdm7QnID0+ICfOoycsCifwnZu1JyA9PiAnzqQnLAon8J2bticgPT4gJ86lJywKJ/Cdm7cnID0+ICfOpicsCifwnZu4JyA9PiAnzqcnLAon8J2buScgPT4gJ86oJywKJ/Cdm7onID0+ICfOqScsCifwnZu7JyA9PiAn4oiHJywKJ/Cdm7wnID0+ICfOsScsCifwnZu9JyA9PiAnzrInLAon8J2bvicgPT4gJ86zJywKJ/Cdm78nID0+ICfOtCcsCifwnZyAJyA9PiAnzrUnLAon8J2cgScgPT4gJ862JywKJ/CdnIInID0+ICfOtycsCifwnZyDJyA9PiAnzrgnLAon8J2chCcgPT4gJ865JywKJ/CdnIUnID0+ICfOuicsCifwnZyGJyA9PiAnzrsnLAon8J2chycgPT4gJ868JywKJ/CdnIgnID0+ICfOvScsCifwnZyJJyA9PiAnzr4nLAon8J2ciicgPT4gJ86/JywKJ/CdnIsnID0+ICfPgCcsCifwnZyMJyA9PiAnz4EnLAon8J2cjScgPT4gJ8+CJywKJ/CdnI4nID0+ICfPgycsCifwnZyPJyA9PiAnz4QnLAon8J2ckCcgPT4gJ8+FJywKJ/CdnJEnID0+ICfPhicsCifwnZySJyA9PiAnz4cnLAon8J2ckycgPT4gJ8+IJywKJ/CdnJQnID0+ICfPiScsCifwnZyVJyA9PiAn4oiCJywKJ/CdnJYnID0+ICfOtScsCifwnZyXJyA9PiAnzrgnLAon8J2cmCcgPT4gJ866JywKJ/CdnJknID0+ICfPhicsCifwnZyaJyA9PiAnz4EnLAon8J2cmycgPT4gJ8+AJywKJ/CdnJwnID0+ICfOkScsCifwnZydJyA9PiAnzpInLAon8J2cnicgPT4gJ86TJywKJ/CdnJ8nID0+ICfOlCcsCifwnZygJyA9PiAnzpUnLAon8J2coScgPT4gJ86WJywKJ/CdnKInID0+ICfOlycsCifwnZyjJyA9PiAnzpgnLAon8J2cpCcgPT4gJ86ZJywKJ/CdnKUnID0+ICfOmicsCifwnZymJyA9PiAnzpsnLAon8J2cpycgPT4gJ86cJywKJ/CdnKgnID0+ICfOnScsCifwnZypJyA9PiAnzp4nLAon8J2cqicgPT4gJ86fJywKJ/CdnKsnID0+ICfOoCcsCifwnZysJyA9PiAnzqEnLAon8J2crScgPT4gJ86YJywKJ/CdnK4nID0+ICfOoycsCifwnZyvJyA9PiAnzqQnLAon8J2csCcgPT4gJ86lJywKJ/CdnLEnID0+ICfOpicsCifwnZyyJyA9PiAnzqcnLAon8J2csycgPT4gJ86oJywKJ/CdnLQnID0+ICfOqScsCifwnZy1JyA9PiAn4oiHJywKJ/CdnLYnID0+ICfOsScsCifwnZy3JyA9PiAnzrInLAon8J2cuCcgPT4gJ86zJywKJ/CdnLknID0+ICfOtCcsCifwnZy6JyA9PiAnzrUnLAon8J2cuycgPT4gJ862JywKJ/CdnLwnID0+ICfOtycsCifwnZy9JyA9PiAnzrgnLAon8J2cvicgPT4gJ865JywKJ/CdnL8nID0+ICfOuicsCifwnZ2AJyA9PiAnzrsnLAon8J2dgScgPT4gJ868JywKJ/CdnYInID0+ICfOvScsCifwnZ2DJyA9PiAnzr4nLAon8J2dhCcgPT4gJ86/JywKJ/CdnYUnID0+ICfPgCcsCifwnZ2GJyA9PiAnz4EnLAon8J2dhycgPT4gJ8+CJywKJ/CdnYgnID0+ICfPgycsCifwnZ2JJyA9PiAnz4QnLAon8J2diicgPT4gJ8+FJywKJ/CdnYsnID0+ICfPhicsCifwnZ2MJyA9PiAnz4cnLAon8J2djScgPT4gJ8+IJywKJ/CdnY4nID0+ICfPiScsCifwnZ2PJyA9PiAn4oiCJywKJ/CdnZAnID0+ICfOtScsCifwnZ2RJyA9PiAnzrgnLAon8J2dkicgPT4gJ866JywKJ/CdnZMnID0+ICfPhicsCifwnZ2UJyA9PiAnz4EnLAon8J2dlScgPT4gJ8+AJywKJ/CdnZYnID0+ICfOkScsCifwnZ2XJyA9PiAnzpInLAon8J2dmCcgPT4gJ86TJywKJ/CdnZknID0+ICfOlCcsCifwnZ2aJyA9PiAnzpUnLAon8J2dmycgPT4gJ86WJywKJ/CdnZwnID0+ICfOlycsCifwnZ2dJyA9PiAnzpgnLAon8J2dnicgPT4gJ86ZJywKJ/CdnZ8nID0+ICfOmicsCifwnZ2gJyA9PiAnzpsnLAon8J2doScgPT4gJ86cJywKJ/CdnaInID0+ICfOnScsCifwnZ2jJyA9PiAnzp4nLAon8J2dpCcgPT4gJ86fJywKJ/CdnaUnID0+ICfOoCcsCifwnZ2mJyA9PiAnzqEnLAon8J2dpycgPT4gJ86YJywKJ/CdnagnID0+ICfOoycsCifwnZ2pJyA9PiAnzqQnLAon8J2dqicgPT4gJ86lJywKJ/CdnasnID0+ICfOpicsCifwnZ2sJyA9PiAnzqcnLAon8J2drScgPT4gJ86oJywKJ/Cdna4nID0+ICfOqScsCifwnZ2vJyA9PiAn4oiHJywKJ/CdnbAnID0+ICfOsScsCifwnZ2xJyA9PiAnzrInLAon8J2dsicgPT4gJ86zJywKJ/CdnbMnID0+ICfOtCcsCifwnZ20JyA9PiAnzrUnLAon8J2dtScgPT4gJ862JywKJ/CdnbYnID0+ICfOtycsCifwnZ23JyA9PiAnzrgnLAon8J2duCcgPT4gJ865JywKJ/CdnbknID0+ICfOuicsCifwnZ26JyA9PiAnzrsnLAon8J2duycgPT4gJ868JywKJ/CdnbwnID0+ICfOvScsCifwnZ29JyA9PiAnzr4nLAon8J2dvicgPT4gJ86/JywKJ/Cdnb8nID0+ICfPgCcsCifwnZ6AJyA9PiAnz4EnLAon8J2egScgPT4gJ8+CJywKJ/CdnoInID0+ICfPgycsCifwnZ6DJyA9PiAnz4QnLAon8J2ehCcgPT4gJ8+FJywKJ/CdnoUnID0+ICfPhicsCifwnZ6GJyA9PiAnz4cnLAon8J2ehycgPT4gJ8+IJywKJ/CdnognID0+ICfPiScsCifwnZ6JJyA9PiAn4oiCJywKJ/CdnoonID0+ICfOtScsCifwnZ6LJyA9PiAnzrgnLAon8J2ejCcgPT4gJ866JywKJ/Cdno0nID0+ICfPhicsCifwnZ6OJyA9PiAnz4EnLAon8J2ejycgPT4gJ8+AJywKJ/CdnpAnID0+ICfOkScsCifwnZ6RJyA9PiAnzpInLAon8J2ekicgPT4gJ86TJywKJ/CdnpMnID0+ICfOlCcsCifwnZ6UJyA9PiAnzpUnLAon8J2elScgPT4gJ86WJywKJ/CdnpYnID0+ICfOlycsCifwnZ6XJyA9PiAnzpgnLAon8J2emCcgPT4gJ86ZJywKJ/CdnpknID0+ICfOmicsCifwnZ6aJyA9PiAnzpsnLAon8J2emycgPT4gJ86cJywKJ/CdnpwnID0+ICfOnScsCifwnZ6dJyA9PiAnzp4nLAon8J2enicgPT4gJ86fJywKJ/Cdnp8nID0+ICfOoCcsCifwnZ6gJyA9PiAnzqEnLAon8J2eoScgPT4gJ86YJywKJ/CdnqInID0+ICfOoycsCifwnZ6jJyA9PiAnzqQnLAon8J2epCcgPT4gJ86lJywKJ/CdnqUnID0+ICfOpicsCifwnZ6mJyA9PiAnzqcnLAon8J2epycgPT4gJ86oJywKJ/CdnqgnID0+ICfOqScsCifwnZ6pJyA9PiAn4oiHJywKJ/CdnqonID0+ICfOsScsCifwnZ6rJyA9PiAnzrInLAon8J2erCcgPT4gJ86zJywKJ/Cdnq0nID0+ICfOtCcsCifwnZ6uJyA9PiAnzrUnLAon8J2erycgPT4gJ862JywKJ/CdnrAnID0+ICfOtycsCifwnZ6xJyA9PiAnzrgnLAon8J2esicgPT4gJ865JywKJ/CdnrMnID0+ICfOuicsCifwnZ60JyA9PiAnzrsnLAon8J2etScgPT4gJ868JywKJ/CdnrYnID0+ICfOvScsCifwnZ63JyA9PiAnzr4nLAon8J2euCcgPT4gJ86/JywKJ/CdnrknID0+ICfPgCcsCifwnZ66JyA9PiAnz4EnLAon8J2euycgPT4gJ8+CJywKJ/CdnrwnID0+ICfPgycsCifwnZ69JyA9PiAnz4QnLAon8J2evicgPT4gJ8+FJywKJ/Cdnr8nID0+ICfPhicsCifwnZ+AJyA9PiAnz4cnLAon8J2fgScgPT4gJ8+IJywKJ/Cdn4InID0+ICfPiScsCifwnZ+DJyA9PiAn4oiCJywKJ/Cdn4QnID0+ICfOtScsCifwnZ+FJyA9PiAnzrgnLAon8J2fhicgPT4gJ866JywKJ/Cdn4cnID0+ICfPhicsCifwnZ+IJyA9PiAnz4EnLAon8J2fiScgPT4gJ8+AJywKJ/Cdn4onID0+ICfPnCcsCifwnZ+LJyA9PiAnz50nLAon8J2fjicgPT4gJzAnLAon8J2fjycgPT4gJzEnLAon8J2fkCcgPT4gJzInLAon8J2fkScgPT4gJzMnLAon8J2fkicgPT4gJzQnLAon8J2fkycgPT4gJzUnLAon8J2flCcgPT4gJzYnLAon8J2flScgPT4gJzcnLAon8J2flicgPT4gJzgnLAon8J2flycgPT4gJzknLAon8J2fmCcgPT4gJzAnLAon8J2fmScgPT4gJzEnLAon8J2fmicgPT4gJzInLAon8J2fmycgPT4gJzMnLAon8J2fnCcgPT4gJzQnLAon8J2fnScgPT4gJzUnLAon8J2fnicgPT4gJzYnLAon8J2fnycgPT4gJzcnLAon8J2foCcgPT4gJzgnLAon8J2foScgPT4gJzknLAon8J2foicgPT4gJzAnLAon8J2foycgPT4gJzEnLAon8J2fpCcgPT4gJzInLAon8J2fpScgPT4gJzMnLAon8J2fpicgPT4gJzQnLAon8J2fpycgPT4gJzUnLAon8J2fqCcgPT4gJzYnLAon8J2fqScgPT4gJzcnLAon8J2fqicgPT4gJzgnLAon8J2fqycgPT4gJzknLAon8J2frCcgPT4gJzAnLAon8J2frScgPT4gJzEnLAon8J2fricgPT4gJzInLAon8J2frycgPT4gJzMnLAon8J2fsCcgPT4gJzQnLAon8J2fsScgPT4gJzUnLAon8J2fsicgPT4gJzYnLAon8J2fsycgPT4gJzcnLAon8J2ftCcgPT4gJzgnLAon8J2ftScgPT4gJzknLAon8J2fticgPT4gJzAnLAon8J2ftycgPT4gJzEnLAon8J2fuCcgPT4gJzInLAon8J2fuScgPT4gJzMnLAon8J2fuicgPT4gJzQnLAon8J2fuycgPT4gJzUnLAon8J2fvCcgPT4gJzYnLAon8J2fvScgPT4gJzcnLAon8J2fvicgPT4gJzgnLAon8J2fvycgPT4gJzknLAon8J64gCcgPT4gJ9inJywKJ/CeuIEnID0+ICfYqCcsCifwnriCJyA9PiAn2KwnLAon8J64gycgPT4gJ9ivJywKJ/CeuIUnID0+ICfZiCcsCifwnriGJyA9PiAn2LInLAon8J64hycgPT4gJ9itJywKJ/CeuIgnID0+ICfYtycsCifwnriJJyA9PiAn2YonLAon8J64iicgPT4gJ9mDJywKJ/CeuIsnID0+ICfZhCcsCifwnriMJyA9PiAn2YUnLAon8J64jScgPT4gJ9mGJywKJ/CeuI4nID0+ICfYsycsCifwnriPJyA9PiAn2LknLAon8J64kCcgPT4gJ9mBJywKJ/CeuJEnID0+ICfYtScsCifwnriSJyA9PiAn2YInLAon8J64kycgPT4gJ9ixJywKJ/CeuJQnID0+ICfYtCcsCifwnriVJyA9PiAn2KonLAon8J64licgPT4gJ9irJywKJ/CeuJcnID0+ICfYricsCifwnriYJyA9PiAn2LAnLAon8J64mScgPT4gJ9i2JywKJ/CeuJonID0+ICfYuCcsCifwnribJyA9PiAn2LonLAon8J64nCcgPT4gJ9muJywKJ/CeuJ0nID0+ICfauicsCifwnrieJyA9PiAn2qEnLAon8J64nycgPT4gJ9mvJywKJ/CeuKEnID0+ICfYqCcsCifwnriiJyA9PiAn2KwnLAon8J64pCcgPT4gJ9mHJywKJ/CeuKcnID0+ICfYrScsCifwnripJyA9PiAn2YonLAon8J64qicgPT4gJ9mDJywKJ/CeuKsnID0+ICfZhCcsCifwnrisJyA9PiAn2YUnLAon8J64rScgPT4gJ9mGJywKJ/CeuK4nID0+ICfYsycsCifwnrivJyA9PiAn2LknLAon8J64sCcgPT4gJ9mBJywKJ/CeuLEnID0+ICfYtScsCifwnriyJyA9PiAn2YInLAon8J64tCcgPT4gJ9i0JywKJ/CeuLUnID0+ICfYqicsCifwnri2JyA9PiAn2KsnLAon8J64tycgPT4gJ9iuJywKJ/CeuLknID0+ICfYticsCifwnri7JyA9PiAn2LonLAon8J65gicgPT4gJ9isJywKJ/CeuYcnID0+ICfYrScsCifwnrmJJyA9PiAn2YonLAon8J65iycgPT4gJ9mEJywKJ/CeuY0nID0+ICfZhicsCifwnrmOJyA9PiAn2LMnLAon8J65jycgPT4gJ9i5JywKJ/CeuZEnID0+ICfYtScsCifwnrmSJyA9PiAn2YInLAon8J65lCcgPT4gJ9i0JywKJ/CeuZcnID0+ICfYricsCifwnrmZJyA9PiAn2LYnLAon8J65mycgPT4gJ9i6JywKJ/CeuZ0nID0+ICfauicsCifwnrmfJyA9PiAn2a8nLAon8J65oScgPT4gJ9ioJywKJ/CeuaInID0+ICfYrCcsCifwnrmkJyA9PiAn2YcnLAon8J65pycgPT4gJ9itJywKJ/CeuagnID0+ICfYtycsCifwnrmpJyA9PiAn2YonLAon8J65qicgPT4gJ9mDJywKJ/CeuawnID0+ICfZhScsCifwnrmtJyA9PiAn2YYnLAon8J65ricgPT4gJ9izJywKJ/Ceua8nID0+ICfYuScsCifwnrmwJyA9PiAn2YEnLAon8J65sScgPT4gJ9i1JywKJ/CeubInID0+ICfZgicsCifwnrm0JyA9PiAn2LQnLAon8J65tScgPT4gJ9iqJywKJ/CeubYnID0+ICfYqycsCifwnrm3JyA9PiAn2K4nLAon8J65uScgPT4gJ9i2JywKJ/CeubonID0+ICfYuCcsCifwnrm7JyA9PiAn2LonLAon8J65vCcgPT4gJ9muJywKJ/Ceub4nID0+ICfaoScsCifwnrqAJyA9PiAn2KcnLAon8J66gScgPT4gJ9ioJywKJ/CeuoInID0+ICfYrCcsCifwnrqDJyA9PiAn2K8nLAon8J66hCcgPT4gJ9mHJywKJ/CeuoUnID0+ICfZiCcsCifwnrqGJyA9PiAn2LInLAon8J66hycgPT4gJ9itJywKJ/CeuognID0+ICfYtycsCifwnrqJJyA9PiAn2YonLAon8J66iycgPT4gJ9mEJywKJ/CeuownID0+ICfZhScsCifwnrqNJyA9PiAn2YYnLAon8J66jicgPT4gJ9izJywKJ/Ceuo8nID0+ICfYuScsCifwnrqQJyA9PiAn2YEnLAon8J66kScgPT4gJ9i1JywKJ/CeupInID0+ICfZgicsCifwnrqTJyA9PiAn2LEnLAon8J66lCcgPT4gJ9i0JywKJ/CeupUnID0+ICfYqicsCifwnrqWJyA9PiAn2KsnLAon8J66lycgPT4gJ9iuJywKJ/CeupgnID0+ICfYsCcsCifwnrqZJyA9PiAn2LYnLAon8J66micgPT4gJ9i4JywKJ/CeupsnID0+ICfYuicsCifwnrqhJyA9PiAn2KgnLAon8J66oicgPT4gJ9isJywKJ/CeuqMnID0+ICfYrycsCifwnrqlJyA9PiAn2YgnLAon8J66picgPT4gJ9iyJywKJ/CeuqcnID0+ICfYrScsCifwnrqoJyA9PiAn2LcnLAon8J66qScgPT4gJ9mKJywKJ/CeuqsnID0+ICfZhCcsCifwnrqsJyA9PiAn2YUnLAon8J66rScgPT4gJ9mGJywKJ/Ceuq4nID0+ICfYsycsCifwnrqvJyA9PiAn2LknLAon8J66sCcgPT4gJ9mBJywKJ/CeurEnID0+ICfYtScsCifwnrqyJyA9PiAn2YInLAon8J66sycgPT4gJ9ixJywKJ/CeurQnID0+ICfYtCcsCifwnrq1JyA9PiAn2KonLAon8J66ticgPT4gJ9irJywKJ/CeurcnID0+ICfYricsCifwnrq4JyA9PiAn2LAnLAon8J66uScgPT4gJ9i2JywKJ/CeuronID0+ICfYuCcsCifwnrq7JyA9PiAn2LonLAon8J+EgCcgPT4gJzAuJywKJ/CfhIEnID0+ICcwLCcsCifwn4SCJyA9PiAnMSwnLAon8J+EgycgPT4gJzIsJywKJ/CfhIQnID0+ICczLCcsCifwn4SFJyA9PiAnNCwnLAon8J+EhicgPT4gJzUsJywKJ/CfhIcnID0+ICc2LCcsCifwn4SIJyA9PiAnNywnLAon8J+EiScgPT4gJzgsJywKJ/CfhIonID0+ICc5LCcsCifwn4SQJyA9PiAnKEEpJywKJ/CfhJEnID0+ICcoQiknLAon8J+EkicgPT4gJyhDKScsCifwn4STJyA9PiAnKEQpJywKJ/CfhJQnID0+ICcoRSknLAon8J+ElScgPT4gJyhGKScsCifwn4SWJyA9PiAnKEcpJywKJ/CfhJcnID0+ICcoSCknLAon8J+EmCcgPT4gJyhJKScsCifwn4SZJyA9PiAnKEopJywKJ/CfhJonID0+ICcoSyknLAon8J+EmycgPT4gJyhMKScsCifwn4ScJyA9PiAnKE0pJywKJ/CfhJ0nID0+ICcoTiknLAon8J+EnicgPT4gJyhPKScsCifwn4SfJyA9PiAnKFApJywKJ/CfhKAnID0+ICcoUSknLAon8J+EoScgPT4gJyhSKScsCifwn4SiJyA9PiAnKFMpJywKJ/CfhKMnID0+ICcoVCknLAon8J+EpCcgPT4gJyhVKScsCifwn4SlJyA9PiAnKFYpJywKJ/CfhKYnID0+ICcoVyknLAon8J+EpycgPT4gJyhYKScsCifwn4SoJyA9PiAnKFkpJywKJ/CfhKknID0+ICcoWiknLAon8J+EqicgPT4gJ+OAlFPjgJUnLAon8J+EqycgPT4gJ0MnLAon8J+ErCcgPT4gJ1InLAon8J+ErScgPT4gJ0NEJywKJ/CfhK4nID0+ICdXWicsCifwn4SwJyA9PiAnQScsCifwn4SxJyA9PiAnQicsCifwn4SyJyA9PiAnQycsCifwn4SzJyA9PiAnRCcsCifwn4S0JyA9PiAnRScsCifwn4S1JyA9PiAnRicsCifwn4S2JyA9PiAnRycsCifwn4S3JyA9PiAnSCcsCifwn4S4JyA9PiAnSScsCifwn4S5JyA9PiAnSicsCifwn4S6JyA9PiAnSycsCifwn4S7JyA9PiAnTCcsCifwn4S8JyA9PiAnTScsCifwn4S9JyA9PiAnTicsCifwn4S+JyA9PiAnTycsCifwn4S/JyA9PiAnUCcsCifwn4WAJyA9PiAnUScsCifwn4WBJyA9PiAnUicsCifwn4WCJyA9PiAnUycsCifwn4WDJyA9PiAnVCcsCifwn4WEJyA9PiAnVScsCifwn4WFJyA9PiAnVicsCifwn4WGJyA9PiAnVycsCifwn4WHJyA9PiAnWCcsCifwn4WIJyA9PiAnWScsCifwn4WJJyA9PiAnWicsCifwn4WKJyA9PiAnSFYnLAon8J+FiycgPT4gJ01WJywKJ/CfhYwnID0+ICdTRCcsCifwn4WNJyA9PiAnU1MnLAon8J+FjicgPT4gJ1BQVicsCifwn4WPJyA9PiAnV0MnLAon8J+FqicgPT4gJ01DJywKJ/CfhasnID0+ICdNRCcsCifwn4WsJyA9PiAnTVInLAon8J+GkCcgPT4gJ0RKJywKJ/CfiIAnID0+ICfjgbvjgYsnLAon8J+IgScgPT4gJ+OCs+OCsycsCifwn4iCJyA9PiAn44K1JywKJ/CfiJAnID0+ICfmiYsnLAon8J+IkScgPT4gJ+WtlycsCifwn4iSJyA9PiAn5Y+MJywKJ/CfiJMnID0+ICfjg4bjgpknLAon8J+IlCcgPT4gJ+S6jCcsCifwn4iVJyA9PiAn5aSaJywKJ/CfiJYnID0+ICfop6MnLAon8J+IlycgPT4gJ+WkqScsCifwn4iYJyA9PiAn5LqkJywKJ/CfiJknID0+ICfmmKAnLAon8J+ImicgPT4gJ+eEoScsCifwn4ibJyA9PiAn5paZJywKJ/CfiJwnID0+ICfliY0nLAon8J+InScgPT4gJ+W+jCcsCifwn4ieJyA9PiAn5YaNJywKJ/CfiJ8nID0+ICfmlrAnLAon8J+IoCcgPT4gJ+WInScsCifwn4ihJyA9PiAn57WCJywKJ/CfiKInID0+ICfnlJ8nLAon8J+IoycgPT4gJ+iyqScsCifwn4ikJyA9PiAn5aOwJywKJ/CfiKUnID0+ICflkLknLAon8J+IpicgPT4gJ+a8lCcsCifwn4inJyA9PiAn5oqVJywKJ/CfiKgnID0+ICfmjZUnLAon8J+IqScgPT4gJ+S4gCcsCifwn4iqJyA9PiAn5LiJJywKJ/CfiKsnID0+ICfpgYonLAon8J+IrCcgPT4gJ+W3picsCifwn4itJyA9PiAn5LitJywKJ/CfiK4nID0+ICflj7MnLAon8J+IrycgPT4gJ+aMhycsCifwn4iwJyA9PiAn6LWwJywKJ/CfiLEnID0+ICfmiZMnLAon8J+IsicgPT4gJ+emgScsCifwn4izJyA9PiAn56m6JywKJ/CfiLQnID0+ICflkIgnLAon8J+ItScgPT4gJ+a6gCcsCifwn4i2JyA9PiAn5pyJJywKJ/CfiLcnID0+ICfmnIgnLAon8J+IuCcgPT4gJ+eUsycsCifwn4i5JyA9PiAn5YmyJywKJ/CfiLonID0+ICfllrYnLAon8J+IuycgPT4gJ+mFjScsCifwn4mAJyA9PiAn44CU5pys44CVJywKJ/CfiYEnID0+ICfjgJTkuInjgJUnLAon8J+JgicgPT4gJ+OAlOS6jOOAlScsCifwn4mDJyA9PiAn44CU5a6J44CVJywKJ/CfiYQnID0+ICfjgJTngrnjgJUnLAon8J+JhScgPT4gJ+OAlOaJk+OAlScsCifwn4mGJyA9PiAn44CU55uX44CVJywKJ/CfiYcnID0+ICfjgJTli53jgJUnLAon8J+JiCcgPT4gJ+OAlOaVl+OAlScsCifwn4mQJyA9PiAn5b6XJywKJ/CfiZEnID0+ICflj68nLAon8J+vsCcgPT4gJzAnLAon8J+vsScgPT4gJzEnLAon8J+vsicgPT4gJzInLAon8J+vsycgPT4gJzMnLAon8J+vtCcgPT4gJzQnLAon8J+vtScgPT4gJzUnLAon8J+vticgPT4gJzYnLAon8J+vtycgPT4gJzcnLAon8J+vuCcgPT4gJzgnLAon8J+vuScgPT4gJzknLAopOwo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcSW50bFxOb3JtYWxpemVyIGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnJldHVybiByZXF1aXJlIF9fRElSX18uJy9ib290c3RyYXA4MC5waHAnOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9pc19ub3JtYWxpemVkJykpIHsKZnVuY3Rpb24gbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHJpbmcsICRmb3JtID0gcFxOb3JtYWxpemVyOjpGT1JNX0MpIHsgcmV0dXJuIHBcTm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKCRzdHJpbmcsICRmb3JtKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdub3JtYWxpemVyX25vcm1hbGl6ZScpKSB7CmZ1bmN0aW9uIG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHJpbmcsICRmb3JtID0gcFxOb3JtYWxpemVyOjpGT1JNX0MpIHsgcmV0dXJuIHBcTm9ybWFsaXplcjo6bm9ybWFsaXplKCRzdHJpbmcsICRmb3JtKTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXE5vcm1hbGl6ZXIgYXMgcDsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQnKSkgewpmdW5jdGlvbiBub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRmb3JtID0gcFxOb3JtYWxpemVyOjpGT1JNX0MpOiBib29sIHsgcmV0dXJuIHBcTm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRmb3JtKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdub3JtYWxpemVyX25vcm1hbGl6ZScpKSB7CmZ1bmN0aW9uIG5vcm1hbGl6ZXJfbm9ybWFsaXplKD9zdHJpbmcgJHN0cmluZywgP2ludCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTm9ybWFsaXplcjo6bm9ybWFsaXplKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRmb3JtKTsgfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXE1ic3RyaW5nOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZmluYWwgY2xhc3MgTWJzdHJpbmcKewpwdWJsaWMgY29uc3QgTUJfQ0FTRV9GT0xEID0gXFBIUF9JTlRfTUFYOwoKcHJpdmF0ZSBjb25zdCBTSU1QTEVfQ0FTRV9GT0xEID0gWwpbJ8K1JywgJ8W/JywgIlx4Q0RceDg1IiwgJ8+CJywgIlx4Q0ZceDkwIiwgIlx4Q0ZceDkxIiwgIlx4Q0ZceDk1IiwgIlx4Q0ZceDk2IiwgIlx4Q0ZceEIwIiwgIlx4Q0ZceEIxIiwgIlx4Q0ZceEI1IiwgIlx4RTFceEJBXHg5QiIsICJceEUxXHhCRVx4QkUiXSwKWyfOvCcsICdzJywgJ865JywgJ8+DJywgJ86yJywgJ864JywgJ8+GJywgJ8+AJywgJ866JywgJ8+BJywgJ861JywgIlx4RTFceEI5XHhBMSIsICfOuSddLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGVuY29kaW5nTGlzdCA9IFsnQVNDSUknLCAnVVRGLTgnXTsKcHJpdmF0ZSBzdGF0aWMgJGxhbmd1YWdlID0gJ25ldXRyYWwnOwpwcml2YXRlIHN0YXRpYyAkaW50ZXJuYWxFbmNvZGluZyA9ICdVVEYtOCc7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHMsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nID0gbnVsbCkKewppZiAoXGlzX2FycmF5KCRmcm9tRW5jb2RpbmcpIHx8IChudWxsICE9PSAkZnJvbUVuY29kaW5nICYmIGZhbHNlICE9PSBzdHJwb3MoJGZyb21FbmNvZGluZywgJywnKSkpIHsKJGZyb21FbmNvZGluZyA9IHNlbGY6Om1iX2RldGVjdF9lbmNvZGluZygkcywgJGZyb21FbmNvZGluZyk7Cn0gZWxzZSB7CiRmcm9tRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZnJvbUVuY29kaW5nKTsKfQoKJHRvRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkdG9FbmNvZGluZyk7CgppZiAoJ0JBU0U2NCcgPT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBiYXNlNjRfZGVjb2RlKCRzKTsKJGZyb21FbmNvZGluZyA9ICR0b0VuY29kaW5nOwp9CgppZiAoJ0JBU0U2NCcgPT09ICR0b0VuY29kaW5nKSB7CnJldHVybiBiYXNlNjRfZW5jb2RlKCRzKTsKfQoKaWYgKCdIVE1MLUVOVElUSUVTJyA9PT0gJHRvRW5jb2RpbmcgfHwgJ0hUTUwnID09PSAkdG9FbmNvZGluZykgewppZiAoJ0hUTUwtRU5USVRJRVMnID09PSAkZnJvbUVuY29kaW5nIHx8ICdIVE1MJyA9PT0gJGZyb21FbmNvZGluZykgewokZnJvbUVuY29kaW5nID0gJ1dpbmRvd3MtMTI1Mic7Cn0KaWYgKCdVVEYtOCcgIT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBpY29udigkZnJvbUVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1tceDgwLVx4RkZdKy8nLCBbX19DTEFTU19fLCAnaHRtbF9lbmNvZGluZ19jYWxsYmFjayddLCAkcyk7Cn0KCmlmICgnSFRNTC1FTlRJVElFUycgPT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBodG1sX2VudGl0eV9kZWNvZGUoJHMsIFxFTlRfQ09NUEFULCAnVVRGLTgnKTsKJGZyb21FbmNvZGluZyA9ICdVVEYtOCc7Cn0KCnJldHVybiBpY29udigkZnJvbUVuY29kaW5nLCAkdG9FbmNvZGluZy4nLy9JR05PUkUnLCAkcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY29udmVydF92YXJpYWJsZXMoJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcsICYuLi4kdmFycykKewokb2sgPSB0cnVlOwphcnJheV93YWxrX3JlY3Vyc2l2ZSgkdmFycywgZnVuY3Rpb24gKCYkdikgdXNlICgmJG9rLCAkdG9FbmNvZGluZywgJGZyb21FbmNvZGluZykgewppZiAoZmFsc2UgPT09ICR2ID0gc2VsZjo6bWJfY29udmVydF9lbmNvZGluZygkdiwgJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcpKSB7CiRvayA9IGZhbHNlOwp9Cn0pOwoKcmV0dXJuICRvayA/ICRmcm9tRW5jb2RpbmcgOiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9kZWNvZGVfbWltZWhlYWRlcigkcykKewpyZXR1cm4gaWNvbnZfbWltZV9kZWNvZGUoJHMsIDIsIHNlbGY6OiRpbnRlcm5hbEVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9lbmNvZGVfbWltZWhlYWRlcigkcywgJGNoYXJzZXQgPSBudWxsLCAkdHJhbnNmZXJFbmNvZGluZyA9IG51bGwsICRsaW5lZmVlZCA9IG51bGwsICRpbmRlbnQgPSBudWxsKQp7CnRyaWdnZXJfZXJyb3IoJ21iX2VuY29kZV9taW1laGVhZGVyKCkgaXMgYnVnZ2VkLiBQbGVhc2UgdXNlIGljb252X21pbWVfZW5jb2RlKCkgaW5zdGVhZCcsIFxFX1VTRVJfV0FSTklORyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoJHMsICRjb252bWFwLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsICE9PSAkcyAmJiAhXGlzX3NjYWxhcigkcykgJiYgIShcaXNfb2JqZWN0KCRzKSAmJiBtZXRob2RfZXhpc3RzKCRzLCAnX190b1N0cmluZycpKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSgpIGV4cGVjdHMgcGFyYW1ldGVyIDEgdG8gYmUgc3RyaW5nLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAoIVxpc19hcnJheSgkY29udm1hcCkgfHwgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEICYmICEkY29udm1hcCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAobnVsbCAhPT0gJGVuY29kaW5nICYmICFcaXNfc2NhbGFyKCRlbmNvZGluZykpIHsKdHJpZ2dlcl9lcnJvcignbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciAzIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkcykuJyBnaXZlbicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gJyc7IAp9CgokcyA9IChzdHJpbmcpICRzOwppZiAoJycgPT09ICRzKSB7CnJldHVybiAnJzsKfQoKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbnVsbDsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcykpIHsKJHMgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KfSBlbHNlIHsKJHMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9CgokY250ID0gZmxvb3IoXGNvdW50KCRjb252bWFwKSAvIDQpICogNDsKCmZvciAoJGkgPSAwOyAkaSA8ICRjbnQ7ICRpICs9IDQpIHsKCiRjb252bWFwWyRpXSArPSAkY29udm1hcFskaSArIDJdOwokY29udm1hcFskaSArIDFdICs9ICRjb252bWFwWyRpICsgMl07Cn0KCiRzID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvJiMoPzowKihbMC05XSspfHgwKihbMC05YS1mQS1GXSspKSg/ISYpOz8vJywgZnVuY3Rpb24gKGFycmF5ICRtKSB1c2UgKCRjbnQsICRjb252bWFwKSB7CiRjID0gaXNzZXQoJG1bMl0pID8gKGludCkgaGV4ZGVjKCRtWzJdKSA6ICRtWzFdOwpmb3IgKCRpID0gMDsgJGkgPCAkY250OyAkaSArPSA0KSB7CmlmICgkYyA+PSAkY29udm1hcFskaV0gJiYgJGMgPD0gJGNvbnZtYXBbJGkgKyAxXSkgewpyZXR1cm4gc2VsZjo6bWJfY2hyKCRjIC0gJGNvbnZtYXBbJGkgKyAyXSk7Cn0KfQoKcmV0dXJuICRtWzBdOwp9LCAkcyk7CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkczsKfQoKcmV0dXJuIGljb252KCdVVEYtOCcsICRlbmNvZGluZy4nLy9JR05PUkUnLCAkcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoJHMsICRjb252bWFwLCAkZW5jb2RpbmcgPSBudWxsLCAkaXNfaGV4ID0gZmFsc2UpCnsKaWYgKG51bGwgIT09ICRzICYmICFcaXNfc2NhbGFyKCRzKSAmJiAhKFxpc19vYmplY3QoJHMpICYmIG1ldGhvZF9leGlzdHMoJHMsICdfX3RvU3RyaW5nJykpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2VuY29kZV9udW1lcmljZW50aXR5KCkgZXhwZWN0cyBwYXJhbWV0ZXIgMSB0byBiZSBzdHJpbmcsICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIG51bGw7Cn0KCmlmICghXGlzX2FycmF5KCRjb252bWFwKSB8fCAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQgJiYgISRjb252bWFwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChudWxsICE9PSAkZW5jb2RpbmcgJiYgIVxpc19zY2FsYXIoJGVuY29kaW5nKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgpIGV4cGVjdHMgcGFyYW1ldGVyIDMgdG8gYmUgc3RyaW5nLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOyAKfQoKaWYgKG51bGwgIT09ICRpc19oZXggJiYgIVxpc19zY2FsYXIoJGlzX2hleCkpIHsKdHJpZ2dlcl9lcnJvcignbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciA0IHRvIGJlIGJvb2xlYW4sICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIG51bGw7Cn0KCiRzID0gKHN0cmluZykgJHM7CmlmICgnJyA9PT0gJHMpIHsKcmV0dXJuICcnOwp9CgokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBudWxsOwppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzKSkgewokcyA9IEBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQp9IGVsc2UgewokcyA9IGljb252KCRlbmNvZGluZywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KCnN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwoKJGNudCA9IGZsb29yKFxjb3VudCgkY29udm1hcCkgLyA0KSAqIDQ7CiRpID0gMDsKJGxlbiA9IFxzdHJsZW4oJHMpOwokcmVzdWx0ID0gJyc7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CiR1bGVuID0gJHNbJGldIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKJGkgKz0gJHVsZW47CiRjID0gc2VsZjo6bWJfb3JkKCR1Y2hyKTsKCmZvciAoJGogPSAwOyAkaiA8ICRjbnQ7ICRqICs9IDQpIHsKaWYgKCRjID49ICRjb252bWFwWyRqXSAmJiAkYyA8PSAkY29udm1hcFskaiArIDFdKSB7CiRjT2Zmc2V0ID0gKCRjICsgJGNvbnZtYXBbJGogKyAyXSkgJiAkY29udm1hcFskaiArIDNdOwokcmVzdWx0IC49ICRpc19oZXggPyBzcHJpbnRmKCcmI3glWDsnLCAkY09mZnNldCkgOiAnJiMnLiRjT2Zmc2V0Lic7JzsKY29udGludWUgMjsKfQp9CiRyZXN1bHQgLj0gJHVjaHI7Cn0KCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCnJldHVybiBpY29udignVVRGLTgnLCAkZW5jb2RpbmcuJy8vSUdOT1JFJywgJHJlc3VsdCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY29udmVydF9jYXNlKCRzLCAkbW9kZSwgJGVuY29kaW5nID0gbnVsbCkKewokcyA9IChzdHJpbmcpICRzOwppZiAoJycgPT09ICRzKSB7CnJldHVybiAnJzsKfQoKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbnVsbDsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcykpIHsKJHMgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KfSBlbHNlIHsKJHMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9CgppZiAoXE1CX0NBU0VfVElUTEUgPT0gJG1vZGUpIHsKc3RhdGljICR0aXRsZVJlZ2V4cCA9IG51bGw7CmlmIChudWxsID09PSAkdGl0bGVSZWdleHApIHsKJHRpdGxlUmVnZXhwID0gc2VsZjo6Z2V0RGF0YSgndGl0bGVDYXNlUmVnZXhwJyk7Cn0KJHMgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHRpdGxlUmVnZXhwLCBbX19DTEFTU19fLCAndGl0bGVfY2FzZSddLCAkcyk7Cn0gZWxzZSB7CmlmIChcTUJfQ0FTRV9VUFBFUiA9PSAkbW9kZSkgewpzdGF0aWMgJHVwcGVyID0gbnVsbDsKaWYgKG51bGwgPT09ICR1cHBlcikgewokdXBwZXIgPSBzZWxmOjpnZXREYXRhKCd1cHBlckNhc2UnKTsKfQokbWFwID0gJHVwcGVyOwp9IGVsc2UgewppZiAoc2VsZjo6TUJfQ0FTRV9GT0xEID09PSAkbW9kZSkgewpzdGF0aWMgJGNhc2VGb2xkaW5nID0gbnVsbDsKaWYgKG51bGwgPT09ICRjYXNlRm9sZGluZykgewokY2FzZUZvbGRpbmcgPSBzZWxmOjpnZXREYXRhKCdjYXNlRm9sZGluZycpOwp9CiRzID0gc3RydHIoJHMsICRjYXNlRm9sZGluZyk7Cn0KCnN0YXRpYyAkbG93ZXIgPSBudWxsOwppZiAobnVsbCA9PT0gJGxvd2VyKSB7CiRsb3dlciA9IHNlbGY6OmdldERhdGEoJ2xvd2VyQ2FzZScpOwp9CiRtYXAgPSAkbG93ZXI7Cn0KCnN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwoKJGkgPSAwOwokbGVuID0gXHN0cmxlbigkcyk7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CiR1bGVuID0gJHNbJGldIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKJGkgKz0gJHVsZW47CgppZiAoaXNzZXQoJG1hcFskdWNocl0pKSB7CiR1Y2hyID0gJG1hcFskdWNocl07CiRubGVuID0gXHN0cmxlbigkdWNocik7CgppZiAoJG5sZW4gPT0gJHVsZW4pIHsKJG5sZW4gPSAkaTsKZG8gewokc1stLSRubGVuXSA9ICR1Y2hyWy0tJHVsZW5dOwp9IHdoaWxlICgkdWxlbik7Cn0gZWxzZSB7CiRzID0gc3Vic3RyX3JlcGxhY2UoJHMsICR1Y2hyLCAkaSAtICR1bGVuLCAkdWxlbik7CiRsZW4gKz0gJG5sZW4gLSAkdWxlbjsKJGkgKz0gJG5sZW4gLSAkdWxlbjsKfQp9Cn0KfQoKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJHM7Cn0KCnJldHVybiBpY29udignVVRGLTgnLCAkZW5jb2RpbmcuJy8vSUdOT1JFJywgJHMpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2ludGVybmFsX2VuY29kaW5nKCRlbmNvZGluZyA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewpyZXR1cm4gc2VsZjo6JGludGVybmFsRW5jb2Rpbmc7Cn0KCiRub3JtYWxpemVkRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwoKaWYgKCdVVEYtOCcgPT09ICRub3JtYWxpemVkRW5jb2RpbmcgfHwgZmFsc2UgIT09IEBpY29udigkbm9ybWFsaXplZEVuY29kaW5nLCAkbm9ybWFsaXplZEVuY29kaW5nLCAnICcpKSB7CnNlbGY6OiRpbnRlcm5hbEVuY29kaW5nID0gJG5vcm1hbGl6ZWRFbmNvZGluZzsKCnJldHVybiB0cnVlOwp9CgppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgIzEgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGFuZ3VhZ2UoJGxhbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkbGFuZykgewpyZXR1cm4gc2VsZjo6JGxhbmd1YWdlOwp9Cgpzd2l0Y2ggKCRub3JtYWxpemVkTGFuZyA9IHN0cnRvbG93ZXIoJGxhbmcpKSB7CmNhc2UgJ3VuaSc6CmNhc2UgJ25ldXRyYWwnOgpzZWxmOjokbGFuZ3VhZ2UgPSAkbm9ybWFsaXplZExhbmc7CgpyZXR1cm4gdHJ1ZTsKfQoKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50ICMxICgkbGFuZ3VhZ2UpIG11c3QgYmUgYSB2YWxpZCBsYW5ndWFnZSwgIiVzIiBnaXZlbicsICRsYW5nKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGlzdF9lbmNvZGluZ3MoKQp7CnJldHVybiBbJ1VURi04J107Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcygkZW5jb2RpbmcpCnsKc3dpdGNoIChzdHJ0b3VwcGVyKCRlbmNvZGluZykpIHsKY2FzZSAnVVRGOCc6CmNhc2UgJ1VURi04JzoKcmV0dXJuIFsndXRmOCddOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY2hlY2tfZW5jb2RpbmcoJHZhciA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAyMDAgJiYgXGlzX2FycmF5KCR2YXIpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2NoZWNrX2VuY29kaW5nKCkgZXhwZWN0cyBwYXJhbWV0ZXIgMSB0byBiZSBzdHJpbmcsIGFycmF5IGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CmlmIChudWxsID09PSAkdmFyKSB7CnJldHVybiBmYWxzZTsKfQokZW5jb2RpbmcgPSBzZWxmOjokaW50ZXJuYWxFbmNvZGluZzsKfQoKaWYgKCFcaXNfYXJyYXkoJHZhcikpIHsKcmV0dXJuIHNlbGY6Om1iX2RldGVjdF9lbmNvZGluZygkdmFyLCBbJGVuY29kaW5nXSkgfHwgZmFsc2UgIT09IEBpY29udigkZW5jb2RpbmcsICRlbmNvZGluZywgJHZhcik7Cn0KCmZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFzZWxmOjptYl9jaGVja19lbmNvZGluZygka2V5LCAkZW5jb2RpbmcpKSB7CnJldHVybiBmYWxzZTsKfQppZiAoIXNlbGY6Om1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSwgJGVuY29kaW5nKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cgp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2RldGVjdF9lbmNvZGluZygkc3RyLCAkZW5jb2RpbmdMaXN0ID0gbnVsbCwgJHN0cmljdCA9IGZhbHNlKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmdMaXN0KSB7CiRlbmNvZGluZ0xpc3QgPSBzZWxmOjokZW5jb2RpbmdMaXN0Owp9IGVsc2UgewppZiAoIVxpc19hcnJheSgkZW5jb2RpbmdMaXN0KSkgewokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRlbmNvZGluZ0xpc3QpKTsKfQokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCdzdHJ0b3VwcGVyJywgJGVuY29kaW5nTGlzdCk7Cn0KCmZvcmVhY2ggKCRlbmNvZGluZ0xpc3QgYXMgJGVuYykgewpzd2l0Y2ggKCRlbmMpIHsKY2FzZSAnQVNDSUknOgppZiAoIXByZWdfbWF0Y2goJy9bXHg4MC1ceEZGXS8nLCAkc3RyKSkgewpyZXR1cm4gJGVuYzsKfQpicmVhazsKCmNhc2UgJ1VURjgnOgpjYXNlICdVVEYtOCc6CmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyKSkgewpyZXR1cm4gJ1VURi04JzsKfQpicmVhazsKCmRlZmF1bHQ6CmlmICgwID09PSBzdHJuY21wKCRlbmMsICdJU08tODg1OS0nLCA5KSkgewpyZXR1cm4gJGVuYzsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nTGlzdCA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZ0xpc3QpIHsKcmV0dXJuIHNlbGY6OiRlbmNvZGluZ0xpc3Q7Cn0KCmlmICghXGlzX2FycmF5KCRlbmNvZGluZ0xpc3QpKSB7CiRlbmNvZGluZ0xpc3QgPSBhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJGVuY29kaW5nTGlzdCkpOwp9CiRlbmNvZGluZ0xpc3QgPSBhcnJheV9tYXAoJ3N0cnRvdXBwZXInLCAkZW5jb2RpbmdMaXN0KTsKCmZvcmVhY2ggKCRlbmNvZGluZ0xpc3QgYXMgJGVuYykgewpzd2l0Y2ggKCRlbmMpIHsKZGVmYXVsdDoKaWYgKHN0cm5jbXAoJGVuYywgJ0lTTy04ODU5LScsIDkpKSB7CnJldHVybiBmYWxzZTsKfQoKY2FzZSAnQVNDSUknOgpjYXNlICdVVEY4JzoKY2FzZSAnVVRGLTgnOgp9Cn0KCnNlbGY6OiRlbmNvZGluZ0xpc3QgPSAkZW5jb2RpbmdMaXN0OwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RybGVuKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CmlmICgnQ1A4NTAnID09PSAkZW5jb2RpbmcgfHwgJ0FTQ0lJJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiBcc3RybGVuKCRzKTsKfQoKcmV0dXJuIEBpY29udl9zdHJsZW4oJHMsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOwp9CgokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKaWYgKCcnID09PSAkbmVlZGxlKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewp0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJzogRW1wdHkgZGVsaW1pdGVyJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIDA7Cn0KCnJldHVybiBpY29udl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwppZiAoJ0NQODUwJyA9PT0gJGVuY29kaW5nIHx8ICdBU0NJSScgPT09ICRlbmNvZGluZykgewpyZXR1cm4gc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOwp9CgppZiAoJG9mZnNldCAhPSAoaW50KSAkb2Zmc2V0KSB7CiRvZmZzZXQgPSAwOwp9IGVsc2VpZiAoJG9mZnNldCA9IChpbnQpICRvZmZzZXQpIHsKaWYgKCRvZmZzZXQgPCAwKSB7CmlmICgwID4gJG9mZnNldCArPSBzZWxmOjptYl9zdHJsZW4oJG5lZWRsZSkpIHsKJGhheXN0YWNrID0gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgMCwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQokb2Zmc2V0ID0gMDsKfSBlbHNlIHsKJGhheXN0YWNrID0gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgJG9mZnNldCwgMjE0NzQ4MzY0NywgJGVuY29kaW5nKTsKfQp9CgokcG9zID0gJycgIT09ICRuZWVkbGUgfHwgODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQKPyBpY29udl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKQo6IHNlbGY6Om1iX3N0cmxlbigkaGF5c3RhY2ssICRlbmNvZGluZyk7CgpyZXR1cm4gZmFsc2UgIT09ICRwb3MgPyAkb2Zmc2V0ICsgJHBvcyA6IGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkc3BsaXRfbGVuZ3RoID0gMSwgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHN0cmluZyAmJiAhXGlzX3NjYWxhcigkc3RyaW5nKSAmJiAhKFxpc19vYmplY3QoJHN0cmluZykgJiYgbWV0aG9kX2V4aXN0cygkc3RyaW5nLCAnX190b1N0cmluZycpKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9zdHJfc3BsaXQoKSBleHBlY3RzIHBhcmFtZXRlciAxIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkc3RyaW5nKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAoMSA+ICRzcGxpdF9sZW5ndGggPSAoaW50KSAkc3BsaXRfbGVuZ3RoKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewp0cmlnZ2VyX2Vycm9yKCdUaGUgbGVuZ3RoIG9mIGVhY2ggc2VnbWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdBcmd1bWVudCAjMiAoJGxlbmd0aCkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0KCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpKSB7CiRyeCA9ICcvKCc7CndoaWxlICg2NTUzNSA8ICRzcGxpdF9sZW5ndGgpIHsKJHJ4IC49ICcuezY1NTM1fSc7CiRzcGxpdF9sZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICcueycuJHNwbGl0X2xlbmd0aC4nfSkvdXMnOwoKcmV0dXJuIHByZWdfc3BsaXQoJHJ4LCAkc3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSB8IFxQUkVHX1NQTElUX05PX0VNUFRZKTsKfQoKJHJlc3VsdCA9IFtdOwokbGVuZ3RoID0gbWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7Cgpmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSArPSAkc3BsaXRfbGVuZ3RoKSB7CiRyZXN1bHRbXSA9IG1iX3N1YnN0cigkc3RyaW5nLCAkaSwgJHNwbGl0X2xlbmd0aCwgJGVuY29kaW5nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RydG9sb3dlcigkcywgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc2VsZjo6bWJfY29udmVydF9jYXNlKCRzLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CnJldHVybiBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHMsIFxNQl9DQVNFX1VQUEVSLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRjID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGMpIHsKcmV0dXJuICdub25lJzsKfQppZiAoMCA9PT0gc3RyY2FzZWNtcCgkYywgJ25vbmUnKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChcaXNfaW50KCRjKSB8fCAnbG9uZycgPT09ICRjIHx8ICdlbnRpdHknID09PSAkYykgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignQXJndW1lbnQgIzEgKCRzdWJzdGl0dXRlX2NoYXJhY3RlcikgbXVzdCBiZSAibm9uZSIsICJsb25nIiwgImVudGl0eSIgb3IgYSB2YWxpZCBjb2RlcG9pbnQnKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdWJzdHIoJHMsICRzdGFydCwgJGxlbmd0aCA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIChzdHJpbmcpIHN1YnN0cigkcywgJHN0YXJ0LCBudWxsID09PSAkbGVuZ3RoID8gMjE0NzQ4MzY0NyA6ICRsZW5ndGgpOwp9CgppZiAoJHN0YXJ0IDwgMCkgewokc3RhcnQgPSBpY29udl9zdHJsZW4oJHMsICRlbmNvZGluZykgKyAkc3RhcnQ7CmlmICgkc3RhcnQgPCAwKSB7CiRzdGFydCA9IDA7Cn0KfQoKaWYgKG51bGwgPT09ICRsZW5ndGgpIHsKJGxlbmd0aCA9IDIxNDc0ODM2NDc7Cn0gZWxzZWlmICgkbGVuZ3RoIDwgMCkgewokbGVuZ3RoID0gaWNvbnZfc3RybGVuKCRzLCAkZW5jb2RpbmcpICsgJGxlbmd0aCAtICRzdGFydDsKaWYgKCRsZW5ndGggPCAwKSB7CnJldHVybiAnJzsKfQp9CgpyZXR1cm4gKHN0cmluZykgaWNvbnZfc3Vic3RyKCRzLCAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKQp7ClskaGF5c3RhY2ssICRuZWVkbGVdID0gc3RyX3JlcGxhY2Uoc2VsZjo6U0lNUExFX0NBU0VfRk9MRFswXSwgc2VsZjo6U0lNUExFX0NBU0VfRk9MRFsxXSwgWwpzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJGhheXN0YWNrLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKSwKc2VsZjo6bWJfY29udmVydF9jYXNlKCRuZWVkbGUsIFxNQl9DQVNFX0xPV0VSLCAkZW5jb2RpbmcpLApdKTsKCnJldHVybiBzZWxmOjptYl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRwb3MgPSBzZWxmOjptYl9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgMCwgJGVuY29kaW5nKTsKCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycmNocigkaGF5c3RhY2ssICRuZWVkbGUsICRwYXJ0ID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKJHBvcyA9IHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKfSBlbHNlIHsKJG5lZWRsZSA9IHNlbGY6Om1iX3N1YnN0cigkbmVlZGxlLCAwLCAxLCAkZW5jb2RpbmcpOwokcG9zID0gaWNvbnZfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRlbmNvZGluZyk7Cn0KCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycmljaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRuZWVkbGUgPSBzZWxmOjptYl9zdWJzdHIoJG5lZWRsZSwgMCwgMSwgJGVuY29kaW5nKTsKJHBvcyA9IHNlbGY6Om1iX3N0cnJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKTsKCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewokaGF5c3RhY2sgPSBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJGhheXN0YWNrLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKJG5lZWRsZSA9IHNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKCiRoYXlzdGFjayA9IHN0cl9yZXBsYWNlKHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMF0sIHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMV0sICRoYXlzdGFjayk7CiRuZWVkbGUgPSBzdHJfcmVwbGFjZShzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzBdLCBzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzFdLCAkbmVlZGxlKTsKCnJldHVybiBzZWxmOjptYl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRwb3MgPSBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKaWYgKGZhbHNlID09PSAkcG9zKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHBhcnQpIHsKcmV0dXJuIHN1YnN0cigkaGF5c3RhY2ssIDAsICRwb3MpOwp9CgpyZXR1cm4gc3Vic3RyKCRoYXlzdGFjaywgJHBvcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZ2V0X2luZm8oJHR5cGUgPSAnYWxsJykKewokaW5mbyA9IFsKJ2ludGVybmFsX2VuY29kaW5nJyA9PiBzZWxmOjokaW50ZXJuYWxFbmNvZGluZywKJ2h0dHBfb3V0cHV0JyA9PiAncGFzcycsCidodHRwX291dHB1dF9jb252X21pbWV0eXBlcycgPT4gJ14odGV4dC98YXBwbGljYXRpb24veGh0bWxcK3htbCknLAonZnVuY19vdmVybG9hZCcgPT4gMCwKJ2Z1bmNfb3ZlcmxvYWRfbGlzdCcgPT4gJ25vIG92ZXJsb2FkJywKJ21haWxfY2hhcnNldCcgPT4gJ1VURi04JywKJ21haWxfaGVhZGVyX2VuY29kaW5nJyA9PiAnQkFTRTY0JywKJ21haWxfYm9keV9lbmNvZGluZycgPT4gJ0JBU0U2NCcsCidpbGxlZ2FsX2NoYXJzJyA9PiAwLAonZW5jb2RpbmdfdHJhbnNsYXRpb24nID0+ICdPZmYnLAonbGFuZ3VhZ2UnID0+IHNlbGY6OiRsYW5ndWFnZSwKJ2RldGVjdF9vcmRlcicgPT4gc2VsZjo6JGVuY29kaW5nTGlzdCwKJ3N1YnN0aXR1dGVfY2hhcmFjdGVyJyA9PiAnbm9uZScsCidzdHJpY3RfZGV0ZWN0aW9uJyA9PiAnT2ZmJywKXTsKCmlmICgnYWxsJyA9PT0gJHR5cGUpIHsKcmV0dXJuICRpbmZvOwp9CmlmIChpc3NldCgkaW5mb1skdHlwZV0pKSB7CnJldHVybiAkaW5mb1skdHlwZV07Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9odHRwX2lucHV0KCR0eXBlID0gJycpCnsKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2h0dHBfb3V0cHV0KCRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIG51bGwgIT09ICRlbmNvZGluZyA/ICdwYXNzJyA9PT0gJGVuY29kaW5nIDogJ3Bhc3MnOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cndpZHRoKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyAhPT0gJGVuY29kaW5nKSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKJHMgPSBwcmVnX3JlcGxhY2UoJy9bXHh7MTEwMH0tXHh7MTE1Rn1ceHsyMzI5fVx4ezIzMkF9XHh7MkU4MH0tXHh7MzAzRX1ceHszMDQwfS1ceHtBNENGfVx4e0FDMDB9LVx4e0Q3QTN9XHh7RjkwMH0tXHh7RkFGRn1ceHtGRTEwfS1ceHtGRTE5fVx4e0ZFMzB9LVx4e0ZFNkZ9XHh7RkYwMH0tXHh7RkY2MH1ceHtGRkUwfS1ceHtGRkU2fVx4ezIwMDAwfS1ceHsyRkZGRH1ceHszMDAwMH0tXHh7M0ZGRkR9XS91JywgJycsICRzLCAtMSwgJHdpZGUpOwoKcmV0dXJuICgkd2lkZSA8PCAxKSArIGljb252X3N0cmxlbigkcywgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoJGNvbnRlbnRzLCAkc3RhdHVzKQp7CnJldHVybiAkY29udGVudHM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY2hyKCRjb2RlLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmICgweDgwID4gJGNvZGUgJT0gMHgyMDAwMDApIHsKJHMgPSBcY2hyKCRjb2RlKTsKfSBlbHNlaWYgKDB4ODAwID4gJGNvZGUpIHsKJHMgPSBcY2hyKDB4QzAgfCAkY29kZSA+PiA2KS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2VpZiAoMHgxMDAwMCA+ICRjb2RlKSB7CiRzID0gXGNocigweEUwIHwgJGNvZGUgPj4gMTIpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2UgewokcyA9IFxjaHIoMHhGMCB8ICRjb2RlID4+IDE4KS5cY2hyKDB4ODAgfCAkY29kZSA+PiAxMiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9CgppZiAoJ1VURi04JyAhPT0gJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKSkgewokcyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHMsICRlbmNvZGluZywgJ1VURi04Jyk7Cn0KCnJldHVybiAkczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9vcmQoJHMsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKCdVVEYtOCcgIT09ICRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZykpIHsKJHMgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCRzLCAnVVRGLTgnLCAkZW5jb2RpbmcpOwp9CgppZiAoMSA9PT0gXHN0cmxlbigkcykpIHsKcmV0dXJuIFxvcmQoJHMpOwp9CgokY29kZSA9ICgkcyA9IHVucGFjaygnQyonLCBzdWJzdHIoJHMsIDAsIDQpKSkgPyAkc1sxXSA6IDA7CmlmICgweEYwIDw9ICRjb2RlKSB7CnJldHVybiAoKCRjb2RlIC0gMHhGMCkgPDwgMTgpICsgKCgkc1syXSAtIDB4ODApIDw8IDEyKSArICgoJHNbM10gLSAweDgwKSA8PCA2KSArICRzWzRdIC0gMHg4MDsKfQppZiAoMHhFMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4RTApIDw8IDEyKSArICgoJHNbMl0gLSAweDgwKSA8PCA2KSArICRzWzNdIC0gMHg4MDsKfQppZiAoMHhDMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4QzApIDw8IDYpICsgJHNbMl0gLSAweDgwOwp9CgpyZXR1cm4gJGNvZGU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RyX3BhZChzdHJpbmcgJHN0cmluZywgaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkX3N0cmluZyA9ICcgJywgaW50ICRwYWRfdHlwZSA9IFxTVFJfUEFEX1JJR0hULCBzdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZwp7CmlmICghXGluX2FycmF5KCRwYWRfdHlwZSwgW1xTVFJfUEFEX1JJR0hULCBcU1RSX1BBRF9MRUZULCBcU1RSX1BBRF9CT1RIXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdtYl9zdHJfcGFkKCk6IEFyZ3VtZW50ICM0ICgkcGFkX3R5cGUpIG11c3QgYmUgU1RSX1BBRF9MRUZULCBTVFJfUEFEX1JJR0hULCBvciBTVFJfUEFEX0JPVEgnKTsKfQoKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBzZWxmOjptYl9pbnRlcm5hbF9lbmNvZGluZygpOwp9Cgp0cnkgewokdmFsaWRFbmNvZGluZyA9IEBzZWxmOjptYl9jaGVja19lbmNvZGluZygnJywgJGVuY29kaW5nKTsKfSBjYXRjaCAoXFZhbHVlRXJyb3IgJGUpIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKHNwcmludGYoJ21iX3N0cl9wYWQoKTogQXJndW1lbnQgIzUgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCgppZiAoISR2YWxpZEVuY29kaW5nKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihzcHJpbnRmKCdtYl9zdHJfcGFkKCk6IEFyZ3VtZW50ICM1ICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicsICRlbmNvZGluZykpOwp9CgppZiAoc2VsZjo6bWJfc3RybGVuKCRwYWRfc3RyaW5nLCAkZW5jb2RpbmcpIDw9IDApIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdtYl9zdHJfcGFkKCk6IEFyZ3VtZW50ICMzICgkcGFkX3N0cmluZykgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTsKfQoKJHBhZGRpbmdSZXF1aXJlZCA9ICRsZW5ndGggLSBzZWxmOjptYl9zdHJsZW4oJHN0cmluZywgJGVuY29kaW5nKTsKCmlmICgkcGFkZGluZ1JlcXVpcmVkIDwgMSkgewpyZXR1cm4gJHN0cmluZzsKfQoKc3dpdGNoICgkcGFkX3R5cGUpIHsKY2FzZSBcU1RSX1BBRF9MRUZUOgpyZXR1cm4gc2VsZjo6bWJfc3Vic3RyKHN0cl9yZXBlYXQoJHBhZF9zdHJpbmcsICRwYWRkaW5nUmVxdWlyZWQpLCAwLCAkcGFkZGluZ1JlcXVpcmVkLCAkZW5jb2RpbmcpLiRzdHJpbmc7CmNhc2UgXFNUUl9QQURfUklHSFQ6CnJldHVybiAkc3RyaW5nLnNlbGY6Om1iX3N1YnN0cihzdHJfcmVwZWF0KCRwYWRfc3RyaW5nLCAkcGFkZGluZ1JlcXVpcmVkKSwgMCwgJHBhZGRpbmdSZXF1aXJlZCwgJGVuY29kaW5nKTsKZGVmYXVsdDoKJGxlZnRQYWRkaW5nTGVuZ3RoID0gZmxvb3IoJHBhZGRpbmdSZXF1aXJlZCAvIDIpOwokcmlnaHRQYWRkaW5nTGVuZ3RoID0gJHBhZGRpbmdSZXF1aXJlZCAtICRsZWZ0UGFkZGluZ0xlbmd0aDsKCnJldHVybiBzZWxmOjptYl9zdWJzdHIoc3RyX3JlcGVhdCgkcGFkX3N0cmluZywgJGxlZnRQYWRkaW5nTGVuZ3RoKSwgMCwgJGxlZnRQYWRkaW5nTGVuZ3RoLCAkZW5jb2RpbmcpLiRzdHJpbmcuc2VsZjo6bWJfc3Vic3RyKHN0cl9yZXBlYXQoJHBhZF9zdHJpbmcsICRyaWdodFBhZGRpbmdMZW5ndGgpLCAwLCAkcmlnaHRQYWRkaW5nTGVuZ3RoLCAkZW5jb2RpbmcpOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnBhcnQoJHBvcywgJHBhcnQsICRoYXlzdGFjaywgJGVuY29kaW5nKQp7CmlmIChmYWxzZSA9PT0gJHBvcykgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRwYXJ0KSB7CnJldHVybiBzZWxmOjptYl9zdWJzdHIoJGhheXN0YWNrLCAwLCAkcG9zLCAkZW5jb2RpbmcpOwp9CgpyZXR1cm4gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgJHBvcywgbnVsbCwgJGVuY29kaW5nKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaHRtbF9lbmNvZGluZ19jYWxsYmFjayhhcnJheSAkbSkKewokaSA9IDE7CiRlbnRpdGllcyA9ICcnOwokbSA9IHVucGFjaygnQyonLCBodG1sZW50aXRpZXMoJG1bMF0sIFxFTlRfQ09NUEFULCAnVVRGLTgnKSk7Cgp3aGlsZSAoaXNzZXQoJG1bJGldKSkgewppZiAoMHg4MCA+ICRtWyRpXSkgewokZW50aXRpZXMgLj0gXGNocigkbVskaSsrXSk7CmNvbnRpbnVlOwp9CmlmICgweEYwIDw9ICRtWyRpXSkgewokYyA9ICgoJG1bJGkrK10gLSAweEYwKSA8PCAxOCkgKyAoKCRtWyRpKytdIC0gMHg4MCkgPDwgMTIpICsgKCgkbVskaSsrXSAtIDB4ODApIDw8IDYpICsgJG1bJGkrK10gLSAweDgwOwp9IGVsc2VpZiAoMHhFMCA8PSAkbVskaV0pIHsKJGMgPSAoKCRtWyRpKytdIC0gMHhFMCkgPDwgMTIpICsgKCgkbVskaSsrXSAtIDB4ODApIDw8IDYpICsgJG1bJGkrK10gLSAweDgwOwp9IGVsc2UgewokYyA9ICgoJG1bJGkrK10gLSAweEMwKSA8PCA2KSArICRtWyRpKytdIC0gMHg4MDsKfQoKJGVudGl0aWVzIC49ICcmIycuJGMuJzsnOwp9CgpyZXR1cm4gJGVudGl0aWVzOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0aXRsZV9jYXNlKGFycmF5ICRzKQp7CnJldHVybiBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHNbMV0sIFxNQl9DQVNFX1VQUEVSLCAnVVRGLTgnKS5zZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHNbMl0sIFxNQl9DQVNFX0xPV0VSLCAnVVRGLTgnKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0YSgkZmlsZSkKewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSBfX0RJUl9fLicvUmVzb3VyY2VzL3VuaWRhdGEvJy4kZmlsZS4nLnBocCcpKSB7CnJldHVybiByZXF1aXJlICRmaWxlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEVuY29kaW5nKCRlbmNvZGluZykKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiBzZWxmOjokaW50ZXJuYWxFbmNvZGluZzsKfQoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJ1VURi04JzsKfQoKJGVuY29kaW5nID0gc3RydG91cHBlcigkZW5jb2RpbmcpOwoKaWYgKCc4QklUJyA9PT0gJGVuY29kaW5nIHx8ICdCSU5BUlknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICdDUDg1MCc7Cn0KCmlmICgnVVRGOCcgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJ1VURi04JzsKfQoKcmV0dXJuICRlbmNvZGluZzsKfQp9Cjw/cGhwCgpyZXR1cm4gWwonxLAnID0+ICdpzIcnLAonwrUnID0+ICfOvCcsCifFvycgPT4gJ3MnLAonzYUnID0+ICfOuScsCifPgicgPT4gJ8+DJywKJ8+QJyA9PiAnzrInLAonz5EnID0+ICfOuCcsCifPlScgPT4gJ8+GJywKJ8+WJyA9PiAnz4AnLAonz7AnID0+ICfOuicsCifPsScgPT4gJ8+BJywKJ8+1JyA9PiAnzrUnLAon4bqbJyA9PiAn4bmhJywKJ+G+vicgPT4gJ865JywKJ8OfJyA9PiAnc3MnLAonxYknID0+ICfKvG4nLAonx7AnID0+ICfHsCcsCifOkCcgPT4gJ86QJywKJ86wJyA9PiAnzrAnLAon1ocnID0+ICfVpdaCJywKJ+G6licgPT4gJ+G6licsCifhupcnID0+ICfhupcnLAon4bqYJyA9PiAn4bqYJywKJ+G6mScgPT4gJ+G6mScsCifhuponID0+ICdhyr4nLAon4bqeJyA9PiAnc3MnLAon4b2QJyA9PiAn4b2QJywKJ+G9kicgPT4gJ+G9kicsCifhvZQnID0+ICfhvZQnLAon4b2WJyA9PiAn4b2WJywKJ+G+gCcgPT4gJ+G8gM65JywKJ+G+gScgPT4gJ+G8gc65JywKJ+G+gicgPT4gJ+G8gs65JywKJ+G+gycgPT4gJ+G8g865JywKJ+G+hCcgPT4gJ+G8hM65JywKJ+G+hScgPT4gJ+G8hc65JywKJ+G+hicgPT4gJ+G8hs65JywKJ+G+hycgPT4gJ+G8h865JywKJ+G+iCcgPT4gJ+G8gM65JywKJ+G+iScgPT4gJ+G8gc65JywKJ+G+iicgPT4gJ+G8gs65JywKJ+G+iycgPT4gJ+G8g865JywKJ+G+jCcgPT4gJ+G8hM65JywKJ+G+jScgPT4gJ+G8hc65JywKJ+G+jicgPT4gJ+G8hs65JywKJ+G+jycgPT4gJ+G8h865JywKJ+G+kCcgPT4gJ+G8oM65JywKJ+G+kScgPT4gJ+G8oc65JywKJ+G+kicgPT4gJ+G8os65JywKJ+G+kycgPT4gJ+G8o865JywKJ+G+lCcgPT4gJ+G8pM65JywKJ+G+lScgPT4gJ+G8pc65JywKJ+G+licgPT4gJ+G8ps65JywKJ+G+lycgPT4gJ+G8p865JywKJ+G+mCcgPT4gJ+G8oM65JywKJ+G+mScgPT4gJ+G8oc65JywKJ+G+micgPT4gJ+G8os65JywKJ+G+mycgPT4gJ+G8o865JywKJ+G+nCcgPT4gJ+G8pM65JywKJ+G+nScgPT4gJ+G8pc65JywKJ+G+nicgPT4gJ+G8ps65JywKJ+G+nycgPT4gJ+G8p865JywKJ+G+oCcgPT4gJ+G9oM65JywKJ+G+oScgPT4gJ+G9oc65JywKJ+G+oicgPT4gJ+G9os65JywKJ+G+oycgPT4gJ+G9o865JywKJ+G+pCcgPT4gJ+G9pM65JywKJ+G+pScgPT4gJ+G9pc65JywKJ+G+picgPT4gJ+G9ps65JywKJ+G+pycgPT4gJ+G9p865JywKJ+G+qCcgPT4gJ+G9oM65JywKJ+G+qScgPT4gJ+G9oc65JywKJ+G+qicgPT4gJ+G9os65JywKJ+G+qycgPT4gJ+G9o865JywKJ+G+rCcgPT4gJ+G9pM65JywKJ+G+rScgPT4gJ+G9pc65JywKJ+G+ricgPT4gJ+G9ps65JywKJ+G+rycgPT4gJ+G9p865JywKJ+G+sicgPT4gJ+G9sM65JywKJ+G+sycgPT4gJ86xzrknLAon4b60JyA9PiAnzqzOuScsCifhvrYnID0+ICfhvrYnLAon4b63JyA9PiAn4b62zrknLAon4b68JyA9PiAnzrHOuScsCifhv4InID0+ICfhvbTOuScsCifhv4MnID0+ICfOt865JywKJ+G/hCcgPT4gJ86uzrknLAon4b+GJyA9PiAn4b+GJywKJ+G/hycgPT4gJ+G/hs65JywKJ+G/jCcgPT4gJ863zrknLAon4b+SJyA9PiAn4b+SJywKJ+G/licgPT4gJ+G/licsCifhv5cnID0+ICfhv5cnLAon4b+iJyA9PiAn4b+iJywKJ+G/pCcgPT4gJ+G/pCcsCifhv6YnID0+ICfhv6YnLAon4b+nJyA9PiAn4b+nJywKJ+G/sicgPT4gJ+G9vM65JywKJ+G/sycgPT4gJ8+JzrknLAon4b+0JyA9PiAnz47OuScsCifhv7YnID0+ICfhv7YnLAon4b+3JyA9PiAn4b+2zrknLAon4b+8JyA9PiAnz4nOuScsCifvrIAnID0+ICdmZicsCifvrIEnID0+ICdmaScsCifvrIInID0+ICdmbCcsCifvrIMnID0+ICdmZmknLAon76yEJyA9PiAnZmZsJywKJ++shScgPT4gJ3N0JywKJ++shicgPT4gJ3N0JywKJ++skycgPT4gJ9W01bYnLAon76yUJyA9PiAn1bTVpScsCifvrJUnID0+ICfVtNWrJywKJ++slicgPT4gJ9W+1bYnLAon76yXJyA9PiAn1bTVrScsCl07Cjw/cGhwCgpyZXR1cm4gYXJyYXkgKAonQScgPT4gJ2EnLAonQicgPT4gJ2InLAonQycgPT4gJ2MnLAonRCcgPT4gJ2QnLAonRScgPT4gJ2UnLAonRicgPT4gJ2YnLAonRycgPT4gJ2cnLAonSCcgPT4gJ2gnLAonSScgPT4gJ2knLAonSicgPT4gJ2onLAonSycgPT4gJ2snLAonTCcgPT4gJ2wnLAonTScgPT4gJ20nLAonTicgPT4gJ24nLAonTycgPT4gJ28nLAonUCcgPT4gJ3AnLAonUScgPT4gJ3EnLAonUicgPT4gJ3InLAonUycgPT4gJ3MnLAonVCcgPT4gJ3QnLAonVScgPT4gJ3UnLAonVicgPT4gJ3YnLAonVycgPT4gJ3cnLAonWCcgPT4gJ3gnLAonWScgPT4gJ3knLAonWicgPT4gJ3onLAonw4AnID0+ICfDoCcsCifDgScgPT4gJ8OhJywKJ8OCJyA9PiAnw6InLAonw4MnID0+ICfDoycsCifDhCcgPT4gJ8OkJywKJ8OFJyA9PiAnw6UnLAonw4YnID0+ICfDpicsCifDhycgPT4gJ8OnJywKJ8OIJyA9PiAnw6gnLAonw4knID0+ICfDqScsCifDiicgPT4gJ8OqJywKJ8OLJyA9PiAnw6snLAonw4wnID0+ICfDrCcsCifDjScgPT4gJ8OtJywKJ8OOJyA9PiAnw64nLAonw48nID0+ICfDrycsCifDkCcgPT4gJ8OwJywKJ8ORJyA9PiAnw7EnLAonw5InID0+ICfDsicsCifDkycgPT4gJ8OzJywKJ8OUJyA9PiAnw7QnLAonw5UnID0+ICfDtScsCifDlicgPT4gJ8O2JywKJ8OYJyA9PiAnw7gnLAonw5knID0+ICfDuScsCifDmicgPT4gJ8O6JywKJ8ObJyA9PiAnw7snLAonw5wnID0+ICfDvCcsCifDnScgPT4gJ8O9JywKJ8OeJyA9PiAnw74nLAonxIAnID0+ICfEgScsCifEgicgPT4gJ8SDJywKJ8SEJyA9PiAnxIUnLAonxIYnID0+ICfEhycsCifEiCcgPT4gJ8SJJywKJ8SKJyA9PiAnxIsnLAonxIwnID0+ICfEjScsCifEjicgPT4gJ8SPJywKJ8SQJyA9PiAnxJEnLAonxJInID0+ICfEkycsCifElCcgPT4gJ8SVJywKJ8SWJyA9PiAnxJcnLAonxJgnID0+ICfEmScsCifEmicgPT4gJ8SbJywKJ8ScJyA9PiAnxJ0nLAonxJ4nID0+ICfEnycsCifEoCcgPT4gJ8ShJywKJ8SiJyA9PiAnxKMnLAonxKQnID0+ICfEpScsCifEpicgPT4gJ8SnJywKJ8SoJyA9PiAnxKknLAonxKonID0+ICfEqycsCifErCcgPT4gJ8StJywKJ8SuJyA9PiAnxK8nLAonxLAnID0+ICdpzIcnLAonxLInID0+ICfEsycsCifEtCcgPT4gJ8S1JywKJ8S2JyA9PiAnxLcnLAonxLknID0+ICfEuicsCifEuycgPT4gJ8S8JywKJ8S9JyA9PiAnxL4nLAonxL8nID0+ICfFgCcsCifFgScgPT4gJ8WCJywKJ8WDJyA9PiAnxYQnLAonxYUnID0+ICfFhicsCifFhycgPT4gJ8WIJywKJ8WKJyA9PiAnxYsnLAonxYwnID0+ICfFjScsCifFjicgPT4gJ8WPJywKJ8WQJyA9PiAnxZEnLAonxZInID0+ICfFkycsCifFlCcgPT4gJ8WVJywKJ8WWJyA9PiAnxZcnLAonxZgnID0+ICfFmScsCifFmicgPT4gJ8WbJywKJ8WcJyA9PiAnxZ0nLAonxZ4nID0+ICfFnycsCifFoCcgPT4gJ8WhJywKJ8WiJyA9PiAnxaMnLAonxaQnID0+ICfFpScsCifFpicgPT4gJ8WnJywKJ8WoJyA9PiAnxaknLAonxaonID0+ICfFqycsCifFrCcgPT4gJ8WtJywKJ8WuJyA9PiAnxa8nLAonxbAnID0+ICfFsScsCifFsicgPT4gJ8WzJywKJ8W0JyA9PiAnxbUnLAonxbYnID0+ICfFtycsCifFuCcgPT4gJ8O/JywKJ8W5JyA9PiAnxbonLAonxbsnID0+ICfFvCcsCifFvScgPT4gJ8W+JywKJ8aBJyA9PiAnyZMnLAonxoInID0+ICfGgycsCifGhCcgPT4gJ8aFJywKJ8aGJyA9PiAnyZQnLAonxocnID0+ICfGiCcsCifGiScgPT4gJ8mWJywKJ8aKJyA9PiAnyZcnLAonxosnID0+ICfGjCcsCifGjicgPT4gJ8edJywKJ8aPJyA9PiAnyZknLAonxpAnID0+ICfJmycsCifGkScgPT4gJ8aSJywKJ8aTJyA9PiAnyaAnLAonxpQnID0+ICfJoycsCifGlicgPT4gJ8mpJywKJ8aXJyA9PiAnyagnLAonxpgnID0+ICfGmScsCifGnCcgPT4gJ8mvJywKJ8adJyA9PiAnybInLAonxp8nID0+ICfJtScsCifGoCcgPT4gJ8ahJywKJ8aiJyA9PiAnxqMnLAonxqQnID0+ICfGpScsCifGpicgPT4gJ8qAJywKJ8anJyA9PiAnxqgnLAonxqknID0+ICfKgycsCifGrCcgPT4gJ8atJywKJ8auJyA9PiAnyognLAonxq8nID0+ICfGsCcsCifGsScgPT4gJ8qKJywKJ8ayJyA9PiAnyosnLAonxrMnID0+ICfGtCcsCifGtScgPT4gJ8a2JywKJ8a3JyA9PiAnypInLAonxrgnID0+ICfGuScsCifGvCcgPT4gJ8a9JywKJ8eEJyA9PiAnx4YnLAonx4UnID0+ICfHhicsCifHhycgPT4gJ8eJJywKJ8eIJyA9PiAnx4knLAonx4onID0+ICfHjCcsCifHiycgPT4gJ8eMJywKJ8eNJyA9PiAnx44nLAonx48nID0+ICfHkCcsCifHkScgPT4gJ8eSJywKJ8eTJyA9PiAnx5QnLAonx5UnID0+ICfHlicsCifHlycgPT4gJ8eYJywKJ8eZJyA9PiAnx5onLAonx5snID0+ICfHnCcsCifHnicgPT4gJ8efJywKJ8egJyA9PiAnx6EnLAonx6InID0+ICfHoycsCifHpCcgPT4gJ8elJywKJ8emJyA9PiAnx6cnLAonx6gnID0+ICfHqScsCifHqicgPT4gJ8erJywKJ8esJyA9PiAnx60nLAonx64nID0+ICfHrycsCifHsScgPT4gJ8ezJywKJ8eyJyA9PiAnx7MnLAonx7QnID0+ICfHtScsCifHticgPT4gJ8aVJywKJ8e3JyA9PiAnxr8nLAonx7gnID0+ICfHuScsCifHuicgPT4gJ8e7JywKJ8e8JyA9PiAnx70nLAonx74nID0+ICfHvycsCifIgCcgPT4gJ8iBJywKJ8iCJyA9PiAnyIMnLAonyIQnID0+ICfIhScsCifIhicgPT4gJ8iHJywKJ8iIJyA9PiAnyIknLAonyIonID0+ICfIiycsCifIjCcgPT4gJ8iNJywKJ8iOJyA9PiAnyI8nLAonyJAnID0+ICfIkScsCifIkicgPT4gJ8iTJywKJ8iUJyA9PiAnyJUnLAonyJYnID0+ICfIlycsCifImCcgPT4gJ8iZJywKJ8iaJyA9PiAnyJsnLAonyJwnID0+ICfInScsCifInicgPT4gJ8ifJywKJ8igJyA9PiAnxp4nLAonyKInID0+ICfIoycsCifIpCcgPT4gJ8ilJywKJ8imJyA9PiAnyKcnLAonyKgnID0+ICfIqScsCifIqicgPT4gJ8irJywKJ8isJyA9PiAnyK0nLAonyK4nID0+ICfIrycsCifIsCcgPT4gJ8ixJywKJ8iyJyA9PiAnyLMnLAonyLonID0+ICfisaUnLAonyLsnID0+ICfIvCcsCifIvScgPT4gJ8aaJywKJ8i+JyA9PiAn4rGmJywKJ8mBJyA9PiAnyYInLAonyYMnID0+ICfGgCcsCifJhCcgPT4gJ8qJJywKJ8mFJyA9PiAnyownLAonyYYnID0+ICfJhycsCifJiCcgPT4gJ8mJJywKJ8mKJyA9PiAnyYsnLAonyYwnID0+ICfJjScsCifJjicgPT4gJ8mPJywKJ82wJyA9PiAnzbEnLAonzbInID0+ICfNsycsCifNticgPT4gJ823JywKJ82/JyA9PiAnz7MnLAonzoYnID0+ICfOrCcsCifOiCcgPT4gJ86tJywKJ86JJyA9PiAnzq4nLAonzoonID0+ICfOrycsCifOjCcgPT4gJ8+MJywKJ86OJyA9PiAnz40nLAonzo8nID0+ICfPjicsCifOkScgPT4gJ86xJywKJ86SJyA9PiAnzrInLAonzpMnID0+ICfOsycsCifOlCcgPT4gJ860JywKJ86VJyA9PiAnzrUnLAonzpYnID0+ICfOticsCifOlycgPT4gJ863JywKJ86YJyA9PiAnzrgnLAonzpknID0+ICfOuScsCifOmicgPT4gJ866JywKJ86bJyA9PiAnzrsnLAonzpwnID0+ICfOvCcsCifOnScgPT4gJ869JywKJ86eJyA9PiAnzr4nLAonzp8nID0+ICfOvycsCifOoCcgPT4gJ8+AJywKJ86hJyA9PiAnz4EnLAonzqMnID0+ICfPgycsCifOpCcgPT4gJ8+EJywKJ86lJyA9PiAnz4UnLAonzqYnID0+ICfPhicsCifOpycgPT4gJ8+HJywKJ86oJyA9PiAnz4gnLAonzqknID0+ICfPiScsCifOqicgPT4gJ8+KJywKJ86rJyA9PiAnz4snLAonz48nID0+ICfPlycsCifPmCcgPT4gJ8+ZJywKJ8+aJyA9PiAnz5snLAonz5wnID0+ICfPnScsCifPnicgPT4gJ8+fJywKJ8+gJyA9PiAnz6EnLAonz6InID0+ICfPoycsCifPpCcgPT4gJ8+lJywKJ8+mJyA9PiAnz6cnLAonz6gnID0+ICfPqScsCifPqicgPT4gJ8+rJywKJ8+sJyA9PiAnz60nLAonz64nID0+ICfPrycsCifPtCcgPT4gJ864JywKJ8+3JyA9PiAnz7gnLAonz7knID0+ICfPsicsCifPuicgPT4gJ8+7JywKJ8+9JyA9PiAnzbsnLAonz74nID0+ICfNvCcsCifPvycgPT4gJ829JywKJ9CAJyA9PiAn0ZAnLAon0IEnID0+ICfRkScsCifQgicgPT4gJ9GSJywKJ9CDJyA9PiAn0ZMnLAon0IQnID0+ICfRlCcsCifQhScgPT4gJ9GVJywKJ9CGJyA9PiAn0ZYnLAon0IcnID0+ICfRlycsCifQiCcgPT4gJ9GYJywKJ9CJJyA9PiAn0ZknLAon0IonID0+ICfRmicsCifQiycgPT4gJ9GbJywKJ9CMJyA9PiAn0ZwnLAon0I0nID0+ICfRnScsCifQjicgPT4gJ9GeJywKJ9CPJyA9PiAn0Z8nLAon0JAnID0+ICfQsCcsCifQkScgPT4gJ9CxJywKJ9CSJyA9PiAn0LInLAon0JMnID0+ICfQsycsCifQlCcgPT4gJ9C0JywKJ9CVJyA9PiAn0LUnLAon0JYnID0+ICfQticsCifQlycgPT4gJ9C3JywKJ9CYJyA9PiAn0LgnLAon0JknID0+ICfQuScsCifQmicgPT4gJ9C6JywKJ9CbJyA9PiAn0LsnLAon0JwnID0+ICfQvCcsCifQnScgPT4gJ9C9JywKJ9CeJyA9PiAn0L4nLAon0J8nID0+ICfQvycsCifQoCcgPT4gJ9GAJywKJ9ChJyA9PiAn0YEnLAon0KInID0+ICfRgicsCifQoycgPT4gJ9GDJywKJ9CkJyA9PiAn0YQnLAon0KUnID0+ICfRhScsCifQpicgPT4gJ9GGJywKJ9CnJyA9PiAn0YcnLAon0KgnID0+ICfRiCcsCifQqScgPT4gJ9GJJywKJ9CqJyA9PiAn0YonLAon0KsnID0+ICfRiycsCifQrCcgPT4gJ9GMJywKJ9CtJyA9PiAn0Y0nLAon0K4nID0+ICfRjicsCifQrycgPT4gJ9GPJywKJ9GgJyA9PiAn0aEnLAon0aInID0+ICfRoycsCifRpCcgPT4gJ9GlJywKJ9GmJyA9PiAn0acnLAon0agnID0+ICfRqScsCifRqicgPT4gJ9GrJywKJ9GsJyA9PiAn0a0nLAon0a4nID0+ICfRrycsCifRsCcgPT4gJ9GxJywKJ9GyJyA9PiAn0bMnLAon0bQnID0+ICfRtScsCifRticgPT4gJ9G3JywKJ9G4JyA9PiAn0bknLAon0bonID0+ICfRuycsCifRvCcgPT4gJ9G9JywKJ9G+JyA9PiAn0b8nLAon0oAnID0+ICfSgScsCifSiicgPT4gJ9KLJywKJ9KMJyA9PiAn0o0nLAon0o4nID0+ICfSjycsCifSkCcgPT4gJ9KRJywKJ9KSJyA9PiAn0pMnLAon0pQnID0+ICfSlScsCifSlicgPT4gJ9KXJywKJ9KYJyA9PiAn0pknLAon0ponID0+ICfSmycsCifSnCcgPT4gJ9KdJywKJ9KeJyA9PiAn0p8nLAon0qAnID0+ICfSoScsCifSoicgPT4gJ9KjJywKJ9KkJyA9PiAn0qUnLAon0qYnID0+ICfSpycsCifSqCcgPT4gJ9KpJywKJ9KqJyA9PiAn0qsnLAon0qwnID0+ICfSrScsCifSricgPT4gJ9KvJywKJ9KwJyA9PiAn0rEnLAon0rInID0+ICfSsycsCifStCcgPT4gJ9K1JywKJ9K2JyA9PiAn0rcnLAon0rgnID0+ICfSuScsCifSuicgPT4gJ9K7JywKJ9K8JyA9PiAn0r0nLAon0r4nID0+ICfSvycsCifTgCcgPT4gJ9OPJywKJ9OBJyA9PiAn04InLAon04MnID0+ICfThCcsCifThScgPT4gJ9OGJywKJ9OHJyA9PiAn04gnLAon04knID0+ICfTiicsCifTiycgPT4gJ9OMJywKJ9ONJyA9PiAn044nLAon05AnID0+ICfTkScsCifTkicgPT4gJ9OTJywKJ9OUJyA9PiAn05UnLAon05YnID0+ICfTlycsCifTmCcgPT4gJ9OZJywKJ9OaJyA9PiAn05snLAon05wnID0+ICfTnScsCifTnicgPT4gJ9OfJywKJ9OgJyA9PiAn06EnLAon06InID0+ICfToycsCifTpCcgPT4gJ9OlJywKJ9OmJyA9PiAn06cnLAon06gnID0+ICfTqScsCifTqicgPT4gJ9OrJywKJ9OsJyA9PiAn060nLAon064nID0+ICfTrycsCifTsCcgPT4gJ9OxJywKJ9OyJyA9PiAn07MnLAon07QnID0+ICfTtScsCifTticgPT4gJ9O3JywKJ9O4JyA9PiAn07knLAon07onID0+ICfTuycsCifTvCcgPT4gJ9O9JywKJ9O+JyA9PiAn078nLAon1IAnID0+ICfUgScsCifUgicgPT4gJ9SDJywKJ9SEJyA9PiAn1IUnLAon1IYnID0+ICfUhycsCifUiCcgPT4gJ9SJJywKJ9SKJyA9PiAn1IsnLAon1IwnID0+ICfUjScsCifUjicgPT4gJ9SPJywKJ9SQJyA9PiAn1JEnLAon1JInID0+ICfUkycsCifUlCcgPT4gJ9SVJywKJ9SWJyA9PiAn1JcnLAon1JgnID0+ICfUmScsCifUmicgPT4gJ9SbJywKJ9ScJyA9PiAn1J0nLAon1J4nID0+ICfUnycsCifUoCcgPT4gJ9ShJywKJ9SiJyA9PiAn1KMnLAon1KQnID0+ICfUpScsCifUpicgPT4gJ9SnJywKJ9SoJyA9PiAn1KknLAon1KonID0+ICfUqycsCifUrCcgPT4gJ9StJywKJ9SuJyA9PiAn1K8nLAon1LEnID0+ICfVoScsCifUsicgPT4gJ9WiJywKJ9SzJyA9PiAn1aMnLAon1LQnID0+ICfVpCcsCifUtScgPT4gJ9WlJywKJ9S2JyA9PiAn1aYnLAon1LcnID0+ICfVpycsCifUuCcgPT4gJ9WoJywKJ9S5JyA9PiAn1aknLAon1LonID0+ICfVqicsCifUuycgPT4gJ9WrJywKJ9S8JyA9PiAn1awnLAon1L0nID0+ICfVrScsCifUvicgPT4gJ9WuJywKJ9S/JyA9PiAn1a8nLAon1YAnID0+ICfVsCcsCifVgScgPT4gJ9WxJywKJ9WCJyA9PiAn1bInLAon1YMnID0+ICfVsycsCifVhCcgPT4gJ9W0JywKJ9WFJyA9PiAn1bUnLAon1YYnID0+ICfVticsCifVhycgPT4gJ9W3JywKJ9WIJyA9PiAn1bgnLAon1YknID0+ICfVuScsCifViicgPT4gJ9W6JywKJ9WLJyA9PiAn1bsnLAon1YwnID0+ICfVvCcsCifVjScgPT4gJ9W9JywKJ9WOJyA9PiAn1b4nLAon1Y8nID0+ICfVvycsCifVkCcgPT4gJ9aAJywKJ9WRJyA9PiAn1oEnLAon1ZInID0+ICfWgicsCifVkycgPT4gJ9aDJywKJ9WUJyA9PiAn1oQnLAon1ZUnID0+ICfWhScsCifVlicgPT4gJ9aGJywKJ+GCoCcgPT4gJ+K0gCcsCifhgqEnID0+ICfitIEnLAon4YKiJyA9PiAn4rSCJywKJ+GCoycgPT4gJ+K0gycsCifhgqQnID0+ICfitIQnLAon4YKlJyA9PiAn4rSFJywKJ+GCpicgPT4gJ+K0hicsCifhgqcnID0+ICfitIcnLAon4YKoJyA9PiAn4rSIJywKJ+GCqScgPT4gJ+K0iScsCifhgqonID0+ICfitIonLAon4YKrJyA9PiAn4rSLJywKJ+GCrCcgPT4gJ+K0jCcsCifhgq0nID0+ICfitI0nLAon4YKuJyA9PiAn4rSOJywKJ+GCrycgPT4gJ+K0jycsCifhgrAnID0+ICfitJAnLAon4YKxJyA9PiAn4rSRJywKJ+GCsicgPT4gJ+K0kicsCifhgrMnID0+ICfitJMnLAon4YK0JyA9PiAn4rSUJywKJ+GCtScgPT4gJ+K0lScsCifhgrYnID0+ICfitJYnLAon4YK3JyA9PiAn4rSXJywKJ+GCuCcgPT4gJ+K0mCcsCifhgrknID0+ICfitJknLAon4YK6JyA9PiAn4rSaJywKJ+GCuycgPT4gJ+K0mycsCifhgrwnID0+ICfitJwnLAon4YK9JyA9PiAn4rSdJywKJ+GCvicgPT4gJ+K0nicsCifhgr8nID0+ICfitJ8nLAon4YOAJyA9PiAn4rSgJywKJ+GDgScgPT4gJ+K0oScsCifhg4InID0+ICfitKInLAon4YODJyA9PiAn4rSjJywKJ+GDhCcgPT4gJ+K0pCcsCifhg4UnID0+ICfitKUnLAon4YOHJyA9PiAn4rSnJywKJ+GDjScgPT4gJ+K0rScsCifhjqAnID0+ICfqrbAnLAon4Y6hJyA9PiAn6q2xJywKJ+GOoicgPT4gJ+qtsicsCifhjqMnID0+ICfqrbMnLAon4Y6kJyA9PiAn6q20JywKJ+GOpScgPT4gJ+qttScsCifhjqYnID0+ICfqrbYnLAon4Y6nJyA9PiAn6q23JywKJ+GOqCcgPT4gJ+qtuCcsCifhjqknID0+ICfqrbknLAon4Y6qJyA9PiAn6q26JywKJ+GOqycgPT4gJ+qtuycsCifhjqwnID0+ICfqrbwnLAon4Y6tJyA9PiAn6q29JywKJ+GOricgPT4gJ+qtvicsCifhjq8nID0+ICfqrb8nLAon4Y6wJyA9PiAn6q6AJywKJ+GOsScgPT4gJ+qugScsCifhjrInID0+ICfqroInLAon4Y6zJyA9PiAn6q6DJywKJ+GOtCcgPT4gJ+quhCcsCifhjrUnID0+ICfqroUnLAon4Y62JyA9PiAn6q6GJywKJ+GOtycgPT4gJ+quhycsCifhjrgnID0+ICfqrognLAon4Y65JyA9PiAn6q6JJywKJ+GOuicgPT4gJ+quiicsCifhjrsnID0+ICfqrosnLAon4Y68JyA9PiAn6q6MJywKJ+GOvScgPT4gJ+qujScsCifhjr4nID0+ICfqro4nLAon4Y6/JyA9PiAn6q6PJywKJ+GPgCcgPT4gJ+qukCcsCifhj4EnID0+ICfqrpEnLAon4Y+CJyA9PiAn6q6SJywKJ+GPgycgPT4gJ+qukycsCifhj4QnID0+ICfqrpQnLAon4Y+FJyA9PiAn6q6VJywKJ+GPhicgPT4gJ+qulicsCifhj4cnID0+ICfqrpcnLAon4Y+IJyA9PiAn6q6YJywKJ+GPiScgPT4gJ+qumScsCifhj4onID0+ICfqrponLAon4Y+LJyA9PiAn6q6bJywKJ+GPjCcgPT4gJ+qunCcsCifhj40nID0+ICfqrp0nLAon4Y+OJyA9PiAn6q6eJywKJ+GPjycgPT4gJ+qunycsCifhj5AnID0+ICfqrqAnLAon4Y+RJyA9PiAn6q6hJywKJ+GPkicgPT4gJ+quoicsCifhj5MnID0+ICfqrqMnLAon4Y+UJyA9PiAn6q6kJywKJ+GPlScgPT4gJ+qupScsCifhj5YnID0+ICfqrqYnLAon4Y+XJyA9PiAn6q6nJywKJ+GPmCcgPT4gJ+quqCcsCifhj5knID0+ICfqrqknLAon4Y+aJyA9PiAn6q6qJywKJ+GPmycgPT4gJ+quqycsCifhj5wnID0+ICfqrqwnLAon4Y+dJyA9PiAn6q6tJywKJ+GPnicgPT4gJ+quricsCifhj58nID0+ICfqrq8nLAon4Y+gJyA9PiAn6q6wJywKJ+GPoScgPT4gJ+qusScsCifhj6InID0+ICfqrrInLAon4Y+jJyA9PiAn6q6zJywKJ+GPpCcgPT4gJ+qutCcsCifhj6UnID0+ICfqrrUnLAon4Y+mJyA9PiAn6q62JywKJ+GPpycgPT4gJ+qutycsCifhj6gnID0+ICfqrrgnLAon4Y+pJyA9PiAn6q65JywKJ+GPqicgPT4gJ+quuicsCifhj6snID0+ICfqrrsnLAon4Y+sJyA9PiAn6q68JywKJ+GPrScgPT4gJ+quvScsCifhj64nID0+ICfqrr4nLAon4Y+vJyA9PiAn6q6/JywKJ+GPsCcgPT4gJ+GPuCcsCifhj7EnID0+ICfhj7knLAon4Y+yJyA9PiAn4Y+6JywKJ+GPsycgPT4gJ+GPuycsCifhj7QnID0+ICfhj7wnLAon4Y+1JyA9PiAn4Y+9JywKJ+GykCcgPT4gJ+GDkCcsCifhspEnID0+ICfhg5EnLAon4bKSJyA9PiAn4YOSJywKJ+GykycgPT4gJ+GDkycsCifhspQnID0+ICfhg5QnLAon4bKVJyA9PiAn4YOVJywKJ+GylicgPT4gJ+GDlicsCifhspcnID0+ICfhg5cnLAon4bKYJyA9PiAn4YOYJywKJ+GymScgPT4gJ+GDmScsCifhsponID0+ICfhg5onLAon4bKbJyA9PiAn4YObJywKJ+GynCcgPT4gJ+GDnCcsCifhsp0nID0+ICfhg50nLAon4bKeJyA9PiAn4YOeJywKJ+GynycgPT4gJ+GDnycsCifhsqAnID0+ICfhg6AnLAon4bKhJyA9PiAn4YOhJywKJ+GyoicgPT4gJ+GDoicsCifhsqMnID0+ICfhg6MnLAon4bKkJyA9PiAn4YOkJywKJ+GypScgPT4gJ+GDpScsCifhsqYnID0+ICfhg6YnLAon4bKnJyA9PiAn4YOnJywKJ+GyqCcgPT4gJ+GDqCcsCifhsqknID0+ICfhg6knLAon4bKqJyA9PiAn4YOqJywKJ+GyqycgPT4gJ+GDqycsCifhsqwnID0+ICfhg6wnLAon4bKtJyA9PiAn4YOtJywKJ+GyricgPT4gJ+GDricsCifhsq8nID0+ICfhg68nLAon4bKwJyA9PiAn4YOwJywKJ+GysScgPT4gJ+GDsScsCifhsrInID0+ICfhg7InLAon4bKzJyA9PiAn4YOzJywKJ+GytCcgPT4gJ+GDtCcsCifhsrUnID0+ICfhg7UnLAon4bK2JyA9PiAn4YO2JywKJ+GytycgPT4gJ+GDtycsCifhsrgnID0+ICfhg7gnLAon4bK5JyA9PiAn4YO5JywKJ+GyuicgPT4gJ+GDuicsCifhsr0nID0+ICfhg70nLAon4bK+JyA9PiAn4YO+JywKJ+GyvycgPT4gJ+GDvycsCifhuIAnID0+ICfhuIEnLAon4biCJyA9PiAn4biDJywKJ+G4hCcgPT4gJ+G4hScsCifhuIYnID0+ICfhuIcnLAon4biIJyA9PiAn4biJJywKJ+G4iicgPT4gJ+G4iycsCifhuIwnID0+ICfhuI0nLAon4biOJyA9PiAn4biPJywKJ+G4kCcgPT4gJ+G4kScsCifhuJInID0+ICfhuJMnLAon4biUJyA9PiAn4biVJywKJ+G4licgPT4gJ+G4lycsCifhuJgnID0+ICfhuJknLAon4biaJyA9PiAn4bibJywKJ+G4nCcgPT4gJ+G4nScsCifhuJ4nID0+ICfhuJ8nLAon4bigJyA9PiAn4bihJywKJ+G4oicgPT4gJ+G4oycsCifhuKQnID0+ICfhuKUnLAon4bimJyA9PiAn4binJywKJ+G4qCcgPT4gJ+G4qScsCifhuKonID0+ICfhuKsnLAon4bisJyA9PiAn4bitJywKJ+G4ricgPT4gJ+G4rycsCifhuLAnID0+ICfhuLEnLAon4biyJyA9PiAn4bizJywKJ+G4tCcgPT4gJ+G4tScsCifhuLYnID0+ICfhuLcnLAon4bi4JyA9PiAn4bi5JywKJ+G4uicgPT4gJ+G4uycsCifhuLwnID0+ICfhuL0nLAon4bi+JyA9PiAn4bi/JywKJ+G5gCcgPT4gJ+G5gScsCifhuYInID0+ICfhuYMnLAon4bmEJyA9PiAn4bmFJywKJ+G5hicgPT4gJ+G5hycsCifhuYgnID0+ICfhuYknLAon4bmKJyA9PiAn4bmLJywKJ+G5jCcgPT4gJ+G5jScsCifhuY4nID0+ICfhuY8nLAon4bmQJyA9PiAn4bmRJywKJ+G5kicgPT4gJ+G5kycsCifhuZQnID0+ICfhuZUnLAon4bmWJyA9PiAn4bmXJywKJ+G5mCcgPT4gJ+G5mScsCifhuZonID0+ICfhuZsnLAon4bmcJyA9PiAn4bmdJywKJ+G5nicgPT4gJ+G5nycsCifhuaAnID0+ICfhuaEnLAon4bmiJyA9PiAn4bmjJywKJ+G5pCcgPT4gJ+G5pScsCifhuaYnID0+ICfhuacnLAon4bmoJyA9PiAn4bmpJywKJ+G5qicgPT4gJ+G5qycsCifhuawnID0+ICfhua0nLAon4bmuJyA9PiAn4bmvJywKJ+G5sCcgPT4gJ+G5sScsCifhubInID0+ICfhubMnLAon4bm0JyA9PiAn4bm1JywKJ+G5ticgPT4gJ+G5tycsCifhubgnID0+ICfhubknLAon4bm6JyA9PiAn4bm7JywKJ+G5vCcgPT4gJ+G5vScsCifhub4nID0+ICfhub8nLAon4bqAJyA9PiAn4bqBJywKJ+G6gicgPT4gJ+G6gycsCifhuoQnID0+ICfhuoUnLAon4bqGJyA9PiAn4bqHJywKJ+G6iCcgPT4gJ+G6iScsCifhuoonID0+ICfhuosnLAon4bqMJyA9PiAn4bqNJywKJ+G6jicgPT4gJ+G6jycsCifhupAnID0+ICfhupEnLAon4bqSJyA9PiAn4bqTJywKJ+G6lCcgPT4gJ+G6lScsCifhup4nID0+ICfDnycsCifhuqAnID0+ICfhuqEnLAon4bqiJyA9PiAn4bqjJywKJ+G6pCcgPT4gJ+G6pScsCifhuqYnID0+ICfhuqcnLAon4bqoJyA9PiAn4bqpJywKJ+G6qicgPT4gJ+G6qycsCifhuqwnID0+ICfhuq0nLAon4bquJyA9PiAn4bqvJywKJ+G6sCcgPT4gJ+G6sScsCifhurInID0+ICfhurMnLAon4bq0JyA9PiAn4bq1JywKJ+G6ticgPT4gJ+G6tycsCifhurgnID0+ICfhurknLAon4bq6JyA9PiAn4bq7JywKJ+G6vCcgPT4gJ+G6vScsCifhur4nID0+ICfhur8nLAon4buAJyA9PiAn4buBJywKJ+G7gicgPT4gJ+G7gycsCifhu4QnID0+ICfhu4UnLAon4buGJyA9PiAn4buHJywKJ+G7iCcgPT4gJ+G7iScsCifhu4onID0+ICfhu4snLAon4buMJyA9PiAn4buNJywKJ+G7jicgPT4gJ+G7jycsCifhu5AnID0+ICfhu5EnLAon4buSJyA9PiAn4buTJywKJ+G7lCcgPT4gJ+G7lScsCifhu5YnID0+ICfhu5cnLAon4buYJyA9PiAn4buZJywKJ+G7micgPT4gJ+G7mycsCifhu5wnID0+ICfhu50nLAon4bueJyA9PiAn4bufJywKJ+G7oCcgPT4gJ+G7oScsCifhu6InID0+ICfhu6MnLAon4bukJyA9PiAn4bulJywKJ+G7picgPT4gJ+G7pycsCifhu6gnID0+ICfhu6knLAon4buqJyA9PiAn4burJywKJ+G7rCcgPT4gJ+G7rScsCifhu64nID0+ICfhu68nLAon4buwJyA9PiAn4buxJywKJ+G7sicgPT4gJ+G7sycsCifhu7QnID0+ICfhu7UnLAon4bu2JyA9PiAn4bu3JywKJ+G7uCcgPT4gJ+G7uScsCifhu7onID0+ICfhu7snLAon4bu8JyA9PiAn4bu9JywKJ+G7vicgPT4gJ+G7vycsCifhvIgnID0+ICfhvIAnLAon4byJJyA9PiAn4byBJywKJ+G8iicgPT4gJ+G8gicsCifhvIsnID0+ICfhvIMnLAon4byMJyA9PiAn4byEJywKJ+G8jScgPT4gJ+G8hScsCifhvI4nID0+ICfhvIYnLAon4byPJyA9PiAn4byHJywKJ+G8mCcgPT4gJ+G8kCcsCifhvJknID0+ICfhvJEnLAon4byaJyA9PiAn4bySJywKJ+G8mycgPT4gJ+G8kycsCifhvJwnID0+ICfhvJQnLAon4bydJyA9PiAn4byVJywKJ+G8qCcgPT4gJ+G8oCcsCifhvKknID0+ICfhvKEnLAon4byqJyA9PiAn4byiJywKJ+G8qycgPT4gJ+G8oycsCifhvKwnID0+ICfhvKQnLAon4bytJyA9PiAn4bylJywKJ+G8ricgPT4gJ+G8picsCifhvK8nID0+ICfhvKcnLAon4by4JyA9PiAn4bywJywKJ+G8uScgPT4gJ+G8sScsCifhvLonID0+ICfhvLInLAon4by7JyA9PiAn4byzJywKJ+G8vCcgPT4gJ+G8tCcsCifhvL0nID0+ICfhvLUnLAon4by+JyA9PiAn4by2JywKJ+G8vycgPT4gJ+G8tycsCifhvYgnID0+ICfhvYAnLAon4b2JJyA9PiAn4b2BJywKJ+G9iicgPT4gJ+G9gicsCifhvYsnID0+ICfhvYMnLAon4b2MJyA9PiAn4b2EJywKJ+G9jScgPT4gJ+G9hScsCifhvZknID0+ICfhvZEnLAon4b2bJyA9PiAn4b2TJywKJ+G9nScgPT4gJ+G9lScsCifhvZ8nID0+ICfhvZcnLAon4b2oJyA9PiAn4b2gJywKJ+G9qScgPT4gJ+G9oScsCifhvaonID0+ICfhvaInLAon4b2rJyA9PiAn4b2jJywKJ+G9rCcgPT4gJ+G9pCcsCifhva0nID0+ICfhvaUnLAon4b2uJyA9PiAn4b2mJywKJ+G9rycgPT4gJ+G9pycsCifhvognID0+ICfhvoAnLAon4b6JJyA9PiAn4b6BJywKJ+G+iicgPT4gJ+G+gicsCifhvosnID0+ICfhvoMnLAon4b6MJyA9PiAn4b6EJywKJ+G+jScgPT4gJ+G+hScsCifhvo4nID0+ICfhvoYnLAon4b6PJyA9PiAn4b6HJywKJ+G+mCcgPT4gJ+G+kCcsCifhvpknID0+ICfhvpEnLAon4b6aJyA9PiAn4b6SJywKJ+G+mycgPT4gJ+G+kycsCifhvpwnID0+ICfhvpQnLAon4b6dJyA9PiAn4b6VJywKJ+G+nicgPT4gJ+G+licsCifhvp8nID0+ICfhvpcnLAon4b6oJyA9PiAn4b6gJywKJ+G+qScgPT4gJ+G+oScsCifhvqonID0+ICfhvqInLAon4b6rJyA9PiAn4b6jJywKJ+G+rCcgPT4gJ+G+pCcsCifhvq0nID0+ICfhvqUnLAon4b6uJyA9PiAn4b6mJywKJ+G+rycgPT4gJ+G+pycsCifhvrgnID0+ICfhvrAnLAon4b65JyA9PiAn4b6xJywKJ+G+uicgPT4gJ+G9sCcsCifhvrsnID0+ICfhvbEnLAon4b68JyA9PiAn4b6zJywKJ+G/iCcgPT4gJ+G9sicsCifhv4knID0+ICfhvbMnLAon4b+KJyA9PiAn4b20JywKJ+G/iycgPT4gJ+G9tScsCifhv4wnID0+ICfhv4MnLAon4b+YJyA9PiAn4b+QJywKJ+G/mScgPT4gJ+G/kScsCifhv5onID0+ICfhvbYnLAon4b+bJyA9PiAn4b23JywKJ+G/qCcgPT4gJ+G/oCcsCifhv6knID0+ICfhv6EnLAon4b+qJyA9PiAn4b26JywKJ+G/qycgPT4gJ+G9uycsCifhv6wnID0+ICfhv6UnLAon4b+4JyA9PiAn4b24JywKJ+G/uScgPT4gJ+G9uScsCifhv7onID0+ICfhvbwnLAon4b+7JyA9PiAn4b29JywKJ+G/vCcgPT4gJ+G/sycsCifihKYnID0+ICfPiScsCifihKonID0+ICdrJywKJ+KEqycgPT4gJ8OlJywKJ+KEsicgPT4gJ+KFjicsCifihaAnID0+ICfihbAnLAon4oWhJyA9PiAn4oWxJywKJ+KFoicgPT4gJ+KFsicsCifihaMnID0+ICfihbMnLAon4oWkJyA9PiAn4oW0JywKJ+KFpScgPT4gJ+KFtScsCifihaYnID0+ICfihbYnLAon4oWnJyA9PiAn4oW3JywKJ+KFqCcgPT4gJ+KFuCcsCifihaknID0+ICfihbknLAon4oWqJyA9PiAn4oW6JywKJ+KFqycgPT4gJ+KFuycsCifihawnID0+ICfihbwnLAon4oWtJyA9PiAn4oW9JywKJ+KFricgPT4gJ+KFvicsCifiha8nID0+ICfihb8nLAon4oaDJyA9PiAn4oaEJywKJ+KSticgPT4gJ+KTkCcsCifikrcnID0+ICfik5EnLAon4pK4JyA9PiAn4pOSJywKJ+KSuScgPT4gJ+KTkycsCifikronID0+ICfik5QnLAon4pK7JyA9PiAn4pOVJywKJ+KSvCcgPT4gJ+KTlicsCifikr0nID0+ICfik5cnLAon4pK+JyA9PiAn4pOYJywKJ+KSvycgPT4gJ+KTmScsCifik4AnID0+ICfik5onLAon4pOBJyA9PiAn4pObJywKJ+KTgicgPT4gJ+KTnCcsCifik4MnID0+ICfik50nLAon4pOEJyA9PiAn4pOeJywKJ+KThScgPT4gJ+KTnycsCifik4YnID0+ICfik6AnLAon4pOHJyA9PiAn4pOhJywKJ+KTiCcgPT4gJ+KToicsCifik4knID0+ICfik6MnLAon4pOKJyA9PiAn4pOkJywKJ+KTiycgPT4gJ+KTpScsCifik4wnID0+ICfik6YnLAon4pONJyA9PiAn4pOnJywKJ+KTjicgPT4gJ+KTqCcsCifik48nID0+ICfik6knLAon4rCAJyA9PiAn4rCwJywKJ+KwgScgPT4gJ+KwsScsCifisIInID0+ICfisLInLAon4rCDJyA9PiAn4rCzJywKJ+KwhCcgPT4gJ+KwtCcsCifisIUnID0+ICfisLUnLAon4rCGJyA9PiAn4rC2JywKJ+KwhycgPT4gJ+KwtycsCifisIgnID0+ICfisLgnLAon4rCJJyA9PiAn4rC5JywKJ+KwiicgPT4gJ+KwuicsCifisIsnID0+ICfisLsnLAon4rCMJyA9PiAn4rC8JywKJ+KwjScgPT4gJ+KwvScsCifisI4nID0+ICfisL4nLAon4rCPJyA9PiAn4rC/JywKJ+KwkCcgPT4gJ+KxgCcsCifisJEnID0+ICfisYEnLAon4rCSJyA9PiAn4rGCJywKJ+KwkycgPT4gJ+KxgycsCifisJQnID0+ICfisYQnLAon4rCVJyA9PiAn4rGFJywKJ+KwlicgPT4gJ+KxhicsCifisJcnID0+ICfisYcnLAon4rCYJyA9PiAn4rGIJywKJ+KwmScgPT4gJ+KxiScsCifisJonID0+ICfisYonLAon4rCbJyA9PiAn4rGLJywKJ+KwnCcgPT4gJ+KxjCcsCifisJ0nID0+ICfisY0nLAon4rCeJyA9PiAn4rGOJywKJ+KwnycgPT4gJ+KxjycsCifisKAnID0+ICfisZAnLAon4rChJyA9PiAn4rGRJywKJ+KwoicgPT4gJ+KxkicsCifisKMnID0+ICfisZMnLAon4rCkJyA9PiAn4rGUJywKJ+KwpScgPT4gJ+KxlScsCifisKYnID0+ICfisZYnLAon4rCnJyA9PiAn4rGXJywKJ+KwqCcgPT4gJ+KxmCcsCifisKknID0+ICfisZknLAon4rCqJyA9PiAn4rGaJywKJ+KwqycgPT4gJ+KxmycsCifisKwnID0+ICfisZwnLAon4rCtJyA9PiAn4rGdJywKJ+KwricgPT4gJ+KxnicsCifisaAnID0+ICfisaEnLAon4rGiJyA9PiAnyasnLAon4rGjJyA9PiAn4bW9JywKJ+KxpCcgPT4gJ8m9JywKJ+KxpycgPT4gJ+KxqCcsCifisaknID0+ICfisaonLAon4rGrJyA9PiAn4rGsJywKJ+KxrScgPT4gJ8mRJywKJ+KxricgPT4gJ8mxJywKJ+KxrycgPT4gJ8mQJywKJ+KxsCcgPT4gJ8mSJywKJ+KxsicgPT4gJ+KxsycsCifisbUnID0+ICfisbYnLAon4rG+JyA9PiAnyL8nLAon4rG/JyA9PiAnyYAnLAon4rKAJyA9PiAn4rKBJywKJ+KygicgPT4gJ+KygycsCifisoQnID0+ICfisoUnLAon4rKGJyA9PiAn4rKHJywKJ+KyiCcgPT4gJ+KyiScsCifisoonID0+ICfisosnLAon4rKMJyA9PiAn4rKNJywKJ+KyjicgPT4gJ+KyjycsCifispAnID0+ICfispEnLAon4rKSJyA9PiAn4rKTJywKJ+KylCcgPT4gJ+KylScsCifispYnID0+ICfispcnLAon4rKYJyA9PiAn4rKZJywKJ+KymicgPT4gJ+KymycsCifispwnID0+ICfisp0nLAon4rKeJyA9PiAn4rKfJywKJ+KyoCcgPT4gJ+KyoScsCifisqInID0+ICfisqMnLAon4rKkJyA9PiAn4rKlJywKJ+KypicgPT4gJ+KypycsCifisqgnID0+ICfisqknLAon4rKqJyA9PiAn4rKrJywKJ+KyrCcgPT4gJ+KyrScsCifisq4nID0+ICfisq8nLAon4rKwJyA9PiAn4rKxJywKJ+KysicgPT4gJ+KysycsCifisrQnID0+ICfisrUnLAon4rK2JyA9PiAn4rK3JywKJ+KyuCcgPT4gJ+KyuScsCifisronID0+ICfisrsnLAon4rK8JyA9PiAn4rK9JywKJ+KyvicgPT4gJ+KyvycsCifis4AnID0+ICfis4EnLAon4rOCJyA9PiAn4rODJywKJ+KzhCcgPT4gJ+KzhScsCifis4YnID0+ICfis4cnLAon4rOIJyA9PiAn4rOJJywKJ+KziicgPT4gJ+KziycsCifis4wnID0+ICfis40nLAon4rOOJyA9PiAn4rOPJywKJ+KzkCcgPT4gJ+KzkScsCifis5InID0+ICfis5MnLAon4rOUJyA9PiAn4rOVJywKJ+KzlicgPT4gJ+KzlycsCifis5gnID0+ICfis5knLAon4rOaJyA9PiAn4rObJywKJ+KznCcgPT4gJ+KznScsCifis54nID0+ICfis58nLAon4rOgJyA9PiAn4rOhJywKJ+KzoicgPT4gJ+KzoycsCifis6snID0+ICfis6wnLAon4rOtJyA9PiAn4rOuJywKJ+KzsicgPT4gJ+KzsycsCifqmYAnID0+ICfqmYEnLAon6pmCJyA9PiAn6pmDJywKJ+qZhCcgPT4gJ+qZhScsCifqmYYnID0+ICfqmYcnLAon6pmIJyA9PiAn6pmJJywKJ+qZiicgPT4gJ+qZiycsCifqmYwnID0+ICfqmY0nLAon6pmOJyA9PiAn6pmPJywKJ+qZkCcgPT4gJ+qZkScsCifqmZInID0+ICfqmZMnLAon6pmUJyA9PiAn6pmVJywKJ+qZlicgPT4gJ+qZlycsCifqmZgnID0+ICfqmZknLAon6pmaJyA9PiAn6pmbJywKJ+qZnCcgPT4gJ+qZnScsCifqmZ4nID0+ICfqmZ8nLAon6pmgJyA9PiAn6pmhJywKJ+qZoicgPT4gJ+qZoycsCifqmaQnID0+ICfqmaUnLAon6pmmJyA9PiAn6pmnJywKJ+qZqCcgPT4gJ+qZqScsCifqmaonID0+ICfqmasnLAon6pmsJyA9PiAn6pmtJywKJ+qagCcgPT4gJ+qagScsCifqmoInID0+ICfqmoMnLAon6pqEJyA9PiAn6pqFJywKJ+qahicgPT4gJ+qahycsCifqmognID0+ICfqmoknLAon6pqKJyA9PiAn6pqLJywKJ+qajCcgPT4gJ+qajScsCifqmo4nID0+ICfqmo8nLAon6pqQJyA9PiAn6pqRJywKJ+qakicgPT4gJ+qakycsCifqmpQnID0+ICfqmpUnLAon6pqWJyA9PiAn6pqXJywKJ+qamCcgPT4gJ+qamScsCifqmponID0+ICfqmpsnLAon6pyiJyA9PiAn6pyjJywKJ+qcpCcgPT4gJ+qcpScsCifqnKYnID0+ICfqnKcnLAon6pyoJyA9PiAn6pypJywKJ+qcqicgPT4gJ+qcqycsCifqnKwnID0+ICfqnK0nLAon6pyuJyA9PiAn6pyvJywKJ+qcsicgPT4gJ+qcsycsCifqnLQnID0+ICfqnLUnLAon6py2JyA9PiAn6py3JywKJ+qcuCcgPT4gJ+qcuScsCifqnLonID0+ICfqnLsnLAon6py8JyA9PiAn6py9JywKJ+qcvicgPT4gJ+qcvycsCifqnYAnID0+ICfqnYEnLAon6p2CJyA9PiAn6p2DJywKJ+qdhCcgPT4gJ+qdhScsCifqnYYnID0+ICfqnYcnLAon6p2IJyA9PiAn6p2JJywKJ+qdiicgPT4gJ+qdiycsCifqnYwnID0+ICfqnY0nLAon6p2OJyA9PiAn6p2PJywKJ+qdkCcgPT4gJ+qdkScsCifqnZInID0+ICfqnZMnLAon6p2UJyA9PiAn6p2VJywKJ+qdlicgPT4gJ+qdlycsCifqnZgnID0+ICfqnZknLAon6p2aJyA9PiAn6p2bJywKJ+qdnCcgPT4gJ+qdnScsCifqnZ4nID0+ICfqnZ8nLAon6p2gJyA9PiAn6p2hJywKJ+qdoicgPT4gJ+qdoycsCifqnaQnID0+ICfqnaUnLAon6p2mJyA9PiAn6p2nJywKJ+qdqCcgPT4gJ+qdqScsCifqnaonID0+ICfqnasnLAon6p2sJyA9PiAn6p2tJywKJ+qdricgPT4gJ+qdrycsCifqnbknID0+ICfqnbonLAon6p27JyA9PiAn6p28JywKJ+qdvScgPT4gJ+G1uScsCifqnb4nID0+ICfqnb8nLAon6p6AJyA9PiAn6p6BJywKJ+qegicgPT4gJ+qegycsCifqnoQnID0+ICfqnoUnLAon6p6GJyA9PiAn6p6HJywKJ+qeiycgPT4gJ+qejCcsCifqno0nID0+ICfJpScsCifqnpAnID0+ICfqnpEnLAon6p6SJyA9PiAn6p6TJywKJ+qelicgPT4gJ+qelycsCifqnpgnID0+ICfqnpknLAon6p6aJyA9PiAn6p6bJywKJ+qenCcgPT4gJ+qenScsCifqnp4nID0+ICfqnp8nLAon6p6gJyA9PiAn6p6hJywKJ+qeoicgPT4gJ+qeoycsCifqnqQnID0+ICfqnqUnLAon6p6mJyA9PiAn6p6nJywKJ+qeqCcgPT4gJ+qeqScsCifqnqonID0+ICfJpicsCifqnqsnID0+ICfJnCcsCifqnqwnID0+ICfJoScsCifqnq0nID0+ICfJrCcsCifqnq4nID0+ICfJqicsCifqnrAnID0+ICfKnicsCifqnrEnID0+ICfKhycsCifqnrInID0+ICfKnScsCifqnrMnID0+ICfqrZMnLAon6p60JyA9PiAn6p61JywKJ+qeticgPT4gJ+qetycsCifqnrgnID0+ICfqnrknLAon6p66JyA9PiAn6p67JywKJ+qevCcgPT4gJ+qevScsCifqnr4nID0+ICfqnr8nLAon6p+CJyA9PiAn6p+DJywKJ+qfhCcgPT4gJ+qelCcsCifqn4UnID0+ICfKgicsCifqn4YnID0+ICfhto4nLAon6p+HJyA9PiAn6p+IJywKJ+qfiScgPT4gJ+qfiicsCifqn7UnID0+ICfqn7YnLAon77yhJyA9PiAn772BJywKJ++8oicgPT4gJ++9gicsCifvvKMnID0+ICfvvYMnLAon77ykJyA9PiAn772EJywKJ++8pScgPT4gJ++9hScsCifvvKYnID0+ICfvvYYnLAon77ynJyA9PiAn772HJywKJ++8qCcgPT4gJ++9iCcsCifvvKknID0+ICfvvYknLAon77yqJyA9PiAn772KJywKJ++8qycgPT4gJ++9iycsCifvvKwnID0+ICfvvYwnLAon77ytJyA9PiAn772NJywKJ++8ricgPT4gJ++9jicsCifvvK8nID0+ICfvvY8nLAon77ywJyA9PiAn772QJywKJ++8sScgPT4gJ++9kScsCifvvLInID0+ICfvvZInLAon77yzJyA9PiAn772TJywKJ++8tCcgPT4gJ++9lCcsCifvvLUnID0+ICfvvZUnLAon77y2JyA9PiAn772WJywKJ++8tycgPT4gJ++9lycsCifvvLgnID0+ICfvvZgnLAon77y5JyA9PiAn772ZJywKJ++8uicgPT4gJ++9micsCifwkJCAJyA9PiAn8JCQqCcsCifwkJCBJyA9PiAn8JCQqScsCifwkJCCJyA9PiAn8JCQqicsCifwkJCDJyA9PiAn8JCQqycsCifwkJCEJyA9PiAn8JCQrCcsCifwkJCFJyA9PiAn8JCQrScsCifwkJCGJyA9PiAn8JCQricsCifwkJCHJyA9PiAn8JCQrycsCifwkJCIJyA9PiAn8JCQsCcsCifwkJCJJyA9PiAn8JCQsScsCifwkJCKJyA9PiAn8JCQsicsCifwkJCLJyA9PiAn8JCQsycsCifwkJCMJyA9PiAn8JCQtCcsCifwkJCNJyA9PiAn8JCQtScsCifwkJCOJyA9PiAn8JCQticsCifwkJCPJyA9PiAn8JCQtycsCifwkJCQJyA9PiAn8JCQuCcsCifwkJCRJyA9PiAn8JCQuScsCifwkJCSJyA9PiAn8JCQuicsCifwkJCTJyA9PiAn8JCQuycsCifwkJCUJyA9PiAn8JCQvCcsCifwkJCVJyA9PiAn8JCQvScsCifwkJCWJyA9PiAn8JCQvicsCifwkJCXJyA9PiAn8JCQvycsCifwkJCYJyA9PiAn8JCRgCcsCifwkJCZJyA9PiAn8JCRgScsCifwkJCaJyA9PiAn8JCRgicsCifwkJCbJyA9PiAn8JCRgycsCifwkJCcJyA9PiAn8JCRhCcsCifwkJCdJyA9PiAn8JCRhScsCifwkJCeJyA9PiAn8JCRhicsCifwkJCfJyA9PiAn8JCRhycsCifwkJCgJyA9PiAn8JCRiCcsCifwkJChJyA9PiAn8JCRiScsCifwkJCiJyA9PiAn8JCRiicsCifwkJCjJyA9PiAn8JCRiycsCifwkJCkJyA9PiAn8JCRjCcsCifwkJClJyA9PiAn8JCRjScsCifwkJCmJyA9PiAn8JCRjicsCifwkJCnJyA9PiAn8JCRjycsCifwkJKwJyA9PiAn8JCTmCcsCifwkJKxJyA9PiAn8JCTmScsCifwkJKyJyA9PiAn8JCTmicsCifwkJKzJyA9PiAn8JCTmycsCifwkJK0JyA9PiAn8JCTnCcsCifwkJK1JyA9PiAn8JCTnScsCifwkJK2JyA9PiAn8JCTnicsCifwkJK3JyA9PiAn8JCTnycsCifwkJK4JyA9PiAn8JCToCcsCifwkJK5JyA9PiAn8JCToScsCifwkJK6JyA9PiAn8JCToicsCifwkJK7JyA9PiAn8JCToycsCifwkJK8JyA9PiAn8JCTpCcsCifwkJK9JyA9PiAn8JCTpScsCifwkJK+JyA9PiAn8JCTpicsCifwkJK/JyA9PiAn8JCTpycsCifwkJOAJyA9PiAn8JCTqCcsCifwkJOBJyA9PiAn8JCTqScsCifwkJOCJyA9PiAn8JCTqicsCifwkJODJyA9PiAn8JCTqycsCifwkJOEJyA9PiAn8JCTrCcsCifwkJOFJyA9PiAn8JCTrScsCifwkJOGJyA9PiAn8JCTricsCifwkJOHJyA9PiAn8JCTrycsCifwkJOIJyA9PiAn8JCTsCcsCifwkJOJJyA9PiAn8JCTsScsCifwkJOKJyA9PiAn8JCTsicsCifwkJOLJyA9PiAn8JCTsycsCifwkJOMJyA9PiAn8JCTtCcsCifwkJONJyA9PiAn8JCTtScsCifwkJOOJyA9PiAn8JCTticsCifwkJOPJyA9PiAn8JCTtycsCifwkJOQJyA9PiAn8JCTuCcsCifwkJORJyA9PiAn8JCTuScsCifwkJOSJyA9PiAn8JCTuicsCifwkJOTJyA9PiAn8JCTuycsCifwkLKAJyA9PiAn8JCzgCcsCifwkLKBJyA9PiAn8JCzgScsCifwkLKCJyA9PiAn8JCzgicsCifwkLKDJyA9PiAn8JCzgycsCifwkLKEJyA9PiAn8JCzhCcsCifwkLKFJyA9PiAn8JCzhScsCifwkLKGJyA9PiAn8JCzhicsCifwkLKHJyA9PiAn8JCzhycsCifwkLKIJyA9PiAn8JCziCcsCifwkLKJJyA9PiAn8JCziScsCifwkLKKJyA9PiAn8JCziicsCifwkLKLJyA9PiAn8JCziycsCifwkLKMJyA9PiAn8JCzjCcsCifwkLKNJyA9PiAn8JCzjScsCifwkLKOJyA9PiAn8JCzjicsCifwkLKPJyA9PiAn8JCzjycsCifwkLKQJyA9PiAn8JCzkCcsCifwkLKRJyA9PiAn8JCzkScsCifwkLKSJyA9PiAn8JCzkicsCifwkLKTJyA9PiAn8JCzkycsCifwkLKUJyA9PiAn8JCzlCcsCifwkLKVJyA9PiAn8JCzlScsCifwkLKWJyA9PiAn8JCzlicsCifwkLKXJyA9PiAn8JCzlycsCifwkLKYJyA9PiAn8JCzmCcsCifwkLKZJyA9PiAn8JCzmScsCifwkLKaJyA9PiAn8JCzmicsCifwkLKbJyA9PiAn8JCzmycsCifwkLKcJyA9PiAn8JCznCcsCifwkLKdJyA9PiAn8JCznScsCifwkLKeJyA9PiAn8JCznicsCifwkLKfJyA9PiAn8JCznycsCifwkLKgJyA9PiAn8JCzoCcsCifwkLKhJyA9PiAn8JCzoScsCifwkLKiJyA9PiAn8JCzoicsCifwkLKjJyA9PiAn8JCzoycsCifwkLKkJyA9PiAn8JCzpCcsCifwkLKlJyA9PiAn8JCzpScsCifwkLKmJyA9PiAn8JCzpicsCifwkLKnJyA9PiAn8JCzpycsCifwkLKoJyA9PiAn8JCzqCcsCifwkLKpJyA9PiAn8JCzqScsCifwkLKqJyA9PiAn8JCzqicsCifwkLKrJyA9PiAn8JCzqycsCifwkLKsJyA9PiAn8JCzrCcsCifwkLKtJyA9PiAn8JCzrScsCifwkLKuJyA9PiAn8JCzricsCifwkLKvJyA9PiAn8JCzrycsCifwkLKwJyA9PiAn8JCzsCcsCifwkLKxJyA9PiAn8JCzsScsCifwkLKyJyA9PiAn8JCzsicsCifwkaKgJyA9PiAn8JGjgCcsCifwkaKhJyA9PiAn8JGjgScsCifwkaKiJyA9PiAn8JGjgicsCifwkaKjJyA9PiAn8JGjgycsCifwkaKkJyA9PiAn8JGjhCcsCifwkaKlJyA9PiAn8JGjhScsCifwkaKmJyA9PiAn8JGjhicsCifwkaKnJyA9PiAn8JGjhycsCifwkaKoJyA9PiAn8JGjiCcsCifwkaKpJyA9PiAn8JGjiScsCifwkaKqJyA9PiAn8JGjiicsCifwkaKrJyA9PiAn8JGjiycsCifwkaKsJyA9PiAn8JGjjCcsCifwkaKtJyA9PiAn8JGjjScsCifwkaKuJyA9PiAn8JGjjicsCifwkaKvJyA9PiAn8JGjjycsCifwkaKwJyA9PiAn8JGjkCcsCifwkaKxJyA9PiAn8JGjkScsCifwkaKyJyA9PiAn8JGjkicsCifwkaKzJyA9PiAn8JGjkycsCifwkaK0JyA9PiAn8JGjlCcsCifwkaK1JyA9PiAn8JGjlScsCifwkaK2JyA9PiAn8JGjlicsCifwkaK3JyA9PiAn8JGjlycsCifwkaK4JyA9PiAn8JGjmCcsCifwkaK5JyA9PiAn8JGjmScsCifwkaK6JyA9PiAn8JGjmicsCifwkaK7JyA9PiAn8JGjmycsCifwkaK8JyA9PiAn8JGjnCcsCifwkaK9JyA9PiAn8JGjnScsCifwkaK+JyA9PiAn8JGjnicsCifwkaK/JyA9PiAn8JGjnycsCifwlrmAJyA9PiAn8Ja5oCcsCifwlrmBJyA9PiAn8Ja5oScsCifwlrmCJyA9PiAn8Ja5oicsCifwlrmDJyA9PiAn8Ja5oycsCifwlrmEJyA9PiAn8Ja5pCcsCifwlrmFJyA9PiAn8Ja5pScsCifwlrmGJyA9PiAn8Ja5picsCifwlrmHJyA9PiAn8Ja5pycsCifwlrmIJyA9PiAn8Ja5qCcsCifwlrmJJyA9PiAn8Ja5qScsCifwlrmKJyA9PiAn8Ja5qicsCifwlrmLJyA9PiAn8Ja5qycsCifwlrmMJyA9PiAn8Ja5rCcsCifwlrmNJyA9PiAn8Ja5rScsCifwlrmOJyA9PiAn8Ja5ricsCifwlrmPJyA9PiAn8Ja5rycsCifwlrmQJyA9PiAn8Ja5sCcsCifwlrmRJyA9PiAn8Ja5sScsCifwlrmSJyA9PiAn8Ja5sicsCifwlrmTJyA9PiAn8Ja5sycsCifwlrmUJyA9PiAn8Ja5tCcsCifwlrmVJyA9PiAn8Ja5tScsCifwlrmWJyA9PiAn8Ja5ticsCifwlrmXJyA9PiAn8Ja5tycsCifwlrmYJyA9PiAn8Ja5uCcsCifwlrmZJyA9PiAn8Ja5uScsCifwlrmaJyA9PiAn8Ja5uicsCifwlrmbJyA9PiAn8Ja5uycsCifwlrmcJyA9PiAn8Ja5vCcsCifwlrmdJyA9PiAn8Ja5vScsCifwlrmeJyA9PiAn8Ja5vicsCifwlrmfJyA9PiAn8Ja5vycsCifwnqSAJyA9PiAn8J6koicsCifwnqSBJyA9PiAn8J6koycsCifwnqSCJyA9PiAn8J6kpCcsCifwnqSDJyA9PiAn8J6kpScsCifwnqSEJyA9PiAn8J6kpicsCifwnqSFJyA9PiAn8J6kpycsCifwnqSGJyA9PiAn8J6kqCcsCifwnqSHJyA9PiAn8J6kqScsCifwnqSIJyA9PiAn8J6kqicsCifwnqSJJyA9PiAn8J6kqycsCifwnqSKJyA9PiAn8J6krCcsCifwnqSLJyA9PiAn8J6krScsCifwnqSMJyA9PiAn8J6kricsCifwnqSNJyA9PiAn8J6krycsCifwnqSOJyA9PiAn8J6ksCcsCifwnqSPJyA9PiAn8J6ksScsCifwnqSQJyA9PiAn8J6ksicsCifwnqSRJyA9PiAn8J6ksycsCifwnqSSJyA9PiAn8J6ktCcsCifwnqSTJyA9PiAn8J6ktScsCifwnqSUJyA9PiAn8J6kticsCifwnqSVJyA9PiAn8J6ktycsCifwnqSWJyA9PiAn8J6kuCcsCifwnqSXJyA9PiAn8J6kuScsCifwnqSYJyA9PiAn8J6kuicsCifwnqSZJyA9PiAn8J6kuycsCifwnqSaJyA9PiAn8J6kvCcsCifwnqSbJyA9PiAn8J6kvScsCifwnqScJyA9PiAn8J6kvicsCifwnqSdJyA9PiAn8J6kvycsCifwnqSeJyA9PiAn8J6lgCcsCifwnqSfJyA9PiAn8J6lgScsCifwnqSgJyA9PiAn8J6lgicsCifwnqShJyA9PiAn8J6lgycsCik7Cjw/cGhwCgoKCnJldHVybiAnLyg/PCFbXHh7MDAyN31ceHswMDJFfVx4ezAwM0F9XHh7MDA1RX1ceHswMDYwfVx4ezAwQTh9XHh7MDBBRH1ceHswMEFGfVx4ezAwQjR9XHh7MDBCN31ceHswMEI4fVx4ezAyQjB9LVx4ezAyQzF9XHh7MDJDMn0tXHh7MDJDNX1ceHswMkM2fS1ceHswMkQxfVx4ezAyRDJ9LVx4ezAyREZ9XHh7MDJFMH0tXHh7MDJFNH1ceHswMkU1fS1ceHswMkVCfVx4ezAyRUN9XHh7MDJFRH1ceHswMkVFfVx4ezAyRUZ9LVx4ezAyRkZ9XHh7MDMwMH0tXHh7MDM2Rn1ceHswMzc0fVx4ezAzNzV9XHh7MDM3QX1ceHswMzg0fS1ceHswMzg1fVx4ezAzODd9XHh7MDQ4M30tXHh7MDQ4N31ceHswNDg4fS1ceHswNDg5fVx4ezA1NTl9XHh7MDU5MX0tXHh7MDVCRH1ceHswNUJGfVx4ezA1QzF9LVx4ezA1QzJ9XHh7MDVDNH0tXHh7MDVDNX1ceHswNUM3fVx4ezA1RjR9XHh7MDYwMH0tXHh7MDYwNX1ceHswNjEwfS1ceHswNjFBfVx4ezA2MUN9XHh7MDY0MH1ceHswNjRCfS1ceHswNjVGfVx4ezA2NzB9XHh7MDZENn0tXHh7MDZEQ31ceHswNkREfVx4ezA2REZ9LVx4ezA2RTR9XHh7MDZFNX0tXHh7MDZFNn1ceHswNkU3fS1ceHswNkU4fVx4ezA2RUF9LVx4ezA2RUR9XHh7MDcwRn1ceHswNzExfVx4ezA3MzB9LVx4ezA3NEF9XHh7MDdBNn0tXHh7MDdCMH1ceHswN0VCfS1ceHswN0YzfVx4ezA3RjR9LVx4ezA3RjV9XHh7MDdGQX1ceHswN0ZEfVx4ezA4MTZ9LVx4ezA4MTl9XHh7MDgxQX1ceHswODFCfS1ceHswODIzfVx4ezA4MjR9XHh7MDgyNX0tXHh7MDgyN31ceHswODI4fVx4ezA4Mjl9LVx4ezA4MkR9XHh7MDg1OX0tXHh7MDg1Qn1ceHswOEQzfS1ceHswOEUxfVx4ezA4RTJ9XHh7MDhFM30tXHh7MDkwMn1ceHswOTNBfVx4ezA5M0N9XHh7MDk0MX0tXHh7MDk0OH1ceHswOTREfVx4ezA5NTF9LVx4ezA5NTd9XHh7MDk2Mn0tXHh7MDk2M31ceHswOTcxfVx4ezA5ODF9XHh7MDlCQ31ceHswOUMxfS1ceHswOUM0fVx4ezA5Q0R9XHh7MDlFMn0tXHh7MDlFM31ceHswOUZFfVx4ezBBMDF9LVx4ezBBMDJ9XHh7MEEzQ31ceHswQTQxfS1ceHswQTQyfVx4ezBBNDd9LVx4ezBBNDh9XHh7MEE0Qn0tXHh7MEE0RH1ceHswQTUxfVx4ezBBNzB9LVx4ezBBNzF9XHh7MEE3NX1ceHswQTgxfS1ceHswQTgyfVx4ezBBQkN9XHh7MEFDMX0tXHh7MEFDNX1ceHswQUM3fS1ceHswQUM4fVx4ezBBQ0R9XHh7MEFFMn0tXHh7MEFFM31ceHswQUZBfS1ceHswQUZGfVx4ezBCMDF9XHh7MEIzQ31ceHswQjNGfVx4ezBCNDF9LVx4ezBCNDR9XHh7MEI0RH1ceHswQjU2fVx4ezBCNjJ9LVx4ezBCNjN9XHh7MEI4Mn1ceHswQkMwfVx4ezBCQ0R9XHh7MEMwMH1ceHswQzA0fVx4ezBDM0V9LVx4ezBDNDB9XHh7MEM0Nn0tXHh7MEM0OH1ceHswQzRBfS1ceHswQzREfVx4ezBDNTV9LVx4ezBDNTZ9XHh7MEM2Mn0tXHh7MEM2M31ceHswQzgxfVx4ezBDQkN9XHh7MENCRn1ceHswQ0M2fVx4ezBDQ0N9LVx4ezBDQ0R9XHh7MENFMn0tXHh7MENFM31ceHswRDAwfS1ceHswRDAxfVx4ezBEM0J9LVx4ezBEM0N9XHh7MEQ0MX0tXHh7MEQ0NH1ceHswRDREfVx4ezBENjJ9LVx4ezBENjN9XHh7MERDQX1ceHswREQyfS1ceHswREQ0fVx4ezBERDZ9XHh7MEUzMX1ceHswRTM0fS1ceHswRTNBfVx4ezBFNDZ9XHh7MEU0N30tXHh7MEU0RX1ceHswRUIxfVx4ezBFQjR9LVx4ezBFQjl9XHh7MEVCQn0tXHh7MEVCQ31ceHswRUM2fVx4ezBFQzh9LVx4ezBFQ0R9XHh7MEYxOH0tXHh7MEYxOX1ceHswRjM1fVx4ezBGMzd9XHh7MEYzOX1ceHswRjcxfS1ceHswRjdFfVx4ezBGODB9LVx4ezBGODR9XHh7MEY4Nn0tXHh7MEY4N31ceHswRjhEfS1ceHswRjk3fVx4ezBGOTl9LVx4ezBGQkN9XHh7MEZDNn1ceHsxMDJEfS1ceHsxMDMwfVx4ezEwMzJ9LVx4ezEwMzd9XHh7MTAzOX0tXHh7MTAzQX1ceHsxMDNEfS1ceHsxMDNFfVx4ezEwNTh9LVx4ezEwNTl9XHh7MTA1RX0tXHh7MTA2MH1ceHsxMDcxfS1ceHsxMDc0fVx4ezEwODJ9XHh7MTA4NX0tXHh7MTA4Nn1ceHsxMDhEfVx4ezEwOUR9XHh7MTBGQ31ceHsxMzVEfS1ceHsxMzVGfVx4ezE3MTJ9LVx4ezE3MTR9XHh7MTczMn0tXHh7MTczNH1ceHsxNzUyfS1ceHsxNzUzfVx4ezE3NzJ9LVx4ezE3NzN9XHh7MTdCNH0tXHh7MTdCNX1ceHsxN0I3fS1ceHsxN0JEfVx4ezE3QzZ9XHh7MTdDOX0tXHh7MTdEM31ceHsxN0Q3fVx4ezE3RER9XHh7MTgwQn0tXHh7MTgwRH1ceHsxODBFfVx4ezE4NDN9XHh7MTg4NX0tXHh7MTg4Nn1ceHsxOEE5fVx4ezE5MjB9LVx4ezE5MjJ9XHh7MTkyN30tXHh7MTkyOH1ceHsxOTMyfVx4ezE5Mzl9LVx4ezE5M0J9XHh7MUExN30tXHh7MUExOH1ceHsxQTFCfVx4ezFBNTZ9XHh7MUE1OH0tXHh7MUE1RX1ceHsxQTYwfVx4ezFBNjJ9XHh7MUE2NX0tXHh7MUE2Q31ceHsxQTczfS1ceHsxQTdDfVx4ezFBN0Z9XHh7MUFBN31ceHsxQUIwfS1ceHsxQUJEfVx4ezFBQkV9XHh7MUIwMH0tXHh7MUIwM31ceHsxQjM0fVx4ezFCMzZ9LVx4ezFCM0F9XHh7MUIzQ31ceHsxQjQyfVx4ezFCNkJ9LVx4ezFCNzN9XHh7MUI4MH0tXHh7MUI4MX1ceHsxQkEyfS1ceHsxQkE1fVx4ezFCQTh9LVx4ezFCQTl9XHh7MUJBQn0tXHh7MUJBRH1ceHsxQkU2fVx4ezFCRTh9LVx4ezFCRTl9XHh7MUJFRH1ceHsxQkVGfS1ceHsxQkYxfVx4ezFDMkN9LVx4ezFDMzN9XHh7MUMzNn0tXHh7MUMzN31ceHsxQzc4fS1ceHsxQzdEfVx4ezFDRDB9LVx4ezFDRDJ9XHh7MUNENH0tXHh7MUNFMH1ceHsxQ0UyfS1ceHsxQ0U4fVx4ezFDRUR9XHh7MUNGNH1ceHsxQ0Y4fS1ceHsxQ0Y5fVx4ezFEMkN9LVx4ezFENkF9XHh7MUQ3OH1ceHsxRDlCfS1ceHsxREJGfVx4ezFEQzB9LVx4ezFERjl9XHh7MURGQn0tXHh7MURGRn1ceHsxRkJEfVx4ezFGQkZ9LVx4ezFGQzF9XHh7MUZDRH0tXHh7MUZDRn1ceHsxRkREfS1ceHsxRkRGfVx4ezFGRUR9LVx4ezFGRUZ9XHh7MUZGRH0tXHh7MUZGRX1ceHsyMDBCfS1ceHsyMDBGfVx4ezIwMTh9XHh7MjAxOX1ceHsyMDI0fVx4ezIwMjd9XHh7MjAyQX0tXHh7MjAyRX1ceHsyMDYwfS1ceHsyMDY0fVx4ezIwNjZ9LVx4ezIwNkZ9XHh7MjA3MX1ceHsyMDdGfVx4ezIwOTB9LVx4ezIwOUN9XHh7MjBEMH0tXHh7MjBEQ31ceHsyMEREfS1ceHsyMEUwfVx4ezIwRTF9XHh7MjBFMn0tXHh7MjBFNH1ceHsyMEU1fS1ceHsyMEYwfVx4ezJDN0N9LVx4ezJDN0R9XHh7MkNFRn0tXHh7MkNGMX1ceHsyRDZGfVx4ezJEN0Z9XHh7MkRFMH0tXHh7MkRGRn1ceHsyRTJGfVx4ezMwMDV9XHh7MzAyQX0tXHh7MzAyRH1ceHszMDMxfS1ceHszMDM1fVx4ezMwM0J9XHh7MzA5OX0tXHh7MzA5QX1ceHszMDlCfS1ceHszMDlDfVx4ezMwOUR9LVx4ezMwOUV9XHh7MzBGQ30tXHh7MzBGRX1ceHtBMDE1fVx4e0E0Rjh9LVx4e0E0RkR9XHh7QTYwQ31ceHtBNjZGfVx4e0E2NzB9LVx4e0E2NzJ9XHh7QTY3NH0tXHh7QTY3RH1ceHtBNjdGfVx4e0E2OUN9LVx4e0E2OUR9XHh7QTY5RX0tXHh7QTY5Rn1ceHtBNkYwfS1ceHtBNkYxfVx4e0E3MDB9LVx4e0E3MTZ9XHh7QTcxN30tXHh7QTcxRn1ceHtBNzIwfS1ceHtBNzIxfVx4e0E3NzB9XHh7QTc4OH1ceHtBNzg5fS1ceHtBNzhBfVx4e0E3Rjh9LVx4e0E3Rjl9XHh7QTgwMn1ceHtBODA2fVx4e0E4MEJ9XHh7QTgyNX0tXHh7QTgyNn1ceHtBOEM0fS1ceHtBOEM1fVx4e0E4RTB9LVx4e0E4RjF9XHh7QThGRn1ceHtBOTI2fS1ceHtBOTJEfVx4e0E5NDd9LVx4e0E5NTF9XHh7QTk4MH0tXHh7QTk4Mn1ceHtBOUIzfVx4e0E5QjZ9LVx4e0E5Qjl9XHh7QTlCQ31ceHtBOUNGfVx4e0E5RTV9XHh7QTlFNn1ceHtBQTI5fS1ceHtBQTJFfVx4e0FBMzF9LVx4e0FBMzJ9XHh7QUEzNX0tXHh7QUEzNn1ceHtBQTQzfVx4e0FBNEN9XHh7QUE3MH1ceHtBQTdDfVx4e0FBQjB9XHh7QUFCMn0tXHh7QUFCNH1ceHtBQUI3fS1ceHtBQUI4fVx4e0FBQkV9LVx4e0FBQkZ9XHh7QUFDMX1ceHtBQUREfVx4e0FBRUN9LVx4e0FBRUR9XHh7QUFGM30tXHh7QUFGNH1ceHtBQUY2fVx4e0FCNUJ9XHh7QUI1Q30tXHh7QUI1Rn1ceHtBQkU1fVx4e0FCRTh9XHh7QUJFRH1ceHtGQjFFfVx4e0ZCQjJ9LVx4e0ZCQzF9XHh7RkUwMH0tXHh7RkUwRn1ceHtGRTEzfVx4e0ZFMjB9LVx4e0ZFMkZ9XHh7RkU1Mn1ceHtGRTU1fVx4e0ZFRkZ9XHh7RkYwN31ceHtGRjBFfVx4e0ZGMUF9XHh7RkYzRX1ceHtGRjQwfVx4e0ZGNzB9XHh7RkY5RX0tXHh7RkY5Rn1ceHtGRkUzfVx4e0ZGRjl9LVx4e0ZGRkJ9XHh7MTAxRkR9XHh7MTAyRTB9XHh7MTAzNzZ9LVx4ezEwMzdBfVx4ezEwQTAxfS1ceHsxMEEwM31ceHsxMEEwNX0tXHh7MTBBMDZ9XHh7MTBBMEN9LVx4ezEwQTBGfVx4ezEwQTM4fS1ceHsxMEEzQX1ceHsxMEEzRn1ceHsxMEFFNX0tXHh7MTBBRTZ9XHh7MTBEMjR9LVx4ezEwRDI3fVx4ezEwRjQ2fS1ceHsxMEY1MH1ceHsxMTAwMX1ceHsxMTAzOH0tXHh7MTEwNDZ9XHh7MTEwN0Z9LVx4ezExMDgxfVx4ezExMEIzfS1ceHsxMTBCNn1ceHsxMTBCOX0tXHh7MTEwQkF9XHh7MTEwQkR9XHh7MTEwQ0R9XHh7MTExMDB9LVx4ezExMTAyfVx4ezExMTI3fS1ceHsxMTEyQn1ceHsxMTEyRH0tXHh7MTExMzR9XHh7MTExNzN9XHh7MTExODB9LVx4ezExMTgxfVx4ezExMUI2fS1ceHsxMTFCRX1ceHsxMTFDOX0tXHh7MTExQ0N9XHh7MTEyMkZ9LVx4ezExMjMxfVx4ezExMjM0fVx4ezExMjM2fS1ceHsxMTIzN31ceHsxMTIzRX1ceHsxMTJERn1ceHsxMTJFM30tXHh7MTEyRUF9XHh7MTEzMDB9LVx4ezExMzAxfVx4ezExMzNCfS1ceHsxMTMzQ31ceHsxMTM0MH1ceHsxMTM2Nn0tXHh7MTEzNkN9XHh7MTEzNzB9LVx4ezExMzc0fVx4ezExNDM4fS1ceHsxMTQzRn1ceHsxMTQ0Mn0tXHh7MTE0NDR9XHh7MTE0NDZ9XHh7MTE0NUV9XHh7MTE0QjN9LVx4ezExNEI4fVx4ezExNEJBfVx4ezExNEJGfS1ceHsxMTRDMH1ceHsxMTRDMn0tXHh7MTE0QzN9XHh7MTE1QjJ9LVx4ezExNUI1fVx4ezExNUJDfS1ceHsxMTVCRH1ceHsxMTVCRn0tXHh7MTE1QzB9XHh7MTE1REN9LVx4ezExNUREfVx4ezExNjMzfS1ceHsxMTYzQX1ceHsxMTYzRH1ceHsxMTYzRn0tXHh7MTE2NDB9XHh7MTE2QUJ9XHh7MTE2QUR9XHh7MTE2QjB9LVx4ezExNkI1fVx4ezExNkI3fVx4ezExNzFEfS1ceHsxMTcxRn1ceHsxMTcyMn0tXHh7MTE3MjV9XHh7MTE3Mjd9LVx4ezExNzJCfVx4ezExODJGfS1ceHsxMTgzN31ceHsxMTgzOX0tXHh7MTE4M0F9XHh7MTFBMDF9LVx4ezExQTBBfVx4ezExQTMzfS1ceHsxMUEzOH1ceHsxMUEzQn0tXHh7MTFBM0V9XHh7MTFBNDd9XHh7MTFBNTF9LVx4ezExQTU2fVx4ezExQTU5fS1ceHsxMUE1Qn1ceHsxMUE4QX0tXHh7MTFBOTZ9XHh7MTFBOTh9LVx4ezExQTk5fVx4ezExQzMwfS1ceHsxMUMzNn1ceHsxMUMzOH0tXHh7MTFDM0R9XHh7MTFDM0Z9XHh7MTFDOTJ9LVx4ezExQ0E3fVx4ezExQ0FBfS1ceHsxMUNCMH1ceHsxMUNCMn0tXHh7MTFDQjN9XHh7MTFDQjV9LVx4ezExQ0I2fVx4ezExRDMxfS1ceHsxMUQzNn1ceHsxMUQzQX1ceHsxMUQzQ30tXHh7MTFEM0R9XHh7MTFEM0Z9LVx4ezExRDQ1fVx4ezExRDQ3fVx4ezExRDkwfS1ceHsxMUQ5MX1ceHsxMUQ5NX1ceHsxMUQ5N31ceHsxMUVGM30tXHh7MTFFRjR9XHh7MTZBRjB9LVx4ezE2QUY0fVx4ezE2QjMwfS1ceHsxNkIzNn1ceHsxNkI0MH0tXHh7MTZCNDN9XHh7MTZGOEZ9LVx4ezE2RjkyfVx4ezE2RjkzfS1ceHsxNkY5Rn1ceHsxNkZFMH0tXHh7MTZGRTF9XHh7MUJDOUR9LVx4ezFCQzlFfVx4ezFCQ0EwfS1ceHsxQkNBM31ceHsxRDE2N30tXHh7MUQxNjl9XHh7MUQxNzN9LVx4ezFEMTdBfVx4ezFEMTdCfS1ceHsxRDE4Mn1ceHsxRDE4NX0tXHh7MUQxOEJ9XHh7MUQxQUF9LVx4ezFEMUFEfVx4ezFEMjQyfS1ceHsxRDI0NH1ceHsxREEwMH0tXHh7MURBMzZ9XHh7MURBM0J9LVx4ezFEQTZDfVx4ezFEQTc1fVx4ezFEQTg0fVx4ezFEQTlCfS1ceHsxREE5Rn1ceHsxREFBMX0tXHh7MURBQUZ9XHh7MUUwMDB9LVx4ezFFMDA2fVx4ezFFMDA4fS1ceHsxRTAxOH1ceHsxRTAxQn0tXHh7MUUwMjF9XHh7MUUwMjN9LVx4ezFFMDI0fVx4ezFFMDI2fS1ceHsxRTAyQX1ceHsxRThEMH0tXHh7MUU4RDZ9XHh7MUU5NDR9LVx4ezFFOTRBfVx4ezFGM0ZCfS1ceHsxRjNGRn1ceHtFMDAwMX1ceHtFMDAyMH0tXHh7RTAwN0Z9XHh7RTAxMDB9LVx4e0UwMUVGfV0pKFxwTCkoXHBMKispL3UnOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ2EnID0+ICdBJywKJ2InID0+ICdCJywKJ2MnID0+ICdDJywKJ2QnID0+ICdEJywKJ2UnID0+ICdFJywKJ2YnID0+ICdGJywKJ2cnID0+ICdHJywKJ2gnID0+ICdIJywKJ2knID0+ICdJJywKJ2onID0+ICdKJywKJ2snID0+ICdLJywKJ2wnID0+ICdMJywKJ20nID0+ICdNJywKJ24nID0+ICdOJywKJ28nID0+ICdPJywKJ3AnID0+ICdQJywKJ3EnID0+ICdRJywKJ3InID0+ICdSJywKJ3MnID0+ICdTJywKJ3QnID0+ICdUJywKJ3UnID0+ICdVJywKJ3YnID0+ICdWJywKJ3cnID0+ICdXJywKJ3gnID0+ICdYJywKJ3knID0+ICdZJywKJ3onID0+ICdaJywKJ8K1JyA9PiAnzpwnLAonw6AnID0+ICfDgCcsCifDoScgPT4gJ8OBJywKJ8OiJyA9PiAnw4InLAonw6MnID0+ICfDgycsCifDpCcgPT4gJ8OEJywKJ8OlJyA9PiAnw4UnLAonw6YnID0+ICfDhicsCifDpycgPT4gJ8OHJywKJ8OoJyA9PiAnw4gnLAonw6knID0+ICfDiScsCifDqicgPT4gJ8OKJywKJ8OrJyA9PiAnw4snLAonw6wnID0+ICfDjCcsCifDrScgPT4gJ8ONJywKJ8OuJyA9PiAnw44nLAonw68nID0+ICfDjycsCifDsCcgPT4gJ8OQJywKJ8OxJyA9PiAnw5EnLAonw7InID0+ICfDkicsCifDsycgPT4gJ8OTJywKJ8O0JyA9PiAnw5QnLAonw7UnID0+ICfDlScsCifDticgPT4gJ8OWJywKJ8O4JyA9PiAnw5gnLAonw7knID0+ICfDmScsCifDuicgPT4gJ8OaJywKJ8O7JyA9PiAnw5snLAonw7wnID0+ICfDnCcsCifDvScgPT4gJ8OdJywKJ8O+JyA9PiAnw54nLAonw78nID0+ICfFuCcsCifEgScgPT4gJ8SAJywKJ8SDJyA9PiAnxIInLAonxIUnID0+ICfEhCcsCifEhycgPT4gJ8SGJywKJ8SJJyA9PiAnxIgnLAonxIsnID0+ICfEiicsCifEjScgPT4gJ8SMJywKJ8SPJyA9PiAnxI4nLAonxJEnID0+ICfEkCcsCifEkycgPT4gJ8SSJywKJ8SVJyA9PiAnxJQnLAonxJcnID0+ICfElicsCifEmScgPT4gJ8SYJywKJ8SbJyA9PiAnxJonLAonxJ0nID0+ICfEnCcsCifEnycgPT4gJ8SeJywKJ8ShJyA9PiAnxKAnLAonxKMnID0+ICfEoicsCifEpScgPT4gJ8SkJywKJ8SnJyA9PiAnxKYnLAonxKknID0+ICfEqCcsCifEqycgPT4gJ8SqJywKJ8StJyA9PiAnxKwnLAonxK8nID0+ICfEricsCifEsScgPT4gJ0knLAonxLMnID0+ICfEsicsCifEtScgPT4gJ8S0JywKJ8S3JyA9PiAnxLYnLAonxLonID0+ICfEuScsCifEvCcgPT4gJ8S7JywKJ8S+JyA9PiAnxL0nLAonxYAnID0+ICfEvycsCifFgicgPT4gJ8WBJywKJ8WEJyA9PiAnxYMnLAonxYYnID0+ICfFhScsCifFiCcgPT4gJ8WHJywKJ8WLJyA9PiAnxYonLAonxY0nID0+ICfFjCcsCifFjycgPT4gJ8WOJywKJ8WRJyA9PiAnxZAnLAonxZMnID0+ICfFkicsCifFlScgPT4gJ8WUJywKJ8WXJyA9PiAnxZYnLAonxZknID0+ICfFmCcsCifFmycgPT4gJ8WaJywKJ8WdJyA9PiAnxZwnLAonxZ8nID0+ICfFnicsCifFoScgPT4gJ8WgJywKJ8WjJyA9PiAnxaInLAonxaUnID0+ICfFpCcsCifFpycgPT4gJ8WmJywKJ8WpJyA9PiAnxagnLAonxasnID0+ICfFqicsCifFrScgPT4gJ8WsJywKJ8WvJyA9PiAnxa4nLAonxbEnID0+ICfFsCcsCifFsycgPT4gJ8WyJywKJ8W1JyA9PiAnxbQnLAonxbcnID0+ICfFticsCifFuicgPT4gJ8W5JywKJ8W8JyA9PiAnxbsnLAonxb4nID0+ICfFvScsCifFvycgPT4gJ1MnLAonxoAnID0+ICfJgycsCifGgycgPT4gJ8aCJywKJ8aFJyA9PiAnxoQnLAonxognID0+ICfGhycsCifGjCcgPT4gJ8aLJywKJ8aSJyA9PiAnxpEnLAonxpUnID0+ICfHticsCifGmScgPT4gJ8aYJywKJ8aaJyA9PiAnyL0nLAonxp4nID0+ICfIoCcsCifGoScgPT4gJ8agJywKJ8ajJyA9PiAnxqInLAonxqUnID0+ICfGpCcsCifGqCcgPT4gJ8anJywKJ8atJyA9PiAnxqwnLAonxrAnID0+ICfGrycsCifGtCcgPT4gJ8azJywKJ8a2JyA9PiAnxrUnLAonxrknID0+ICfGuCcsCifGvScgPT4gJ8a8JywKJ8a/JyA9PiAnx7cnLAonx4UnID0+ICfHhCcsCifHhicgPT4gJ8eEJywKJ8eIJyA9PiAnx4cnLAonx4knID0+ICfHhycsCifHiycgPT4gJ8eKJywKJ8eMJyA9PiAnx4onLAonx44nID0+ICfHjScsCifHkCcgPT4gJ8ePJywKJ8eSJyA9PiAnx5EnLAonx5QnID0+ICfHkycsCifHlicgPT4gJ8eVJywKJ8eYJyA9PiAnx5cnLAonx5onID0+ICfHmScsCifHnCcgPT4gJ8ebJywKJ8edJyA9PiAnxo4nLAonx58nID0+ICfHnicsCifHoScgPT4gJ8egJywKJ8ejJyA9PiAnx6InLAonx6UnID0+ICfHpCcsCifHpycgPT4gJ8emJywKJ8epJyA9PiAnx6gnLAonx6snID0+ICfHqicsCifHrScgPT4gJ8esJywKJ8evJyA9PiAnx64nLAonx7InID0+ICfHsScsCifHsycgPT4gJ8exJywKJ8e1JyA9PiAnx7QnLAonx7knID0+ICfHuCcsCifHuycgPT4gJ8e6JywKJ8e9JyA9PiAnx7wnLAonx78nID0+ICfHvicsCifIgScgPT4gJ8iAJywKJ8iDJyA9PiAnyIInLAonyIUnID0+ICfIhCcsCifIhycgPT4gJ8iGJywKJ8iJJyA9PiAnyIgnLAonyIsnID0+ICfIiicsCifIjScgPT4gJ8iMJywKJ8iPJyA9PiAnyI4nLAonyJEnID0+ICfIkCcsCifIkycgPT4gJ8iSJywKJ8iVJyA9PiAnyJQnLAonyJcnID0+ICfIlicsCifImScgPT4gJ8iYJywKJ8ibJyA9PiAnyJonLAonyJ0nID0+ICfInCcsCifInycgPT4gJ8ieJywKJ8ijJyA9PiAnyKInLAonyKUnID0+ICfIpCcsCifIpycgPT4gJ8imJywKJ8ipJyA9PiAnyKgnLAonyKsnID0+ICfIqicsCifIrScgPT4gJ8isJywKJ8ivJyA9PiAnyK4nLAonyLEnID0+ICfIsCcsCifIsycgPT4gJ8iyJywKJ8i8JyA9PiAnyLsnLAonyL8nID0+ICfisb4nLAonyYAnID0+ICfisb8nLAonyYInID0+ICfJgScsCifJhycgPT4gJ8mGJywKJ8mJJyA9PiAnyYgnLAonyYsnID0+ICfJiicsCifJjScgPT4gJ8mMJywKJ8mPJyA9PiAnyY4nLAonyZAnID0+ICfisa8nLAonyZEnID0+ICfisa0nLAonyZInID0+ICfisbAnLAonyZMnID0+ICfGgScsCifJlCcgPT4gJ8aGJywKJ8mWJyA9PiAnxoknLAonyZcnID0+ICfGiicsCifJmScgPT4gJ8aPJywKJ8mbJyA9PiAnxpAnLAonyZwnID0+ICfqnqsnLAonyaAnID0+ICfGkycsCifJoScgPT4gJ+qerCcsCifJoycgPT4gJ8aUJywKJ8mlJyA9PiAn6p6NJywKJ8mmJyA9PiAn6p6qJywKJ8moJyA9PiAnxpcnLAonyaknID0+ICfGlicsCifJqicgPT4gJ+qericsCifJqycgPT4gJ+KxoicsCifJrCcgPT4gJ+qerScsCifJrycgPT4gJ8acJywKJ8mxJyA9PiAn4rGuJywKJ8myJyA9PiAnxp0nLAonybUnID0+ICfGnycsCifJvScgPT4gJ+KxpCcsCifKgCcgPT4gJ8amJywKJ8qCJyA9PiAn6p+FJywKJ8qDJyA9PiAnxqknLAonyocnID0+ICfqnrEnLAonyognID0+ICfGricsCifKiScgPT4gJ8mEJywKJ8qKJyA9PiAnxrEnLAonyosnID0+ICfGsicsCifKjCcgPT4gJ8mFJywKJ8qSJyA9PiAnxrcnLAonyp0nID0+ICfqnrInLAonyp4nID0+ICfqnrAnLAonzYUnID0+ICfOmScsCifNsScgPT4gJ82wJywKJ82zJyA9PiAnzbInLAonzbcnID0+ICfNticsCifNuycgPT4gJ8+9JywKJ828JyA9PiAnz74nLAonzb0nID0+ICfPvycsCifOrCcgPT4gJ86GJywKJ86tJyA9PiAnzognLAonzq4nID0+ICfOiScsCifOrycgPT4gJ86KJywKJ86xJyA9PiAnzpEnLAonzrInID0+ICfOkicsCifOsycgPT4gJ86TJywKJ860JyA9PiAnzpQnLAonzrUnID0+ICfOlScsCifOticgPT4gJ86WJywKJ863JyA9PiAnzpcnLAonzrgnID0+ICfOmCcsCifOuScgPT4gJ86ZJywKJ866JyA9PiAnzponLAonzrsnID0+ICfOmycsCifOvCcgPT4gJ86cJywKJ869JyA9PiAnzp0nLAonzr4nID0+ICfOnicsCifOvycgPT4gJ86fJywKJ8+AJyA9PiAnzqAnLAonz4EnID0+ICfOoScsCifPgicgPT4gJ86jJywKJ8+DJyA9PiAnzqMnLAonz4QnID0+ICfOpCcsCifPhScgPT4gJ86lJywKJ8+GJyA9PiAnzqYnLAonz4cnID0+ICfOpycsCifPiCcgPT4gJ86oJywKJ8+JJyA9PiAnzqknLAonz4onID0+ICfOqicsCifPiycgPT4gJ86rJywKJ8+MJyA9PiAnzownLAonz40nID0+ICfOjicsCifPjicgPT4gJ86PJywKJ8+QJyA9PiAnzpInLAonz5EnID0+ICfOmCcsCifPlScgPT4gJ86mJywKJ8+WJyA9PiAnzqAnLAonz5cnID0+ICfPjycsCifPmScgPT4gJ8+YJywKJ8+bJyA9PiAnz5onLAonz50nID0+ICfPnCcsCifPnycgPT4gJ8+eJywKJ8+hJyA9PiAnz6AnLAonz6MnID0+ICfPoicsCifPpScgPT4gJ8+kJywKJ8+nJyA9PiAnz6YnLAonz6knID0+ICfPqCcsCifPqycgPT4gJ8+qJywKJ8+tJyA9PiAnz6wnLAonz68nID0+ICfPricsCifPsCcgPT4gJ86aJywKJ8+xJyA9PiAnzqEnLAonz7InID0+ICfPuScsCifPsycgPT4gJ82/JywKJ8+1JyA9PiAnzpUnLAonz7gnID0+ICfPtycsCifPuycgPT4gJ8+6JywKJ9CwJyA9PiAn0JAnLAon0LEnID0+ICfQkScsCifQsicgPT4gJ9CSJywKJ9CzJyA9PiAn0JMnLAon0LQnID0+ICfQlCcsCifQtScgPT4gJ9CVJywKJ9C2JyA9PiAn0JYnLAon0LcnID0+ICfQlycsCifQuCcgPT4gJ9CYJywKJ9C5JyA9PiAn0JknLAon0LonID0+ICfQmicsCifQuycgPT4gJ9CbJywKJ9C8JyA9PiAn0JwnLAon0L0nID0+ICfQnScsCifQvicgPT4gJ9CeJywKJ9C/JyA9PiAn0J8nLAon0YAnID0+ICfQoCcsCifRgScgPT4gJ9ChJywKJ9GCJyA9PiAn0KInLAon0YMnID0+ICfQoycsCifRhCcgPT4gJ9CkJywKJ9GFJyA9PiAn0KUnLAon0YYnID0+ICfQpicsCifRhycgPT4gJ9CnJywKJ9GIJyA9PiAn0KgnLAon0YknID0+ICfQqScsCifRiicgPT4gJ9CqJywKJ9GLJyA9PiAn0KsnLAon0YwnID0+ICfQrCcsCifRjScgPT4gJ9CtJywKJ9GOJyA9PiAn0K4nLAon0Y8nID0+ICfQrycsCifRkCcgPT4gJ9CAJywKJ9GRJyA9PiAn0IEnLAon0ZInID0+ICfQgicsCifRkycgPT4gJ9CDJywKJ9GUJyA9PiAn0IQnLAon0ZUnID0+ICfQhScsCifRlicgPT4gJ9CGJywKJ9GXJyA9PiAn0IcnLAon0ZgnID0+ICfQiCcsCifRmScgPT4gJ9CJJywKJ9GaJyA9PiAn0IonLAon0ZsnID0+ICfQiycsCifRnCcgPT4gJ9CMJywKJ9GdJyA9PiAn0I0nLAon0Z4nID0+ICfQjicsCifRnycgPT4gJ9CPJywKJ9GhJyA9PiAn0aAnLAon0aMnID0+ICfRoicsCifRpScgPT4gJ9GkJywKJ9GnJyA9PiAn0aYnLAon0aknID0+ICfRqCcsCifRqycgPT4gJ9GqJywKJ9GtJyA9PiAn0awnLAon0a8nID0+ICfRricsCifRsScgPT4gJ9GwJywKJ9GzJyA9PiAn0bInLAon0bUnID0+ICfRtCcsCifRtycgPT4gJ9G2JywKJ9G5JyA9PiAn0bgnLAon0bsnID0+ICfRuicsCifRvScgPT4gJ9G8JywKJ9G/JyA9PiAn0b4nLAon0oEnID0+ICfSgCcsCifSiycgPT4gJ9KKJywKJ9KNJyA9PiAn0ownLAon0o8nID0+ICfSjicsCifSkScgPT4gJ9KQJywKJ9KTJyA9PiAn0pInLAon0pUnID0+ICfSlCcsCifSlycgPT4gJ9KWJywKJ9KZJyA9PiAn0pgnLAon0psnID0+ICfSmicsCifSnScgPT4gJ9KcJywKJ9KfJyA9PiAn0p4nLAon0qEnID0+ICfSoCcsCifSoycgPT4gJ9KiJywKJ9KlJyA9PiAn0qQnLAon0qcnID0+ICfSpicsCifSqScgPT4gJ9KoJywKJ9KrJyA9PiAn0qonLAon0q0nID0+ICfSrCcsCifSrycgPT4gJ9KuJywKJ9KxJyA9PiAn0rAnLAon0rMnID0+ICfSsicsCifStScgPT4gJ9K0JywKJ9K3JyA9PiAn0rYnLAon0rknID0+ICfSuCcsCifSuycgPT4gJ9K6JywKJ9K9JyA9PiAn0rwnLAon0r8nID0+ICfSvicsCifTgicgPT4gJ9OBJywKJ9OEJyA9PiAn04MnLAon04YnID0+ICfThScsCifTiCcgPT4gJ9OHJywKJ9OKJyA9PiAn04knLAon04wnID0+ICfTiycsCifTjicgPT4gJ9ONJywKJ9OPJyA9PiAn04AnLAon05EnID0+ICfTkCcsCifTkycgPT4gJ9OSJywKJ9OVJyA9PiAn05QnLAon05cnID0+ICfTlicsCifTmScgPT4gJ9OYJywKJ9ObJyA9PiAn05onLAon050nID0+ICfTnCcsCifTnycgPT4gJ9OeJywKJ9OhJyA9PiAn06AnLAon06MnID0+ICfToicsCifTpScgPT4gJ9OkJywKJ9OnJyA9PiAn06YnLAon06knID0+ICfTqCcsCifTqycgPT4gJ9OqJywKJ9OtJyA9PiAn06wnLAon068nID0+ICfTricsCifTsScgPT4gJ9OwJywKJ9OzJyA9PiAn07InLAon07UnID0+ICfTtCcsCifTtycgPT4gJ9O2JywKJ9O5JyA9PiAn07gnLAon07snID0+ICfTuicsCifTvScgPT4gJ9O8JywKJ9O/JyA9PiAn074nLAon1IEnID0+ICfUgCcsCifUgycgPT4gJ9SCJywKJ9SFJyA9PiAn1IQnLAon1IcnID0+ICfUhicsCifUiScgPT4gJ9SIJywKJ9SLJyA9PiAn1IonLAon1I0nID0+ICfUjCcsCifUjycgPT4gJ9SOJywKJ9SRJyA9PiAn1JAnLAon1JMnID0+ICfUkicsCifUlScgPT4gJ9SUJywKJ9SXJyA9PiAn1JYnLAon1JknID0+ICfUmCcsCifUmycgPT4gJ9SaJywKJ9SdJyA9PiAn1JwnLAon1J8nID0+ICfUnicsCifUoScgPT4gJ9SgJywKJ9SjJyA9PiAn1KInLAon1KUnID0+ICfUpCcsCifUpycgPT4gJ9SmJywKJ9SpJyA9PiAn1KgnLAon1KsnID0+ICfUqicsCifUrScgPT4gJ9SsJywKJ9SvJyA9PiAn1K4nLAon1aEnID0+ICfUsScsCifVoicgPT4gJ9SyJywKJ9WjJyA9PiAn1LMnLAon1aQnID0+ICfUtCcsCifVpScgPT4gJ9S1JywKJ9WmJyA9PiAn1LYnLAon1acnID0+ICfUtycsCifVqCcgPT4gJ9S4JywKJ9WpJyA9PiAn1LknLAon1aonID0+ICfUuicsCifVqycgPT4gJ9S7JywKJ9WsJyA9PiAn1LwnLAon1a0nID0+ICfUvScsCifVricgPT4gJ9S+JywKJ9WvJyA9PiAn1L8nLAon1bAnID0+ICfVgCcsCifVsScgPT4gJ9WBJywKJ9WyJyA9PiAn1YInLAon1bMnID0+ICfVgycsCifVtCcgPT4gJ9WEJywKJ9W1JyA9PiAn1YUnLAon1bYnID0+ICfVhicsCifVtycgPT4gJ9WHJywKJ9W4JyA9PiAn1YgnLAon1bknID0+ICfViScsCifVuicgPT4gJ9WKJywKJ9W7JyA9PiAn1YsnLAon1bwnID0+ICfVjCcsCifVvScgPT4gJ9WNJywKJ9W+JyA9PiAn1Y4nLAon1b8nID0+ICfVjycsCifWgCcgPT4gJ9WQJywKJ9aBJyA9PiAn1ZEnLAon1oInID0+ICfVkicsCifWgycgPT4gJ9WTJywKJ9aEJyA9PiAn1ZQnLAon1oUnID0+ICfVlScsCifWhicgPT4gJ9WWJywKJ+GDkCcgPT4gJ+GykCcsCifhg5EnID0+ICfhspEnLAon4YOSJyA9PiAn4bKSJywKJ+GDkycgPT4gJ+GykycsCifhg5QnID0+ICfhspQnLAon4YOVJyA9PiAn4bKVJywKJ+GDlicgPT4gJ+GylicsCifhg5cnID0+ICfhspcnLAon4YOYJyA9PiAn4bKYJywKJ+GDmScgPT4gJ+GymScsCifhg5onID0+ICfhsponLAon4YObJyA9PiAn4bKbJywKJ+GDnCcgPT4gJ+GynCcsCifhg50nID0+ICfhsp0nLAon4YOeJyA9PiAn4bKeJywKJ+GDnycgPT4gJ+GynycsCifhg6AnID0+ICfhsqAnLAon4YOhJyA9PiAn4bKhJywKJ+GDoicgPT4gJ+GyoicsCifhg6MnID0+ICfhsqMnLAon4YOkJyA9PiAn4bKkJywKJ+GDpScgPT4gJ+GypScsCifhg6YnID0+ICfhsqYnLAon4YOnJyA9PiAn4bKnJywKJ+GDqCcgPT4gJ+GyqCcsCifhg6knID0+ICfhsqknLAon4YOqJyA9PiAn4bKqJywKJ+GDqycgPT4gJ+GyqycsCifhg6wnID0+ICfhsqwnLAon4YOtJyA9PiAn4bKtJywKJ+GDricgPT4gJ+GyricsCifhg68nID0+ICfhsq8nLAon4YOwJyA9PiAn4bKwJywKJ+GDsScgPT4gJ+GysScsCifhg7InID0+ICfhsrInLAon4YOzJyA9PiAn4bKzJywKJ+GDtCcgPT4gJ+GytCcsCifhg7UnID0+ICfhsrUnLAon4YO2JyA9PiAn4bK2JywKJ+GDtycgPT4gJ+GytycsCifhg7gnID0+ICfhsrgnLAon4YO5JyA9PiAn4bK5JywKJ+GDuicgPT4gJ+GyuicsCifhg70nID0+ICfhsr0nLAon4YO+JyA9PiAn4bK+JywKJ+GDvycgPT4gJ+GyvycsCifhj7gnID0+ICfhj7AnLAon4Y+5JyA9PiAn4Y+xJywKJ+GPuicgPT4gJ+GPsicsCifhj7snID0+ICfhj7MnLAon4Y+8JyA9PiAn4Y+0JywKJ+GPvScgPT4gJ+GPtScsCifhsoAnID0+ICfQkicsCifhsoEnID0+ICfQlCcsCifhsoInID0+ICfQnicsCifhsoMnID0+ICfQoScsCifhsoQnID0+ICfQoicsCifhsoUnID0+ICfQoicsCifhsoYnID0+ICfQqicsCifhsocnID0+ICfRoicsCifhsognID0+ICfqmYonLAon4bW5JyA9PiAn6p29JywKJ+G1vScgPT4gJ+KxoycsCifhto4nID0+ICfqn4YnLAon4biBJyA9PiAn4biAJywKJ+G4gycgPT4gJ+G4gicsCifhuIUnID0+ICfhuIQnLAon4biHJyA9PiAn4biGJywKJ+G4iScgPT4gJ+G4iCcsCifhuIsnID0+ICfhuIonLAon4biNJyA9PiAn4biMJywKJ+G4jycgPT4gJ+G4jicsCifhuJEnID0+ICfhuJAnLAon4biTJyA9PiAn4biSJywKJ+G4lScgPT4gJ+G4lCcsCifhuJcnID0+ICfhuJYnLAon4biZJyA9PiAn4biYJywKJ+G4mycgPT4gJ+G4micsCifhuJ0nID0+ICfhuJwnLAon4bifJyA9PiAn4bieJywKJ+G4oScgPT4gJ+G4oCcsCifhuKMnID0+ICfhuKInLAon4bilJyA9PiAn4bikJywKJ+G4pycgPT4gJ+G4picsCifhuKknID0+ICfhuKgnLAon4birJyA9PiAn4biqJywKJ+G4rScgPT4gJ+G4rCcsCifhuK8nID0+ICfhuK4nLAon4bixJyA9PiAn4biwJywKJ+G4sycgPT4gJ+G4sicsCifhuLUnID0+ICfhuLQnLAon4bi3JyA9PiAn4bi2JywKJ+G4uScgPT4gJ+G4uCcsCifhuLsnID0+ICfhuLonLAon4bi9JyA9PiAn4bi8JywKJ+G4vycgPT4gJ+G4vicsCifhuYEnID0+ICfhuYAnLAon4bmDJyA9PiAn4bmCJywKJ+G5hScgPT4gJ+G5hCcsCifhuYcnID0+ICfhuYYnLAon4bmJJyA9PiAn4bmIJywKJ+G5iycgPT4gJ+G5iicsCifhuY0nID0+ICfhuYwnLAon4bmPJyA9PiAn4bmOJywKJ+G5kScgPT4gJ+G5kCcsCifhuZMnID0+ICfhuZInLAon4bmVJyA9PiAn4bmUJywKJ+G5lycgPT4gJ+G5licsCifhuZknID0+ICfhuZgnLAon4bmbJyA9PiAn4bmaJywKJ+G5nScgPT4gJ+G5nCcsCifhuZ8nID0+ICfhuZ4nLAon4bmhJyA9PiAn4bmgJywKJ+G5oycgPT4gJ+G5oicsCifhuaUnID0+ICfhuaQnLAon4bmnJyA9PiAn4bmmJywKJ+G5qScgPT4gJ+G5qCcsCifhuasnID0+ICfhuaonLAon4bmtJyA9PiAn4bmsJywKJ+G5rycgPT4gJ+G5ricsCifhubEnID0+ICfhubAnLAon4bmzJyA9PiAn4bmyJywKJ+G5tScgPT4gJ+G5tCcsCifhubcnID0+ICfhubYnLAon4bm5JyA9PiAn4bm4JywKJ+G5uycgPT4gJ+G5uicsCifhub0nID0+ICfhubwnLAon4bm/JyA9PiAn4bm+JywKJ+G6gScgPT4gJ+G6gCcsCifhuoMnID0+ICfhuoInLAon4bqFJyA9PiAn4bqEJywKJ+G6hycgPT4gJ+G6hicsCifhuoknID0+ICfhuognLAon4bqLJyA9PiAn4bqKJywKJ+G6jScgPT4gJ+G6jCcsCifhuo8nID0+ICfhuo4nLAon4bqRJyA9PiAn4bqQJywKJ+G6kycgPT4gJ+G6kicsCifhupUnID0+ICfhupQnLAon4bqbJyA9PiAn4bmgJywKJ+G6oScgPT4gJ+G6oCcsCifhuqMnID0+ICfhuqInLAon4bqlJyA9PiAn4bqkJywKJ+G6pycgPT4gJ+G6picsCifhuqknID0+ICfhuqgnLAon4bqrJyA9PiAn4bqqJywKJ+G6rScgPT4gJ+G6rCcsCifhuq8nID0+ICfhuq4nLAon4bqxJyA9PiAn4bqwJywKJ+G6sycgPT4gJ+G6sicsCifhurUnID0+ICfhurQnLAon4bq3JyA9PiAn4bq2JywKJ+G6uScgPT4gJ+G6uCcsCifhursnID0+ICfhuronLAon4bq9JyA9PiAn4bq8JywKJ+G6vycgPT4gJ+G6vicsCifhu4EnID0+ICfhu4AnLAon4buDJyA9PiAn4buCJywKJ+G7hScgPT4gJ+G7hCcsCifhu4cnID0+ICfhu4YnLAon4buJJyA9PiAn4buIJywKJ+G7iycgPT4gJ+G7iicsCifhu40nID0+ICfhu4wnLAon4buPJyA9PiAn4buOJywKJ+G7kScgPT4gJ+G7kCcsCifhu5MnID0+ICfhu5InLAon4buVJyA9PiAn4buUJywKJ+G7lycgPT4gJ+G7licsCifhu5knID0+ICfhu5gnLAon4bubJyA9PiAn4buaJywKJ+G7nScgPT4gJ+G7nCcsCifhu58nID0+ICfhu54nLAon4buhJyA9PiAn4bugJywKJ+G7oycgPT4gJ+G7oicsCifhu6UnID0+ICfhu6QnLAon4bunJyA9PiAn4bumJywKJ+G7qScgPT4gJ+G7qCcsCifhu6snID0+ICfhu6onLAon4butJyA9PiAn4busJywKJ+G7rycgPT4gJ+G7ricsCifhu7EnID0+ICfhu7AnLAon4buzJyA9PiAn4buyJywKJ+G7tScgPT4gJ+G7tCcsCifhu7cnID0+ICfhu7YnLAon4bu5JyA9PiAn4bu4JywKJ+G7uycgPT4gJ+G7uicsCifhu70nID0+ICfhu7wnLAon4bu/JyA9PiAn4bu+JywKJ+G8gCcgPT4gJ+G8iCcsCifhvIEnID0+ICfhvIknLAon4byCJyA9PiAn4byKJywKJ+G8gycgPT4gJ+G8iycsCifhvIQnID0+ICfhvIwnLAon4byFJyA9PiAn4byNJywKJ+G8hicgPT4gJ+G8jicsCifhvIcnID0+ICfhvI8nLAon4byQJyA9PiAn4byYJywKJ+G8kScgPT4gJ+G8mScsCifhvJInID0+ICfhvJonLAon4byTJyA9PiAn4bybJywKJ+G8lCcgPT4gJ+G8nCcsCifhvJUnID0+ICfhvJ0nLAon4bygJyA9PiAn4byoJywKJ+G8oScgPT4gJ+G8qScsCifhvKInID0+ICfhvKonLAon4byjJyA9PiAn4byrJywKJ+G8pCcgPT4gJ+G8rCcsCifhvKUnID0+ICfhvK0nLAon4bymJyA9PiAn4byuJywKJ+G8pycgPT4gJ+G8rycsCifhvLAnID0+ICfhvLgnLAon4byxJyA9PiAn4by5JywKJ+G8sicgPT4gJ+G8uicsCifhvLMnID0+ICfhvLsnLAon4by0JyA9PiAn4by8JywKJ+G8tScgPT4gJ+G8vScsCifhvLYnID0+ICfhvL4nLAon4by3JyA9PiAn4by/JywKJ+G9gCcgPT4gJ+G9iCcsCifhvYEnID0+ICfhvYknLAon4b2CJyA9PiAn4b2KJywKJ+G9gycgPT4gJ+G9iycsCifhvYQnID0+ICfhvYwnLAon4b2FJyA9PiAn4b2NJywKJ+G9kScgPT4gJ+G9mScsCifhvZMnID0+ICfhvZsnLAon4b2VJyA9PiAn4b2dJywKJ+G9lycgPT4gJ+G9nycsCifhvaAnID0+ICfhvagnLAon4b2hJyA9PiAn4b2pJywKJ+G9oicgPT4gJ+G9qicsCifhvaMnID0+ICfhvasnLAon4b2kJyA9PiAn4b2sJywKJ+G9pScgPT4gJ+G9rScsCifhvaYnID0+ICfhva4nLAon4b2nJyA9PiAn4b2vJywKJ+G9sCcgPT4gJ+G+uicsCifhvbEnID0+ICfhvrsnLAon4b2yJyA9PiAn4b+IJywKJ+G9sycgPT4gJ+G/iScsCifhvbQnID0+ICfhv4onLAon4b21JyA9PiAn4b+LJywKJ+G9ticgPT4gJ+G/micsCifhvbcnID0+ICfhv5snLAon4b24JyA9PiAn4b+4JywKJ+G9uScgPT4gJ+G/uScsCifhvbonID0+ICfhv6onLAon4b27JyA9PiAn4b+rJywKJ+G9vCcgPT4gJ+G/uicsCifhvb0nID0+ICfhv7snLAon4b6AJyA9PiAn4byIzpknLAon4b6BJyA9PiAn4byJzpknLAon4b6CJyA9PiAn4byKzpknLAon4b6DJyA9PiAn4byLzpknLAon4b6EJyA9PiAn4byMzpknLAon4b6FJyA9PiAn4byNzpknLAon4b6GJyA9PiAn4byOzpknLAon4b6HJyA9PiAn4byPzpknLAon4b6QJyA9PiAn4byozpknLAon4b6RJyA9PiAn4bypzpknLAon4b6SJyA9PiAn4byqzpknLAon4b6TJyA9PiAn4byrzpknLAon4b6UJyA9PiAn4byszpknLAon4b6VJyA9PiAn4bytzpknLAon4b6WJyA9PiAn4byuzpknLAon4b6XJyA9PiAn4byvzpknLAon4b6gJyA9PiAn4b2ozpknLAon4b6hJyA9PiAn4b2pzpknLAon4b6iJyA9PiAn4b2qzpknLAon4b6jJyA9PiAn4b2rzpknLAon4b6kJyA9PiAn4b2szpknLAon4b6lJyA9PiAn4b2tzpknLAon4b6mJyA9PiAn4b2uzpknLAon4b6nJyA9PiAn4b2vzpknLAon4b6wJyA9PiAn4b64JywKJ+G+sScgPT4gJ+G+uScsCifhvrMnID0+ICfOkc6ZJywKJ+G+vicgPT4gJ86ZJywKJ+G/gycgPT4gJ86XzpknLAon4b+QJyA9PiAn4b+YJywKJ+G/kScgPT4gJ+G/mScsCifhv6AnID0+ICfhv6gnLAon4b+hJyA9PiAn4b+pJywKJ+G/pScgPT4gJ+G/rCcsCifhv7MnID0+ICfOqc6ZJywKJ+KFjicgPT4gJ+KEsicsCifihbAnID0+ICfihaAnLAon4oWxJyA9PiAn4oWhJywKJ+KFsicgPT4gJ+KFoicsCifihbMnID0+ICfihaMnLAon4oW0JyA9PiAn4oWkJywKJ+KFtScgPT4gJ+KFpScsCifihbYnID0+ICfihaYnLAon4oW3JyA9PiAn4oWnJywKJ+KFuCcgPT4gJ+KFqCcsCifihbknID0+ICfihaknLAon4oW6JyA9PiAn4oWqJywKJ+KFuycgPT4gJ+KFqycsCifihbwnID0+ICfihawnLAon4oW9JyA9PiAn4oWtJywKJ+KFvicgPT4gJ+KFricsCifihb8nID0+ICfiha8nLAon4oaEJyA9PiAn4oaDJywKJ+KTkCcgPT4gJ+KSticsCifik5EnID0+ICfikrcnLAon4pOSJyA9PiAn4pK4JywKJ+KTkycgPT4gJ+KSuScsCifik5QnID0+ICfikronLAon4pOVJyA9PiAn4pK7JywKJ+KTlicgPT4gJ+KSvCcsCifik5cnID0+ICfikr0nLAon4pOYJyA9PiAn4pK+JywKJ+KTmScgPT4gJ+KSvycsCifik5onID0+ICfik4AnLAon4pObJyA9PiAn4pOBJywKJ+KTnCcgPT4gJ+KTgicsCifik50nID0+ICfik4MnLAon4pOeJyA9PiAn4pOEJywKJ+KTnycgPT4gJ+KThScsCifik6AnID0+ICfik4YnLAon4pOhJyA9PiAn4pOHJywKJ+KToicgPT4gJ+KTiCcsCifik6MnID0+ICfik4knLAon4pOkJyA9PiAn4pOKJywKJ+KTpScgPT4gJ+KTiycsCifik6YnID0+ICfik4wnLAon4pOnJyA9PiAn4pONJywKJ+KTqCcgPT4gJ+KTjicsCifik6knID0+ICfik48nLAon4rCwJyA9PiAn4rCAJywKJ+KwsScgPT4gJ+KwgScsCifisLInID0+ICfisIInLAon4rCzJyA9PiAn4rCDJywKJ+KwtCcgPT4gJ+KwhCcsCifisLUnID0+ICfisIUnLAon4rC2JyA9PiAn4rCGJywKJ+KwtycgPT4gJ+KwhycsCifisLgnID0+ICfisIgnLAon4rC5JyA9PiAn4rCJJywKJ+KwuicgPT4gJ+KwiicsCifisLsnID0+ICfisIsnLAon4rC8JyA9PiAn4rCMJywKJ+KwvScgPT4gJ+KwjScsCifisL4nID0+ICfisI4nLAon4rC/JyA9PiAn4rCPJywKJ+KxgCcgPT4gJ+KwkCcsCifisYEnID0+ICfisJEnLAon4rGCJyA9PiAn4rCSJywKJ+KxgycgPT4gJ+KwkycsCifisYQnID0+ICfisJQnLAon4rGFJyA9PiAn4rCVJywKJ+KxhicgPT4gJ+KwlicsCifisYcnID0+ICfisJcnLAon4rGIJyA9PiAn4rCYJywKJ+KxiScgPT4gJ+KwmScsCifisYonID0+ICfisJonLAon4rGLJyA9PiAn4rCbJywKJ+KxjCcgPT4gJ+KwnCcsCifisY0nID0+ICfisJ0nLAon4rGOJyA9PiAn4rCeJywKJ+KxjycgPT4gJ+KwnycsCifisZAnID0+ICfisKAnLAon4rGRJyA9PiAn4rChJywKJ+KxkicgPT4gJ+KwoicsCifisZMnID0+ICfisKMnLAon4rGUJyA9PiAn4rCkJywKJ+KxlScgPT4gJ+KwpScsCifisZYnID0+ICfisKYnLAon4rGXJyA9PiAn4rCnJywKJ+KxmCcgPT4gJ+KwqCcsCifisZknID0+ICfisKknLAon4rGaJyA9PiAn4rCqJywKJ+KxmycgPT4gJ+KwqycsCifisZwnID0+ICfisKwnLAon4rGdJyA9PiAn4rCtJywKJ+KxnicgPT4gJ+KwricsCifisaEnID0+ICfisaAnLAon4rGlJyA9PiAnyLonLAon4rGmJyA9PiAnyL4nLAon4rGoJyA9PiAn4rGnJywKJ+KxqicgPT4gJ+KxqScsCifisawnID0+ICfisasnLAon4rGzJyA9PiAn4rGyJywKJ+KxticgPT4gJ+KxtScsCifisoEnID0+ICfisoAnLAon4rKDJyA9PiAn4rKCJywKJ+KyhScgPT4gJ+KyhCcsCifisocnID0+ICfisoYnLAon4rKJJyA9PiAn4rKIJywKJ+KyiycgPT4gJ+KyiicsCifiso0nID0+ICfisownLAon4rKPJyA9PiAn4rKOJywKJ+KykScgPT4gJ+KykCcsCifispMnID0+ICfispInLAon4rKVJyA9PiAn4rKUJywKJ+KylycgPT4gJ+KylicsCifispknID0+ICfispgnLAon4rKbJyA9PiAn4rKaJywKJ+KynScgPT4gJ+KynCcsCifisp8nID0+ICfisp4nLAon4rKhJyA9PiAn4rKgJywKJ+KyoycgPT4gJ+KyoicsCifisqUnID0+ICfisqQnLAon4rKnJyA9PiAn4rKmJywKJ+KyqScgPT4gJ+KyqCcsCifisqsnID0+ICfisqonLAon4rKtJyA9PiAn4rKsJywKJ+KyrycgPT4gJ+KyricsCifisrEnID0+ICfisrAnLAon4rKzJyA9PiAn4rKyJywKJ+KytScgPT4gJ+KytCcsCifisrcnID0+ICfisrYnLAon4rK5JyA9PiAn4rK4JywKJ+KyuycgPT4gJ+KyuicsCifisr0nID0+ICfisrwnLAon4rK/JyA9PiAn4rK+JywKJ+KzgScgPT4gJ+KzgCcsCifis4MnID0+ICfis4InLAon4rOFJyA9PiAn4rOEJywKJ+KzhycgPT4gJ+KzhicsCifis4knID0+ICfis4gnLAon4rOLJyA9PiAn4rOKJywKJ+KzjScgPT4gJ+KzjCcsCifis48nID0+ICfis44nLAon4rORJyA9PiAn4rOQJywKJ+KzkycgPT4gJ+KzkicsCifis5UnID0+ICfis5QnLAon4rOXJyA9PiAn4rOWJywKJ+KzmScgPT4gJ+KzmCcsCifis5snID0+ICfis5onLAon4rOdJyA9PiAn4rOcJywKJ+KznycgPT4gJ+KznicsCifis6EnID0+ICfis6AnLAon4rOjJyA9PiAn4rOiJywKJ+KzrCcgPT4gJ+KzqycsCifis64nID0+ICfis60nLAon4rOzJyA9PiAn4rOyJywKJ+K0gCcgPT4gJ+GCoCcsCifitIEnID0+ICfhgqEnLAon4rSCJyA9PiAn4YKiJywKJ+K0gycgPT4gJ+GCoycsCifitIQnID0+ICfhgqQnLAon4rSFJyA9PiAn4YKlJywKJ+K0hicgPT4gJ+GCpicsCifitIcnID0+ICfhgqcnLAon4rSIJyA9PiAn4YKoJywKJ+K0iScgPT4gJ+GCqScsCifitIonID0+ICfhgqonLAon4rSLJyA9PiAn4YKrJywKJ+K0jCcgPT4gJ+GCrCcsCifitI0nID0+ICfhgq0nLAon4rSOJyA9PiAn4YKuJywKJ+K0jycgPT4gJ+GCrycsCifitJAnID0+ICfhgrAnLAon4rSRJyA9PiAn4YKxJywKJ+K0kicgPT4gJ+GCsicsCifitJMnID0+ICfhgrMnLAon4rSUJyA9PiAn4YK0JywKJ+K0lScgPT4gJ+GCtScsCifitJYnID0+ICfhgrYnLAon4rSXJyA9PiAn4YK3JywKJ+K0mCcgPT4gJ+GCuCcsCifitJknID0+ICfhgrknLAon4rSaJyA9PiAn4YK6JywKJ+K0mycgPT4gJ+GCuycsCifitJwnID0+ICfhgrwnLAon4rSdJyA9PiAn4YK9JywKJ+K0nicgPT4gJ+GCvicsCifitJ8nID0+ICfhgr8nLAon4rSgJyA9PiAn4YOAJywKJ+K0oScgPT4gJ+GDgScsCifitKInID0+ICfhg4InLAon4rSjJyA9PiAn4YODJywKJ+K0pCcgPT4gJ+GDhCcsCifitKUnID0+ICfhg4UnLAon4rSnJyA9PiAn4YOHJywKJ+K0rScgPT4gJ+GDjScsCifqmYEnID0+ICfqmYAnLAon6pmDJyA9PiAn6pmCJywKJ+qZhScgPT4gJ+qZhCcsCifqmYcnID0+ICfqmYYnLAon6pmJJyA9PiAn6pmIJywKJ+qZiycgPT4gJ+qZiicsCifqmY0nID0+ICfqmYwnLAon6pmPJyA9PiAn6pmOJywKJ+qZkScgPT4gJ+qZkCcsCifqmZMnID0+ICfqmZInLAon6pmVJyA9PiAn6pmUJywKJ+qZlycgPT4gJ+qZlicsCifqmZknID0+ICfqmZgnLAon6pmbJyA9PiAn6pmaJywKJ+qZnScgPT4gJ+qZnCcsCifqmZ8nID0+ICfqmZ4nLAon6pmhJyA9PiAn6pmgJywKJ+qZoycgPT4gJ+qZoicsCifqmaUnID0+ICfqmaQnLAon6pmnJyA9PiAn6pmmJywKJ+qZqScgPT4gJ+qZqCcsCifqmasnID0+ICfqmaonLAon6pmtJyA9PiAn6pmsJywKJ+qagScgPT4gJ+qagCcsCifqmoMnID0+ICfqmoInLAon6pqFJyA9PiAn6pqEJywKJ+qahycgPT4gJ+qahicsCifqmoknID0+ICfqmognLAon6pqLJyA9PiAn6pqKJywKJ+qajScgPT4gJ+qajCcsCifqmo8nID0+ICfqmo4nLAon6pqRJyA9PiAn6pqQJywKJ+qakycgPT4gJ+qakicsCifqmpUnID0+ICfqmpQnLAon6pqXJyA9PiAn6pqWJywKJ+qamScgPT4gJ+qamCcsCifqmpsnID0+ICfqmponLAon6pyjJyA9PiAn6pyiJywKJ+qcpScgPT4gJ+qcpCcsCifqnKcnID0+ICfqnKYnLAon6pypJyA9PiAn6pyoJywKJ+qcqycgPT4gJ+qcqicsCifqnK0nID0+ICfqnKwnLAon6pyvJyA9PiAn6pyuJywKJ+qcsycgPT4gJ+qcsicsCifqnLUnID0+ICfqnLQnLAon6py3JyA9PiAn6py2JywKJ+qcuScgPT4gJ+qcuCcsCifqnLsnID0+ICfqnLonLAon6py9JyA9PiAn6py8JywKJ+qcvycgPT4gJ+qcvicsCifqnYEnID0+ICfqnYAnLAon6p2DJyA9PiAn6p2CJywKJ+qdhScgPT4gJ+qdhCcsCifqnYcnID0+ICfqnYYnLAon6p2JJyA9PiAn6p2IJywKJ+qdiycgPT4gJ+qdiicsCifqnY0nID0+ICfqnYwnLAon6p2PJyA9PiAn6p2OJywKJ+qdkScgPT4gJ+qdkCcsCifqnZMnID0+ICfqnZInLAon6p2VJyA9PiAn6p2UJywKJ+qdlycgPT4gJ+qdlicsCifqnZknID0+ICfqnZgnLAon6p2bJyA9PiAn6p2aJywKJ+qdnScgPT4gJ+qdnCcsCifqnZ8nID0+ICfqnZ4nLAon6p2hJyA9PiAn6p2gJywKJ+qdoycgPT4gJ+qdoicsCifqnaUnID0+ICfqnaQnLAon6p2nJyA9PiAn6p2mJywKJ+qdqScgPT4gJ+qdqCcsCifqnasnID0+ICfqnaonLAon6p2tJyA9PiAn6p2sJywKJ+qdrycgPT4gJ+qdricsCifqnbonID0+ICfqnbknLAon6p28JyA9PiAn6p27JywKJ+qdvycgPT4gJ+qdvicsCifqnoEnID0+ICfqnoAnLAon6p6DJyA9PiAn6p6CJywKJ+qehScgPT4gJ+qehCcsCifqnocnID0+ICfqnoYnLAon6p6MJyA9PiAn6p6LJywKJ+qekScgPT4gJ+qekCcsCifqnpMnID0+ICfqnpInLAon6p6UJyA9PiAn6p+EJywKJ+qelycgPT4gJ+qelicsCifqnpknID0+ICfqnpgnLAon6p6bJyA9PiAn6p6aJywKJ+qenScgPT4gJ+qenCcsCifqnp8nID0+ICfqnp4nLAon6p6hJyA9PiAn6p6gJywKJ+qeoycgPT4gJ+qeoicsCifqnqUnID0+ICfqnqQnLAon6p6nJyA9PiAn6p6mJywKJ+qeqScgPT4gJ+qeqCcsCifqnrUnID0+ICfqnrQnLAon6p63JyA9PiAn6p62JywKJ+qeuScgPT4gJ+qeuCcsCifqnrsnID0+ICfqnronLAon6p69JyA9PiAn6p68JywKJ+qevycgPT4gJ+qevicsCifqn4MnID0+ICfqn4InLAon6p+IJyA9PiAn6p+HJywKJ+qfiicgPT4gJ+qfiScsCifqn7YnID0+ICfqn7UnLAon6q2TJyA9PiAn6p6zJywKJ+qtsCcgPT4gJ+GOoCcsCifqrbEnID0+ICfhjqEnLAon6q2yJyA9PiAn4Y6iJywKJ+qtsycgPT4gJ+GOoycsCifqrbQnID0+ICfhjqQnLAon6q21JyA9PiAn4Y6lJywKJ+qtticgPT4gJ+GOpicsCifqrbcnID0+ICfhjqcnLAon6q24JyA9PiAn4Y6oJywKJ+qtuScgPT4gJ+GOqScsCifqrbonID0+ICfhjqonLAon6q27JyA9PiAn4Y6rJywKJ+qtvCcgPT4gJ+GOrCcsCifqrb0nID0+ICfhjq0nLAon6q2+JyA9PiAn4Y6uJywKJ+qtvycgPT4gJ+GOrycsCifqroAnID0+ICfhjrAnLAon6q6BJyA9PiAn4Y6xJywKJ+qugicgPT4gJ+GOsicsCifqroMnID0+ICfhjrMnLAon6q6EJyA9PiAn4Y60JywKJ+quhScgPT4gJ+GOtScsCifqroYnID0+ICfhjrYnLAon6q6HJyA9PiAn4Y63JywKJ+quiCcgPT4gJ+GOuCcsCifqroknID0+ICfhjrknLAon6q6KJyA9PiAn4Y66JywKJ+quiycgPT4gJ+GOuycsCifqrownID0+ICfhjrwnLAon6q6NJyA9PiAn4Y69JywKJ+qujicgPT4gJ+GOvicsCifqro8nID0+ICfhjr8nLAon6q6QJyA9PiAn4Y+AJywKJ+qukScgPT4gJ+GPgScsCifqrpInID0+ICfhj4InLAon6q6TJyA9PiAn4Y+DJywKJ+qulCcgPT4gJ+GPhCcsCifqrpUnID0+ICfhj4UnLAon6q6WJyA9PiAn4Y+GJywKJ+qulycgPT4gJ+GPhycsCifqrpgnID0+ICfhj4gnLAon6q6ZJyA9PiAn4Y+JJywKJ+qumicgPT4gJ+GPiicsCifqrpsnID0+ICfhj4snLAon6q6cJyA9PiAn4Y+MJywKJ+qunScgPT4gJ+GPjScsCifqrp4nID0+ICfhj44nLAon6q6fJyA9PiAn4Y+PJywKJ+quoCcgPT4gJ+GPkCcsCifqrqEnID0+ICfhj5EnLAon6q6iJyA9PiAn4Y+SJywKJ+quoycgPT4gJ+GPkycsCifqrqQnID0+ICfhj5QnLAon6q6lJyA9PiAn4Y+VJywKJ+qupicgPT4gJ+GPlicsCifqrqcnID0+ICfhj5cnLAon6q6oJyA9PiAn4Y+YJywKJ+quqScgPT4gJ+GPmScsCifqrqonID0+ICfhj5onLAon6q6rJyA9PiAn4Y+bJywKJ+qurCcgPT4gJ+GPnCcsCifqrq0nID0+ICfhj50nLAon6q6uJyA9PiAn4Y+eJywKJ+qurycgPT4gJ+GPnycsCifqrrAnID0+ICfhj6AnLAon6q6xJyA9PiAn4Y+hJywKJ+qusicgPT4gJ+GPoicsCifqrrMnID0+ICfhj6MnLAon6q60JyA9PiAn4Y+kJywKJ+qutScgPT4gJ+GPpScsCifqrrYnID0+ICfhj6YnLAon6q63JyA9PiAn4Y+nJywKJ+quuCcgPT4gJ+GPqCcsCifqrrknID0+ICfhj6knLAon6q66JyA9PiAn4Y+qJywKJ+quuycgPT4gJ+GPqycsCifqrrwnID0+ICfhj6wnLAon6q69JyA9PiAn4Y+tJywKJ+quvicgPT4gJ+GPricsCifqrr8nID0+ICfhj68nLAon772BJyA9PiAn77yhJywKJ++9gicgPT4gJ++8oicsCifvvYMnID0+ICfvvKMnLAon772EJyA9PiAn77ykJywKJ++9hScgPT4gJ++8pScsCifvvYYnID0+ICfvvKYnLAon772HJyA9PiAn77ynJywKJ++9iCcgPT4gJ++8qCcsCifvvYknID0+ICfvvKknLAon772KJyA9PiAn77yqJywKJ++9iycgPT4gJ++8qycsCifvvYwnID0+ICfvvKwnLAon772NJyA9PiAn77ytJywKJ++9jicgPT4gJ++8ricsCifvvY8nID0+ICfvvK8nLAon772QJyA9PiAn77ywJywKJ++9kScgPT4gJ++8sScsCifvvZInID0+ICfvvLInLAon772TJyA9PiAn77yzJywKJ++9lCcgPT4gJ++8tCcsCifvvZUnID0+ICfvvLUnLAon772WJyA9PiAn77y2JywKJ++9lycgPT4gJ++8tycsCifvvZgnID0+ICfvvLgnLAon772ZJyA9PiAn77y5JywKJ++9micgPT4gJ++8uicsCifwkJCoJyA9PiAn8JCQgCcsCifwkJCpJyA9PiAn8JCQgScsCifwkJCqJyA9PiAn8JCQgicsCifwkJCrJyA9PiAn8JCQgycsCifwkJCsJyA9PiAn8JCQhCcsCifwkJCtJyA9PiAn8JCQhScsCifwkJCuJyA9PiAn8JCQhicsCifwkJCvJyA9PiAn8JCQhycsCifwkJCwJyA9PiAn8JCQiCcsCifwkJCxJyA9PiAn8JCQiScsCifwkJCyJyA9PiAn8JCQiicsCifwkJCzJyA9PiAn8JCQiycsCifwkJC0JyA9PiAn8JCQjCcsCifwkJC1JyA9PiAn8JCQjScsCifwkJC2JyA9PiAn8JCQjicsCifwkJC3JyA9PiAn8JCQjycsCifwkJC4JyA9PiAn8JCQkCcsCifwkJC5JyA9PiAn8JCQkScsCifwkJC6JyA9PiAn8JCQkicsCifwkJC7JyA9PiAn8JCQkycsCifwkJC8JyA9PiAn8JCQlCcsCifwkJC9JyA9PiAn8JCQlScsCifwkJC+JyA9PiAn8JCQlicsCifwkJC/JyA9PiAn8JCQlycsCifwkJGAJyA9PiAn8JCQmCcsCifwkJGBJyA9PiAn8JCQmScsCifwkJGCJyA9PiAn8JCQmicsCifwkJGDJyA9PiAn8JCQmycsCifwkJGEJyA9PiAn8JCQnCcsCifwkJGFJyA9PiAn8JCQnScsCifwkJGGJyA9PiAn8JCQnicsCifwkJGHJyA9PiAn8JCQnycsCifwkJGIJyA9PiAn8JCQoCcsCifwkJGJJyA9PiAn8JCQoScsCifwkJGKJyA9PiAn8JCQoicsCifwkJGLJyA9PiAn8JCQoycsCifwkJGMJyA9PiAn8JCQpCcsCifwkJGNJyA9PiAn8JCQpScsCifwkJGOJyA9PiAn8JCQpicsCifwkJGPJyA9PiAn8JCQpycsCifwkJOYJyA9PiAn8JCSsCcsCifwkJOZJyA9PiAn8JCSsScsCifwkJOaJyA9PiAn8JCSsicsCifwkJObJyA9PiAn8JCSsycsCifwkJOcJyA9PiAn8JCStCcsCifwkJOdJyA9PiAn8JCStScsCifwkJOeJyA9PiAn8JCSticsCifwkJOfJyA9PiAn8JCStycsCifwkJOgJyA9PiAn8JCSuCcsCifwkJOhJyA9PiAn8JCSuScsCifwkJOiJyA9PiAn8JCSuicsCifwkJOjJyA9PiAn8JCSuycsCifwkJOkJyA9PiAn8JCSvCcsCifwkJOlJyA9PiAn8JCSvScsCifwkJOmJyA9PiAn8JCSvicsCifwkJOnJyA9PiAn8JCSvycsCifwkJOoJyA9PiAn8JCTgCcsCifwkJOpJyA9PiAn8JCTgScsCifwkJOqJyA9PiAn8JCTgicsCifwkJOrJyA9PiAn8JCTgycsCifwkJOsJyA9PiAn8JCThCcsCifwkJOtJyA9PiAn8JCThScsCifwkJOuJyA9PiAn8JCThicsCifwkJOvJyA9PiAn8JCThycsCifwkJOwJyA9PiAn8JCTiCcsCifwkJOxJyA9PiAn8JCTiScsCifwkJOyJyA9PiAn8JCTiicsCifwkJOzJyA9PiAn8JCTiycsCifwkJO0JyA9PiAn8JCTjCcsCifwkJO1JyA9PiAn8JCTjScsCifwkJO2JyA9PiAn8JCTjicsCifwkJO3JyA9PiAn8JCTjycsCifwkJO4JyA9PiAn8JCTkCcsCifwkJO5JyA9PiAn8JCTkScsCifwkJO6JyA9PiAn8JCTkicsCifwkJO7JyA9PiAn8JCTkycsCifwkLOAJyA9PiAn8JCygCcsCifwkLOBJyA9PiAn8JCygScsCifwkLOCJyA9PiAn8JCygicsCifwkLODJyA9PiAn8JCygycsCifwkLOEJyA9PiAn8JCyhCcsCifwkLOFJyA9PiAn8JCyhScsCifwkLOGJyA9PiAn8JCyhicsCifwkLOHJyA9PiAn8JCyhycsCifwkLOIJyA9PiAn8JCyiCcsCifwkLOJJyA9PiAn8JCyiScsCifwkLOKJyA9PiAn8JCyiicsCifwkLOLJyA9PiAn8JCyiycsCifwkLOMJyA9PiAn8JCyjCcsCifwkLONJyA9PiAn8JCyjScsCifwkLOOJyA9PiAn8JCyjicsCifwkLOPJyA9PiAn8JCyjycsCifwkLOQJyA9PiAn8JCykCcsCifwkLORJyA9PiAn8JCykScsCifwkLOSJyA9PiAn8JCykicsCifwkLOTJyA9PiAn8JCykycsCifwkLOUJyA9PiAn8JCylCcsCifwkLOVJyA9PiAn8JCylScsCifwkLOWJyA9PiAn8JCylicsCifwkLOXJyA9PiAn8JCylycsCifwkLOYJyA9PiAn8JCymCcsCifwkLOZJyA9PiAn8JCymScsCifwkLOaJyA9PiAn8JCymicsCifwkLObJyA9PiAn8JCymycsCifwkLOcJyA9PiAn8JCynCcsCifwkLOdJyA9PiAn8JCynScsCifwkLOeJyA9PiAn8JCynicsCifwkLOfJyA9PiAn8JCynycsCifwkLOgJyA9PiAn8JCyoCcsCifwkLOhJyA9PiAn8JCyoScsCifwkLOiJyA9PiAn8JCyoicsCifwkLOjJyA9PiAn8JCyoycsCifwkLOkJyA9PiAn8JCypCcsCifwkLOlJyA9PiAn8JCypScsCifwkLOmJyA9PiAn8JCypicsCifwkLOnJyA9PiAn8JCypycsCifwkLOoJyA9PiAn8JCyqCcsCifwkLOpJyA9PiAn8JCyqScsCifwkLOqJyA9PiAn8JCyqicsCifwkLOrJyA9PiAn8JCyqycsCifwkLOsJyA9PiAn8JCyrCcsCifwkLOtJyA9PiAn8JCyrScsCifwkLOuJyA9PiAn8JCyricsCifwkLOvJyA9PiAn8JCyrycsCifwkLOwJyA9PiAn8JCysCcsCifwkLOxJyA9PiAn8JCysScsCifwkLOyJyA9PiAn8JCysicsCifwkaOAJyA9PiAn8JGioCcsCifwkaOBJyA9PiAn8JGioScsCifwkaOCJyA9PiAn8JGioicsCifwkaODJyA9PiAn8JGioycsCifwkaOEJyA9PiAn8JGipCcsCifwkaOFJyA9PiAn8JGipScsCifwkaOGJyA9PiAn8JGipicsCifwkaOHJyA9PiAn8JGipycsCifwkaOIJyA9PiAn8JGiqCcsCifwkaOJJyA9PiAn8JGiqScsCifwkaOKJyA9PiAn8JGiqicsCifwkaOLJyA9PiAn8JGiqycsCifwkaOMJyA9PiAn8JGirCcsCifwkaONJyA9PiAn8JGirScsCifwkaOOJyA9PiAn8JGiricsCifwkaOPJyA9PiAn8JGirycsCifwkaOQJyA9PiAn8JGisCcsCifwkaORJyA9PiAn8JGisScsCifwkaOSJyA9PiAn8JGisicsCifwkaOTJyA9PiAn8JGisycsCifwkaOUJyA9PiAn8JGitCcsCifwkaOVJyA9PiAn8JGitScsCifwkaOWJyA9PiAn8JGiticsCifwkaOXJyA9PiAn8JGitycsCifwkaOYJyA9PiAn8JGiuCcsCifwkaOZJyA9PiAn8JGiuScsCifwkaOaJyA9PiAn8JGiuicsCifwkaObJyA9PiAn8JGiuycsCifwkaOcJyA9PiAn8JGivCcsCifwkaOdJyA9PiAn8JGivScsCifwkaOeJyA9PiAn8JGivicsCifwkaOfJyA9PiAn8JGivycsCifwlrmgJyA9PiAn8Ja5gCcsCifwlrmhJyA9PiAn8Ja5gScsCifwlrmiJyA9PiAn8Ja5gicsCifwlrmjJyA9PiAn8Ja5gycsCifwlrmkJyA9PiAn8Ja5hCcsCifwlrmlJyA9PiAn8Ja5hScsCifwlrmmJyA9PiAn8Ja5hicsCifwlrmnJyA9PiAn8Ja5hycsCifwlrmoJyA9PiAn8Ja5iCcsCifwlrmpJyA9PiAn8Ja5iScsCifwlrmqJyA9PiAn8Ja5iicsCifwlrmrJyA9PiAn8Ja5iycsCifwlrmsJyA9PiAn8Ja5jCcsCifwlrmtJyA9PiAn8Ja5jScsCifwlrmuJyA9PiAn8Ja5jicsCifwlrmvJyA9PiAn8Ja5jycsCifwlrmwJyA9PiAn8Ja5kCcsCifwlrmxJyA9PiAn8Ja5kScsCifwlrmyJyA9PiAn8Ja5kicsCifwlrmzJyA9PiAn8Ja5kycsCifwlrm0JyA9PiAn8Ja5lCcsCifwlrm1JyA9PiAn8Ja5lScsCifwlrm2JyA9PiAn8Ja5licsCifwlrm3JyA9PiAn8Ja5lycsCifwlrm4JyA9PiAn8Ja5mCcsCifwlrm5JyA9PiAn8Ja5mScsCifwlrm6JyA9PiAn8Ja5micsCifwlrm7JyA9PiAn8Ja5mycsCifwlrm8JyA9PiAn8Ja5nCcsCifwlrm9JyA9PiAn8Ja5nScsCifwlrm+JyA9PiAn8Ja5nicsCifwlrm/JyA9PiAn8Ja5nycsCifwnqSiJyA9PiAn8J6kgCcsCifwnqSjJyA9PiAn8J6kgScsCifwnqSkJyA9PiAn8J6kgicsCifwnqSlJyA9PiAn8J6kgycsCifwnqSmJyA9PiAn8J6khCcsCifwnqSnJyA9PiAn8J6khScsCifwnqSoJyA9PiAn8J6khicsCifwnqSpJyA9PiAn8J6khycsCifwnqSqJyA9PiAn8J6kiCcsCifwnqSrJyA9PiAn8J6kiScsCifwnqSsJyA9PiAn8J6kiicsCifwnqStJyA9PiAn8J6kiycsCifwnqSuJyA9PiAn8J6kjCcsCifwnqSvJyA9PiAn8J6kjScsCifwnqSwJyA9PiAn8J6kjicsCifwnqSxJyA9PiAn8J6kjycsCifwnqSyJyA9PiAn8J6kkCcsCifwnqSzJyA9PiAn8J6kkScsCifwnqS0JyA9PiAn8J6kkicsCifwnqS1JyA9PiAn8J6kkycsCifwnqS2JyA9PiAn8J6klCcsCifwnqS3JyA9PiAn8J6klScsCifwnqS4JyA9PiAn8J6klicsCifwnqS5JyA9PiAn8J6klycsCifwnqS6JyA9PiAn8J6kmCcsCifwnqS7JyA9PiAn8J6kmScsCifwnqS8JyA9PiAn8J6kmicsCifwnqS9JyA9PiAn8J6kmycsCifwnqS+JyA9PiAn8J6knCcsCifwnqS/JyA9PiAn8J6knScsCifwnqWAJyA9PiAn8J6knicsCifwnqWBJyA9PiAn8J6knycsCifwnqWCJyA9PiAn8J6koCcsCifwnqWDJyA9PiAn8J6koScsCifDnycgPT4gJ1NTJywKJ++sgCcgPT4gJ0ZGJywKJ++sgScgPT4gJ0ZJJywKJ++sgicgPT4gJ0ZMJywKJ++sgycgPT4gJ0ZGSScsCifvrIQnID0+ICdGRkwnLAon76yFJyA9PiAnU1QnLAon76yGJyA9PiAnU1QnLAon1ocnID0+ICfUtdWSJywKJ++skycgPT4gJ9WE1YYnLAon76yUJyA9PiAn1YTUtScsCifvrJUnID0+ICfVhNS7JywKJ++slicgPT4gJ9WO1YYnLAon76yXJyA9PiAn1YTUvScsCifFiScgPT4gJ8q8TicsCifOkCcgPT4gJ86ZzIjMgScsCifOsCcgPT4gJ86lzIjMgScsCifHsCcgPT4gJ0rMjCcsCifhupYnID0+ICdIzLEnLAon4bqXJyA9PiAnVMyIJywKJ+G6mCcgPT4gJ1fMiicsCifhupknID0+ICdZzIonLAon4bqaJyA9PiAnQcq+JywKJ+G9kCcgPT4gJ86lzJMnLAon4b2SJyA9PiAnzqXMk8yAJywKJ+G9lCcgPT4gJ86lzJPMgScsCifhvZYnID0+ICfOpcyTzYInLAon4b62JyA9PiAnzpHNgicsCifhv4YnID0+ICfOl82CJywKJ+G/kicgPT4gJ86ZzIjMgCcsCifhv5MnID0+ICfOmcyIzIEnLAon4b+WJyA9PiAnzpnNgicsCifhv5cnID0+ICfOmcyIzYInLAon4b+iJyA9PiAnzqXMiMyAJywKJ+G/oycgPT4gJ86lzIjMgScsCifhv6QnID0+ICfOocyTJywKJ+G/picgPT4gJ86lzYInLAon4b+nJyA9PiAnzqXMiM2CJywKJ+G/ticgPT4gJ86pzYInLAon4b6IJyA9PiAn4byIzpknLAon4b6JJyA9PiAn4byJzpknLAon4b6KJyA9PiAn4byKzpknLAon4b6LJyA9PiAn4byLzpknLAon4b6MJyA9PiAn4byMzpknLAon4b6NJyA9PiAn4byNzpknLAon4b6OJyA9PiAn4byOzpknLAon4b6PJyA9PiAn4byPzpknLAon4b6YJyA9PiAn4byozpknLAon4b6ZJyA9PiAn4bypzpknLAon4b6aJyA9PiAn4byqzpknLAon4b6bJyA9PiAn4byrzpknLAon4b6cJyA9PiAn4byszpknLAon4b6dJyA9PiAn4bytzpknLAon4b6eJyA9PiAn4byuzpknLAon4b6fJyA9PiAn4byvzpknLAon4b6oJyA9PiAn4b2ozpknLAon4b6pJyA9PiAn4b2pzpknLAon4b6qJyA9PiAn4b2qzpknLAon4b6rJyA9PiAn4b2rzpknLAon4b6sJyA9PiAn4b2szpknLAon4b6tJyA9PiAn4b2tzpknLAon4b6uJyA9PiAn4b2uzpknLAon4b6vJyA9PiAn4b2vzpknLAon4b68JyA9PiAnzpHOmScsCifhv4wnID0+ICfOl86ZJywKJ+G/vCcgPT4gJ86pzpknLAon4b6yJyA9PiAn4b66zpknLAon4b60JyA9PiAnzobOmScsCifhv4InID0+ICfhv4rOmScsCifhv4QnID0+ICfOic6ZJywKJ+G/sicgPT4gJ+G/us6ZJywKJ+G/tCcgPT4gJ86PzpknLAon4b63JyA9PiAnzpHNgs6ZJywKJ+G/hycgPT4gJ86XzYLOmScsCifhv7cnID0+ICfOqc2CzpknLAopOwo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcTWJzdHJpbmcgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9taW1laGVhZGVyKCRzdHJpbmcpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9taW1laGVhZGVyKCRzdHJpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9taW1laGVhZGVyJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX21pbWVoZWFkZXIoJHN0cmluZywgJGNoYXJzZXQgPSBudWxsLCAkdHJhbnNmZXJfZW5jb2RpbmcgPSBudWxsLCAkbmV3bGluZSA9ICJcclxuIiwgJGluZGVudCA9IDApIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9taW1laGVhZGVyKCRzdHJpbmcsICRjaGFyc2V0LCAkdHJhbnNmZXJfZW5jb2RpbmcsICRuZXdsaW5lLCAkaW5kZW50KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbnVtZXJpY2VudGl0eScpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcgPSBudWxsLCAkaGV4ID0gZmFsc2UpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZywgJGhleCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9jYXNlKCRzdHJpbmcsICRtb2RlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X2Nhc2UoJHN0cmluZywgJG1vZGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaW50ZXJuYWxfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xhbmd1YWdlJykpIHsKZnVuY3Rpb24gbWJfbGFuZ3VhZ2UoJGxhbmd1YWdlID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGFuZ3VhZ2UoJGxhbmd1YWdlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9saXN0X2VuY29kaW5ncycpKSB7CmZ1bmN0aW9uIG1iX2xpc3RfZW5jb2RpbmdzKCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGlzdF9lbmNvZGluZ3MoKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGluZ19hbGlhc2VzJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcygkZW5jb2RpbmcpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kaW5nX2FsaWFzZXMoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jaGVja19lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3RfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5ncyA9IG51bGwsICRzdHJpY3QgPSBmYWxzZSkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZ3MsICRzdHJpY3QpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RldGVjdF9vcmRlcicpKSB7CmZ1bmN0aW9uIG1iX2RldGVjdF9vcmRlcigkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9wYXJzZV9zdHInKSkgewpmdW5jdGlvbiBtYl9wYXJzZV9zdHIoJHN0cmluZywgJiRyZXN1bHQgPSBbXSkgeyBwYXJzZV9zdHIoJHN0cmluZywgJHJlc3VsdCk7IHJldHVybiAoYm9vbCkgJHJlc3VsdDsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewpmdW5jdGlvbiBtYl9zdHJsZW4oJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpIHsKZnVuY3Rpb24gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dlcicpKSB7CmZ1bmN0aW9uIG1iX3N0cnRvbG93ZXIoJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RydG9sb3dlcigkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvdXBwZXIoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3RlciA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3Rlcik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyKCRzdHJpbmcsICRzdGFydCwgJGxlbmd0aCA9IDIxNDc0ODM2NDcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmNocicpKSB7CmZ1bmN0aW9uIG1iX3N0cnJjaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmljaHInKSkgewpmdW5jdGlvbiBtYl9zdHJyaWNocigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJpY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Ryc3RyJykpIHsKZnVuY3Rpb24gbWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZ2V0X2luZm8nKSkgewpmdW5jdGlvbiBtYl9nZXRfaW5mbygkdHlwZSA9ICdhbGwnKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9nZXRfaW5mbygkdHlwZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9vdXRwdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX291dHB1dCgkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX291dHB1dCgkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cndpZHRoJykpIHsKZnVuY3Rpb24gbWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHJfY291bnQnKSkgewpmdW5jdGlvbiBtYl9zdWJzdHJfY291bnQoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHJfY291bnQoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX291dHB1dF9oYW5kbGVyJykpIHsKZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoJHN0cmluZywgJHN0YXR1cykgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfb3V0cHV0X2hhbmRsZXIoJHN0cmluZywgJHN0YXR1cyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9pbnB1dCcpKSB7CmZ1bmN0aW9uIG1iX2h0dHBfaW5wdXQoJHR5cGUgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX2lucHV0KCR0eXBlKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF92YXJpYWJsZXMnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X3ZhcmlhYmxlcygkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nLCAmLi4uJHZhcnMpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfdmFyaWFibGVzKCR0b19lbmNvZGluZywgJGZyb21fZW5jb2RpbmcsIC4uLiR2YXJzKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfb3JkJykpIHsKZnVuY3Rpb24gbWJfb3JkKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX29yZCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NocicpKSB7CmZ1bmN0aW9uIG1iX2NocigkY29kZXBvaW50LCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaHIoJGNvZGVwb2ludCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zY3J1YicpKSB7CmZ1bmN0aW9uIG1iX3NjcnViKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgJGVuY29kaW5nID0gbnVsbCA9PT0gJGVuY29kaW5nID8gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKSA6ICRlbmNvZGluZzsgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9zcGxpdCcpKSB7CmZ1bmN0aW9uIG1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoID0gMSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyX3NwbGl0KCRzdHJpbmcsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9wYWQnKSkgewpmdW5jdGlvbiBtYl9zdHJfcGFkKHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRfc3RyaW5nID0gJyAnLCBpbnQgJHBhZF90eXBlID0gU1RSX1BBRF9SSUdIVCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cl9wYWQoJHN0cmluZywgJGxlbmd0aCwgJHBhZF9zdHJpbmcsICRwYWRfdHlwZSwgJGVuY29kaW5nKTsgfQp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewpyZXR1cm47Cn0KCmlmICghZGVmaW5lZCgnTUJfQ0FTRV9VUFBFUicpKSB7CmRlZmluZSgnTUJfQ0FTRV9VUFBFUicsIDApOwp9CmlmICghZGVmaW5lZCgnTUJfQ0FTRV9MT1dFUicpKSB7CmRlZmluZSgnTUJfQ0FTRV9MT1dFUicsIDEpOwp9CmlmICghZGVmaW5lZCgnTUJfQ0FTRV9USVRMRScpKSB7CmRlZmluZSgnTUJfQ0FTRV9USVRMRScsIDIpOwp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxNYnN0cmluZyBhcyBwOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X2VuY29kaW5nKGFycmF5fHN0cmluZ3xudWxsICRzdHJpbmcsID9zdHJpbmcgJHRvX2VuY29kaW5nLCBhcnJheXxzdHJpbmd8bnVsbCAkZnJvbV9lbmNvZGluZyA9IG51bGwpOiBhcnJheXxzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nID8/ICcnLCAoc3RyaW5nKSAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9taW1laGVhZGVyKD9zdHJpbmcgJHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZWNvZGVfbWltZWhlYWRlcigoc3RyaW5nKSAkc3RyaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2VuY29kZV9taW1laGVhZGVyKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcnNldCA9IG51bGwsID9zdHJpbmcgJHRyYW5zZmVyX2VuY29kaW5nID0gbnVsbCwgP3N0cmluZyAkbmV3bGluZSA9ICJcclxuIiwgP2ludCAkaW5kZW50ID0gMCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGVfbWltZWhlYWRlcigoc3RyaW5nKSAkc3RyaW5nLCAkY2hhcnNldCwgJHRyYW5zZmVyX2VuY29kaW5nLCAoc3RyaW5nKSAkbmV3bGluZSwgKGludCkgJGluZGVudCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGVjb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSg/c3RyaW5nICRzdHJpbmcsIGFycmF5ICRtYXAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZWNvZGVfbnVtZXJpY2VudGl0eSgoc3RyaW5nKSAkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9udW1lcmljZW50aXR5JykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoP3N0cmluZyAkc3RyaW5nLCBhcnJheSAkbWFwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwsID9ib29sICRoZXggPSBmYWxzZSk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgoc3RyaW5nKSAkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcsIChib29sKSAkaGV4KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2Nhc2UnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X2Nhc2UoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRtb2RlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9jYXNlKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRtb2RlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2ludGVybmFsX2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfaW50ZXJuYWxfZW5jb2RpbmcoP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sYW5ndWFnZScpKSB7CmZ1bmN0aW9uIG1iX2xhbmd1YWdlKD9zdHJpbmcgJGxhbmd1YWdlID0gbnVsbCk6IHN0cmluZ3xib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xhbmd1YWdlKCRsYW5ndWFnZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbGlzdF9lbmNvZGluZ3MnKSkgewpmdW5jdGlvbiBtYl9saXN0X2VuY29kaW5ncygpOiBhcnJheSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9saXN0X2VuY29kaW5ncygpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kaW5nX2FsaWFzZXMnKSkgewpmdW5jdGlvbiBtYl9lbmNvZGluZ19hbGlhc2VzKD9zdHJpbmcgJGVuY29kaW5nKTogYXJyYXkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZW5jb2RpbmdfYWxpYXNlcygoc3RyaW5nKSAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NoZWNrX2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfY2hlY2tfZW5jb2RpbmcoYXJyYXl8c3RyaW5nfG51bGwgJHZhbHVlID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogYm9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaGVja19lbmNvZGluZygkdmFsdWUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGV0ZWN0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfZGV0ZWN0X2VuY29kaW5nKD9zdHJpbmcgJHN0cmluZywgYXJyYXl8c3RyaW5nfG51bGwgJGVuY29kaW5ncyA9IG51bGwsID9ib29sICRzdHJpY3QgPSBmYWxzZSk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3RfZW5jb2RpbmcoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5ncywgKGJvb2wpICRzdHJpY3QpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RldGVjdF9vcmRlcicpKSB7CmZ1bmN0aW9uIG1iX2RldGVjdF9vcmRlcihhcnJheXxzdHJpbmd8bnVsbCAkZW5jb2RpbmcgPSBudWxsKTogYXJyYXl8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9wYXJzZV9zdHInKSkgewpmdW5jdGlvbiBtYl9wYXJzZV9zdHIoP3N0cmluZyAkc3RyaW5nLCAmJHJlc3VsdCA9IFtdKTogYm9vbCB7IHBhcnNlX3N0cigoc3RyaW5nKSAkc3RyaW5nLCAkcmVzdWx0KTsgcmV0dXJuIChib29sKSAkcmVzdWx0OyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmxlbicpKSB7CmZ1bmN0aW9uIG1iX3N0cmxlbig/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJsZW4oKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dlcicpKSB7CmZ1bmN0aW9uIG1iX3N0cnRvbG93ZXIoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RydG9sb3dlcigoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvdXBwZXIoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKHN0cmluZ3xpbnR8bnVsbCAkc3Vic3RpdHV0ZV9jaGFyYWN0ZXIgPSBudWxsKTogc3RyaW5nfGludHxib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3Rlcik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyKD9zdHJpbmcgJHN0cmluZywgP2ludCAkc3RhcnQsID9pbnQgJGxlbmd0aCA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHIoKHN0cmluZykgJHN0cmluZywgKGludCkgJHN0YXJ0LCAkbGVuZ3RoLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJpcG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJpc3RyJykpIHsKZnVuY3Rpb24gbWJfc3RyaXN0cig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXN0cigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJyY2hyJykpIHsKZnVuY3Rpb24gbWJfc3RycmNocig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycmNocigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJyaWNocicpKSB7CmZ1bmN0aW9uIG1iX3N0cnJpY2hyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaWNocigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJyaXBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaXBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cnN0cig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryc3RyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2dldF9pbmZvJykpIHsKZnVuY3Rpb24gbWJfZ2V0X2luZm8oP3N0cmluZyAkdHlwZSA9ICdhbGwnKTogYXJyYXl8c3RyaW5nfGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9nZXRfaW5mbygoc3RyaW5nKSAkdHlwZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9vdXRwdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX291dHB1dCg/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX291dHB1dCgkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cndpZHRoJykpIHsKZnVuY3Rpb24gbWJfc3Ryd2lkdGgoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnQgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryd2lkdGgoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHJfY291bnQnKSkgewpmdW5jdGlvbiBtYl9zdWJzdHJfY291bnQoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0cl9jb3VudCgoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfb3V0cHV0X2hhbmRsZXInKSkgewpmdW5jdGlvbiBtYl9vdXRwdXRfaGFuZGxlcig/c3RyaW5nICRzdHJpbmcsID9pbnQgJHN0YXR1cyk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9vdXRwdXRfaGFuZGxlcigoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkc3RhdHVzKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9odHRwX2lucHV0JykpIHsKZnVuY3Rpb24gbWJfaHR0cF9pbnB1dCg/c3RyaW5nICR0eXBlID0gbnVsbCk6IGFycmF5fHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX2lucHV0KCR0eXBlKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF92YXJpYWJsZXMnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X3ZhcmlhYmxlcyg/c3RyaW5nICR0b19lbmNvZGluZywgYXJyYXl8c3RyaW5nfG51bGwgJGZyb21fZW5jb2RpbmcsIG1peGVkICYkdmFyLCBtaXhlZCAmLi4uJHZhcnMpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF92YXJpYWJsZXMoKHN0cmluZykgJHRvX2VuY29kaW5nLCAkZnJvbV9lbmNvZGluZyA/PyAnJywgJHZhciwgLi4uJHZhcnMpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9vcmQnKSkgewpmdW5jdGlvbiBtYl9vcmQoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfb3JkKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY2hyJykpIHsKZnVuY3Rpb24gbWJfY2hyKD9pbnQgJGNvZGVwb2ludCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NocigoaW50KSAkY29kZXBvaW50LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3NjcnViJykpIHsKZnVuY3Rpb24gbWJfc2NydWIoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyAkZW5jb2RpbmcgPz89IG1iX2ludGVybmFsX2VuY29kaW5nKCk7IHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBtYl9zdHJfc3BsaXQoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRsZW5ndGggPSAxLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBhcnJheSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJfc3BsaXQoKHN0cmluZykgJHN0cmluZywgKGludCkgJGxlbmd0aCwgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyX3BhZCcpKSB7CmZ1bmN0aW9uIG1iX3N0cl9wYWQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZF9zdHJpbmcgPSAnICcsIGludCAkcGFkX3R5cGUgPSBTVFJfUEFEX1JJR0hULCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyX3BhZCgkc3RyaW5nLCAkbGVuZ3RoLCAkcGFkX3N0cmluZywgJHBhZF90eXBlLCAkZW5jb2RpbmcpOyB9Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CnJldHVybjsKfQoKaWYgKCFkZWZpbmVkKCdNQl9DQVNFX1VQUEVSJykpIHsKZGVmaW5lKCdNQl9DQVNFX1VQUEVSJywgMCk7Cn0KaWYgKCFkZWZpbmVkKCdNQl9DQVNFX0xPV0VSJykpIHsKZGVmaW5lKCdNQl9DQVNFX0xPV0VSJywgMSk7Cn0KaWYgKCFkZWZpbmVkKCdNQl9DQVNFX1RJVExFJykpIHsKZGVmaW5lKCdNQl9DQVNFX1RJVExFJywgMik7Cn0KCkNvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwNzM7CgoKCgoKCgpmaW5hbCBjbGFzcyBQaHA3Mwp7CnB1YmxpYyBzdGF0aWMgJHN0YXJ0QXQgPSAxNTMzNDYyNjAzOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhydGltZSgkYXNOdW0gPSBmYWxzZSkKewokbnMgPSBtaWNyb3RpbWUoZmFsc2UpOwokcyA9IHN1YnN0cigkbnMsIDExKSAtIHNlbGY6OiRzdGFydEF0OwokbnMgPSAxRTkgKiAoZmxvYXQpICRuczsKCmlmICgkYXNOdW0pIHsKJG5zICs9ICRzICogMUU5OwoKcmV0dXJuIFxQSFBfSU5UX1NJWkUgPT09IDQgPyAkbnMgOiAoaW50KSAkbnM7Cn0KCnJldHVybiBbJHMsIChpbnQpICRuc107Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMzAwKSB7CmNsYXNzIEpzb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24Kewp9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXFBocDczIGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDcwMzAwKSB7CnJldHVybjsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2lzX2NvdW50YWJsZScpKSB7CmZ1bmN0aW9uIGlzX2NvdW50YWJsZSgkdmFsdWUpIHsgcmV0dXJuIGlzX2FycmF5KCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2YgQ291bnRhYmxlIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlQnVuZGxlIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIFNpbXBsZVhtbEVsZW1lbnQ7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaHJ0aW1lJykpIHsKcmVxdWlyZV9vbmNlIF9fRElSX18uJy9QaHA3My5waHAnOwpwXFBocDczOjokc3RhcnRBdCA9IChpbnQpIG1pY3JvdGltZSh0cnVlKTsKZnVuY3Rpb24gaHJ0aW1lKCRhc19udW1iZXIgPSBmYWxzZSkgeyByZXR1cm4gcFxQaHA3Mzo6aHJ0aW1lKCRhc19udW1iZXIpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FycmF5X2tleV9maXJzdCcpKSB7CmZ1bmN0aW9uIGFycmF5X2tleV9maXJzdChhcnJheSAkYXJyYXkpIHsgZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7IHJldHVybiAka2V5OyB9IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfa2V5X2xhc3QnKSkgewpmdW5jdGlvbiBhcnJheV9rZXlfbGFzdChhcnJheSAkYXJyYXkpIHsgcmV0dXJuIGtleShhcnJheV9zbGljZSgkYXJyYXksIC0xLCAxLCB0cnVlKSk7IH0KfQoKQ29weXJpZ2h0IChjKSAyMDIwLXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MDsKCgoKCgoKCgpmaW5hbCBjbGFzcyBQaHA4MAp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmRpdihmbG9hdCAkZGl2aWRlbmQsIGZsb2F0ICRkaXZpc29yKTogZmxvYXQKewpyZXR1cm4gQCgkZGl2aWRlbmQgLyAkZGl2aXNvcik7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKTogc3RyaW5nCnsKc3dpdGNoICh0cnVlKSB7CmNhc2UgbnVsbCA9PT0gJHZhbHVlOiByZXR1cm4gJ251bGwnOwpjYXNlIFxpc19ib29sKCR2YWx1ZSk6IHJldHVybiAnYm9vbCc7CmNhc2UgXGlzX3N0cmluZygkdmFsdWUpOiByZXR1cm4gJ3N0cmluZyc7CmNhc2UgXGlzX2FycmF5KCR2YWx1ZSk6IHJldHVybiAnYXJyYXknOwpjYXNlIFxpc19pbnQoJHZhbHVlKTogcmV0dXJuICdpbnQnOwpjYXNlIFxpc19mbG9hdCgkdmFsdWUpOiByZXR1cm4gJ2Zsb2F0JzsKY2FzZSBcaXNfb2JqZWN0KCR2YWx1ZSk6IGJyZWFrOwpjYXNlICR2YWx1ZSBpbnN0YW5jZW9mIFxfX1BIUF9JbmNvbXBsZXRlX0NsYXNzOiByZXR1cm4gJ19fUEhQX0luY29tcGxldGVfQ2xhc3MnOwpkZWZhdWx0OgppZiAobnVsbCA9PT0gJHR5cGUgPSBAZ2V0X3Jlc291cmNlX3R5cGUoJHZhbHVlKSkgewpyZXR1cm4gJ3Vua25vd24nOwp9CgppZiAoJ1Vua25vd24nID09PSAkdHlwZSkgewokdHlwZSA9ICdjbG9zZWQnOwp9CgpyZXR1cm4gInJlc291cmNlICgkdHlwZSkiOwp9CgokY2xhc3MgPSBcZ2V0X2NsYXNzKCR2YWx1ZSk7CgppZiAoZmFsc2UgPT09IHN0cnBvcygkY2xhc3MsICdAJykpIHsKcmV0dXJuICRjbGFzczsKfQoKcmV0dXJuIChnZXRfcGFyZW50X2NsYXNzKCRjbGFzcykgPzoga2V5KGNsYXNzX2ltcGxlbWVudHMoJGNsYXNzKSkgPzogJ2NsYXNzJykuJ0Bhbm9ueW1vdXMnOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9yZXNvdXJjZV9pZCgkcmVzKTogaW50CnsKaWYgKCFcaXNfcmVzb3VyY2UoJHJlcykgJiYgbnVsbCA9PT0gQGdldF9yZXNvdXJjZV90eXBlKCRyZXMpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDEgcGFzc2VkIHRvIGdldF9yZXNvdXJjZV9pZCgpIG11c3QgYmUgb2YgdGhlIHR5cGUgcmVzb3VyY2UsICVzIGdpdmVuJywgZ2V0X2RlYnVnX3R5cGUoJHJlcykpKTsKfQoKcmV0dXJuIChpbnQpICRyZXM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJlZ19sYXN0X2Vycm9yX21zZygpOiBzdHJpbmcKewpzd2l0Y2ggKHByZWdfbGFzdF9lcnJvcigpKSB7CmNhc2UgXFBSRUdfSU5URVJOQUxfRVJST1I6CnJldHVybiAnSW50ZXJuYWwgZXJyb3InOwpjYXNlIFxQUkVHX0JBRF9VVEY4X0VSUk9SOgpyZXR1cm4gJ01hbGZvcm1lZCBVVEYtOCBjaGFyYWN0ZXJzLCBwb3NzaWJseSBpbmNvcnJlY3RseSBlbmNvZGVkJzsKY2FzZSBcUFJFR19CQURfVVRGOF9PRkZTRVRfRVJST1I6CnJldHVybiAnVGhlIG9mZnNldCBkaWQgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHZhbGlkIFVURi04IGNvZGUgcG9pbnQnOwpjYXNlIFxQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUjoKcmV0dXJuICdCYWNrdHJhY2sgbGltaXQgZXhoYXVzdGVkJzsKY2FzZSBcUFJFR19SRUNVUlNJT05fTElNSVRfRVJST1I6CnJldHVybiAnUmVjdXJzaW9uIGxpbWl0IGV4aGF1c3RlZCc7CmNhc2UgXFBSRUdfSklUX1NUQUNLTElNSVRfRVJST1I6CnJldHVybiAnSklUIHN0YWNrIGxpbWl0IGV4aGF1c3RlZCc7CmNhc2UgXFBSRUdfTk9fRVJST1I6CnJldHVybiAnTm8gZXJyb3InOwpkZWZhdWx0OgpyZXR1cm4gJ1Vua25vd24gZXJyb3InOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RyX2NvbnRhaW5zKHN0cmluZyAkaGF5c3RhY2ssIHN0cmluZyAkbmVlZGxlKTogYm9vbAp7CnJldHVybiAnJyA9PT0gJG5lZWRsZSB8fCBmYWxzZSAhPT0gc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RyX3N0YXJ0c193aXRoKHN0cmluZyAkaGF5c3RhY2ssIHN0cmluZyAkbmVlZGxlKTogYm9vbAp7CnJldHVybiAwID09PSBzdHJuY21wKCRoYXlzdGFjaywgJG5lZWRsZSwgXHN0cmxlbigkbmVlZGxlKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RyX2VuZHNfd2l0aChzdHJpbmcgJGhheXN0YWNrLCBzdHJpbmcgJG5lZWRsZSk6IGJvb2wKewppZiAoJycgPT09ICRuZWVkbGUgfHwgJG5lZWRsZSA9PT0gJGhheXN0YWNrKSB7CnJldHVybiB0cnVlOwp9CgppZiAoJycgPT09ICRoYXlzdGFjaykgewpyZXR1cm4gZmFsc2U7Cn0KCiRuZWVkbGVMZW5ndGggPSBcc3RybGVuKCRuZWVkbGUpOwoKcmV0dXJuICRuZWVkbGVMZW5ndGggPD0gXHN0cmxlbigkaGF5c3RhY2spICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCRoYXlzdGFjaywgJG5lZWRsZSwgLSRuZWVkbGVMZW5ndGgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXFBocDgwOwoKCgoKCgpjbGFzcyBQaHBUb2tlbiBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlCnsKCgoKcHVibGljICRpZDsKCgoKCnB1YmxpYyAkdGV4dDsKCgoKCnB1YmxpYyAkbGluZTsKCgoKCnB1YmxpYyAkcG9zOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkaWQsIHN0cmluZyAkdGV4dCwgaW50ICRsaW5lID0gLTEsIGludCAkcG9zaXRpb24gPSAtMSkKewokdGhpcy0+aWQgPSAkaWQ7CiR0aGlzLT50ZXh0ID0gJHRleHQ7CiR0aGlzLT5saW5lID0gJGxpbmU7CiR0aGlzLT5wb3MgPSAkcG9zaXRpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlbk5hbWUoKTogP3N0cmluZwp7CmlmICgnVU5LTk9XTicgPT09ICRuYW1lID0gdG9rZW5fbmFtZSgkdGhpcy0+aWQpKSB7CiRuYW1lID0gXHN0cmxlbigkdGhpcy0+dGV4dCkgPiAxIHx8IFxvcmQoJHRoaXMtPnRleHQpIDwgMzIgPyBudWxsIDogJHRoaXMtPnRleHQ7Cn0KCnJldHVybiAkbmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzKCRraW5kKTogYm9vbAp7CmZvcmVhY2ggKChhcnJheSkgJGtpbmQgYXMgJHZhbHVlKSB7CmlmIChcaW5fYXJyYXkoJHZhbHVlLCBbJHRoaXMtPmlkLCAkdGhpcy0+dGV4dF0sIHRydWUpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JhYmxlKCk6IGJvb2wKewpyZXR1cm4gXGluX2FycmF5KCR0aGlzLT5pZCwgW1xUX1dISVRFU1BBQ0UsIFxUX0NPTU1FTlQsIFxUX0RPQ19DT01NRU5ULCBcVF9PUEVOX1RBR10sIHRydWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gKHN0cmluZykgJHRoaXMtPnRleHQ7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9rZW5pemUoc3RyaW5nICRjb2RlLCBpbnQgJGZsYWdzID0gMCk6IGFycmF5CnsKJGxpbmUgPSAxOwokcG9zaXRpb24gPSAwOwokdG9rZW5zID0gdG9rZW5fZ2V0X2FsbCgkY29kZSwgJGZsYWdzKTsKZm9yZWFjaCAoJHRva2VucyBhcyAkaW5kZXggPT4gJHRva2VuKSB7CmlmIChcaXNfc3RyaW5nKCR0b2tlbikpIHsKJGlkID0gXG9yZCgkdG9rZW4pOwokdGV4dCA9ICR0b2tlbjsKfSBlbHNlIHsKWyRpZCwgJHRleHQsICRsaW5lXSA9ICR0b2tlbjsKfQokdG9rZW5zWyRpbmRleF0gPSBuZXcgc3RhdGljKCRpZCwgJHRleHQsICRsaW5lLCAkcG9zaXRpb24pOwokcG9zaXRpb24gKz0gXHN0cmxlbigkdGV4dCk7Cn0KCnJldHVybiAkdG9rZW5zOwp9Cn0KPD9waHAKCgoKCgoKCgoKCiNbQXR0cmlidXRlKEF0dHJpYnV0ZTo6VEFSR0VUX0NMQVNTKV0KZmluYWwgY2xhc3MgQXR0cmlidXRlCnsKcHVibGljIGNvbnN0IFRBUkdFVF9DTEFTUyA9IDE7CnB1YmxpYyBjb25zdCBUQVJHRVRfRlVOQ1RJT04gPSAyOwpwdWJsaWMgY29uc3QgVEFSR0VUX01FVEhPRCA9IDQ7CnB1YmxpYyBjb25zdCBUQVJHRVRfUFJPUEVSVFkgPSA4OwpwdWJsaWMgY29uc3QgVEFSR0VUX0NMQVNTX0NPTlNUQU5UID0gMTY7CnB1YmxpYyBjb25zdCBUQVJHRVRfUEFSQU1FVEVSID0gMzI7CnB1YmxpYyBjb25zdCBUQVJHRVRfQUxMID0gNjM7CnB1YmxpYyBjb25zdCBJU19SRVBFQVRBQkxFID0gNjQ7CgoKcHVibGljICRmbGFnczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGZsYWdzID0gc2VsZjo6VEFSR0VUX0FMTCkKewokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwICYmIGV4dGVuc2lvbl9sb2FkZWQoJ3Rva2VuaXplcicpKSB7CmNsYXNzIFBocFRva2VuIGV4dGVuZHMgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MFxQaHBUb2tlbgp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmludGVyZmFjZSBTdHJpbmdhYmxlCnsKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKY2xhc3MgVW5oYW5kbGVkTWF0Y2hFcnJvciBleHRlbmRzIEVycm9yCnsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKY2xhc3MgVmFsdWVFcnJvciBleHRlbmRzIEVycm9yCnsKfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MCBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewpyZXR1cm47Cn0KCmlmICghZGVmaW5lZCgnRklMVEVSX1ZBTElEQVRFX0JPT0wnKSAmJiBkZWZpbmVkKCdGSUxURVJfVkFMSURBVEVfQk9PTEVBTicpKSB7CmRlZmluZSgnRklMVEVSX1ZBTElEQVRFX0JPT0wnLCBcRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZmRpdicpKSB7CmZ1bmN0aW9uIGZkaXYoZmxvYXQgJG51bTEsIGZsb2F0ICRudW0yKTogZmxvYXQgeyByZXR1cm4gcFxQaHA4MDo6ZmRpdigkbnVtMSwgJG51bTIpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3ByZWdfbGFzdF9lcnJvcl9tc2cnKSkgewpmdW5jdGlvbiBwcmVnX2xhc3RfZXJyb3JfbXNnKCk6IHN0cmluZyB7IHJldHVybiBwXFBocDgwOjpwcmVnX2xhc3RfZXJyb3JfbXNnKCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyX2NvbnRhaW5zJykpIHsKZnVuY3Rpb24gc3RyX2NvbnRhaW5zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUpOiBib29sIHsgcmV0dXJuIHBcUGhwODA6OnN0cl9jb250YWlucygkaGF5c3RhY2sgPz8gJycsICRuZWVkbGUgPz8gJycpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3N0cl9zdGFydHNfd2l0aCcpKSB7CmZ1bmN0aW9uIHN0cl9zdGFydHNfd2l0aCg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlKTogYm9vbCB7IHJldHVybiBwXFBocDgwOjpzdHJfc3RhcnRzX3dpdGgoJGhheXN0YWNrID8/ICcnLCAkbmVlZGxlID8/ICcnKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzdHJfZW5kc193aXRoJykpIHsKZnVuY3Rpb24gc3RyX2VuZHNfd2l0aCg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlKTogYm9vbCB7IHJldHVybiBwXFBocDgwOjpzdHJfZW5kc193aXRoKCRoYXlzdGFjayA/PyAnJywgJG5lZWRsZSA/PyAnJyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X2RlYnVnX3R5cGUnKSkgewpmdW5jdGlvbiBnZXRfZGVidWdfdHlwZSgkdmFsdWUpOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4MDo6Z2V0X2RlYnVnX3R5cGUoJHZhbHVlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfcmVzb3VyY2VfaWQnKSkgewpmdW5jdGlvbiBnZXRfcmVzb3VyY2VfaWQoJHJlc291cmNlKTogaW50IHsgcmV0dXJuIHBcUGhwODA6OmdldF9yZXNvdXJjZV9pZCgkcmVzb3VyY2UpOyB9Cn0KCkNvcHlyaWdodCAoYykgMjAyMS1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODE7CgoKCgoKCmZpbmFsIGNsYXNzIFBocDgxCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhcnJheV9pc19saXN0KGFycmF5ICRhcnJheSk6IGJvb2wKewppZiAoW10gPT09ICRhcnJheSB8fCAkYXJyYXkgPT09IGFycmF5X3ZhbHVlcygkYXJyYXkpKSB7CnJldHVybiB0cnVlOwp9CgokbmV4dEtleSA9IC0xOwoKZm9yZWFjaCAoJGFycmF5IGFzICRrID0+ICR2KSB7CmlmICgkayAhPT0gKyskbmV4dEtleSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCAmJiBleHRlbnNpb25fbG9hZGVkKCdjdXJsJykpIHsKCgoKY2xhc3MgQ1VSTFN0cmluZ0ZpbGUgZXh0ZW5kcyBDVVJMRmlsZQp7CnByaXZhdGUgJGRhdGE7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRkYXRhLCBzdHJpbmcgJHBvc3RuYW1lLCBzdHJpbmcgJG1pbWUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKewokdGhpcy0+ZGF0YSA9ICRkYXRhOwpwYXJlbnQ6Ol9fY29uc3RydWN0KCdkYXRhOi8vYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwnLmJhc2U2NF9lbmNvZGUoJGRhdGEpLCAkbWltZSwgJHBvc3RuYW1lKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2V0KHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZAp7CmlmICgnZGF0YScgIT09ICRuYW1lKSB7CiR0aGlzLT4kbmFtZSA9ICR2YWx1ZTsKCnJldHVybjsKfQoKaWYgKGlzX29iamVjdCgkdmFsdWUpID8gIW1ldGhvZF9leGlzdHMoJHZhbHVlLCAnX190b1N0cmluZycpIDogIWlzX3NjYWxhcigkdmFsdWUpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKCdDYW5ub3QgYXNzaWduICcuZ2V0dHlwZSgkdmFsdWUpLicgdG8gcHJvcGVydHkgQ1VSTFN0cmluZ0ZpbGU6OiRkYXRhIG9mIHR5cGUgc3RyaW5nJyk7Cn0KCiR0aGlzLT5uYW1lID0gJ2RhdGE6Ly9hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCcuYmFzZTY0X2VuY29kZSgkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19pc3NldChzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT4kbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiAmX19nZXQoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+JG5hbWU7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIHsKI1tBdHRyaWJ1dGUoQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EKV0KZmluYWwgY2xhc3MgUmV0dXJuVHlwZVdpbGxDaGFuZ2UKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MSBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCkgewpyZXR1cm47Cn0KCmlmIChkZWZpbmVkKCdNWVNRTElfUkVGUkVTSF9TTEFWRScpICYmICFkZWZpbmVkKCdNWVNRTElfUkVGUkVTSF9SRVBMSUNBJykpIHsKZGVmaW5lKCdNWVNRTElfUkVGUkVTSF9SRVBMSUNBJywgNjQpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfaXNfbGlzdCcpKSB7CmZ1bmN0aW9uIGFycmF5X2lzX2xpc3QoYXJyYXkgJGFycmF5KTogYm9vbCB7IHJldHVybiBwXFBocDgxOjphcnJheV9pc19saXN0KCRhcnJheSk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2VudW1fZXhpc3RzJykpIHsKZnVuY3Rpb24gZW51bV9leGlzdHMoc3RyaW5nICRlbnVtLCBib29sICRhdXRvbG9hZCA9IHRydWUpOiBib29sIHsgcmV0dXJuICRhdXRvbG9hZCAmJiBjbGFzc19leGlzdHMoJGVudW0pICYmIGZhbHNlOyB9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCgoKCgoKaW50ZXJmYWNlIEV4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIFxUaHJvd2FibGUKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247CgoKCgoKCmNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247CgoKCgoKCmNsYXNzIExvZ2ljRXhjZXB0aW9uIGV4dGVuZHMgXExvZ2ljRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKY2xhc3MgUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFByb2Nlc3MgJHByb2Nlc3MpCnsKaWYgKCRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdFeHBlY3RlZCBhIGZhaWxlZCBwcm9jZXNzLCBidXQgdGhlIGdpdmVuIHByb2Nlc3Mgd2FzIHN1Y2Nlc3NmdWwuJyk7Cn0KCiRlcnJvciA9IHNwcmludGYoJ1RoZSBjb21tYW5kICIlcyIgZmFpbGVkLicuIlxuXG5FeGl0IENvZGU6ICVzKCVzKVxuXG5Xb3JraW5nIGRpcmVjdG9yeTogJXMiLAokcHJvY2Vzcy0+Z2V0Q29tbWFuZExpbmUoKSwKJHByb2Nlc3MtPmdldEV4aXRDb2RlKCksCiRwcm9jZXNzLT5nZXRFeGl0Q29kZVRleHQoKSwKJHByb2Nlc3MtPmdldFdvcmtpbmdEaXJlY3RvcnkoKQopOwoKaWYgKCEkcHJvY2Vzcy0+aXNPdXRwdXREaXNhYmxlZCgpKSB7CiRlcnJvciAuPSBzcHJpbnRmKCJcblxuT3V0cHV0OlxuPT09PT09PT09PT09PT09PVxuJXNcblxuRXJyb3IgT3V0cHV0OlxuPT09PT09PT09PT09PT09PVxuJXMiLAokcHJvY2Vzcy0+Z2V0T3V0cHV0KCksCiRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpCik7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJGVycm9yKTsKCiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzKCkKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3M7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKZmluYWwgY2xhc3MgUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7CnByaXZhdGUgJHByb2Nlc3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUHJvY2VzcyAkcHJvY2VzcykKewokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwoKcGFyZW50OjpfX2NvbnN0cnVjdChzcHJpbnRmKCdUaGUgcHJvY2VzcyBoYXMgYmVlbiBzaWduYWxlZCB3aXRoIHNpZ25hbCAiJXMiLicsICRwcm9jZXNzLT5nZXRUZXJtU2lnbmFsKCkpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3MoKTogUHJvY2Vzcwp7CnJldHVybiAkdGhpcy0+cHJvY2VzczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNpZ25hbCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmdldFByb2Nlc3MoKS0+Z2V0VGVybVNpZ25hbCgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmNsYXNzIFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KewpwdWJsaWMgY29uc3QgVFlQRV9HRU5FUkFMID0gMTsKcHVibGljIGNvbnN0IFRZUEVfSURMRSA9IDI7Cgpwcml2YXRlICRwcm9jZXNzOwpwcml2YXRlICR0aW1lb3V0VHlwZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQcm9jZXNzICRwcm9jZXNzLCBpbnQgJHRpbWVvdXRUeXBlKQp7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CiR0aGlzLT50aW1lb3V0VHlwZSA9ICR0aW1lb3V0VHlwZTsKCnBhcmVudDo6X19jb25zdHJ1Y3Qoc3ByaW50ZigKJ1RoZSBwcm9jZXNzICIlcyIgZXhjZWVkZWQgdGhlIHRpbWVvdXQgb2YgJXMgc2Vjb25kcy4nLAokcHJvY2Vzcy0+Z2V0Q29tbWFuZExpbmUoKSwKJHRoaXMtPmdldEV4Y2VlZGVkVGltZW91dCgpCikpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKcmV0dXJuICR0aGlzLT5wcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNHZW5lcmFsVGltZW91dCgpCnsKcmV0dXJuIHNlbGY6OlRZUEVfR0VORVJBTCA9PT0gJHRoaXMtPnRpbWVvdXRUeXBlOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNJZGxlVGltZW91dCgpCnsKcmV0dXJuIHNlbGY6OlRZUEVfSURMRSA9PT0gJHRoaXMtPnRpbWVvdXRUeXBlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXhjZWVkZWRUaW1lb3V0KCkKewpzd2l0Y2ggKCR0aGlzLT50aW1lb3V0VHlwZSkgewpjYXNlIHNlbGY6OlRZUEVfR0VORVJBTDoKcmV0dXJuICR0aGlzLT5wcm9jZXNzLT5nZXRUaW1lb3V0KCk7CgpjYXNlIHNlbGY6OlRZUEVfSURMRToKcmV0dXJuICR0aGlzLT5wcm9jZXNzLT5nZXRJZGxlVGltZW91dCgpOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdVbmtub3duIHRpbWVvdXQgdHlwZSAiJWQiLicsICR0aGlzLT50aW1lb3V0VHlwZSkpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCgoKCgoKCmNsYXNzIEV4ZWN1dGFibGVGaW5kZXIKewpwcml2YXRlICRzdWZmaXhlcyA9IFsnLmV4ZScsICcuYmF0JywgJy5jbWQnLCAnLmNvbSddOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN1ZmZpeGVzKGFycmF5ICRzdWZmaXhlcykKewokdGhpcy0+c3VmZml4ZXMgPSAkc3VmZml4ZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTdWZmaXgoc3RyaW5nICRzdWZmaXgpCnsKJHRoaXMtPnN1ZmZpeGVzW10gPSAkc3VmZml4Owp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChzdHJpbmcgJG5hbWUsIHN0cmluZyAkZGVmYXVsdCA9IG51bGwsIGFycmF5ICRleHRyYURpcnMgPSBbXSkKewppZiAoXGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKSB7CiRzZWFyY2hQYXRoID0gYXJyYXlfbWVyZ2UoZXhwbG9kZShcUEFUSF9TRVBBUkFUT1IsIFxpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSksICRleHRyYURpcnMpOwokZGlycyA9IFtdOwpmb3JlYWNoICgkc2VhcmNoUGF0aCBhcyAkcGF0aCkgewoKaWYgKEBpc19kaXIoJHBhdGgpKSB7CiRkaXJzW10gPSAkcGF0aDsKfSBlbHNlIHsKaWYgKGJhc2VuYW1lKCRwYXRoKSA9PSAkbmFtZSAmJiBAaXNfZXhlY3V0YWJsZSgkcGF0aCkpIHsKcmV0dXJuICRwYXRoOwp9Cn0KfQp9IGVsc2UgewokZGlycyA9IGFycmF5X21lcmdlKApleHBsb2RlKFxQQVRIX1NFUEFSQVRPUiwgZ2V0ZW52KCdQQVRIJykgPzogZ2V0ZW52KCdQYXRoJykpLAokZXh0cmFEaXJzCik7Cn0KCiRzdWZmaXhlcyA9IFsnJ107CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokcGF0aEV4dCA9IGdldGVudignUEFUSEVYVCcpOwokc3VmZml4ZXMgPSBhcnJheV9tZXJnZSgkcGF0aEV4dCA/IGV4cGxvZGUoXFBBVEhfU0VQQVJBVE9SLCAkcGF0aEV4dCkgOiAkdGhpcy0+c3VmZml4ZXMsICRzdWZmaXhlcyk7Cn0KZm9yZWFjaCAoJHN1ZmZpeGVzIGFzICRzdWZmaXgpIHsKZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewppZiAoQGlzX2ZpbGUoJGZpbGUgPSAkZGlyLlxESVJFQ1RPUllfU0VQQVJBVE9SLiRuYW1lLiRzdWZmaXgpICYmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCBAaXNfZXhlY3V0YWJsZSgkZmlsZSkpKSB7CnJldHVybiAkZmlsZTsKfQp9Cn0KCnJldHVybiAkZGVmYXVsdDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIElucHV0U3RyZWFtIGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlCnsKCnByaXZhdGUgJG9uRW1wdHkgPSBudWxsOwpwcml2YXRlICRpbnB1dCA9IFtdOwpwcml2YXRlICRvcGVuID0gdHJ1ZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBvbkVtcHR5KGNhbGxhYmxlICRvbkVtcHR5ID0gbnVsbCkKewokdGhpcy0+b25FbXB0eSA9ICRvbkVtcHR5Owp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGlucHV0KQp7CmlmIChudWxsID09PSAkaW5wdXQpIHsKcmV0dXJuOwp9CmlmICgkdGhpcy0+aXNDbG9zZWQoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIGlzIGNsb3NlZC4nLCBzdGF0aWM6OmNsYXNzKSk7Cn0KJHRoaXMtPmlucHV0W10gPSBQcm9jZXNzVXRpbHM6OnZhbGlkYXRlSW5wdXQoX19NRVRIT0RfXywgJGlucHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKewokdGhpcy0+b3BlbiA9IGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNDbG9zZWQoKQp7CnJldHVybiAhJHRoaXMtPm9wZW47Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKQp7CiR0aGlzLT5vcGVuID0gdHJ1ZTsKCndoaWxlICgkdGhpcy0+b3BlbiB8fCAkdGhpcy0+aW5wdXQpIHsKaWYgKCEkdGhpcy0+aW5wdXQpIHsKeWllbGQgJyc7CmNvbnRpbnVlOwp9CiRjdXJyZW50ID0gYXJyYXlfc2hpZnQoJHRoaXMtPmlucHV0KTsKCmlmICgkY3VycmVudCBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewp5aWVsZCBmcm9tICRjdXJyZW50Owp9IGVsc2Ugewp5aWVsZCAkY3VycmVudDsKfQppZiAoISR0aGlzLT5pbnB1dCAmJiAkdGhpcy0+b3BlbiAmJiBudWxsICE9PSAkb25FbXB0eSA9ICR0aGlzLT5vbkVtcHR5KSB7CiR0aGlzLT53cml0ZSgkb25FbXB0eSgkdGhpcykpOwp9Cn0KfQp9CgpDb3B5cmlnaHQgKGMpIDIwMDQtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKCgoKCgoKY2xhc3MgUGhwRXhlY3V0YWJsZUZpbmRlcgp7CnByaXZhdGUgJGV4ZWN1dGFibGVGaW5kZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5leGVjdXRhYmxlRmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChib29sICRpbmNsdWRlQXJncyA9IHRydWUpCnsKaWYgKCRwaHAgPSBnZXRlbnYoJ1BIUF9CSU5BUlknKSkgewppZiAoIWlzX2V4ZWN1dGFibGUoJHBocCkpIHsKJGNvbW1hbmQgPSAnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/ICd3aGVyZScgOiAnY29tbWFuZCAtdic7CmlmICgkcGhwID0gc3RydG9rKGV4ZWMoJGNvbW1hbmQuJyAnLmVzY2FwZXNoZWxsYXJnKCRwaHApKSwgXFBIUF9FT0wpKSB7CmlmICghaXNfZXhlY3V0YWJsZSgkcGhwKSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBlbHNlIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCmlmIChAaXNfZGlyKCRwaHApKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICRwaHA7Cn0KCiRhcmdzID0gJHRoaXMtPmZpbmRBcmd1bWVudHMoKTsKJGFyZ3MgPSAkaW5jbHVkZUFyZ3MgJiYgJGFyZ3MgPyAnICcuaW1wbG9kZSgnICcsICRhcmdzKSA6ICcnOwoKCmlmIChcUEhQX0JJTkFSWSAmJiBcaW5fYXJyYXkoXFBIUF9TQVBJLCBbJ2NsaScsICdjbGktc2VydmVyJywgJ3BocGRiZyddLCB0cnVlKSkgewpyZXR1cm4gXFBIUF9CSU5BUlkuJGFyZ3M7Cn0KCmlmICgkcGhwID0gZ2V0ZW52KCdQSFBfUEFUSCcpKSB7CmlmICghQGlzX2V4ZWN1dGFibGUoJHBocCkgfHwgQGlzX2RpcigkcGhwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkcGhwOwp9CgppZiAoJHBocCA9IGdldGVudignUEhQX1BFQVJfUEhQX0JJTicpKSB7CmlmIChAaXNfZXhlY3V0YWJsZSgkcGhwKSAmJiAhQGlzX2RpcigkcGhwKSkgewpyZXR1cm4gJHBocDsKfQp9CgppZiAoQGlzX2V4ZWN1dGFibGUoJHBocCA9IFxQSFBfQklORElSLignXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/ICdcXHBocC5leGUnIDogJy9waHAnKSkgJiYgIUBpc19kaXIoJHBocCkpIHsKcmV0dXJuICRwaHA7Cn0KCiRkaXJzID0gW1xQSFBfQklORElSXTsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRkaXJzW10gPSAnQzpceGFtcHBccGhwXFwnOwp9CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXItPmZpbmQoJ3BocCcsIGZhbHNlLCAkZGlycyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRBcmd1bWVudHMoKQp7CiRhcmd1bWVudHMgPSBbXTsKaWYgKCdwaHBkYmcnID09PSBcUEhQX1NBUEkpIHsKJGFyZ3VtZW50c1tdID0gJy1xcnInOwp9CgpyZXR1cm4gJGFyZ3VtZW50czsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgpjbGFzcyBQaHBQcm9jZXNzIGV4dGVuZHMgUHJvY2Vzcwp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzY3JpcHQsIHN0cmluZyAkY3dkID0gbnVsbCwgYXJyYXkgJGVudiA9IG51bGwsIGludCAkdGltZW91dCA9IDYwLCBhcnJheSAkcGhwID0gbnVsbCkKewppZiAobnVsbCA9PT0gJHBocCkgewokZXhlY3V0YWJsZUZpbmRlciA9IG5ldyBQaHBFeGVjdXRhYmxlRmluZGVyKCk7CiRwaHAgPSAkZXhlY3V0YWJsZUZpbmRlci0+ZmluZChmYWxzZSk7CiRwaHAgPSBmYWxzZSA9PT0gJHBocCA/IG51bGwgOiBhcnJheV9tZXJnZShbJHBocF0sICRleGVjdXRhYmxlRmluZGVyLT5maW5kQXJndW1lbnRzKCkpOwp9CmlmICgncGhwZGJnJyA9PT0gXFBIUF9TQVBJKSB7CiRmaWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdkYmcnKTsKZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRzY3JpcHQpOwpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbigndW5saW5rJywgJGZpbGUpOwokcGhwW10gPSAkZmlsZTsKJHNjcmlwdCA9IG51bGw7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHBocCwgJGN3ZCwgJGVudiwgJHNjcmlwdCwgJHRpbWVvdXQpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TaGVsbENvbW1hbmRsaW5lKHN0cmluZyAkY29tbWFuZCwgc3RyaW5nICRjd2QgPSBudWxsLCBhcnJheSAkZW52ID0gbnVsbCwgJGlucHV0ID0gbnVsbCwgP2Zsb2F0ICR0aW1lb3V0ID0gNjApCnsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMoKSIgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgd2hlbiB1c2luZyAiJXMiLicsIF9fTUVUSE9EX18sIHNlbGY6OmNsYXNzKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydChjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pCnsKaWYgKG51bGwgPT09ICR0aGlzLT5nZXRDb21tYW5kTGluZSgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gZmluZCB0aGUgUEhQIGV4ZWN1dGFibGUuJyk7Cn0KCnBhcmVudDo6c3RhcnQoJGNhbGxiYWNrLCAkZW52KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGlwZXMgaW1wbGVtZW50cyBQaXBlc0ludGVyZmFjZQp7CnB1YmxpYyAkcGlwZXMgPSBbXTsKCnByaXZhdGUgJGlucHV0QnVmZmVyID0gJyc7CnByaXZhdGUgJGlucHV0Owpwcml2YXRlICRibG9ja2VkID0gdHJ1ZTsKcHJpdmF0ZSAkbGFzdEVycm9yOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCkKewppZiAoXGlzX3Jlc291cmNlKCRpbnB1dCkgfHwgJGlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKfSBlbHNlaWYgKFxpc19zdHJpbmcoJGlucHV0KSkgewokdGhpcy0+aW5wdXRCdWZmZXIgPSAkaW5wdXQ7Cn0gZWxzZSB7CiR0aGlzLT5pbnB1dEJ1ZmZlciA9IChzdHJpbmcpICRpbnB1dDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQp7CmZvcmVhY2ggKCR0aGlzLT5waXBlcyBhcyAkcGlwZSkgewppZiAoXGlzX3Jlc291cmNlKCRwaXBlKSkgewpmY2xvc2UoJHBpcGUpOwp9Cn0KJHRoaXMtPnBpcGVzID0gW107Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNTeXN0ZW1DYWxsQmVlbkludGVycnVwdGVkKCk6IGJvb2wKewokbGFzdEVycm9yID0gJHRoaXMtPmxhc3RFcnJvcjsKJHRoaXMtPmxhc3RFcnJvciA9IG51bGw7CgoKcmV0dXJuIG51bGwgIT09ICRsYXN0RXJyb3IgJiYgZmFsc2UgIT09IHN0cmlwb3MoJGxhc3RFcnJvciwgJ2ludGVycnVwdGVkIHN5c3RlbSBjYWxsJyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1bmJsb2NrKCkKewppZiAoISR0aGlzLT5ibG9ja2VkKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHRoaXMtPnBpcGVzIGFzICRwaXBlKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJHBpcGUsIDApOwp9CmlmIChcaXNfcmVzb3VyY2UoJHRoaXMtPmlucHV0KSkgewpzdHJlYW1fc2V0X2Jsb2NraW5nKCR0aGlzLT5pbnB1dCwgMCk7Cn0KCiR0aGlzLT5ibG9ja2VkID0gZmFsc2U7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlKCk6ID9hcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnBpcGVzWzBdKSkgewpyZXR1cm4gbnVsbDsKfQokaW5wdXQgPSAkdGhpcy0+aW5wdXQ7CgppZiAoJGlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CmlmICghJGlucHV0LT52YWxpZCgpKSB7CiRpbnB1dCA9IG51bGw7Cn0gZWxzZWlmIChcaXNfcmVzb3VyY2UoJGlucHV0ID0gJGlucHV0LT5jdXJyZW50KCkpKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJGlucHV0LCAwKTsKfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+aW5wdXRCdWZmZXJbMF0pKSB7CmlmICghXGlzX3N0cmluZygkaW5wdXQpKSB7CmlmICghXGlzX3NjYWxhcigkaW5wdXQpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzIiB5aWVsZGVkIGEgdmFsdWUgb2YgdHlwZSAiJXMiLCBidXQgb25seSBzY2FsYXJzIGFuZCBzdHJlYW0gcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQuJywgZ2V0X2RlYnVnX3R5cGUoJHRoaXMtPmlucHV0KSwgZ2V0X2RlYnVnX3R5cGUoJGlucHV0KSkpOwp9CiRpbnB1dCA9IChzdHJpbmcpICRpbnB1dDsKfQokdGhpcy0+aW5wdXRCdWZmZXIgPSAkaW5wdXQ7CiR0aGlzLT5pbnB1dC0+bmV4dCgpOwokaW5wdXQgPSBudWxsOwp9IGVsc2UgewokaW5wdXQgPSBudWxsOwp9Cn0KCiRyID0gJGUgPSBbXTsKJHcgPSBbJHRoaXMtPnBpcGVzWzBdXTsKCgppZiAoZmFsc2UgPT09IEBzdHJlYW1fc2VsZWN0KCRyLCAkdywgJGUsIDAsIDApKSB7CnJldHVybiBudWxsOwp9Cgpmb3JlYWNoICgkdyBhcyAkc3RkaW4pIHsKaWYgKGlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkpIHsKJHdyaXR0ZW4gPSBmd3JpdGUoJHN0ZGluLCAkdGhpcy0+aW5wdXRCdWZmZXIpOwokdGhpcy0+aW5wdXRCdWZmZXIgPSBzdWJzdHIoJHRoaXMtPmlucHV0QnVmZmVyLCAkd3JpdHRlbik7CmlmIChpc3NldCgkdGhpcy0+aW5wdXRCdWZmZXJbMF0pKSB7CnJldHVybiBbJHRoaXMtPnBpcGVzWzBdXTsKfQp9CgppZiAoJGlucHV0KSB7CndoaWxlICh0cnVlKSB7CiRkYXRhID0gZnJlYWQoJGlucHV0LCBzZWxmOjpDSFVOS19TSVpFKTsKaWYgKCFpc3NldCgkZGF0YVswXSkpIHsKYnJlYWs7Cn0KJHdyaXR0ZW4gPSBmd3JpdGUoJHN0ZGluLCAkZGF0YSk7CiRkYXRhID0gc3Vic3RyKCRkYXRhLCAkd3JpdHRlbik7CmlmIChpc3NldCgkZGF0YVswXSkpIHsKJHRoaXMtPmlucHV0QnVmZmVyID0gJGRhdGE7CgpyZXR1cm4gWyR0aGlzLT5waXBlc1swXV07Cn0KfQppZiAoZmVvZigkaW5wdXQpKSB7CmlmICgkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKJHRoaXMtPmlucHV0LT5uZXh0KCk7Cn0gZWxzZSB7CiR0aGlzLT5pbnB1dCA9IG51bGw7Cn0KfQp9Cn0KCgppZiAoIWlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkgJiYgISgkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IgPyAkdGhpcy0+aW5wdXQtPnZhbGlkKCkgOiAkdGhpcy0+aW5wdXQpKSB7CiR0aGlzLT5pbnB1dCA9IG51bGw7CmZjbG9zZSgkdGhpcy0+cGlwZXNbMF0pOwp1bnNldCgkdGhpcy0+cGlwZXNbMF0pOwp9IGVsc2VpZiAoISR3KSB7CnJldHVybiBbJHRoaXMtPnBpcGVzWzBdXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYW5kbGVFcnJvcihpbnQgJHR5cGUsIHN0cmluZyAkbXNnKQp7CiR0aGlzLT5sYXN0RXJyb3IgPSAkbXNnOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzOwoKCgoKCgoKCmludGVyZmFjZSBQaXBlc0ludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBDSFVOS19TSVpFID0gMTYzODQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlcygpOiBhcnJheTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRBbmRXcml0ZShib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UgPSBmYWxzZSk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyZU9wZW4oKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXZlUmVhZFN1cHBvcnQoKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCgoKY2xhc3MgVW5peFBpcGVzIGV4dGVuZHMgQWJzdHJhY3RQaXBlcwp7CnByaXZhdGUgJHR0eU1vZGU7CnByaXZhdGUgJHB0eU1vZGU7CnByaXZhdGUgJGhhdmVSZWFkU3VwcG9ydDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/Ym9vbCAkdHR5TW9kZSwgYm9vbCAkcHR5TW9kZSwgJGlucHV0LCBib29sICRoYXZlUmVhZFN1cHBvcnQpCnsKJHRoaXMtPnR0eU1vZGUgPSAkdHR5TW9kZTsKJHRoaXMtPnB0eU1vZGUgPSAkcHR5TW9kZTsKJHRoaXMtPmhhdmVSZWFkU3VwcG9ydCA9ICRoYXZlUmVhZFN1cHBvcnQ7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCk6IGFycmF5CnsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3Qgc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCB1bnNlcmlhbGl6ZSAnLl9fQ0xBU1NfXyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewokdGhpcy0+Y2xvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0b3JzKCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0KSB7CiRudWxsc3RyZWFtID0gZm9wZW4oJy9kZXYvbnVsbCcsICdjJyk7CgpyZXR1cm4gWwpbJ3BpcGUnLCAnciddLAokbnVsbHN0cmVhbSwKJG51bGxzdHJlYW0sCl07Cn0KCmlmICgkdGhpcy0+dHR5TW9kZSkgewpyZXR1cm4gWwpbJ2ZpbGUnLCAnL2Rldi90dHknLCAnciddLApbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddLApbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddLApdOwp9CgppZiAoJHRoaXMtPnB0eU1vZGUgJiYgUHJvY2Vzczo6aXNQdHlTdXBwb3J0ZWQoKSkgewpyZXR1cm4gWwpbJ3B0eSddLApbJ3B0eSddLApbJ3B0eSddLApdOwp9CgpyZXR1cm4gWwpbJ3BpcGUnLCAnciddLApbJ3BpcGUnLCAndyddLCAKWydwaXBlJywgJ3cnXSwgCl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlcygpOiBhcnJheQp7CnJldHVybiBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRBbmRXcml0ZShib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UgPSBmYWxzZSk6IGFycmF5CnsKJHRoaXMtPnVuYmxvY2soKTsKJHcgPSAkdGhpcy0+d3JpdGUoKTsKCiRyZWFkID0gJGUgPSBbXTsKJHIgPSAkdGhpcy0+cGlwZXM7CnVuc2V0KCRyWzBdKTsKCgpzZXRfZXJyb3JfaGFuZGxlcihbJHRoaXMsICdoYW5kbGVFcnJvciddKTsKaWYgKCgkciB8fCAkdykgJiYgZmFsc2UgPT09IHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkZSwgMCwgJGJsb2NraW5nID8gUHJvY2Vzczo6VElNRU9VVF9QUkVDSVNJT04gKiAxRTYgOiAwKSkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCgppZiAoISR0aGlzLT5oYXNTeXN0ZW1DYWxsQmVlbkludGVycnVwdGVkKCkpIHsKJHRoaXMtPnBpcGVzID0gW107Cn0KCnJldHVybiAkcmVhZDsKfQpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCmZvcmVhY2ggKCRyIGFzICRwaXBlKSB7CgoKJHJlYWRbJHR5cGUgPSBhcnJheV9zZWFyY2goJHBpcGUsICR0aGlzLT5waXBlcywgdHJ1ZSldID0gJyc7CgpkbyB7CiRkYXRhID0gQGZyZWFkKCRwaXBlLCBzZWxmOjpDSFVOS19TSVpFKTsKJHJlYWRbJHR5cGVdIC49ICRkYXRhOwp9IHdoaWxlIChpc3NldCgkZGF0YVswXSkgJiYgKCRjbG9zZSB8fCBpc3NldCgkZGF0YVtzZWxmOjpDSFVOS19TSVpFIC0gMV0pKSk7CgppZiAoIWlzc2V0KCRyZWFkWyR0eXBlXVswXSkpIHsKdW5zZXQoJHJlYWRbJHR5cGVdKTsKfQoKaWYgKCRjbG9zZSAmJiBmZW9mKCRwaXBlKSkgewpmY2xvc2UoJHBpcGUpOwp1bnNldCgkdGhpcy0+cGlwZXNbJHR5cGVdKTsKfQp9CgpyZXR1cm4gJHJlYWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXZlUmVhZFN1cHBvcnQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlT3BlbigpOiBib29sCnsKcmV0dXJuIChib29sKSAkdGhpcy0+cGlwZXM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXM7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgoKCgpjbGFzcyBXaW5kb3dzUGlwZXMgZXh0ZW5kcyBBYnN0cmFjdFBpcGVzCnsKcHJpdmF0ZSAkZmlsZXMgPSBbXTsKcHJpdmF0ZSAkZmlsZUhhbmRsZXMgPSBbXTsKcHJpdmF0ZSAkbG9ja0hhbmRsZXMgPSBbXTsKcHJpdmF0ZSAkcmVhZEJ5dGVzID0gWwpQcm9jZXNzOjpTVERPVVQgPT4gMCwKUHJvY2Vzczo6U1RERVJSID0+IDAsCl07CnByaXZhdGUgJGhhdmVSZWFkU3VwcG9ydDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQsIGJvb2wgJGhhdmVSZWFkU3VwcG9ydCkKewokdGhpcy0+aGF2ZVJlYWRTdXBwb3J0ID0gJGhhdmVSZWFkU3VwcG9ydDsKCmlmICgkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0KSB7CgoKCgokcGlwZXMgPSBbClByb2Nlc3M6OlNURE9VVCA9PiBQcm9jZXNzOjpPVVQsClByb2Nlc3M6OlNUREVSUiA9PiBQcm9jZXNzOjpFUlIsCl07CiR0bXBEaXIgPSBzeXNfZ2V0X3RlbXBfZGlyKCk7CiRsYXN0RXJyb3IgPSAndW5rbm93biByZWFzb24nOwpzZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoJHR5cGUsICRtc2cpIHVzZSAoJiRsYXN0RXJyb3IpIHsgJGxhc3RFcnJvciA9ICRtc2c7IH0pOwpmb3IgKCRpID0gMDs7ICsrJGkpIHsKZm9yZWFjaCAoJHBpcGVzIGFzICRwaXBlID0+ICRuYW1lKSB7CiRmaWxlID0gc3ByaW50ZignJXNcXHNmX3Byb2NfJTAyWC4lcycsICR0bXBEaXIsICRpLCAkbmFtZSk7CgppZiAoISRoID0gZm9wZW4oJGZpbGUuJy5sb2NrJywgJ3cnKSkgewppZiAoZmlsZV9leGlzdHMoJGZpbGUuJy5sb2NrJykpIHsKY29udGludWUgMjsKfQpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0EgdGVtcG9yYXJ5IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCB0byB3cml0ZSB0aGUgcHJvY2VzcyBvdXRwdXQ6ICcuJGxhc3RFcnJvcik7Cn0KaWYgKCFmbG9jaygkaCwgXExPQ0tfRVggfCBcTE9DS19OQikpIHsKY29udGludWUgMjsKfQppZiAoaXNzZXQoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSkpIHsKZmxvY2soJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSwgXExPQ0tfVU4pOwpmY2xvc2UoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSk7Cn0KJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSA9ICRoOwoKaWYgKCEoJGggPSBmb3BlbigkZmlsZSwgJ3cnKSkgfHwgIWZjbG9zZSgkaCkgfHwgISRoID0gZm9wZW4oJGZpbGUsICdyJykpIHsKZmxvY2soJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSwgXExPQ0tfVU4pOwpmY2xvc2UoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSk7CnVuc2V0KCR0aGlzLT5sb2NrSGFuZGxlc1skcGlwZV0pOwpjb250aW51ZSAyOwp9CiR0aGlzLT5maWxlSGFuZGxlc1skcGlwZV0gPSAkaDsKJHRoaXMtPmZpbGVzWyRwaXBlXSA9ICRmaWxlOwp9CmJyZWFrOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCk6IGFycmF5CnsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3Qgc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCB1bnNlcmlhbGl6ZSAnLl9fQ0xBU1NfXyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewokdGhpcy0+Y2xvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0b3JzKCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0KSB7CiRudWxsc3RyZWFtID0gZm9wZW4oJ05VTCcsICdjJyk7CgpyZXR1cm4gWwpbJ3BpcGUnLCAnciddLAokbnVsbHN0cmVhbSwKJG51bGxzdHJlYW0sCl07Cn0KCgoKCnJldHVybiBbClsncGlwZScsICdyJ10sClsnZmlsZScsICdOVUwnLCAndyddLApbJ2ZpbGUnLCAnTlVMJywgJ3cnXSwKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5maWxlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRBbmRXcml0ZShib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UgPSBmYWxzZSk6IGFycmF5CnsKJHRoaXMtPnVuYmxvY2soKTsKJHcgPSAkdGhpcy0+d3JpdGUoKTsKJHJlYWQgPSAkciA9ICRlID0gW107CgppZiAoJGJsb2NraW5nKSB7CmlmICgkdykgewpAc3RyZWFtX3NlbGVjdCgkciwgJHcsICRlLCAwLCBQcm9jZXNzOjpUSU1FT1VUX1BSRUNJU0lPTiAqIDFFNik7Cn0gZWxzZWlmICgkdGhpcy0+ZmlsZUhhbmRsZXMpIHsKdXNsZWVwKFByb2Nlc3M6OlRJTUVPVVRfUFJFQ0lTSU9OICogMUU2KTsKfQp9CmZvcmVhY2ggKCR0aGlzLT5maWxlSGFuZGxlcyBhcyAkdHlwZSA9PiAkZmlsZUhhbmRsZSkgewokZGF0YSA9IHN0cmVhbV9nZXRfY29udGVudHMoJGZpbGVIYW5kbGUsIC0xLCAkdGhpcy0+cmVhZEJ5dGVzWyR0eXBlXSk7CgppZiAoaXNzZXQoJGRhdGFbMF0pKSB7CiR0aGlzLT5yZWFkQnl0ZXNbJHR5cGVdICs9IFxzdHJsZW4oJGRhdGEpOwokcmVhZFskdHlwZV0gPSAkZGF0YTsKfQppZiAoJGNsb3NlKSB7CmZ0cnVuY2F0ZSgkZmlsZUhhbmRsZSwgMCk7CmZjbG9zZSgkZmlsZUhhbmRsZSk7CmZsb2NrKCR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0sIFxMT0NLX1VOKTsKZmNsb3NlKCR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0pOwp1bnNldCgkdGhpcy0+ZmlsZUhhbmRsZXNbJHR5cGVdLCAkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdKTsKfQp9CgpyZXR1cm4gJHJlYWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXZlUmVhZFN1cHBvcnQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlT3BlbigpOiBib29sCnsKcmV0dXJuICR0aGlzLT5waXBlcyAmJiAkdGhpcy0+ZmlsZUhhbmRsZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCnsKcGFyZW50OjpjbG9zZSgpOwpmb3JlYWNoICgkdGhpcy0+ZmlsZUhhbmRsZXMgYXMgJHR5cGUgPT4gJGhhbmRsZSkgewpmdHJ1bmNhdGUoJGhhbmRsZSwgMCk7CmZjbG9zZSgkaGFuZGxlKTsKZmxvY2soJHRoaXMtPmxvY2tIYW5kbGVzWyR0eXBlXSwgXExPQ0tfVU4pOwpmY2xvc2UoJHRoaXMtPmxvY2tIYW5kbGVzWyR0eXBlXSk7Cn0KJHRoaXMtPmZpbGVIYW5kbGVzID0gJHRoaXMtPmxvY2tIYW5kbGVzID0gW107Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxQcm9jZXNzRmFpbGVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXNcUGlwZXNJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzXFVuaXhQaXBlczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXNcV2luZG93c1BpcGVzOwoKCgoKCgoKCgoKY2xhc3MgUHJvY2VzcyBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7CnB1YmxpYyBjb25zdCBFUlIgPSAnZXJyJzsKcHVibGljIGNvbnN0IE9VVCA9ICdvdXQnOwoKcHVibGljIGNvbnN0IFNUQVRVU19SRUFEWSA9ICdyZWFkeSc7CnB1YmxpYyBjb25zdCBTVEFUVVNfU1RBUlRFRCA9ICdzdGFydGVkJzsKcHVibGljIGNvbnN0IFNUQVRVU19URVJNSU5BVEVEID0gJ3Rlcm1pbmF0ZWQnOwoKcHVibGljIGNvbnN0IFNURElOID0gMDsKcHVibGljIGNvbnN0IFNURE9VVCA9IDE7CnB1YmxpYyBjb25zdCBTVERFUlIgPSAyOwoKCnB1YmxpYyBjb25zdCBUSU1FT1VUX1BSRUNJU0lPTiA9IDAuMjsKCnB1YmxpYyBjb25zdCBJVEVSX05PTl9CTE9DS0lORyA9IDE7IApwdWJsaWMgY29uc3QgSVRFUl9LRUVQX09VVFBVVCA9IDI7IApwdWJsaWMgY29uc3QgSVRFUl9TS0lQX09VVCA9IDQ7IApwdWJsaWMgY29uc3QgSVRFUl9TS0lQX0VSUiA9IDg7IAoKcHJpdmF0ZSAkY2FsbGJhY2s7CnByaXZhdGUgJGhhc0NhbGxiYWNrID0gZmFsc2U7CnByaXZhdGUgJGNvbW1hbmRsaW5lOwpwcml2YXRlICRjd2Q7CnByaXZhdGUgJGVudiA9IFtdOwpwcml2YXRlICRpbnB1dDsKcHJpdmF0ZSAkc3RhcnR0aW1lOwpwcml2YXRlICRsYXN0T3V0cHV0VGltZTsKcHJpdmF0ZSAkdGltZW91dDsKcHJpdmF0ZSAkaWRsZVRpbWVvdXQ7CnByaXZhdGUgJGV4aXRjb2RlOwpwcml2YXRlICRmYWxsYmFja1N0YXR1cyA9IFtdOwpwcml2YXRlICRwcm9jZXNzSW5mb3JtYXRpb247CnByaXZhdGUgJG91dHB1dERpc2FibGVkID0gZmFsc2U7CnByaXZhdGUgJHN0ZG91dDsKcHJpdmF0ZSAkc3RkZXJyOwpwcml2YXRlICRwcm9jZXNzOwpwcml2YXRlICRzdGF0dXMgPSBzZWxmOjpTVEFUVVNfUkVBRFk7CnByaXZhdGUgJGluY3JlbWVudGFsT3V0cHV0T2Zmc2V0ID0gMDsKcHJpdmF0ZSAkaW5jcmVtZW50YWxFcnJvck91dHB1dE9mZnNldCA9IDA7CnByaXZhdGUgJHR0eSA9IGZhbHNlOwpwcml2YXRlICRwdHk7CnByaXZhdGUgJG9wdGlvbnMgPSBbJ3N1cHByZXNzX2Vycm9ycycgPT4gdHJ1ZSwgJ2J5cGFzc19zaGVsbCcgPT4gdHJ1ZV07Cgpwcml2YXRlICR1c2VGaWxlSGFuZGxlcyA9IGZhbHNlOwoKcHJpdmF0ZSAkcHJvY2Vzc1BpcGVzOwoKcHJpdmF0ZSAkbGF0ZXN0U2lnbmFsOwoKcHJpdmF0ZSBzdGF0aWMgJHNpZ2NoaWxkOwoKCgoKCgpwdWJsaWMgc3RhdGljICRleGl0Q29kZXMgPSBbCjAgPT4gJ09LJywKMSA9PiAnR2VuZXJhbCBlcnJvcicsCjIgPT4gJ01pc3VzZSBvZiBzaGVsbCBidWlsdGlucycsCgoxMjYgPT4gJ0ludm9rZWQgY29tbWFuZCBjYW5ub3QgZXhlY3V0ZScsCjEyNyA9PiAnQ29tbWFuZCBub3QgZm91bmQnLAoxMjggPT4gJ0ludmFsaWQgZXhpdCBhcmd1bWVudCcsCgoKMTI5ID0+ICdIYW5ndXAnLAoxMzAgPT4gJ0ludGVycnVwdCcsCjEzMSA9PiAnUXVpdCBhbmQgZHVtcCBjb3JlJywKMTMyID0+ICdJbGxlZ2FsIGluc3RydWN0aW9uJywKMTMzID0+ICdUcmFjZS9icmVha3BvaW50IHRyYXAnLAoxMzQgPT4gJ1Byb2Nlc3MgYWJvcnRlZCcsCjEzNSA9PiAnQnVzIGVycm9yOiAiYWNjZXNzIHRvIHVuZGVmaW5lZCBwb3J0aW9uIG9mIG1lbW9yeSBvYmplY3QiJywKMTM2ID0+ICdGbG9hdGluZyBwb2ludCBleGNlcHRpb246ICJlcnJvbmVvdXMgYXJpdGhtZXRpYyBvcGVyYXRpb24iJywKMTM3ID0+ICdLaWxsICh0ZXJtaW5hdGUgaW1tZWRpYXRlbHkpJywKMTM4ID0+ICdVc2VyLWRlZmluZWQgMScsCjEzOSA9PiAnU2VnbWVudGF0aW9uIHZpb2xhdGlvbicsCjE0MCA9PiAnVXNlci1kZWZpbmVkIDInLAoxNDEgPT4gJ1dyaXRlIHRvIHBpcGUgd2l0aCBubyBvbmUgcmVhZGluZycsCjE0MiA9PiAnU2lnbmFsIHJhaXNlZCBieSBhbGFybScsCjE0MyA9PiAnVGVybWluYXRpb24gKHJlcXVlc3QgdG8gdGVybWluYXRlKScsCgoxNDUgPT4gJ0NoaWxkIHByb2Nlc3MgdGVybWluYXRlZCwgc3RvcHBlZCAob3IgY29udGludWVkKiknLAoxNDYgPT4gJ0NvbnRpbnVlIGlmIHN0b3BwZWQnLAoxNDcgPT4gJ1N0b3AgZXhlY3V0aW5nIHRlbXBvcmFyaWx5JywKMTQ4ID0+ICdUZXJtaW5hbCBzdG9wIHNpZ25hbCcsCjE0OSA9PiAnQmFja2dyb3VuZCBwcm9jZXNzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHR0eSAoImluIiknLAoxNTAgPT4gJ0JhY2tncm91bmQgcHJvY2VzcyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHR0eSAoIm91dCIpJywKMTUxID0+ICdVcmdlbnQgZGF0YSBhdmFpbGFibGUgb24gc29ja2V0JywKMTUyID0+ICdDUFUgdGltZSBsaW1pdCBleGNlZWRlZCcsCjE1MyA9PiAnRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkJywKMTU0ID0+ICdTaWduYWwgcmFpc2VkIGJ5IHRpbWVyIGNvdW50aW5nIHZpcnR1YWwgdGltZTogInZpcnR1YWwgdGltZXIgZXhwaXJlZCInLAoxNTUgPT4gJ1Byb2ZpbGluZyB0aW1lciBleHBpcmVkJywKCjE1NyA9PiAnUG9sbGFibGUgZXZlbnQnLAoKMTU5ID0+ICdCYWQgc3lzY2FsbCcsCl07CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbW1hbmQsIHN0cmluZyAkY3dkID0gbnVsbCwgYXJyYXkgJGVudiA9IG51bGwsICRpbnB1dCA9IG51bGwsID9mbG9hdCAkdGltZW91dCA9IDYwKQp7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdUaGUgUHJvY2VzcyBjbGFzcyByZWxpZXMgb24gcHJvY19vcGVuLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uIHlvdXIgUEhQIGluc3RhbGxhdGlvbi4nKTsKfQoKJHRoaXMtPmNvbW1hbmRsaW5lID0gJGNvbW1hbmQ7CiR0aGlzLT5jd2QgPSAkY3dkOwoKCgoKCmlmIChudWxsID09PSAkdGhpcy0+Y3dkICYmIChcZGVmaW5lZCgnWkVORF9USFJFQURfU0FGRScpIHx8ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSkgewokdGhpcy0+Y3dkID0gZ2V0Y3dkKCk7Cn0KaWYgKG51bGwgIT09ICRlbnYpIHsKJHRoaXMtPnNldEVudigkZW52KTsKfQoKJHRoaXMtPnNldElucHV0KCRpbnB1dCk7CiR0aGlzLT5zZXRUaW1lb3V0KCR0aW1lb3V0KTsKJHRoaXMtPnVzZUZpbGVIYW5kbGVzID0gJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1I7CiR0aGlzLT5wdHkgPSBmYWxzZTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TaGVsbENvbW1hbmRsaW5lKHN0cmluZyAkY29tbWFuZCwgc3RyaW5nICRjd2QgPSBudWxsLCBhcnJheSAkZW52ID0gbnVsbCwgJGlucHV0ID0gbnVsbCwgP2Zsb2F0ICR0aW1lb3V0ID0gNjApCnsKJHByb2Nlc3MgPSBuZXcgc3RhdGljKFtdLCAkY3dkLCAkZW52LCAkaW5wdXQsICR0aW1lb3V0KTsKJHByb2Nlc3MtPmNvbW1hbmRsaW5lID0gJGNvbW1hbmQ7CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CmlmICgkdGhpcy0+b3B0aW9uc1snY3JlYXRlX25ld19jb25zb2xlJ10gPz8gZmFsc2UpIHsKJHRoaXMtPnByb2Nlc3NQaXBlcy0+Y2xvc2UoKTsKfSBlbHNlIHsKJHRoaXMtPnN0b3AoMCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5yZXNldFByb2Nlc3NEYXRhKCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bihjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pOiBpbnQKewokdGhpcy0+c3RhcnQoJGNhbGxiYWNrLCAkZW52KTsKCnJldHVybiAkdGhpcy0+d2FpdCgpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbXVzdFJ1bihjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pOiBzZWxmCnsKaWYgKDAgIT09ICR0aGlzLT5ydW4oJGNhbGxiYWNrLCAkZW52KSkgewp0aHJvdyBuZXcgUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbigkdGhpcyk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydChjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignUHJvY2VzcyBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7Cn0KCiR0aGlzLT5yZXNldFByb2Nlc3NEYXRhKCk7CiR0aGlzLT5zdGFydHRpbWUgPSAkdGhpcy0+bGFzdE91dHB1dFRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0aGlzLT5jYWxsYmFjayA9ICR0aGlzLT5idWlsZENhbGxiYWNrKCRjYWxsYmFjayk7CiR0aGlzLT5oYXNDYWxsYmFjayA9IG51bGwgIT09ICRjYWxsYmFjazsKJGRlc2NyaXB0b3JzID0gJHRoaXMtPmdldERlc2NyaXB0b3JzKCk7CgppZiAoJHRoaXMtPmVudikgewokZW52ICs9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCR0aGlzLT5lbnYsICRlbnYsICdzdHJjYXNlY21wJykgOiAkdGhpcy0+ZW52Owp9CgokZW52ICs9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCR0aGlzLT5nZXREZWZhdWx0RW52KCksICRlbnYsICdzdHJjYXNlY21wJykgOiAkdGhpcy0+Z2V0RGVmYXVsdEVudigpOwoKaWYgKFxpc19hcnJheSgkY29tbWFuZGxpbmUgPSAkdGhpcy0+Y29tbWFuZGxpbmUpKSB7CiRjb21tYW5kbGluZSA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWyR0aGlzLCAnZXNjYXBlQXJndW1lbnQnXSwgJGNvbW1hbmRsaW5lKSk7CgppZiAoJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKCiRjb21tYW5kbGluZSA9ICdleGVjICcuJGNvbW1hbmRsaW5lOwp9Cn0gZWxzZSB7CiRjb21tYW5kbGluZSA9ICR0aGlzLT5yZXBsYWNlUGxhY2Vob2xkZXJzKCRjb21tYW5kbGluZSwgJGVudik7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokY29tbWFuZGxpbmUgPSAkdGhpcy0+cHJlcGFyZVdpbmRvd3NDb21tYW5kTGluZSgkY29tbWFuZGxpbmUsICRlbnYpOwp9IGVsc2VpZiAoISR0aGlzLT51c2VGaWxlSGFuZGxlcyAmJiAkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewoKJGRlc2NyaXB0b3JzWzNdID0gWydwaXBlJywgJ3cnXTsKCgokY29tbWFuZGxpbmUgPSAneyAoJy4kY29tbWFuZGxpbmUuJykgPCYzIDM8Ji0gMz4vZGV2L251bGwgJiB9IDM8JjA7JzsKJGNvbW1hbmRsaW5lIC49ICdwaWQ9JCE7IGVjaG8gJHBpZCA+JjM7IHdhaXQgJHBpZCAyPi9kZXYvbnVsbDsgY29kZT0kPzsgZWNobyAkY29kZSA+JjM7IGV4aXQgJGNvZGUnOwoKCgokcHRzV29ya2Fyb3VuZCA9IGZvcGVuKF9fRklMRV9fLCAncicpOwp9CgokZW52UGFpcnMgPSBbXTsKZm9yZWFjaCAoJGVudiBhcyAkayA9PiAkdikgewppZiAoZmFsc2UgIT09ICR2ICYmIGZhbHNlID09PSBcaW5fYXJyYXkoJGssIFsnYXJnYycsICdhcmd2JywgJ0FSR0MnLCAnQVJHViddLCB0cnVlKSkgewokZW52UGFpcnNbXSA9ICRrLic9Jy4kdjsKfQp9CgppZiAoIWlzX2RpcigkdGhpcy0+Y3dkKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcHJvdmlkZWQgY3dkICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJHRoaXMtPmN3ZCkpOwp9CgokdGhpcy0+cHJvY2VzcyA9IEBwcm9jX29wZW4oJGNvbW1hbmRsaW5lLCAkZGVzY3JpcHRvcnMsICR0aGlzLT5wcm9jZXNzUGlwZXMtPnBpcGVzLCAkdGhpcy0+Y3dkLCAkZW52UGFpcnMsICR0aGlzLT5vcHRpb25zKTsKCmlmICghXGlzX3Jlc291cmNlKCR0aGlzLT5wcm9jZXNzKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIGxhdW5jaCBhIG5ldyBwcm9jZXNzLicpOwp9CiR0aGlzLT5zdGF0dXMgPSBzZWxmOjpTVEFUVVNfU1RBUlRFRDsKCmlmIChpc3NldCgkZGVzY3JpcHRvcnNbM10pKSB7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1sncGlkJ10gPSAoaW50KSBmZ2V0cygkdGhpcy0+cHJvY2Vzc1BpcGVzLT5waXBlc1szXSk7Cn0KCmlmICgkdGhpcy0+dHR5KSB7CnJldHVybjsKfQoKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CiR0aGlzLT5jaGVja1RpbWVvdXQoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzdGFydChjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pOiBzZWxmCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignUHJvY2VzcyBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7Cn0KCiRwcm9jZXNzID0gY2xvbmUgJHRoaXM7CiRwcm9jZXNzLT5zdGFydCgkY2FsbGJhY2ssICRlbnYpOwoKcmV0dXJuICRwcm9jZXNzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdChjYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKQp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZChfX0ZVTkNUSU9OX18pOwoKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgppZiAobnVsbCAhPT0gJGNhbGxiYWNrKSB7CmlmICghJHRoaXMtPnByb2Nlc3NQaXBlcy0+aGF2ZVJlYWRTdXBwb3J0KCkpIHsKJHRoaXMtPnN0b3AoMCk7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUGFzcyB0aGUgY2FsbGJhY2sgdG8gdGhlICJQcm9jZXNzOjpzdGFydCIgbWV0aG9kIG9yIGNhbGwgZW5hYmxlT3V0cHV0IHRvIHVzZSBhIGNhbGxiYWNrIHdpdGggIlByb2Nlc3M6OndhaXQiLicpOwp9CiR0aGlzLT5jYWxsYmFjayA9ICR0aGlzLT5idWlsZENhbGxiYWNrKCRjYWxsYmFjayk7Cn0KCmRvIHsKJHRoaXMtPmNoZWNrVGltZW91dCgpOwokcnVubmluZyA9ICR0aGlzLT5pc1J1bm5pbmcoKSAmJiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgJHRoaXMtPnByb2Nlc3NQaXBlcy0+YXJlT3BlbigpKTsKJHRoaXMtPnJlYWRQaXBlcygkcnVubmluZywgJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgISRydW5uaW5nKTsKfSB3aGlsZSAoJHJ1bm5pbmcpOwoKd2hpbGUgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7CnVzbGVlcCgxMDAwKTsKfQoKaWYgKCR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3NpZ25hbGVkJ10gJiYgJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsndGVybXNpZyddICE9PSAkdGhpcy0+bGF0ZXN0U2lnbmFsKSB7CnRocm93IG5ldyBQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb24oJHRoaXMpOwp9CgpyZXR1cm4gJHRoaXMtPmV4aXRjb2RlOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0VW50aWwoY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbAp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZChfX0ZVTkNUSU9OX18pOwokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKCmlmICghJHRoaXMtPnByb2Nlc3NQaXBlcy0+aGF2ZVJlYWRTdXBwb3J0KCkpIHsKJHRoaXMtPnN0b3AoMCk7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUGFzcyB0aGUgY2FsbGJhY2sgdG8gdGhlICJQcm9jZXNzOjpzdGFydCIgbWV0aG9kIG9yIGNhbGwgZW5hYmxlT3V0cHV0IHRvIHVzZSBhIGNhbGxiYWNrIHdpdGggIlByb2Nlc3M6OndhaXRVbnRpbCIuJyk7Cn0KJGNhbGxiYWNrID0gJHRoaXMtPmJ1aWxkQ2FsbGJhY2soJGNhbGxiYWNrKTsKCiRyZWFkeSA9IGZhbHNlOwp3aGlsZSAodHJ1ZSkgewokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7CiRydW5uaW5nID0gJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyAkdGhpcy0+aXNSdW5uaW5nKCkgOiAkdGhpcy0+cHJvY2Vzc1BpcGVzLT5hcmVPcGVuKCk7CiRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzc1BpcGVzLT5yZWFkQW5kV3JpdGUoJHJ1bm5pbmcsICdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICEkcnVubmluZyk7Cgpmb3JlYWNoICgkb3V0cHV0IGFzICR0eXBlID0+ICRkYXRhKSB7CmlmICgzICE9PSAkdHlwZSkgewokcmVhZHkgPSAkY2FsbGJhY2soc2VsZjo6U1RET1VUID09PSAkdHlwZSA/IHNlbGY6Ok9VVCA6IHNlbGY6OkVSUiwgJGRhdGEpIHx8ICRyZWFkeTsKfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3NpZ25hbGVkJ10pKSB7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snZXhpdGNvZGUnXSA9IChpbnQpICRkYXRhOwp9Cn0KaWYgKCRyZWFkeSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoISRydW5uaW5nKSB7CnJldHVybiBmYWxzZTsKfQoKdXNsZWVwKDEwMDApOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBpZCgpCnsKcmV0dXJuICR0aGlzLT5pc1J1bm5pbmcoKSA/ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3BpZCddIDogbnVsbDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2lnbmFsKGludCAkc2lnbmFsKQp7CiR0aGlzLT5kb1NpZ25hbCgkc2lnbmFsLCB0cnVlKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZU91dHB1dCgpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRGlzYWJsaW5nIG91dHB1dCB3aGlsZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGlzIG5vdCBwb3NzaWJsZS4nKTsKfQppZiAobnVsbCAhPT0gJHRoaXMtPmlkbGVUaW1lb3V0KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignT3V0cHV0IGNhbm5vdCBiZSBkaXNhYmxlZCB3aGlsZSBhbiBpZGxlIHRpbWVvdXQgaXMgc2V0LicpOwp9CgokdGhpcy0+b3V0cHV0RGlzYWJsZWQgPSB0cnVlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZU91dHB1dCgpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRW5hYmxpbmcgb3V0cHV0IHdoaWxlIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcgaXMgbm90IHBvc3NpYmxlLicpOwp9CgokdGhpcy0+b3V0cHV0RGlzYWJsZWQgPSBmYWxzZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNPdXRwdXREaXNhYmxlZCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXREaXNhYmxlZDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0KCkKewokdGhpcy0+cmVhZFBpcGVzRm9yT3V0cHV0KF9fRlVOQ1RJT05fXyk7CgppZiAoZmFsc2UgPT09ICRyZXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdGRvdXQsIC0xLCAwKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkcmV0Owp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbmNyZW1lbnRhbE91dHB1dCgpCnsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18pOwoKJGxhdGVzdCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPnN0ZG91dCwgLTEsICR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCk7CiR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IGZ0ZWxsKCR0aGlzLT5zdGRvdXQpOwoKaWYgKGZhbHNlID09PSAkbGF0ZXN0KSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICRsYXRlc3Q7Cn0KCgoKCgoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKGludCAkZmxhZ3MgPSAwKQp7CiR0aGlzLT5yZWFkUGlwZXNGb3JPdXRwdXQoX19GVU5DVElPTl9fLCBmYWxzZSk7CgokY2xlYXJPdXRwdXQgPSAhKHNlbGY6OklURVJfS0VFUF9PVVRQVVQgJiAkZmxhZ3MpOwokYmxvY2tpbmcgPSAhKHNlbGY6OklURVJfTk9OX0JMT0NLSU5HICYgJGZsYWdzKTsKJHlpZWxkT3V0ID0gIShzZWxmOjpJVEVSX1NLSVBfT1VUICYgJGZsYWdzKTsKJHlpZWxkRXJyID0gIShzZWxmOjpJVEVSX1NLSVBfRVJSICYgJGZsYWdzKTsKCndoaWxlIChudWxsICE9PSAkdGhpcy0+Y2FsbGJhY2sgfHwgKCR5aWVsZE91dCAmJiAhZmVvZigkdGhpcy0+c3Rkb3V0KSkgfHwgKCR5aWVsZEVyciAmJiAhZmVvZigkdGhpcy0+c3RkZXJyKSkpIHsKaWYgKCR5aWVsZE91dCkgewokb3V0ID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+c3Rkb3V0LCAtMSwgJHRoaXMtPmluY3JlbWVudGFsT3V0cHV0T2Zmc2V0KTsKCmlmIChpc3NldCgkb3V0WzBdKSkgewppZiAoJGNsZWFyT3V0cHV0KSB7CiR0aGlzLT5jbGVhck91dHB1dCgpOwp9IGVsc2UgewokdGhpcy0+aW5jcmVtZW50YWxPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3Rkb3V0KTsKfQoKeWllbGQgc2VsZjo6T1VUID0+ICRvdXQ7Cn0KfQoKaWYgKCR5aWVsZEVycikgewokZXJyID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+c3RkZXJyLCAtMSwgJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQpOwoKaWYgKGlzc2V0KCRlcnJbMF0pKSB7CmlmICgkY2xlYXJPdXRwdXQpIHsKJHRoaXMtPmNsZWFyRXJyb3JPdXRwdXQoKTsKfSBlbHNlIHsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3RkZXJyKTsKfQoKeWllbGQgc2VsZjo6RVJSID0+ICRlcnI7Cn0KfQoKaWYgKCEkYmxvY2tpbmcgJiYgIWlzc2V0KCRvdXRbMF0pICYmICFpc3NldCgkZXJyWzBdKSkgewp5aWVsZCBzZWxmOjpPVVQgPT4gJyc7Cn0KCiR0aGlzLT5jaGVja1RpbWVvdXQoKTsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18sICRibG9ja2luZyk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJPdXRwdXQoKQp7CmZ0cnVuY2F0ZSgkdGhpcy0+c3Rkb3V0LCAwKTsKZnNlZWsoJHRoaXMtPnN0ZG91dCwgMCk7CiR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IDA7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCkKewokdGhpcy0+cmVhZFBpcGVzRm9yT3V0cHV0KF9fRlVOQ1RJT05fXyk7CgppZiAoZmFsc2UgPT09ICRyZXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdGRlcnIsIC0xLCAwKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkcmV0Owp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jcmVtZW50YWxFcnJvck91dHB1dCgpCnsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18pOwoKJGxhdGVzdCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPnN0ZGVyciwgLTEsICR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0KTsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3RkZXJyKTsKCmlmIChmYWxzZSA9PT0gJGxhdGVzdCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkbGF0ZXN0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhckVycm9yT3V0cHV0KCkKewpmdHJ1bmNhdGUoJHRoaXMtPnN0ZGVyciwgMCk7CmZzZWVrKCR0aGlzLT5zdGRlcnIsIDApOwokdGhpcy0+aW5jcmVtZW50YWxFcnJvck91dHB1dE9mZnNldCA9IDA7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlKCkKewokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKCnJldHVybiAkdGhpcy0+ZXhpdGNvZGU7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlVGV4dCgpCnsKaWYgKG51bGwgPT09ICRleGl0Y29kZSA9ICR0aGlzLT5nZXRFeGl0Q29kZSgpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gc2VsZjo6JGV4aXRDb2Rlc1skZXhpdGNvZGVdID8/ICdVbmtub3duIGVycm9yJzsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTdWNjZXNzZnVsKCkKewpyZXR1cm4gMCA9PT0gJHRoaXMtPmdldEV4aXRDb2RlKCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNCZWVuU2lnbmFsZWQoKQp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzVGVybWluYXRlZChfX0ZVTkNUSU9OX18pOwoKcmV0dXJuICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3NpZ25hbGVkJ107Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGVybVNpZ25hbCgpCnsKJHRoaXMtPnJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKF9fRlVOQ1RJT05fXyk7CgppZiAoJHRoaXMtPmlzU2lnY2hpbGRFbmFibGVkKCkgJiYgLTEgPT09ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVGhpcyBQSFAgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCAtLWVuYWJsZS1zaWdjaGlsZC4gVGVybSBzaWduYWwgY2Fubm90IGJlIHJldHJpZXZlZC4nKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0JlZW5TdG9wcGVkKCkKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1Rlcm1pbmF0ZWQoX19GVU5DVElPTl9fKTsKCnJldHVybiAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzdG9wcGVkJ107Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdG9wU2lnbmFsKCkKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1Rlcm1pbmF0ZWQoX19GVU5DVElPTl9fKTsKCnJldHVybiAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzdG9wc2lnJ107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUnVubmluZygpCnsKaWYgKHNlbGY6OlNUQVRVU19TVEFSVEVEICE9PSAkdGhpcy0+c3RhdHVzKSB7CnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsncnVubmluZyddOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1N0YXJ0ZWQoKQp7CnJldHVybiBzZWxmOjpTVEFUVVNfUkVBRFkgIT0gJHRoaXMtPnN0YXR1czsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNUZXJtaW5hdGVkKCkKewokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKCnJldHVybiBzZWxmOjpTVEFUVVNfVEVSTUlOQVRFRCA9PSAkdGhpcy0+c3RhdHVzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1cygpCnsKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gJHRoaXMtPnN0YXR1czsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcChmbG9hdCAkdGltZW91dCA9IDEwLCBpbnQgJHNpZ25hbCA9IG51bGwpCnsKJHRpbWVvdXRNaWNybyA9IG1pY3JvdGltZSh0cnVlKSArICR0aW1lb3V0OwppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CgokdGhpcy0+ZG9TaWduYWwoMTUsIGZhbHNlKTsKZG8gewp1c2xlZXAoMTAwMCk7Cn0gd2hpbGUgKCR0aGlzLT5pc1J1bm5pbmcoKSAmJiBtaWNyb3RpbWUodHJ1ZSkgPCAkdGltZW91dE1pY3JvKTsKCmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKCgokdGhpcy0+ZG9TaWduYWwoJHNpZ25hbCA/OiA5LCBmYWxzZSk7Cn0KfQoKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewppZiAoaXNzZXQoJHRoaXMtPmZhbGxiYWNrU3RhdHVzWydwaWQnXSkpIHsKdW5zZXQoJHRoaXMtPmZhbGxiYWNrU3RhdHVzWydwaWQnXSk7CgpyZXR1cm4gJHRoaXMtPnN0b3AoMCwgJHNpZ25hbCk7Cn0KJHRoaXMtPmNsb3NlKCk7Cn0KCnJldHVybiAkdGhpcy0+ZXhpdGNvZGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE91dHB1dChzdHJpbmcgJGxpbmUpCnsKJHRoaXMtPmxhc3RPdXRwdXRUaW1lID0gbWljcm90aW1lKHRydWUpOwoKZnNlZWsoJHRoaXMtPnN0ZG91dCwgMCwgXFNFRUtfRU5EKTsKZndyaXRlKCR0aGlzLT5zdGRvdXQsICRsaW5lKTsKZnNlZWsoJHRoaXMtPnN0ZG91dCwgJHRoaXMtPmluY3JlbWVudGFsT3V0cHV0T2Zmc2V0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3JPdXRwdXQoc3RyaW5nICRsaW5lKQp7CiR0aGlzLT5sYXN0T3V0cHV0VGltZSA9IG1pY3JvdGltZSh0cnVlKTsKCmZzZWVrKCR0aGlzLT5zdGRlcnIsIDAsIFxTRUVLX0VORCk7CmZ3cml0ZSgkdGhpcy0+c3RkZXJyLCAkbGluZSk7CmZzZWVrKCR0aGlzLT5zdGRlcnIsICR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExhc3RPdXRwdXRUaW1lKCk6ID9mbG9hdAp7CnJldHVybiAkdGhpcy0+bGFzdE91dHB1dFRpbWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lKCkKewpyZXR1cm4gXGlzX2FycmF5KCR0aGlzLT5jb21tYW5kbGluZSkgPyBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKFskdGhpcywgJ2VzY2FwZUFyZ3VtZW50J10sICR0aGlzLT5jb21tYW5kbGluZSkpIDogJHRoaXMtPmNvbW1hbmRsaW5lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUaW1lb3V0KCkKewpyZXR1cm4gJHRoaXMtPnRpbWVvdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElkbGVUaW1lb3V0KCkKewpyZXR1cm4gJHRoaXMtPmlkbGVUaW1lb3V0Owp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dCg/ZmxvYXQgJHRpbWVvdXQpCnsKJHRoaXMtPnRpbWVvdXQgPSAkdGhpcy0+dmFsaWRhdGVUaW1lb3V0KCR0aW1lb3V0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJZGxlVGltZW91dCg/ZmxvYXQgJHRpbWVvdXQpCnsKaWYgKG51bGwgIT09ICR0aW1lb3V0ICYmICR0aGlzLT5vdXRwdXREaXNhYmxlZCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0lkbGUgdGltZW91dCBjYW5ub3QgYmUgc2V0IHdoaWxlIHRoZSBvdXRwdXQgaXMgZGlzYWJsZWQuJyk7Cn0KCiR0aGlzLT5pZGxlVGltZW91dCA9ICR0aGlzLT52YWxpZGF0ZVRpbWVvdXQoJHRpbWVvdXQpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFR0eShib29sICR0dHkpCnsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmICR0dHkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1RUWSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBwbGF0Zm9ybS4nKTsKfQoKaWYgKCR0dHkgJiYgIXNlbGY6OmlzVHR5U3VwcG9ydGVkKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1RUWSBtb2RlIHJlcXVpcmVzIC9kZXYvdHR5IHRvIGJlIHJlYWQvd3JpdGFibGUuJyk7Cn0KCiR0aGlzLT50dHkgPSAkdHR5OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1R0eSgpCnsKcmV0dXJuICR0aGlzLT50dHk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFB0eShib29sICRib29sKQp7CiR0aGlzLT5wdHkgPSAkYm9vbDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQdHkoKQp7CnJldHVybiAkdGhpcy0+cHR5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRXb3JraW5nRGlyZWN0b3J5KCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmN3ZCkgewoKCnJldHVybiBnZXRjd2QoKSA/OiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPmN3ZDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0V29ya2luZ0RpcmVjdG9yeShzdHJpbmcgJGN3ZCkKewokdGhpcy0+Y3dkID0gJGN3ZDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW52KCkKewpyZXR1cm4gJHRoaXMtPmVudjsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFbnYoYXJyYXkgJGVudikKewokdGhpcy0+ZW52ID0gJGVudjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKQp7CnJldHVybiAkdGhpcy0+aW5wdXQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElucHV0KCRpbnB1dCkKewppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignSW5wdXQgY2Fubm90IGJlIHNldCB3aGlsZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nLicpOwp9CgokdGhpcy0+aW5wdXQgPSBQcm9jZXNzVXRpbHM6OnZhbGlkYXRlSW5wdXQoX19NRVRIT0RfXywgJGlucHV0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2tUaW1lb3V0KCkKewppZiAoc2VsZjo6U1RBVFVTX1NUQVJURUQgIT09ICR0aGlzLT5zdGF0dXMpIHsKcmV0dXJuOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPnRpbWVvdXQgJiYgJHRoaXMtPnRpbWVvdXQgPCBtaWNyb3RpbWUodHJ1ZSkgLSAkdGhpcy0+c3RhcnR0aW1lKSB7CiR0aGlzLT5zdG9wKDApOwoKdGhyb3cgbmV3IFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbigkdGhpcywgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uOjpUWVBFX0dFTkVSQUwpOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmlkbGVUaW1lb3V0ICYmICR0aGlzLT5pZGxlVGltZW91dCA8IG1pY3JvdGltZSh0cnVlKSAtICR0aGlzLT5sYXN0T3V0cHV0VGltZSkgewokdGhpcy0+c3RvcCgwKTsKCnRocm93IG5ldyBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb24oJHRoaXMsIFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjo6VFlQRV9JRExFKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhcnRUaW1lKCk6IGZsb2F0CnsKaWYgKCEkdGhpcy0+aXNTdGFydGVkKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdTdGFydCB0aW1lIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHByb2Nlc3Mgc3RhcnQuJyk7Cn0KCnJldHVybiAkdGhpcy0+c3RhcnR0aW1lOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKGFycmF5ICRvcHRpb25zKQp7CmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1NldHRpbmcgb3B0aW9ucyB3aGlsZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGlzIG5vdCBwb3NzaWJsZS4nKTsKfQoKJGRlZmF1bHRPcHRpb25zID0gJHRoaXMtPm9wdGlvbnM7CiRleGlzdGluZ09wdGlvbnMgPSBbJ2Jsb2NraW5nX3BpcGVzJywgJ2NyZWF0ZV9wcm9jZXNzX2dyb3VwJywgJ2NyZWF0ZV9uZXdfY29uc29sZSddOwoKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFcaW5fYXJyYXkoJGtleSwgJGV4aXN0aW5nT3B0aW9ucykpIHsKJHRoaXMtPm9wdGlvbnMgPSAkZGVmYXVsdE9wdGlvbnM7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIG9wdGlvbiAiJXMiIHBhc3NlZCB0byAiJXMoKSIuIFN1cHBvcnRlZCBvcHRpb25zIGFyZSAiJXMiLicsICRrZXksIF9fTUVUSE9EX18sIGltcGxvZGUoJyIsICInLCAkZXhpc3RpbmdPcHRpb25zKSkpOwp9CiR0aGlzLT5vcHRpb25zWyRrZXldID0gJHZhbHVlOwp9Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNUdHlTdXBwb3J0ZWQoKTogYm9vbAp7CnN0YXRpYyAkaXNUdHlTdXBwb3J0ZWQ7CgppZiAobnVsbCA9PT0gJGlzVHR5U3VwcG9ydGVkKSB7CiRpc1R0eVN1cHBvcnRlZCA9IChib29sKSBAcHJvY19vcGVuKCdlY2hvIDEgPi9kZXYvbnVsbCcsIFtbJ2ZpbGUnLCAnL2Rldi90dHknLCAnciddLCBbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddLCBbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddXSwgJHBpcGVzKTsKfQoKcmV0dXJuICRpc1R0eVN1cHBvcnRlZDsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUHR5U3VwcG9ydGVkKCkKewpzdGF0aWMgJHJlc3VsdDsKCmlmIChudWxsICE9PSAkcmVzdWx0KSB7CnJldHVybiAkcmVzdWx0Owp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKcmV0dXJuICRyZXN1bHQgPSBmYWxzZTsKfQoKcmV0dXJuICRyZXN1bHQgPSAoYm9vbCkgQHByb2Nfb3BlbignZWNobyAxID4vZGV2L251bGwnLCBbWydwdHknXSwgWydwdHknXSwgWydwdHknXV0sICRwaXBlcyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXkKewppZiAoJHRoaXMtPmlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CiR0aGlzLT5pbnB1dC0+cmV3aW5kKCk7Cn0KaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiR0aGlzLT5wcm9jZXNzUGlwZXMgPSBuZXcgV2luZG93c1BpcGVzKCR0aGlzLT5pbnB1dCwgISR0aGlzLT5vdXRwdXREaXNhYmxlZCB8fCAkdGhpcy0+aGFzQ2FsbGJhY2spOwp9IGVsc2UgewokdGhpcy0+cHJvY2Vzc1BpcGVzID0gbmV3IFVuaXhQaXBlcygkdGhpcy0+aXNUdHkoKSwgJHRoaXMtPmlzUHR5KCksICR0aGlzLT5pbnB1dCwgISR0aGlzLT5vdXRwdXREaXNhYmxlZCB8fCAkdGhpcy0+aGFzQ2FsbGJhY2spOwp9CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3NQaXBlcy0+Z2V0RGVzY3JpcHRvcnMoKTsKfQoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBidWlsZENhbGxiYWNrKGNhbGxhYmxlICRjYWxsYmFjayA9IG51bGwpCnsKaWYgKCR0aGlzLT5vdXRwdXREaXNhYmxlZCkgewpyZXR1cm4gZnVuY3Rpb24gKCR0eXBlLCAkZGF0YSkgdXNlICgkY2FsbGJhY2spOiBib29sIHsKcmV0dXJuIG51bGwgIT09ICRjYWxsYmFjayAmJiAkY2FsbGJhY2soJHR5cGUsICRkYXRhKTsKfTsKfQoKJG91dCA9IHNlbGY6Ok9VVDsKCnJldHVybiBmdW5jdGlvbiAoJHR5cGUsICRkYXRhKSB1c2UgKCRjYWxsYmFjaywgJG91dCk6IGJvb2wgewppZiAoJG91dCA9PSAkdHlwZSkgewokdGhpcy0+YWRkT3V0cHV0KCRkYXRhKTsKfSBlbHNlIHsKJHRoaXMtPmFkZEVycm9yT3V0cHV0KCRkYXRhKTsKfQoKcmV0dXJuIG51bGwgIT09ICRjYWxsYmFjayAmJiAkY2FsbGJhY2soJHR5cGUsICRkYXRhKTsKfTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKGJvb2wgJGJsb2NraW5nKQp7CmlmIChzZWxmOjpTVEFUVVNfU1RBUlRFRCAhPT0gJHRoaXMtPnN0YXR1cykgewpyZXR1cm47Cn0KCiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb24gPSBwcm9jX2dldF9zdGF0dXMoJHRoaXMtPnByb2Nlc3MpOwokcnVubmluZyA9ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3J1bm5pbmcnXTsKCiR0aGlzLT5yZWFkUGlwZXMoJHJ1bm5pbmcgJiYgJGJsb2NraW5nLCAnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAhJHJ1bm5pbmcpOwoKaWYgKCR0aGlzLT5mYWxsYmFja1N0YXR1cyAmJiAkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uID0gJHRoaXMtPmZhbGxiYWNrU3RhdHVzICsgJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvbjsKfQoKaWYgKCEkcnVubmluZykgewokdGhpcy0+Y2xvc2UoKTsKfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc1NpZ2NoaWxkRW5hYmxlZCgpCnsKaWYgKG51bGwgIT09IHNlbGY6OiRzaWdjaGlsZCkgewpyZXR1cm4gc2VsZjo6JHNpZ2NoaWxkOwp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3BocGluZm8nKSkgewpyZXR1cm4gc2VsZjo6JHNpZ2NoaWxkID0gZmFsc2U7Cn0KCm9iX3N0YXJ0KCk7CnBocGluZm8oXElORk9fR0VORVJBTCk7CgpyZXR1cm4gc2VsZjo6JHNpZ2NoaWxkID0gc3RyX2NvbnRhaW5zKG9iX2dldF9jbGVhbigpLCAnLS1lbmFibGUtc2lnY2hpbGQnKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRQaXBlc0Zvck91dHB1dChzdHJpbmcgJGNhbGxlciwgYm9vbCAkYmxvY2tpbmcgPSBmYWxzZSkKewppZiAoJHRoaXMtPm91dHB1dERpc2FibGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignT3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkLicpOwp9CgokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoJGNhbGxlcik7CgokdGhpcy0+dXBkYXRlU3RhdHVzKCRibG9ja2luZyk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVRpbWVvdXQoP2Zsb2F0ICR0aW1lb3V0KTogP2Zsb2F0CnsKJHRpbWVvdXQgPSAoZmxvYXQpICR0aW1lb3V0OwoKaWYgKDAuMCA9PT0gJHRpbWVvdXQpIHsKJHRpbWVvdXQgPSBudWxsOwp9IGVsc2VpZiAoJHRpbWVvdXQgPCAwKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSB0aW1lb3V0IHZhbHVlIG11c3QgYmUgYSB2YWxpZCBwb3NpdGl2ZSBpbnRlZ2VyIG9yIGZsb2F0IG51bWJlci4nKTsKfQoKcmV0dXJuICR0aW1lb3V0Owp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRQaXBlcyhib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UpCnsKJHJlc3VsdCA9ICR0aGlzLT5wcm9jZXNzUGlwZXMtPnJlYWRBbmRXcml0ZSgkYmxvY2tpbmcsICRjbG9zZSk7CgokY2FsbGJhY2sgPSAkdGhpcy0+Y2FsbGJhY2s7CmZvcmVhY2ggKCRyZXN1bHQgYXMgJHR5cGUgPT4gJGRhdGEpIHsKaWYgKDMgIT09ICR0eXBlKSB7CiRjYWxsYmFjayhzZWxmOjpTVERPVVQgPT09ICR0eXBlID8gc2VsZjo6T1VUIDogc2VsZjo6RVJSLCAkZGF0YSk7Cn0gZWxzZWlmICghaXNzZXQoJHRoaXMtPmZhbGxiYWNrU3RhdHVzWydzaWduYWxlZCddKSkgewokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ2V4aXRjb2RlJ10gPSAoaW50KSAkZGF0YTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjbG9zZSgpOiBpbnQKewokdGhpcy0+cHJvY2Vzc1BpcGVzLT5jbG9zZSgpOwppZiAoXGlzX3Jlc291cmNlKCR0aGlzLT5wcm9jZXNzKSkgewpwcm9jX2Nsb3NlKCR0aGlzLT5wcm9jZXNzKTsKfQokdGhpcy0+ZXhpdGNvZGUgPSAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydleGl0Y29kZSddOwokdGhpcy0+c3RhdHVzID0gc2VsZjo6U1RBVFVTX1RFUk1JTkFURUQ7CgppZiAoLTEgPT09ICR0aGlzLT5leGl0Y29kZSkgewppZiAoJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnc2lnbmFsZWQnXSAmJiAwIDwgJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsndGVybXNpZyddKSB7CgokdGhpcy0+ZXhpdGNvZGUgPSAxMjggKyAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ107Cn0gZWxzZWlmICgkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzaWduYWxlZCddID0gdHJ1ZTsKJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsndGVybXNpZyddID0gLTE7Cn0KfQoKCgoKJHRoaXMtPmNhbGxiYWNrID0gbnVsbDsKCnJldHVybiAkdGhpcy0+ZXhpdGNvZGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzZXRQcm9jZXNzRGF0YSgpCnsKJHRoaXMtPnN0YXJ0dGltZSA9IG51bGw7CiR0aGlzLT5jYWxsYmFjayA9IG51bGw7CiR0aGlzLT5leGl0Y29kZSA9IG51bGw7CiR0aGlzLT5mYWxsYmFja1N0YXR1cyA9IFtdOwokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uID0gbnVsbDsKJHRoaXMtPnN0ZG91dCA9IGZvcGVuKCdwaHA6Ly90ZW1wL21heG1lbW9yeTonLigxMDI0ICogMTAyNCksICd3KycpOwokdGhpcy0+c3RkZXJyID0gZm9wZW4oJ3BocDovL3RlbXAvbWF4bWVtb3J5OicuKDEwMjQgKiAxMDI0KSwgJ3crJyk7CiR0aGlzLT5wcm9jZXNzID0gbnVsbDsKJHRoaXMtPmxhdGVzdFNpZ25hbCA9IG51bGw7CiR0aGlzLT5zdGF0dXMgPSBzZWxmOjpTVEFUVVNfUkVBRFk7CiR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IDA7CiR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0ID0gMDsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TaWduYWwoaW50ICRzaWduYWwsIGJvb2wgJHRocm93RXhjZXB0aW9uKTogYm9vbAp7CmlmIChudWxsID09PSAkcGlkID0gJHRoaXMtPmdldFBpZCgpKSB7CmlmICgkdGhyb3dFeGNlcHRpb24pIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdDYW5ub3Qgc2VuZCBzaWduYWwgb24gYSBub24gcnVubmluZyBwcm9jZXNzLicpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewpleGVjKHNwcmludGYoJ3Rhc2traWxsIC9GIC9UIC9QSUQgJWQgMj4mMScsICRwaWQpLCAkb3V0cHV0LCAkZXhpdENvZGUpOwppZiAoJGV4aXRDb2RlICYmICR0aGlzLT5pc1J1bm5pbmcoKSkgewppZiAoJHRocm93RXhjZXB0aW9uKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBraWxsIHRoZSBwcm9jZXNzICglcykuJywgaW1wbG9kZSgnICcsICRvdXRwdXQpKSk7Cn0KCnJldHVybiBmYWxzZTsKfQp9IGVsc2UgewppZiAoISR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpKSB7CiRvayA9IEBwcm9jX3Rlcm1pbmF0ZSgkdGhpcy0+cHJvY2VzcywgJHNpZ25hbCk7Cn0gZWxzZWlmIChcZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9raWxsJykpIHsKJG9rID0gQHBvc2l4X2tpbGwoJHBpZCwgJHNpZ25hbCk7Cn0gZWxzZWlmICgkb2sgPSBwcm9jX29wZW4oc3ByaW50Zigna2lsbCAtJWQgJWQnLCAkc2lnbmFsLCAkcGlkKSwgWzIgPT4gWydwaXBlJywgJ3cnXV0sICRwaXBlcykpIHsKJG9rID0gZmFsc2UgPT09IGZnZXRzKCRwaXBlc1syXSk7Cn0KaWYgKCEkb2spIHsKaWYgKCR0aHJvd0V4Y2VwdGlvbikgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdFcnJvciB3aGlsZSBzZW5kaW5nIHNpZ25hbCAiJXMiLicsICRzaWduYWwpKTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0KCiR0aGlzLT5sYXRlc3RTaWduYWwgPSAkc2lnbmFsOwokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3NpZ25hbGVkJ10gPSB0cnVlOwokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ2V4aXRjb2RlJ10gPSAtMTsKJHRoaXMtPmZhbGxiYWNrU3RhdHVzWyd0ZXJtc2lnJ10gPSAkdGhpcy0+bGF0ZXN0U2lnbmFsOwoKcmV0dXJuIHRydWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZVdpbmRvd3NDb21tYW5kTGluZShzdHJpbmcgJGNtZCwgYXJyYXkgJiRlbnYpOiBzdHJpbmcKewokdWlkID0gdW5pcWlkKCcnLCB0cnVlKTsKJHZhckNvdW50ID0gMDsKJHZhckNhY2hlID0gW107CiRjbWQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCicvIig/OigKICAgICAgICAgICAgICAgIFteIiUhXl0qKwogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86ICFMRiEgfCAiKD86XF5bJSFeXSk/KyIgKQogICAgICAgICAgICAgICAgICAgIFteIiUhXl0qKwogICAgICAgICAgICAgICAgKSsrCiAgICAgICAgICAgICkgfCBbXiJdKisgKSIveCcsCmZ1bmN0aW9uICgkbSkgdXNlICgmJGVudiwgJiR2YXJDYWNoZSwgJiR2YXJDb3VudCwgJHVpZCkgewppZiAoIWlzc2V0KCRtWzFdKSkgewpyZXR1cm4gJG1bMF07Cn0KaWYgKGlzc2V0KCR2YXJDYWNoZVskbVswXV0pKSB7CnJldHVybiAkdmFyQ2FjaGVbJG1bMF1dOwp9CmlmIChzdHJfY29udGFpbnMoJHZhbHVlID0gJG1bMV0sICJcMCIpKSB7CiR2YWx1ZSA9IHN0cl9yZXBsYWNlKCJcMCIsICc/JywgJHZhbHVlKTsKfQppZiAoZmFsc2UgPT09IHN0cnBicmsoJHZhbHVlLCAiXCIlIVxuIikpIHsKcmV0dXJuICciJy4kdmFsdWUuJyInOwp9CgokdmFsdWUgPSBzdHJfcmVwbGFjZShbJyFMRiEnLCAnIl4hIicsICciXiUiJywgJyJeXiInLCAnIiInXSwgWyJcbiIsICchJywgJyUnLCAnXicsICciJ10sICR2YWx1ZSk7CiR2YWx1ZSA9ICciJy5wcmVnX3JlcGxhY2UoJy8oXFxcXCopIi8nLCAnJDEkMVxcIicsICR2YWx1ZSkuJyInOwokdmFyID0gJHVpZC4rKyR2YXJDb3VudDsKCiRlbnZbJHZhcl0gPSAkdmFsdWU7CgpyZXR1cm4gJHZhckNhY2hlWyRtWzBdXSA9ICchJy4kdmFyLichJzsKfSwKJGNtZAopOwoKJGNtZCA9ICdjbWQgL1Y6T04gL0U6T04gL0QgL0MgKCcuc3RyX3JlcGxhY2UoIlxuIiwgJyAnLCAkY21kKS4nKSc7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzUGlwZXMtPmdldEZpbGVzKCkgYXMgJG9mZnNldCA9PiAkZmlsZW5hbWUpIHsKJGNtZCAuPSAnICcuJG9mZnNldC4nPiInLiRmaWxlbmFtZS4nIic7Cn0KCnJldHVybiAkY21kOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoc3RyaW5nICRmdW5jdGlvbk5hbWUpCnsKaWYgKCEkdGhpcy0+aXNTdGFydGVkKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1Byb2Nlc3MgbXVzdCBiZSBzdGFydGVkIGJlZm9yZSBjYWxsaW5nICIlcygpIi4nLCAkZnVuY3Rpb25OYW1lKSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKHN0cmluZyAkZnVuY3Rpb25OYW1lKQp7CmlmICghJHRoaXMtPmlzVGVybWluYXRlZCgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdQcm9jZXNzIG11c3QgYmUgdGVybWluYXRlZCBiZWZvcmUgY2FsbGluZyAiJXMoKSIuJywgJGZ1bmN0aW9uTmFtZSkpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlQXJndW1lbnQoP3N0cmluZyAkYXJndW1lbnQpOiBzdHJpbmcKewppZiAoJycgPT09ICRhcmd1bWVudCB8fCBudWxsID09PSAkYXJndW1lbnQpIHsKcmV0dXJuICciIic7Cn0KaWYgKCdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJndW1lbnQpLiInIjsKfQppZiAoc3RyX2NvbnRhaW5zKCRhcmd1bWVudCwgIlwwIikpIHsKJGFyZ3VtZW50ID0gc3RyX3JlcGxhY2UoIlwwIiwgJz8nLCAkYXJndW1lbnQpOwp9CmlmICghcHJlZ19tYXRjaCgnL1tcLygpJSFeIjw+Jnxcc10vJywgJGFyZ3VtZW50KSkgewpyZXR1cm4gJGFyZ3VtZW50Owp9CiRhcmd1bWVudCA9IHByZWdfcmVwbGFjZSgnLyhcXFxcKykkLycsICckMSQxJywgJGFyZ3VtZW50KTsKCnJldHVybiAnIicuc3RyX3JlcGxhY2UoWyciJywgJ14nLCAnJScsICchJywgIlxuIl0sIFsnIiInLCAnIl5eIicsICciXiUiJywgJyJeISInLCAnIUxGISddLCAkYXJndW1lbnQpLiciJzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzKHN0cmluZyAkY29tbWFuZGxpbmUsIGFycmF5ICRlbnYpCnsKcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyJcJFx7OihbX2EtekEtWl0rK1tfYS16QS1aMC05XSorKVx9Ii8nLCBmdW5jdGlvbiAoJG1hdGNoZXMpIHVzZSAoJGNvbW1hbmRsaW5lLCAkZW52KSB7CmlmICghaXNzZXQoJGVudlskbWF0Y2hlc1sxXV0pIHx8IGZhbHNlID09PSAkZW52WyRtYXRjaGVzWzFdXSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgbGluZSBpcyBtaXNzaW5nIGEgdmFsdWUgZm9yIHBhcmFtZXRlciAiJXMiOiAnLCAkbWF0Y2hlc1sxXSkuJGNvbW1hbmRsaW5lKTsKfQoKcmV0dXJuICR0aGlzLT5lc2NhcGVBcmd1bWVudCgkZW52WyRtYXRjaGVzWzFdXSk7Cn0sICRjb21tYW5kbGluZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdEVudigpOiBhcnJheQp7CiRlbnYgPSBnZXRlbnYoKTsKJGVudiA9ICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/IGFycmF5X2ludGVyc2VjdF91a2V5KCRlbnYsICRfU0VSVkVSLCAnc3RyY2FzZWNtcCcpIDogYXJyYXlfaW50ZXJzZWN0X2tleSgkZW52LCAkX1NFUlZFUikpID86ICRlbnY7CgpyZXR1cm4gJF9FTlYgKyAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyBhcnJheV9kaWZmX3VrZXkoJGVudiwgJF9FTlYsICdzdHJjYXNlY21wJykgOiAkZW52KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgUHJvY2Vzc1V0aWxzCnsKCgoKcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChzdHJpbmcgJGNhbGxlciwgJGlucHV0KQp7CmlmIChudWxsICE9PSAkaW5wdXQpIHsKaWYgKFxpc19yZXNvdXJjZSgkaW5wdXQpKSB7CnJldHVybiAkaW5wdXQ7Cn0KaWYgKFxpc19zdHJpbmcoJGlucHV0KSkgewpyZXR1cm4gJGlucHV0Owp9CmlmIChcaXNfc2NhbGFyKCRpbnB1dCkpIHsKcmV0dXJuIChzdHJpbmcpICRpbnB1dDsKfQppZiAoJGlucHV0IGluc3RhbmNlb2YgUHJvY2VzcykgewpyZXR1cm4gJGlucHV0LT5nZXRJdGVyYXRvcigkaW5wdXQ6OklURVJfU0tJUF9FUlIpOwp9CmlmICgkaW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKcmV0dXJuICRpbnB1dDsKfQppZiAoJGlucHV0IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBuZXcgXEl0ZXJhdG9ySXRlcmF0b3IoJGlucHV0KTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIG9ubHkgYWNjZXB0cyBzdHJpbmdzLCBUcmF2ZXJzYWJsZSBvYmplY3RzIG9yIHN0cmVhbSByZXNvdXJjZXMuJywgJGNhbGxlcikpOwp9CgpyZXR1cm4gJGlucHV0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXEF0dHJpYnV0ZTsKCgoKCgoKCgoKI1tcQXR0cmlidXRlKFxBdHRyaWJ1dGU6OlRBUkdFVF9NRVRIT0QgfCBcQXR0cmlidXRlOjpUQVJHRVRfUFJPUEVSVFkpXQpmaW5hbCBjbGFzcyBSZXF1aXJlZAp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXEF0dHJpYnV0ZTsKCnVzZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFNlcnZpY2VTdWJzY3JpYmVyVHJhaXQ7CgoKCgoKCgojW1xBdHRyaWJ1dGUoXEF0dHJpYnV0ZTo6VEFSR0VUX01FVEhPRCldCmZpbmFsIGNsYXNzIFN1YnNjcmliZWRTZXJ2aWNlCnsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKcHVibGljID9zdHJpbmcgJGtleSA9IG51bGwKKSB7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgUmVzZXRJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7Cgp1c2UgUHNyXENvbnRhaW5lclxDb250YWluZXJFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBQc3JcQ29udGFpbmVyXE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlOwoKCmNsYXNzX2V4aXN0cyhDb250YWluZXJFeGNlcHRpb25JbnRlcmZhY2U6OmNsYXNzKTsKY2xhc3NfZXhpc3RzKE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CgoKCgoKCgp0cmFpdCBTZXJ2aWNlTG9jYXRvclRyYWl0CnsKcHJpdmF0ZSAkZmFjdG9yaWVzOwpwcml2YXRlICRsb2FkaW5nID0gW107CnByaXZhdGUgJHByb3ZpZGVkVHlwZXM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGZhY3RvcmllcykKewokdGhpcy0+ZmFjdG9yaWVzID0gJGZhY3RvcmllczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkaWQpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJGlkXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJGlkKQp7CmlmICghaXNzZXQoJHRoaXMtPmZhY3Rvcmllc1skaWRdKSkgewp0aHJvdyAkdGhpcy0+Y3JlYXRlTm90Rm91bmRFeGNlcHRpb24oJGlkKTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5sb2FkaW5nWyRpZF0pKSB7CiRpZHMgPSBhcnJheV92YWx1ZXMoJHRoaXMtPmxvYWRpbmcpOwokaWRzID0gXGFycmF5X3NsaWNlKCR0aGlzLT5sb2FkaW5nLCBhcnJheV9zZWFyY2goJGlkLCAkaWRzKSk7CiRpZHNbXSA9ICRpZDsKCnRocm93ICR0aGlzLT5jcmVhdGVDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbigkaWQsICRpZHMpOwp9CgokdGhpcy0+bG9hZGluZ1skaWRdID0gJGlkOwp0cnkgewpyZXR1cm4gJHRoaXMtPmZhY3Rvcmllc1skaWRdKCR0aGlzKTsKfSBmaW5hbGx5IHsKdW5zZXQoJHRoaXMtPmxvYWRpbmdbJGlkXSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVkU2VydmljZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPnByb3ZpZGVkVHlwZXMpIHsKJHRoaXMtPnByb3ZpZGVkVHlwZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5mYWN0b3JpZXMgYXMgJG5hbWUgPT4gJGZhY3RvcnkpIHsKaWYgKCFcaXNfY2FsbGFibGUoJGZhY3RvcnkpKSB7CiR0aGlzLT5wcm92aWRlZFR5cGVzWyRuYW1lXSA9ICc/JzsKfSBlbHNlIHsKJHR5cGUgPSAobmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGZhY3RvcnkpKS0+Z2V0UmV0dXJuVHlwZSgpOwoKJHRoaXMtPnByb3ZpZGVkVHlwZXNbJG5hbWVdID0gJHR5cGUgPyAoJHR5cGUtPmFsbG93c051bGwoKSA/ICc/JyA6ICcnKS4oJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSA/ICR0eXBlLT5nZXROYW1lKCkgOiAkdHlwZSkgOiAnPyc7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPnByb3ZpZGVkVHlwZXM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlTm90Rm91bmRFeGNlcHRpb24oc3RyaW5nICRpZCk6IE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlCnsKaWYgKCEkYWx0ZXJuYXRpdmVzID0gYXJyYXlfa2V5cygkdGhpcy0+ZmFjdG9yaWVzKSkgewokbWVzc2FnZSA9ICdpcyBlbXB0eS4uLic7Cn0gZWxzZSB7CiRsYXN0ID0gYXJyYXlfcG9wKCRhbHRlcm5hdGl2ZXMpOwppZiAoJGFsdGVybmF0aXZlcykgewokbWVzc2FnZSA9IHNwcmludGYoJ29ubHkga25vd3MgYWJvdXQgdGhlICIlcyIgYW5kICIlcyIgc2VydmljZXMuJywgaW1wbG9kZSgnIiwgIicsICRhbHRlcm5hdGl2ZXMpLCAkbGFzdCk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50Zignb25seSBrbm93cyBhYm91dCB0aGUgIiVzIiBzZXJ2aWNlLicsICRsYXN0KTsKfQp9CgppZiAoJHRoaXMtPmxvYWRpbmcpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdUaGUgc2VydmljZSAiJXMiIGhhcyBhIGRlcGVuZGVuY3kgb24gYSBub24tZXhpc3RlbnQgc2VydmljZSAiJXMiLiBUaGlzIGxvY2F0b3IgJXMnLCBlbmQoJHRoaXMtPmxvYWRpbmcpLCAkaWQsICRtZXNzYWdlKTsKfSBlbHNlIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdTZXJ2aWNlICIlcyIgbm90IGZvdW5kOiB0aGUgY3VycmVudCBzZXJ2aWNlIGxvY2F0b3IgJXMnLCAkaWQsICRtZXNzYWdlKTsKfQoKcmV0dXJuIG5ldyBjbGFzcygkbWVzc2FnZSkgZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgTm90Rm91bmRFeGNlcHRpb25JbnRlcmZhY2Ugewp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUNpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKHN0cmluZyAkaWQsIGFycmF5ICRwYXRoKTogQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlCnsKcmV0dXJuIG5ldyBjbGFzcyhzcHJpbnRmKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNlcnZpY2UgIiVzIiwgcGF0aDogIiVzIi4nLCAkaWQsIGltcGxvZGUoJyAtPiAnLCAkcGF0aCkpKSBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlIHsKfTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBTZXJ2aWNlUHJvdmlkZXJJbnRlcmZhY2UgZXh0ZW5kcyBDb250YWluZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlZFNlcnZpY2VzKCk6IGFycmF5Owp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCgoKCgoKCgoKCgoKCgoKCmludGVyZmFjZSBTZXJ2aWNlU3Vic2NyaWJlckludGVyZmFjZQp7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZFNlcnZpY2VzKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlOwoKdXNlIFBzclxDb250YWluZXJcQ29udGFpbmVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxBdHRyaWJ1dGVcU3Vic2NyaWJlZFNlcnZpY2U7CgoKCgoKCgp0cmFpdCBTZXJ2aWNlU3Vic2NyaWJlclRyYWl0CnsKCnByb3RlY3RlZCAkY29udGFpbmVyOwoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdWJzY3JpYmVkU2VydmljZXMoKTogYXJyYXkKewokc2VydmljZXMgPSBtZXRob2RfZXhpc3RzKGdldF9wYXJlbnRfY2xhc3Moc2VsZjo6Y2xhc3MpID86ICcnLCBfX0ZVTkNUSU9OX18pID8gcGFyZW50OjpnZXRTdWJzY3JpYmVkU2VydmljZXMoKSA6IFtdOwokYXR0cmlidXRlT3B0SW4gPSBmYWxzZTsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKZm9yZWFjaCAoKG5ldyBcUmVmbGVjdGlvbkNsYXNzKHNlbGY6OmNsYXNzKSktPmdldE1ldGhvZHMoKSBhcyAkbWV0aG9kKSB7CmlmIChzZWxmOjpjbGFzcyAhPT0gJG1ldGhvZC0+Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+bmFtZSkgewpjb250aW51ZTsKfQoKaWYgKCEkYXR0cmlidXRlID0gJG1ldGhvZC0+Z2V0QXR0cmlidXRlcyhTdWJzY3JpYmVkU2VydmljZTo6Y2xhc3MpWzBdID8/IG51bGwpIHsKY29udGludWU7Cn0KCmlmICgkbWV0aG9kLT5pc1N0YXRpYygpIHx8ICRtZXRob2QtPmlzQWJzdHJhY3QoKSB8fCAkbWV0aG9kLT5pc0dlbmVyYXRvcigpIHx8ICRtZXRob2QtPmlzSW50ZXJuYWwoKSB8fCAkbWV0aG9kLT5nZXROdW1iZXJPZlJlcXVpcmVkUGFyYW1ldGVycygpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHVzZSAiJXMiIG9uIG1ldGhvZCAiJXM6OiVzKCkiIChjYW4gb25seSBiZSB1c2VkIG9uIG5vbi1zdGF0aWMsIG5vbi1hYnN0cmFjdCBtZXRob2RzIHdpdGggbm8gcGFyYW1ldGVycykuJywgU3Vic2NyaWJlZFNlcnZpY2U6OmNsYXNzLCBzZWxmOjpjbGFzcywgJG1ldGhvZC0+bmFtZSkpOwp9CgppZiAoISRyZXR1cm5UeXBlID0gJG1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHVzZSAiJXMiIG9uIG1ldGhvZHMgd2l0aG91dCBhIHJldHVybiB0eXBlIGluICIlczo6JXMoKSIuJywgU3Vic2NyaWJlZFNlcnZpY2U6OmNsYXNzLCAkbWV0aG9kLT5uYW1lLCBzZWxmOjpjbGFzcykpOwp9Cgokc2VydmljZUlkID0gJHJldHVyblR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSA/ICRyZXR1cm5UeXBlLT5nZXROYW1lKCkgOiAoc3RyaW5nKSAkcmV0dXJuVHlwZTsKCmlmICgkcmV0dXJuVHlwZS0+YWxsb3dzTnVsbCgpKSB7CiRzZXJ2aWNlSWQgPSAnPycuJHNlcnZpY2VJZDsKfQoKJHNlcnZpY2VzWyRhdHRyaWJ1dGUtPm5ld0luc3RhbmNlKCktPmtleSA/PyBzZWxmOjpjbGFzcy4nOjonLiRtZXRob2QtPm5hbWVdID0gJHNlcnZpY2VJZDsKJGF0dHJpYnV0ZU9wdEluID0gdHJ1ZTsKfQp9CgppZiAoISRhdHRyaWJ1dGVPcHRJbikgewpmb3JlYWNoICgobmV3IFxSZWZsZWN0aW9uQ2xhc3Moc2VsZjo6Y2xhc3MpKS0+Z2V0TWV0aG9kcygpIGFzICRtZXRob2QpIHsKaWYgKCRtZXRob2QtPmlzU3RhdGljKCkgfHwgJG1ldGhvZC0+aXNBYnN0cmFjdCgpIHx8ICRtZXRob2QtPmlzR2VuZXJhdG9yKCkgfHwgJG1ldGhvZC0+aXNJbnRlcm5hbCgpIHx8ICRtZXRob2QtPmdldE51bWJlck9mUmVxdWlyZWRQYXJhbWV0ZXJzKCkpIHsKY29udGludWU7Cn0KCmlmIChzZWxmOjpjbGFzcyAhPT0gJG1ldGhvZC0+Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+bmFtZSkgewpjb250aW51ZTsKfQoKaWYgKCEoJHJldHVyblR5cGUgPSAkbWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUpIHsKY29udGludWU7Cn0KCmlmICgkcmV0dXJuVHlwZS0+aXNCdWlsdGluKCkpIHsKY29udGludWU7Cn0KCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cycsICcyLjUnLCAnVXNpbmcgIiVzIiBpbiAiJXMiIHdpdGhvdXQgdXNpbmcgdGhlICIlcyIgYXR0cmlidXRlIG9uIGFueSBtZXRob2QgaXMgZGVwcmVjYXRlZC4nLCBTZXJ2aWNlU3Vic2NyaWJlclRyYWl0OjpjbGFzcywgc2VsZjo6Y2xhc3MsIFN1YnNjcmliZWRTZXJ2aWNlOjpjbGFzcyk7Cn0KCiRzZXJ2aWNlc1tzZWxmOjpjbGFzcy4nOjonLiRtZXRob2QtPm5hbWVdID0gJz8nLigkcmV0dXJuVHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlID8gJHJldHVyblR5cGUtPmdldE5hbWUoKSA6ICRyZXR1cm5UeXBlKTsKfQp9CgpyZXR1cm4gJHNlcnZpY2VzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb250YWluZXIoQ29udGFpbmVySW50ZXJmYWNlICRjb250YWluZXIpCnsKJHRoaXMtPmNvbnRhaW5lciA9ICRjb250YWluZXI7CgppZiAobWV0aG9kX2V4aXN0cyhnZXRfcGFyZW50X2NsYXNzKHNlbGY6OmNsYXNzKSA/OiAnJywgX19GVU5DVElPTl9fKSkgewpyZXR1cm4gcGFyZW50OjpzZXRDb250YWluZXIoJGNvbnRhaW5lcik7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFRlc3Q7Cgp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7CnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcU2VydmljZUxvY2F0b3JUcmFpdDsKCmFic3RyYWN0IGNsYXNzIFNlcnZpY2VMb2NhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNlcnZpY2VMb2NhdG9yKGFycmF5ICRmYWN0b3JpZXMpCnsKcmV0dXJuIG5ldyBjbGFzcygkZmFjdG9yaWVzKSBpbXBsZW1lbnRzIENvbnRhaW5lckludGVyZmFjZSB7CnVzZSBTZXJ2aWNlTG9jYXRvclRyYWl0Owp9Owp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdEhhcygpCnsKJGxvY2F0b3IgPSAkdGhpcy0+Z2V0U2VydmljZUxvY2F0b3IoWwonZm9vJyA9PiBmdW5jdGlvbiAoKSB7IHJldHVybiAnYmFyJzsgfSwKJ2JhcicgPT4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jheic7IH0sCmZ1bmN0aW9uICgpIHsgcmV0dXJuICdkdW1teSc7IH0sCl0pOwoKJHRoaXMtPmFzc2VydFRydWUoJGxvY2F0b3ItPmhhcygnZm9vJykpOwokdGhpcy0+YXNzZXJ0VHJ1ZSgkbG9jYXRvci0+aGFzKCdiYXInKSk7CiR0aGlzLT5hc3NlcnRGYWxzZSgkbG9jYXRvci0+aGFzKCdkdW1teScpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RHZXQoKQp7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jhcic7IH0sCidiYXInID0+IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdiYXonOyB9LApdKTsKCiR0aGlzLT5hc3NlcnRTYW1lKCdiYXInLCAkbG9jYXRvci0+Z2V0KCdmb28nKSk7CiR0aGlzLT5hc3NlcnRTYW1lKCdiYXonLCAkbG9jYXRvci0+Z2V0KCdiYXInKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0R2V0RG9lc05vdE1lbW9pemUoKQp7CiRpID0gMDsKJGxvY2F0b3IgPSAkdGhpcy0+Z2V0U2VydmljZUxvY2F0b3IoWwonZm9vJyA9PiBmdW5jdGlvbiAoKSB1c2UgKCYkaSkgeworKyRpOwoKcmV0dXJuICdiYXInOwp9LApdKTsKCiR0aGlzLT5hc3NlcnRTYW1lKCdiYXInLCAkbG9jYXRvci0+Z2V0KCdmb28nKSk7CiR0aGlzLT5hc3NlcnRTYW1lKCdiYXInLCAkbG9jYXRvci0+Z2V0KCdmb28nKSk7CiR0aGlzLT5hc3NlcnRTYW1lKDIsICRpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RUaHJvd3NPblVuZGVmaW5lZEludGVybmFsU2VydmljZSgpCnsKaWYgKCEkdGhpcy0+Z2V0RXhwZWN0ZWRFeGNlcHRpb24oKSkgewokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uKFxQc3JcQ29udGFpbmVyXE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CiR0aGlzLT5leHBlY3RFeGNlcHRpb25NZXNzYWdlKCdUaGUgc2VydmljZSAiZm9vIiBoYXMgYSBkZXBlbmRlbmN5IG9uIGEgbm9uLWV4aXN0ZW50IHNlcnZpY2UgImJhciIuIFRoaXMgbG9jYXRvciBvbmx5IGtub3dzIGFib3V0IHRoZSAiZm9vIiBzZXJ2aWNlLicpOwp9CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGxvY2F0b3IpIHsgcmV0dXJuICRsb2NhdG9yLT5nZXQoJ2JhcicpOyB9LApdKTsKCiRsb2NhdG9yLT5nZXQoJ2ZvbycpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdFRocm93c09uQ2lyY3VsYXJSZWZlcmVuY2UoKQp7CiR0aGlzLT5leHBlY3RFeGNlcHRpb24oXFBzclxDb250YWluZXJcQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CiR0aGlzLT5leHBlY3RFeGNlcHRpb25NZXNzYWdlKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNlcnZpY2UgImJhciIsIHBhdGg6ICJiYXIgLT4gYmF6IC0+IGJhciIuJyk7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGxvY2F0b3IpIHsgcmV0dXJuICRsb2NhdG9yLT5nZXQoJ2JhcicpOyB9LAonYmFyJyA9PiBmdW5jdGlvbiAoKSB1c2UgKCYkbG9jYXRvcikgeyByZXR1cm4gJGxvY2F0b3ItPmdldCgnYmF6Jyk7IH0sCidiYXonID0+IGZ1bmN0aW9uICgpIHVzZSAoJiRsb2NhdG9yKSB7IHJldHVybiAkbG9jYXRvci0+Z2V0KCdiYXInKTsgfSwKXSk7CgokbG9jYXRvci0+Z2V0KCdmb28nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cmluZyBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlLCBcSnNvblNlcmlhbGl6YWJsZQp7CnB1YmxpYyBjb25zdCBQUkVHX1BBVFRFUk5fT1JERVIgPSBcUFJFR19QQVRURVJOX09SREVSOwpwdWJsaWMgY29uc3QgUFJFR19TRVRfT1JERVIgPSBcUFJFR19TRVRfT1JERVI7CnB1YmxpYyBjb25zdCBQUkVHX09GRlNFVF9DQVBUVVJFID0gXFBSRUdfT0ZGU0VUX0NBUFRVUkU7CnB1YmxpYyBjb25zdCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMID0gXFBSRUdfVU5NQVRDSEVEX0FTX05VTEw7CgpwdWJsaWMgY29uc3QgUFJFR19TUExJVCA9IDA7CnB1YmxpYyBjb25zdCBQUkVHX1NQTElUX05PX0VNUFRZID0gXFBSRUdfU1BMSVRfTk9fRU1QVFk7CnB1YmxpYyBjb25zdCBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgPSBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFOwpwdWJsaWMgY29uc3QgUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSA9IFxQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFOwoKcHJvdGVjdGVkICRzdHJpbmcgPSAnJzsKcHJvdGVjdGVkICRpZ25vcmVDYXNlID0gZmFsc2U7CgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzdHJpbmcgPSAnJyk7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW53cmFwKGFycmF5ICR2YWx1ZXMpOiBhcnJheQp7CmZvcmVhY2ggKCR2YWx1ZXMgYXMgJGsgPT4gJHYpIHsKaWYgKCR2IGluc3RhbmNlb2Ygc2VsZikgewokdmFsdWVzWyRrXSA9ICR2LT5fX3RvU3RyaW5nKCk7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHYpICYmICR2YWx1ZXNbJGtdICE9PSAkdiA9IHN0YXRpYzo6dW53cmFwKCR2KSkgewokdmFsdWVzWyRrXSA9ICR2Owp9Cn0KCnJldHVybiAkdmFsdWVzOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd3JhcChhcnJheSAkdmFsdWVzKTogYXJyYXkKewokaSA9IDA7CiRrZXlzID0gbnVsbDsKCmZvcmVhY2ggKCR2YWx1ZXMgYXMgJGsgPT4gJHYpIHsKaWYgKFxpc19zdHJpbmcoJGspICYmICcnICE9PSAkayAmJiAkayAhPT0gJGogPSAoc3RyaW5nKSBuZXcgc3RhdGljKCRrKSkgewoka2V5cyA9ICRrZXlzID8/IGFycmF5X2tleXMoJHZhbHVlcyk7CiRrZXlzWyRpXSA9ICRqOwp9CgppZiAoXGlzX3N0cmluZygkdikpIHsKJHZhbHVlc1ska10gPSBuZXcgc3RhdGljKCR2KTsKfSBlbHNlaWYgKFxpc19hcnJheSgkdikgJiYgJHZhbHVlc1ska10gIT09ICR2ID0gc3RhdGljOjp3cmFwKCR2KSkgewokdmFsdWVzWyRrXSA9ICR2Owp9CgorKyRpOwp9CgpyZXR1cm4gbnVsbCAhPT0gJGtleXMgPyBhcnJheV9jb21iaW5lKCRrZXlzLCAkdmFsdWVzKSA6ICR2YWx1ZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFmdGVyKCRuZWVkbGUsIGJvb2wgJGluY2x1ZGVOZWVkbGUgPSBmYWxzZSwgaW50ICRvZmZzZXQgPSAwKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJGkgPSBcUEhQX0lOVF9NQVg7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZigkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPCAkaSkgewokaSA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAoXFBIUF9JTlRfTUFYID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCEkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgkaSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFmdGVyTGFzdCgkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gbnVsbDsKCmZvcmVhY2ggKChhcnJheSkgJG5lZWRsZSBhcyAkbikgewokbiA9IChzdHJpbmcpICRuOwokaiA9ICR0aGlzLT5pbmRleE9mTGFzdCgkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPj0gJGkpIHsKJGkgPSAkb2Zmc2V0ID0gJGo7CiRzdHItPnN0cmluZyA9ICRuOwp9Cn0KCmlmIChudWxsID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCEkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgkaSk7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoc3RyaW5nIC4uLiRzdWZmaXgpOiBzZWxmOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYmVmb3JlKCRuZWVkbGUsIGJvb2wgJGluY2x1ZGVOZWVkbGUgPSBmYWxzZSwgaW50ICRvZmZzZXQgPSAwKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJGkgPSBcUEhQX0lOVF9NQVg7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZigkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPCAkaSkgewokaSA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAoXFBIUF9JTlRfTUFYID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCRpbmNsdWRlTmVlZGxlKSB7CiRpICs9ICRzdHItPmxlbmd0aCgpOwp9CgpyZXR1cm4gJHRoaXMtPnNsaWNlKDAsICRpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYmVmb3JlTGFzdCgkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gbnVsbDsKCmZvcmVhY2ggKChhcnJheSkgJG5lZWRsZSBhcyAkbikgewokbiA9IChzdHJpbmcpICRuOwokaiA9ICR0aGlzLT5pbmRleE9mTGFzdCgkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPj0gJGkpIHsKJGkgPSAkb2Zmc2V0ID0gJGo7CiRzdHItPnN0cmluZyA9ICRuOwp9Cn0KCmlmIChudWxsID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCRpbmNsdWRlTmVlZGxlKSB7CiRpICs9ICRzdHItPmxlbmd0aCgpOwp9CgpyZXR1cm4gJHRoaXMtPnNsaWNlKDAsICRpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJ5dGVzQXQoaW50ICRvZmZzZXQpOiBhcnJheQp7CiRzdHIgPSAkdGhpcy0+c2xpY2UoJG9mZnNldCwgMSk7CgpyZXR1cm4gJycgPT09ICRzdHItPnN0cmluZyA/IFtdIDogYXJyYXlfdmFsdWVzKHVucGFjaygnQyonLCAkc3RyLT5zdHJpbmcpKTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNhbWVsKCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29sbGFwc2VXaGl0ZXNwYWNlKCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHRyaW0ocHJlZ19yZXBsYWNlKCIvKD86WyBcblxyXHRceDBDXXsyLH0rfFtcblxyXHRceDBDXSkvIiwgJyAnLCAkc3RyLT5zdHJpbmcpLCAiIFxuXHJcdFx4MEMiKTsKCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29udGFpbnNBbnkoJG5lZWRsZSk6IGJvb2wKewpyZXR1cm4gbnVsbCAhPT0gJHRoaXMtPmluZGV4T2YoJG5lZWRsZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICghXGlzX2FycmF5KCRzdWZmaXgpICYmICEkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCmZvcmVhY2ggKCRzdWZmaXggYXMgJHMpIHsKaWYgKCR0aGlzLT5lbmRzV2l0aCgoc3RyaW5nKSAkcykpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlRW5kKHN0cmluZyAkc3VmZml4KTogc2VsZgp7CmlmICghJHRoaXMtPmVuZHNXaXRoKCRzdWZmaXgpKSB7CnJldHVybiAkdGhpcy0+YXBwZW5kKCRzdWZmaXgpOwp9Cgokc3VmZml4ID0gcHJlZ19xdW90ZSgkc3VmZml4KTsKJHJlZ2V4ID0gJ3soJy4kc3VmZml4LicpKD86Jy4kc3VmZml4LicpKyskfUQnOwoKcmV0dXJuICR0aGlzLT5yZXBsYWNlTWF0Y2hlcygkcmVnZXguKCR0aGlzLT5pZ25vcmVDYXNlID8gJ2knIDogJycpLCAnJDEnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZVN0YXJ0KHN0cmluZyAkcHJlZml4KTogc2VsZgp7CiRwcmVmaXggPSBuZXcgc3RhdGljKCRwcmVmaXgpOwoKaWYgKCEkdGhpcy0+c3RhcnRzV2l0aCgkcHJlZml4KSkgewpyZXR1cm4gJHRoaXMtPnByZXBlbmQoJHByZWZpeCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJGkgPSAkcHJlZml4TGVuID0gJHByZWZpeC0+bGVuZ3RoKCk7Cgp3aGlsZSAoJHRoaXMtPmluZGV4T2YoJHByZWZpeCwgJGkpID09PSAkaSkgewokc3RyID0gJHN0ci0+c2xpY2UoJHByZWZpeExlbik7CiRpICs9ICRwcmVmaXhMZW47Cn0KCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzVG8oJHN0cmluZyk6IGJvb2wKewppZiAoIVxpc19hcnJheSgkc3RyaW5nKSAmJiAhJHN0cmluZyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdNZXRob2QgIiVzKCkiIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBjbGFzcyAiJXMiIHRvIGRlYWwgd2l0aCBub24taXRlcmFibGUgdmFsdWVzLicsIF9fRlVOQ1RJT05fXywgc3RhdGljOjpjbGFzcykpOwp9Cgpmb3JlYWNoICgkc3RyaW5nIGFzICRzKSB7CmlmICgkdGhpcy0+ZXF1YWxzVG8oKHN0cmluZykgJHMpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGZvbGRlZCgpOiBzZWxmOwoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZUNhc2UoKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+aWdub3JlQ2FzZSA9IHRydWU7CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2YoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICghXGlzX2FycmF5KCRuZWVkbGUpICYmICEkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCiRpID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoJG5lZWRsZSBhcyAkbikgewokaiA9ICR0aGlzLT5pbmRleE9mKChzdHJpbmcpICRuLCAkb2Zmc2V0KTsKCmlmIChudWxsICE9PSAkaiAmJiAkaiA8ICRpKSB7CiRpID0gJGo7Cn0KfQoKcmV0dXJuIFxQSFBfSU5UX01BWCA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mTGFzdCgkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCFcaXNfYXJyYXkoJG5lZWRsZSkgJiYgISRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignTWV0aG9kICIlcygpIiBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgY2xhc3MgIiVzIiB0byBkZWFsIHdpdGggbm9uLWl0ZXJhYmxlIHZhbHVlcy4nLCBfX0ZVTkNUSU9OX18sIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJGkgPSBudWxsOwoKZm9yZWFjaCAoJG5lZWRsZSBhcyAkbikgewokaiA9ICR0aGlzLT5pbmRleE9mTGFzdCgoc3RyaW5nKSAkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPj0gJGkpIHsKJGkgPSAkb2Zmc2V0ID0gJGo7Cn0KfQoKcmV0dXJuICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCnsKcmV0dXJuICcnID09PSAkdGhpcy0+c3RyaW5nOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gam9pbihhcnJheSAkc3RyaW5ncywgc3RyaW5nICRsYXN0R2x1ZSA9IG51bGwpOiBzZWxmOwoKcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdHJpbmc7Cn0KCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBsZW5ndGgoKTogaW50OwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxvd2VyKCk6IHNlbGY7CgoKCgoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcmVnZXhwLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYXJyYXk7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcGFkQm90aChpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRTdHIgPSAnICcpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHBhZEVuZChpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRTdHIgPSAnICcpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHBhZFN0YXJ0KGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IHNlbGY7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVwZWF0KGludCAkbXVsdGlwbGllcik6IHNlbGYKewppZiAoMCA+ICRtdWx0aXBsaWVyKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignTXVsdGlwbGllciBtdXN0IGJlIHBvc2l0aXZlLCAlZCBnaXZlbi4nLCAkbXVsdGlwbGllcikpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cl9yZXBlYXQoJHN0ci0+c3RyaW5nLCAkbXVsdGlwbGllcik7CgpyZXR1cm4gJHN0cjsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyaW5nICRmcm9tLCBzdHJpbmcgJHRvKTogc2VsZjsKCgoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaGVzKHN0cmluZyAkZnJvbVJlZ2V4cCwgJHRvKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZXZlcnNlKCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc2xpY2UoaW50ICRzdGFydCA9IDAsIGludCAkbGVuZ3RoID0gbnVsbCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc25ha2UoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzcGxpY2Uoc3RyaW5nICRyZXBsYWNlbWVudCwgaW50ICRzdGFydCA9IDAsIGludCAkbGVuZ3RoID0gbnVsbCk6IHNlbGY7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsIGludCAkbGltaXQgPSBudWxsLCBpbnQgJGZsYWdzID0gbnVsbCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICRmbGFncykgewp0aHJvdyBuZXcgXFR5cGVFcnJvcignU3BsaXQgYmVoYXZpb3Igd2hlbiAkZmxhZ3MgaXMgbnVsbCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzZXMuJyk7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokZGVsaW1pdGVyIC49ICdpJzsKfQoKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkdCwgJG0pIHsgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbSk7IH0pOwoKdHJ5IHsKaWYgKGZhbHNlID09PSAkY2h1bmtzID0gcHJlZ19zcGxpdCgkZGVsaW1pdGVyLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQsICRmbGFncykpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU3BsaXR0aW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU3BsaXR0aW5nIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3IgY29kZS4nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKHNlbGY6OlBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgJiAkZmxhZ3MpIHsKZm9yZWFjaCAoJGNodW5rcyBhcyAmJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVua1swXTsKJGNodW5rWzBdID0gY2xvbmUgJHN0cjsKfQp9IGVsc2Ugewpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmsgPSBjbG9uZSAkc3RyOwp9Cn0KCnJldHVybiAkY2h1bmtzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICghXGlzX2FycmF5KCRwcmVmaXgpICYmICEkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCmZvcmVhY2ggKCRwcmVmaXggYXMgJHByZWZpeCkgewppZiAoJHRoaXMtPnN0YXJ0c1dpdGgoKHN0cmluZykgJHByZWZpeCkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdGl0bGUoYm9vbCAkYWxsV29yZHMgPSBmYWxzZSk6IHNlbGY7CgpwdWJsaWMgZnVuY3Rpb24gdG9CeXRlU3RyaW5nKHN0cmluZyAkdG9FbmNvZGluZyA9IG51bGwpOiBCeXRlU3RyaW5nCnsKJGIgPSBuZXcgQnl0ZVN0cmluZygpOwoKJHRvRW5jb2RpbmcgPSBcaW5fYXJyYXkoJHRvRW5jb2RpbmcsIFsndXRmOCcsICd1dGYtOCcsICdVVEY4J10sIHRydWUpID8gJ1VURi04JyA6ICR0b0VuY29kaW5nOwoKaWYgKG51bGwgPT09ICR0b0VuY29kaW5nIHx8ICR0b0VuY29kaW5nID09PSAkZnJvbUVuY29kaW5nID0gJHRoaXMgaW5zdGFuY2VvZiBBYnN0cmFjdFVuaWNvZGVTdHJpbmcgfHwgcHJlZ19tYXRjaCgnLy91JywgJGItPnN0cmluZykgPyAnVVRGLTgnIDogJ1dpbmRvd3MtMTI1MicpIHsKJGItPnN0cmluZyA9ICR0aGlzLT5zdHJpbmc7CgpyZXR1cm4gJGI7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CnRyeSB7CiRiLT5zdHJpbmcgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCR0aGlzLT5zdHJpbmcsICR0b0VuY29kaW5nLCAnVVRGLTgnKTsKfSBjYXRjaCAoSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygnaWNvbnYnKSkgewp0aHJvdyAkZTsKfQoKJGItPnN0cmluZyA9IGljb252KCdVVEYtOCcsICR0b0VuY29kaW5nLCAkdGhpcy0+c3RyaW5nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKcmV0dXJuICRiOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9Db2RlUG9pbnRTdHJpbmcoKTogQ29kZVBvaW50U3RyaW5nCnsKcmV0dXJuIG5ldyBDb2RlUG9pbnRTdHJpbmcoJHRoaXMtPnN0cmluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIHRvVW5pY29kZVN0cmluZygpOiBVbmljb2RlU3RyaW5nCnsKcmV0dXJuIG5ldyBVbmljb2RlU3RyaW5nKCR0aGlzLT5zdHJpbmcpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdHJpbShzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB0cmltRW5kKHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBzZWxmOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJpbVByZWZpeCgkcHJlZml4KTogc2VsZgp7CmlmIChcaXNfYXJyYXkoJHByZWZpeCkgfHwgJHByZWZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpmb3JlYWNoICgkcHJlZml4IGFzICRzKSB7CiR0ID0gJHRoaXMtPnRyaW1QcmVmaXgoJHMpOwoKaWYgKCR0LT5zdHJpbmcgIT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuICR0Owp9Cn0KCnJldHVybiBjbG9uZSAkdGhpczsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBzZWxmKSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0gZWxzZSB7CiRwcmVmaXggPSAoc3RyaW5nKSAkcHJlZml4Owp9CgppZiAoJycgIT09ICRwcmVmaXggJiYgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSA+PSBcc3RybGVuKCRwcmVmaXgpICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIDAsIFxzdHJsZW4oJHByZWZpeCksICR0aGlzLT5pZ25vcmVDYXNlKSkgewokc3RyLT5zdHJpbmcgPSBzdWJzdHIoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkcHJlZml4KSk7Cn0KCnJldHVybiAkc3RyOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBzZWxmOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJpbVN1ZmZpeCgkc3VmZml4KTogc2VsZgp7CmlmIChcaXNfYXJyYXkoJHN1ZmZpeCkgfHwgJHN1ZmZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpmb3JlYWNoICgkc3VmZml4IGFzICRzKSB7CiR0ID0gJHRoaXMtPnRyaW1TdWZmaXgoJHMpOwoKaWYgKCR0LT5zdHJpbmcgIT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuICR0Owp9Cn0KCnJldHVybiBjbG9uZSAkdGhpczsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBzZWxmKSB7CiRzdWZmaXggPSAkc3VmZml4LT5zdHJpbmc7Cn0gZWxzZSB7CiRzdWZmaXggPSAoc3RyaW5nKSAkc3VmZml4Owp9CgppZiAoJycgIT09ICRzdWZmaXggJiYgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSA+PSBcc3RybGVuKCRzdWZmaXgpICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCR0aGlzLT5zdHJpbmcsICRzdWZmaXgsIC1cc3RybGVuKCRzdWZmaXgpLCBudWxsLCAkdGhpcy0+aWdub3JlQ2FzZSkpIHsKJHN0ci0+c3RyaW5nID0gc3Vic3RyKCR0aGlzLT5zdHJpbmcsIDAsIC1cc3RybGVuKCRzdWZmaXgpKTsKfQoKcmV0dXJuICRzdHI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0cnVuY2F0ZShpbnQgJGxlbmd0aCwgc3RyaW5nICRlbGxpcHNpcyA9ICcnLCBib29sICRjdXQgPSB0cnVlKTogc2VsZgp7CiRzdHJpbmdMZW5ndGggPSAkdGhpcy0+bGVuZ3RoKCk7CgppZiAoJHN0cmluZ0xlbmd0aCA8PSAkbGVuZ3RoKSB7CnJldHVybiBjbG9uZSAkdGhpczsKfQoKJGVsbGlwc2lzTGVuZ3RoID0gJycgIT09ICRlbGxpcHNpcyA/IChuZXcgc3RhdGljKCRlbGxpcHNpcykpLT5sZW5ndGgoKSA6IDA7CgppZiAoJGxlbmd0aCA8ICRlbGxpcHNpc0xlbmd0aCkgewokZWxsaXBzaXNMZW5ndGggPSAwOwp9CgppZiAoISRjdXQpIHsKaWYgKG51bGwgPT09ICRsZW5ndGggPSAkdGhpcy0+aW5kZXhPZihbJyAnLCAiXHIiLCAiXG4iLCAiXHQiXSwgKCRsZW5ndGggPzogMSkgLSAxKSkgewpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRsZW5ndGggKz0gJGVsbGlwc2lzTGVuZ3RoOwp9Cgokc3RyID0gJHRoaXMtPnNsaWNlKDAsICRsZW5ndGggLSAkZWxsaXBzaXNMZW5ndGgpOwoKcmV0dXJuICRlbGxpcHNpc0xlbmd0aCA/ICRzdHItPnRyaW1FbmQoKS0+YXBwZW5kKCRlbGxpcHNpcykgOiAkc3RyOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdXBwZXIoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3aWR0aChib29sICRpZ25vcmVBbnNpRGVjb3JhdGlvbiA9IHRydWUpOiBpbnQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gd29yZHdyYXAoaW50ICR3aWR0aCA9IDc1LCBzdHJpbmcgJGJyZWFrID0gIlxuIiwgYm9vbCAkY3V0ID0gZmFsc2UpOiBzZWxmCnsKJGxpbmVzID0gJycgIT09ICRicmVhayA/ICR0aGlzLT5zcGxpdCgkYnJlYWspIDogW2Nsb25lICR0aGlzXTsKJGNoYXJzID0gW107CiRtYXNrID0gJyc7CgppZiAoMSA9PT0gXGNvdW50KCRsaW5lcykgJiYgJycgPT09ICRsaW5lc1swXS0+c3RyaW5nKSB7CnJldHVybiAkbGluZXNbMF07Cn0KCmZvcmVhY2ggKCRsaW5lcyBhcyAkaSA9PiAkbGluZSkgewppZiAoJGkpIHsKJGNoYXJzW10gPSAkYnJlYWs7CiRtYXNrIC49ICcjJzsKfQoKZm9yZWFjaCAoJGxpbmUtPmNodW5rKCkgYXMgJGNoYXIpIHsKJGNoYXJzW10gPSAkY2hhci0+c3RyaW5nOwokbWFzayAuPSAnICcgPT09ICRjaGFyLT5zdHJpbmcgPyAnICcgOiAnPyc7Cn0KfQoKJHN0cmluZyA9ICcnOwokaiA9IDA7CiRiID0gJGkgPSAtMTsKJG1hc2sgPSB3b3Jkd3JhcCgkbWFzaywgJHdpZHRoLCAnIycsICRjdXQpOwoKd2hpbGUgKGZhbHNlICE9PSAkYiA9IHN0cnBvcygkbWFzaywgJyMnLCAkYiArIDEpKSB7CmZvciAoKyskaTsgJGkgPCAkYjsgKyskaSkgewokc3RyaW5nIC49ICRjaGFyc1skal07CnVuc2V0KCRjaGFyc1skaisrXSk7Cn0KCmlmICgkYnJlYWsgPT09ICRjaGFyc1skal0gfHwgJyAnID09PSAkY2hhcnNbJGpdKSB7CnVuc2V0KCRjaGFyc1skaisrXSk7Cn0KCiRzdHJpbmcgLj0gJGJyZWFrOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICRzdHJpbmcuaW1wbG9kZSgnJywgJGNoYXJzKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19zbGVlcCgpOiBhcnJheQp7CnJldHVybiBbJ3N0cmluZyddOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKJHRoaXMtPmlnbm9yZUNhc2UgPSBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdHJpbmc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFVuaWNvZGVTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZwp7CnB1YmxpYyBjb25zdCBORkMgPSBcTm9ybWFsaXplcjo6TkZDOwpwdWJsaWMgY29uc3QgTkZEID0gXE5vcm1hbGl6ZXI6Ok5GRDsKcHVibGljIGNvbnN0IE5GS0MgPSBcTm9ybWFsaXplcjo6TkZLQzsKcHVibGljIGNvbnN0IE5GS0QgPSBcTm9ybWFsaXplcjo6TkZLRDsKCgpwcml2YXRlIGNvbnN0IEFTQ0lJID0gIlx4MjBceDY1XHg2OVx4NjFceDczXHg2RVx4NzRceDcyXHg2Rlx4NkNceDc1XHg2NFx4NURceDVCXHg2M1x4NkRceDcwXHgyN1x4MEFceDY3XHg3Q1x4NjhceDc2XHgyRVx4NjZceDYyXHgyQ1x4M0FceDNEXHgyRFx4NzFceDMxXHgzMFx4NDNceDMyXHgyQVx4NzlceDc4XHgyOVx4MjhceDRDXHgzOVx4NDFceDUzXHgyRlx4NTBceDIyXHg0NVx4NkFceDREXHg0OVx4NkJceDMzXHgzRVx4MzVceDU0XHgzQ1x4NDRceDM0XHg3RFx4NDJceDdCXHgzOFx4NDZceDc3XHg1Mlx4MzZceDM3XHg1NVx4NDdceDRFXHgzQlx4NEFceDdBXHg1Nlx4MjNceDQ4XHg0Rlx4NTdceDVGXHgyNlx4MjFceDRCXHgzRlx4NThceDUxXHgyNVx4NTlceDVDXHgwOVx4NUFceDJCXHg3RVx4NUVceDI0XHg0MFx4NjBceDdGXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwQlx4MENceDBEXHgwRVx4MEZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxQVx4MUJceDFDXHgxRFx4MUVceDFGIjsKCgpwcml2YXRlIGNvbnN0IEZPTERfRlJPTSA9IFsnxLAnLCAnwrUnLCAnxb8nLCAiXHhDRFx4ODUiLCAnz4InLCAnz5AnLCAnz5EnLCAnz5UnLCAnz5YnLCAnz7AnLCAnz7EnLCAnz7UnLCAn4bqbJywgIlx4RTFceEJFXHhCRSIsICfDnycsICfFiScsICfHsCcsICfOkCcsICfOsCcsICfWhycsICfhupYnLCAn4bqXJywgJ+G6mCcsICfhupknLCAn4bqaJywgJ+G6nicsICfhvZAnLCAn4b2SJywgJ+G9lCcsICfhvZYnLCAn4b6AJywgJ+G+gScsICfhvoInLCAn4b6DJywgJ+G+hCcsICfhvoUnLCAn4b6GJywgJ+G+hycsICfhvognLCAn4b6JJywgJ+G+iicsICfhvosnLCAn4b6MJywgJ+G+jScsICfhvo4nLCAn4b6PJywgJ+G+kCcsICfhvpEnLCAn4b6SJywgJ+G+kycsICfhvpQnLCAn4b6VJywgJ+G+licsICfhvpcnLCAn4b6YJywgJ+G+mScsICfhvponLCAn4b6bJywgJ+G+nCcsICfhvp0nLCAn4b6eJywgJ+G+nycsICfhvqAnLCAn4b6hJywgJ+G+oicsICfhvqMnLCAn4b6kJywgJ+G+pScsICfhvqYnLCAn4b6nJywgJ+G+qCcsICfhvqknLCAn4b6qJywgJ+G+qycsICfhvqwnLCAn4b6tJywgJ+G+ricsICfhvq8nLCAn4b6yJywgJ+G+sycsICfhvrQnLCAn4b62JywgJ+G+tycsICfhvrwnLCAn4b+CJywgJ+G/gycsICfhv4QnLCAn4b+GJywgJ+G/hycsICfhv4wnLCAn4b+SJywgJ+G/licsICfhv5cnLCAn4b+iJywgJ+G/pCcsICfhv6YnLCAn4b+nJywgJ+G/sicsICfhv7MnLCAn4b+0JywgJ+G/ticsICfhv7cnLCAn4b+8JywgJ++sgCcsICfvrIEnLCAn76yCJywgJ++sgycsICfvrIQnLCAn76yFJywgJ++shicsICfvrJMnLCAn76yUJywgJ++slScsICfvrJYnLCAn76yXJ107CnByaXZhdGUgY29uc3QgRk9MRF9UTyA9IFsnacyHJywgJ868JywgJ3MnLCAnzrknLCAnz4MnLCAnzrInLCAnzrgnLCAnz4YnLCAnz4AnLCAnzronLCAnz4EnLCAnzrUnLCAn4bmhJywgJ865JywgJ3NzJywgJ8q8bicsICfHsCcsICfOkCcsICfOsCcsICfVpdaCJywgJ+G6licsICfhupcnLCAn4bqYJywgJ+G6mScsICdhyr4nLCAnc3MnLCAn4b2QJywgJ+G9kicsICfhvZQnLCAn4b2WJywgJ+G8gM65JywgJ+G8gc65JywgJ+G8gs65JywgJ+G8g865JywgJ+G8hM65JywgJ+G8hc65JywgJ+G8hs65JywgJ+G8h865JywgJ+G8gM65JywgJ+G8gc65JywgJ+G8gs65JywgJ+G8g865JywgJ+G8hM65JywgJ+G8hc65JywgJ+G8hs65JywgJ+G8h865JywgJ+G8oM65JywgJ+G8oc65JywgJ+G8os65JywgJ+G8o865JywgJ+G8pM65JywgJ+G8pc65JywgJ+G8ps65JywgJ+G8p865JywgJ+G8oM65JywgJ+G8oc65JywgJ+G8os65JywgJ+G8o865JywgJ+G8pM65JywgJ+G8pc65JywgJ+G8ps65JywgJ+G8p865JywgJ+G9oM65JywgJ+G9oc65JywgJ+G9os65JywgJ+G9o865JywgJ+G9pM65JywgJ+G9pc65JywgJ+G9ps65JywgJ+G9p865JywgJ+G9oM65JywgJ+G9oc65JywgJ+G9os65JywgJ+G9o865JywgJ+G9pM65JywgJ+G9pc65JywgJ+G9ps65JywgJ+G9p865JywgJ+G9sM65JywgJ86xzrknLCAnzqzOuScsICfhvrYnLCAn4b62zrknLCAnzrHOuScsICfhvbTOuScsICfOt865JywgJ86uzrknLCAn4b+GJywgJ+G/hs65JywgJ863zrknLCAn4b+SJywgJ+G/licsICfhv5cnLCAn4b+iJywgJ+G/pCcsICfhv6YnLCAn4b+nJywgJ+G9vM65JywgJ8+JzrknLCAnz47OuScsICfhv7YnLCAn4b+2zrknLCAnz4nOuScsICdmZicsICdmaScsICdmbCcsICdmZmknLCAnZmZsJywgJ3N0JywgJ3N0JywgJ9W01bYnLCAn1bTVpScsICfVtNWrJywgJ9W+1bYnLCAn1bTVrSddOwoKCnByaXZhdGUgY29uc3QgVVBQRVJfRlJPTSA9IFsnw58nLCAn76yAJywgJ++sgScsICfvrIInLCAn76yDJywgJ++shCcsICfvrIUnLCAn76yGJywgJ9aHJywgJ++skycsICfvrJQnLCAn76yVJywgJ++slicsICfvrJcnLCAnxYknLCAnzpAnLCAnzrAnLCAnx7AnLCAn4bqWJywgJ+G6lycsICfhupgnLCAn4bqZJywgJ+G6micsICfhvZAnLCAn4b2SJywgJ+G9lCcsICfhvZYnLCAn4b62JywgJ+G/hicsICfhv5InLCAn4b+TJywgJ+G/licsICfhv5cnLCAn4b+iJywgJ+G/oycsICfhv6QnLCAn4b+mJywgJ+G/pycsICfhv7YnXTsKcHJpdmF0ZSBjb25zdCBVUFBFUl9UTyA9IFsnU1MnLCAnRkYnLCAnRkknLCAnRkwnLCAnRkZJJywgJ0ZGTCcsICdTVCcsICdTVCcsICfUtdWSJywgJ9WE1YYnLCAn1YTUtScsICfVhNS7JywgJ9WO1YYnLCAn1YTUvScsICfKvE4nLCAnzpnMiMyBJywgJ86lzIjMgScsICdKzIwnLCAnSMyxJywgJ1TMiCcsICdXzIonLCAnWcyKJywgJ0HKvicsICfOpcyTJywgJ86lzJPMgCcsICfOpcyTzIEnLCAnzqXMk82CJywgJ86RzYInLCAnzpfNgicsICfOmcyIzIAnLCAnzpnMiMyBJywgJ86ZzYInLCAnzpnMiM2CJywgJ86lzIjMgCcsICfOpcyIzIEnLCAnzqHMkycsICfOpc2CJywgJ86lzIjNgicsICfOqc2CJ107CgoKcHJpdmF0ZSBjb25zdCBUUkFOU0xJVF9GUk9NID0gWyfDhicsICfDkCcsICfDmCcsICfDnicsICfDnycsICfDpicsICfDsCcsICfDuCcsICfDvicsICfEkCcsICfEkScsICfEpicsICfEpycsICfEsScsICfEuCcsICfEvycsICfFgCcsICfFgScsICfFgicsICfFiScsICfFiicsICfFiycsICfFkicsICfFkycsICfFpicsICfFpycsICfGgCcsICfGgScsICfGgicsICfGgycsICfGhycsICfGiCcsICfGiScsICfGiicsICfGiycsICfGjCcsICfGkCcsICfGkScsICfGkicsICfGkycsICfGlScsICfGlicsICfGlycsICfGmCcsICfGmScsICfGmicsICfGnScsICfGnicsICfGoicsICfGoycsICfGpCcsICfGpScsICfGqycsICfGrCcsICfGrScsICfGricsICfGsicsICfGsycsICfGtCcsICfGtScsICfGticsICfHhCcsICfHhScsICfHhicsICfHpCcsICfHpScsICfIoScsICfIpCcsICfIpScsICfItCcsICfItScsICfIticsICfItycsICfIuCcsICfIuScsICfIuicsICfIuycsICfIvCcsICfIvScsICfIvicsICfIvycsICfJgCcsICfJgycsICfJhCcsICfJhicsICfJhycsICfJiCcsICfJiScsICfJjCcsICfJjScsICfJjicsICfJjycsICfJkycsICfJlScsICfJlicsICfJlycsICfJmycsICfJnycsICfJoCcsICfJoScsICfJoicsICfJpicsICfJpycsICfJqCcsICfJqicsICfJqycsICfJrCcsICfJrScsICfJsScsICfJsicsICfJsycsICfJtCcsICfJticsICfJvCcsICfJvScsICfJvicsICfKgCcsICfKgicsICfKiCcsICfKiScsICfKiycsICfKjycsICfKkCcsICfKkScsICfKmScsICfKmycsICfKnCcsICfKnScsICfKnycsICfKoCcsICfKoycsICfKpScsICfKpicsICfKqicsICfKqycsICfhtIAnLCAn4bSBJywgJ+G0gycsICfhtIQnLCAn4bSFJywgJ+G0hicsICfhtIcnLCAn4bSKJywgJ+G0iycsICfhtIwnLCAn4bSNJywgJ+G0jycsICfhtJgnLCAn4bSbJywgJ+G0nCcsICfhtKAnLCAn4bShJywgJ+G0oicsICfhtasnLCAn4bWsJywgJ+G1rScsICfhta4nLCAn4bWvJywgJ+G1sCcsICfhtbEnLCAn4bWyJywgJ+G1sycsICfhtbQnLCAn4bW1JywgJ+G1ticsICfhtbonLCAn4bW7JywgJ+G1vScsICfhtb4nLCAn4baAJywgJ+G2gScsICfhtoInLCAn4baDJywgJ+G2hCcsICfhtoUnLCAn4baGJywgJ+G2hycsICfhtognLCAn4baJJywgJ+G2iicsICfhtownLCAn4baNJywgJ+G2jicsICfhto8nLCAn4baRJywgJ+G2kicsICfhtpMnLCAn4baWJywgJ+G2mScsICfhuponLCAn4bqcJywgJ+G6nScsICfhup4nLCAn4bu6JywgJ+G7uycsICfhu7wnLCAn4bu9JywgJ+G7vicsICfhu78nLCAnwqknLCAnwq4nLCAn4oKgJywgJ+KCoicsICfigqMnLCAn4oKkJywgJ+KCpycsICfigronLCAn4oK5JywgJ+KEjCcsICfihJ4nLCAn446nJywgJ+OOricsICfjj4YnLCAn44+XJywgJ+OPnicsICfjj58nLCAnwrwnLCAnwr0nLCAnwr4nLCAn4oWTJywgJ+KFlCcsICfihZUnLCAn4oWWJywgJ+KFlycsICfihZgnLCAn4oWZJywgJ+KFmicsICfihZsnLCAn4oWcJywgJ+KFnScsICfihZ4nLCAn4oWfJywgJ+OAhycsICfigJgnLCAn4oCZJywgJ+KAmicsICfigJsnLCAn4oCcJywgJ+KAnScsICfigJ4nLCAn4oCfJywgJ+KAsicsICfigLMnLCAn44CdJywgJ+OAnicsICfCqycsICfCuycsICfigLknLCAn4oC6JywgJ+KAkCcsICfigJEnLCAn4oCSJywgJ+KAkycsICfigJQnLCAn4oCVJywgJ++4sScsICfvuLInLCAn77mYJywgJ+KAlicsICfigYQnLCAn4oGFJywgJ+KBhicsICfigY4nLCAn44CBJywgJ+OAgicsICfjgIgnLCAn44CJJywgJ+OAiicsICfjgIsnLCAn44CUJywgJ+OAlScsICfjgJgnLCAn44CZJywgJ+OAmicsICfjgJsnLCAn77iRJywgJ++4kicsICfvuLknLCAn77i6JywgJ++4vScsICfvuL4nLCAn77i/JywgJ++5gCcsICfvuZEnLCAn77mdJywgJ++5nicsICfvvZ8nLCAn772gJywgJ++9oScsICfvvaQnLCAnw5cnLCAnw7cnLCAn4oiSJywgJ+KIlScsICfiiJYnLCAn4oijJywgJ+KIpScsICfiiaonLCAn4omrJywgJ+KmhScsICfipoYnXTsKcHJpdmF0ZSBjb25zdCBUUkFOU0xJVF9UTyA9IFsnQUUnLCAnRCcsICdPJywgJ1RIJywgJ3NzJywgJ2FlJywgJ2QnLCAnbycsICd0aCcsICdEJywgJ2QnLCAnSCcsICdoJywgJ2knLCAncScsICdMJywgJ2wnLCAnTCcsICdsJywgJ1wnbicsICdOJywgJ24nLCAnT0UnLCAnb2UnLCAnVCcsICd0JywgJ2InLCAnQicsICdCJywgJ2InLCAnQycsICdjJywgJ0QnLCAnRCcsICdEJywgJ2QnLCAnRScsICdGJywgJ2YnLCAnRycsICdodicsICdJJywgJ0knLCAnSycsICdrJywgJ2wnLCAnTicsICduJywgJ09JJywgJ29pJywgJ1AnLCAncCcsICd0JywgJ1QnLCAndCcsICdUJywgJ1YnLCAnWScsICd5JywgJ1onLCAneicsICdEWicsICdEeicsICdkeicsICdHJywgJ2cnLCAnZCcsICdaJywgJ3onLCAnbCcsICduJywgJ3QnLCAnaicsICdkYicsICdxcCcsICdBJywgJ0MnLCAnYycsICdMJywgJ1QnLCAncycsICd6JywgJ0InLCAnVScsICdFJywgJ2UnLCAnSicsICdqJywgJ1InLCAncicsICdZJywgJ3knLCAnYicsICdjJywgJ2QnLCAnZCcsICdlJywgJ2onLCAnZycsICdnJywgJ0cnLCAnaCcsICdoJywgJ2knLCAnSScsICdsJywgJ2wnLCAnbCcsICdtJywgJ24nLCAnbicsICdOJywgJ09FJywgJ3InLCAncicsICdyJywgJ1InLCAncycsICd0JywgJ3UnLCAndicsICdZJywgJ3onLCAneicsICdCJywgJ0cnLCAnSCcsICdqJywgJ0wnLCAncScsICdkeicsICdkeicsICd0cycsICdscycsICdseicsICdBJywgJ0FFJywgJ0InLCAnQycsICdEJywgJ0QnLCAnRScsICdKJywgJ0snLCAnTCcsICdNJywgJ08nLCAnUCcsICdUJywgJ1UnLCAnVicsICdXJywgJ1onLCAndWUnLCAnYicsICdkJywgJ2YnLCAnbScsICduJywgJ3AnLCAncicsICdyJywgJ3MnLCAndCcsICd6JywgJ3RoJywgJ0knLCAncCcsICdVJywgJ2InLCAnZCcsICdmJywgJ2cnLCAnaycsICdsJywgJ20nLCAnbicsICdwJywgJ3InLCAncycsICd2JywgJ3gnLCAneicsICdhJywgJ2QnLCAnZScsICdlJywgJ2knLCAndScsICdhJywgJ3MnLCAncycsICdTUycsICdMTCcsICdsbCcsICdWJywgJ3YnLCAnWScsICd5JywgJyhDKScsICcoUiknLCAnQ0UnLCAnQ3InLCAnRnIuJywgJ0wuJywgJ1B0cycsICdUTCcsICdScycsICd4JywgJ1J4JywgJ20vcycsICdyYWQvcycsICdDL2tnJywgJ3BIJywgJ1YvbScsICdBL20nLCAnIDEvNCcsICcgMS8yJywgJyAzLzQnLCAnIDEvMycsICcgMi8zJywgJyAxLzUnLCAnIDIvNScsICcgMy81JywgJyA0LzUnLCAnIDEvNicsICcgNS82JywgJyAxLzgnLCAnIDMvOCcsICcgNS84JywgJyA3LzgnLCAnIDEvJywgJzAnLCAnXCcnLCAnXCcnLCAnLCcsICdcJycsICciJywgJyInLCAnLCwnLCAnIicsICdcJycsICciJywgJyInLCAnIicsICc8PCcsICc+PicsICc8JywgJz4nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJy0nLCAnfHwnLCAnLycsICdbJywgJ10nLCAnKicsICcsJywgJy4nLCAnPCcsICc+JywgJzw8JywgJz4+JywgJ1snLCAnXScsICdbJywgJ10nLCAnWycsICddJywgJywnLCAnLicsICdbJywgJ10nLCAnPDwnLCAnPj4nLCAnPCcsICc+JywgJywnLCAnWycsICddJywgJygoJywgJykpJywgJy4nLCAnLCcsICcqJywgJy8nLCAnLScsICcvJywgJ1xcJywgJ3wnLCAnfHwnLCAnPDwnLCAnPj4nLCAnKCgnLCAnKSknXTsKCnByaXZhdGUgc3RhdGljICR0cmFuc2xpdGVyYXRvcnMgPSBbXTsKcHJpdmF0ZSBzdGF0aWMgJHRhYmxlWmVybzsKcHJpdmF0ZSBzdGF0aWMgJHRhYmxlV2lkZTsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUNvZGVQb2ludHMoaW50IC4uLiRjb2Rlcyk6IHNlbGYKewokc3RyaW5nID0gJyc7Cgpmb3JlYWNoICgkY29kZXMgYXMgJGNvZGUpIHsKaWYgKDB4ODAgPiAkY29kZSAlPSAweDIwMDAwMCkgewokc3RyaW5nIC49IFxjaHIoJGNvZGUpOwp9IGVsc2VpZiAoMHg4MDAgPiAkY29kZSkgewokc3RyaW5nIC49IFxjaHIoMHhDMCB8ICRjb2RlID4+IDYpLlxjaHIoMHg4MCB8ICRjb2RlICYgMHgzRik7Cn0gZWxzZWlmICgweDEwMDAwID4gJGNvZGUpIHsKJHN0cmluZyAuPSBcY2hyKDB4RTAgfCAkY29kZSA+PiAxMikuXGNocigweDgwIHwgJGNvZGUgPj4gNiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlICYgMHgzRik7Cn0gZWxzZSB7CiRzdHJpbmcgLj0gXGNocigweEYwIHwgJGNvZGUgPj4gMTgpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDEyICYgMHgzRikuXGNocigweDgwIHwgJGNvZGUgPj4gNiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlICYgMHgzRik7Cn0KfQoKcmV0dXJuIG5ldyBzdGF0aWMoJHN0cmluZyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNjaWkoYXJyYXkgJHJ1bGVzID0gW10pOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokcyA9ICRzdHItPnN0cmluZzsKJHN0ci0+c3RyaW5nID0gJyc7CgphcnJheV91bnNoaWZ0KCRydWxlcywgJ25mZCcpOwokcnVsZXNbXSA9ICdsYXRpbi1hc2NpaSc7CgppZiAoXGZ1bmN0aW9uX2V4aXN0cygndHJhbnNsaXRlcmF0b3JfdHJhbnNsaXRlcmF0ZScpKSB7CiRydWxlc1tdID0gJ2FueS1sYXRpbi9iZ24nOwp9CgokcnVsZXNbXSA9ICduZmtkJzsKJHJ1bGVzW10gPSAnWzpub25zcGFjaW5nIG1hcms6XSByZW1vdmUnOwoKd2hpbGUgKFxzdHJsZW4oJHMpIC0gMSA+ICRpID0gc3Ryc3BuKCRzLCBzZWxmOjpBU0NJSSkpIHsKaWYgKDAgPCAtLSRpKSB7CiRzdHItPnN0cmluZyAuPSBzdWJzdHIoJHMsIDAsICRpKTsKJHMgPSBzdWJzdHIoJHMsICRpKTsKfQoKaWYgKCEkcnVsZSA9IGFycmF5X3NoaWZ0KCRydWxlcykpIHsKJHJ1bGVzID0gW107IAp9CgppZiAoJHJ1bGUgaW5zdGFuY2VvZiBcVHJhbnNsaXRlcmF0b3IpIHsKJHMgPSAkcnVsZS0+dHJhbnNsaXRlcmF0ZSgkcyk7Cn0gZWxzZWlmICgkcnVsZSBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRzID0gJHJ1bGUoJHMpOwp9IGVsc2VpZiAoJHJ1bGUpIHsKaWYgKCduZmQnID09PSAkcnVsZSA9IHN0cnRvbG93ZXIoJHJ1bGUpKSB7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkcywgc2VsZjo6TkZEKSA/OiAkcyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzLCBzZWxmOjpORkQpOwp9IGVsc2VpZiAoJ25ma2QnID09PSAkcnVsZSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHMsIHNlbGY6Ok5GS0QpID86ICRzID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHMsIHNlbGY6Ok5GS0QpOwp9IGVsc2VpZiAoJ1s6bm9uc3BhY2luZyBtYXJrOl0gcmVtb3ZlJyA9PT0gJHJ1bGUpIHsKJHMgPSBwcmVnX3JlcGxhY2UoJy9ccHtNbn0rKy91JywgJycsICRzKTsKfSBlbHNlaWYgKCdsYXRpbi1hc2NpaScgPT09ICRydWxlKSB7CiRzID0gc3RyX3JlcGxhY2Uoc2VsZjo6VFJBTlNMSVRfRlJPTSwgc2VsZjo6VFJBTlNMSVRfVE8sICRzKTsKfSBlbHNlaWYgKCdkZS1hc2NpaScgPT09ICRydWxlKSB7CiRzID0gcHJlZ19yZXBsYWNlKCIvKFtBVU9dKVx1ezAzMDh9KD89XHB7TGx9KS91IiwgJyQxZScsICRzKTsKJHMgPSBzdHJfcmVwbGFjZShbImFcdXswMzA4fSIsICJvXHV7MDMwOH0iLCAidVx1ezAzMDh9IiwgIkFcdXswMzA4fSIsICJPXHV7MDMwOH0iLCAiVVx1ezAzMDh9Il0sIFsnYWUnLCAnb2UnLCAndWUnLCAnQUUnLCAnT0UnLCAnVUUnXSwgJHMpOwp9IGVsc2VpZiAoXGZ1bmN0aW9uX2V4aXN0cygndHJhbnNsaXRlcmF0b3JfdHJhbnNsaXRlcmF0ZScpKSB7CmlmIChudWxsID09PSAkdHJhbnNsaXRlcmF0b3IgPSBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA/PyBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA9IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRydWxlKSkgewppZiAoJ2FueS1sYXRpbi9iZ24nID09PSAkcnVsZSkgewokcnVsZSA9ICdhbnktbGF0aW4nOwokdHJhbnNsaXRlcmF0b3IgPSBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA/PyBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA9IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRydWxlKTsKfQoKaWYgKG51bGwgPT09ICR0cmFuc2xpdGVyYXRvcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1Vua25vd24gdHJhbnNsaXRlcmF0aW9uIHJ1bGUgIiVzIi4nLCAkcnVsZSkpOwp9CgpzZWxmOjokdHJhbnNsaXRlcmF0b3JzWydhbnktbGF0aW4vYmduJ10gPSAkdHJhbnNsaXRlcmF0b3I7Cn0KCiRzID0gJHRyYW5zbGl0ZXJhdG9yLT50cmFuc2xpdGVyYXRlKCRzKTsKfQp9IGVsc2VpZiAoIVxmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKJHMgPSBwcmVnX3JlcGxhY2UoJy9bXlx4MDAtXHg3Rl0vdScsICc/JywgJHMpOwp9IGVsc2UgewokcyA9IEBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9bXlx4MDAtXHg3Rl0vdScsIHN0YXRpYyBmdW5jdGlvbiAoJGMpIHsKJGMgPSAoc3RyaW5nKSBpY29udignVVRGLTgnLCAnQVNDSUkvL1RSQU5TTElUJywgJGNbMF0pOwoKaWYgKCcnID09PSAkYyAmJiAnJyA9PT0gaWNvbnYoJ1VURi04JywgJ0FTQ0lJLy9UUkFOU0xJVCcsICfCsicpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignIiVzIiByZXF1aXJlcyBhIHRyYW5zbGl0LWFibGUgaWNvbnYgaW1wbGVtZW50YXRpb24sIHRyeSBpbnN0YWxsaW5nICJnbnUtbGliaWNvbnYiIGlmIHlvdVwncmUgdXNpbmcgQWxwaW5lIExpbnV4LicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKcmV0dXJuIDEgPCBcc3RybGVuKCRjKSA/IGx0cmltKCRjLCAnXCdgIl5+JykgOiAoJycgIT09ICRjID8gJGMgOiAnPycpOwp9LCAkcyk7Cn0KfQoKJHN0ci0+c3RyaW5nIC49ICRzOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYW1lbCgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cl9yZXBsYWNlKCcgJywgJycsIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1xiLig/IVtBLVpdezIsfSkvdScsIHN0YXRpYyBmdW5jdGlvbiAoJG0pIHVzZSAoJiRpKSB7CnJldHVybiAxID09PSArKyRpID8gKCfEsCcgPT09ICRtWzBdID8gJ2nMhycgOiBtYl9zdHJ0b2xvd2VyKCRtWzBdLCAnVVRGLTgnKSkgOiBtYl9jb252ZXJ0X2Nhc2UoJG1bMF0sIFxNQl9DQVNFX1RJVExFLCAnVVRGLTgnKTsKfSwgcHJlZ19yZXBsYWNlKCcvW15ccEwwLTldKysvdScsICcgJywgJHRoaXMtPnN0cmluZykpKTsKCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29kZVBvaW50c0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJHRoaXMtPnNsaWNlKCRvZmZzZXQsIDEpOwoKaWYgKCcnID09PSAkc3RyLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokY29kZVBvaW50cyA9IFtdOwoKZm9yZWFjaCAocHJlZ19zcGxpdCgnLy91JywgJHN0ci0+c3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpIGFzICRjKSB7CiRjb2RlUG9pbnRzW10gPSBtYl9vcmQoJGMsICdVVEYtOCcpOwp9CgpyZXR1cm4gJGNvZGVQb2ludHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmb2xkZWQoYm9vbCAkY29tcGF0ID0gdHJ1ZSk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICghJGNvbXBhdCB8fCBcUEhQX1ZFUlNJT05fSUQgPCA3MDMwMCB8fCAhXGRlZmluZWQoJ05vcm1hbGl6ZXI6Ok5GS0NfQ0YnKSkgewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsICRjb21wYXQgPyBcTm9ybWFsaXplcjo6TkZLQyA6IFxOb3JtYWxpemVyOjpORkMpOwokc3RyLT5zdHJpbmcgPSBtYl9zdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKHNlbGY6OkZPTERfRlJPTSwgc2VsZjo6Rk9MRF9UTywgJHRoaXMtPnN0cmluZyksICdVVEYtOCcpOwp9IGVsc2Ugewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsIFxOb3JtYWxpemVyOjpORktDX0NGKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBqb2luKGFycmF5ICRzdHJpbmdzLCBzdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCiR0YWlsID0gbnVsbCAhPT0gJGxhc3RHbHVlICYmIDEgPCBcY291bnQoJHN0cmluZ3MpID8gJGxhc3RHbHVlLmFycmF5X3BvcCgkc3RyaW5ncykgOiAnJzsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgkdGhpcy0+c3RyaW5nLCAkc3RyaW5ncykuJHRhaWw7CgppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzdHItPnN0cmluZykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gbG93ZXIoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBtYl9zdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKCfEsCcsICdpzIcnLCAkc3RyLT5zdHJpbmcpLCAnVVRGLTgnKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRyZWdleHAsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBhcnJheQp7CiRtYXRjaCA9ICgoXFBSRUdfUEFUVEVSTl9PUkRFUiB8IFxQUkVHX1NFVF9PUkRFUikgJiAkZmxhZ3MpID8gJ3ByZWdfbWF0Y2hfYWxsJyA6ICdwcmVnX21hdGNoJzsKCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokcmVnZXhwIC49ICdpJzsKfQoKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkdCwgJG0pIHsgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbSk7IH0pOwoKdHJ5IHsKaWYgKGZhbHNlID09PSAkbWF0Y2goJHJlZ2V4cC4ndScsICR0aGlzLT5zdHJpbmcsICRtYXRjaGVzLCAkZmxhZ3MgfCBcUFJFR19VTk1BVENIRURfQVNfTlVMTCwgJG9mZnNldCkpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIGNvZGUuJyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZShpbnQgJGZvcm0gPSBzZWxmOjpORkMpOiBzZWxmCnsKaWYgKCFcaW5fYXJyYXkoJGZvcm0sIFtzZWxmOjpORkMsIHNlbGY6Ok5GRCwgc2VsZjo6TkZLQywgc2VsZjo6TkZLRF0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIG5vcm1hbGl6YXRpb24gZm9ybS4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nLCAkZm9ybSkgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkZm9ybSk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZEJvdGgoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKaWYgKCcnID09PSAkcGFkU3RyIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkcGFkU3RyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHBhZCA9IGNsb25lICR0aGlzOwokcGFkLT5zdHJpbmcgPSAkcGFkU3RyOwoKcmV0dXJuICR0aGlzLT5wYWQoJGxlbmd0aCwgJHBhZCwgXFNUUl9QQURfQk9USCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRFbmQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKaWYgKCcnID09PSAkcGFkU3RyIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkcGFkU3RyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHBhZCA9IGNsb25lICR0aGlzOwokcGFkLT5zdHJpbmcgPSAkcGFkU3RyOwoKcmV0dXJuICR0aGlzLT5wYWQoJGxlbmd0aCwgJHBhZCwgXFNUUl9QQURfUklHSFQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkU3RhcnQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKaWYgKCcnID09PSAkcGFkU3RyIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkcGFkU3RyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHBhZCA9IGNsb25lICR0aGlzOwokcGFkLT5zdHJpbmcgPSAkcGFkU3RyOwoKcmV0dXJuICR0aGlzLT5wYWQoJGxlbmd0aCwgJHBhZCwgXFNUUl9QQURfTEVGVCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlTWF0Y2hlcyhzdHJpbmcgJGZyb21SZWdleHAsICR0byk6IHBhcmVudAp7CmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokZnJvbVJlZ2V4cCAuPSAnaSc7Cn0KCmlmIChcaXNfYXJyYXkoJHRvKSB8fCAkdG8gaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewppZiAoIVxpc19jYWxsYWJsZSgkdG8pKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlczo6cmVwbGFjZU1hdGNoZXMoKSIgbXVzdCBiZSBjYWxsYWJsZSwgYXJyYXkgZ2l2ZW4uJywgc3RhdGljOjpjbGFzcykpOwp9CgokcmVwbGFjZSA9ICdwcmVnX3JlcGxhY2VfY2FsbGJhY2snOwokdG8gPSBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRtKSB1c2UgKCR0byk6IHN0cmluZyB7CiR0byA9ICR0bygkbSk7CgppZiAoJycgIT09ICR0byAmJiAoIVxpc19zdHJpbmcoJHRvKSB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHRvKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUmVwbGFjZSBjYWxsYmFjayBtdXN0IHJldHVybiBhIHZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICR0bzsKfTsKfSBlbHNlaWYgKCcnICE9PSAkdG8gJiYgIXByZWdfbWF0Y2goJy8vdScsICR0bykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0gZWxzZSB7CiRyZXBsYWNlID0gJ3ByZWdfcmVwbGFjZSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChudWxsID09PSAkc3RyaW5nID0gJHJlcGxhY2UoJGZyb21SZWdleHAuJ3UnLCAkdG8sICR0aGlzLT5zdHJpbmcpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICRzdHJpbmc7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJldmVyc2UoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBpbXBsb2RlKCcnLCBhcnJheV9yZXZlcnNlKHByZWdfc3BsaXQoJy8oXFgpL3UnLCAkc3RyLT5zdHJpbmcsIC0xLCBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFIHwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpKSk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNuYWtlKCk6IHBhcmVudAp7CiRzdHIgPSAkdGhpcy0+Y2FtZWwoKTsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoWycvKFxwe0x1fSspKFxwe0x1fVxwe0xsfSkvdScsICcvKFtccHtMbH0wLTldKShccHtMdX0pL3UnXSwgJ1wxX1wyJywgJHN0ci0+c3RyaW5nKSwgJ1VURi04Jyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKGJvb2wgJGFsbFdvcmRzID0gZmFsc2UpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgokbGltaXQgPSAkYWxsV29yZHMgPyAtMSA6IDE7Cgokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9cYi4vdScsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJG0pOiBzdHJpbmcgewpyZXR1cm4gbWJfY29udmVydF9jYXNlKCRtWzBdLCBcTUJfQ0FTRV9USVRMRSwgJ1VURi04Jyk7Cn0sICRzdHItPnN0cmluZywgJGxpbWl0KTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbShzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogcGFyZW50CnsKaWYgKCIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9IiAhPT0gJGNoYXJzICYmICFwcmVnX21hdGNoKCcvL3UnLCAkY2hhcnMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcnMuJyk7Cn0KJGNoYXJzID0gcHJlZ19xdW90ZSgkY2hhcnMpOwoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2UoInteWyRjaGFyc10rK3xbJGNoYXJzXSsrJH11RCIsICcnLCAkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltRW5kKHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBwYXJlbnQKewppZiAoIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iICE9PSAkY2hhcnMgJiYgIXByZWdfbWF0Y2goJy8vdScsICRjaGFycykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBjaGFycy4nKTsKfQokY2hhcnMgPSBwcmVnX3F1b3RlKCRjaGFycyk7Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgie1skY2hhcnNdKyskfXVEIiwgJycsICRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1QcmVmaXgoJHByZWZpeCk6IHBhcmVudAp7CmlmICghJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIHBhcmVudDo6dHJpbVByZWZpeCgkcHJlZml4KTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJHByZWZpeCA9IGl0ZXJhdG9yX3RvX2FycmF5KCRwcmVmaXgsIGZhbHNlKTsKfSBlbHNlaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHByZWZpeCA9ICRwcmVmaXgtPnN0cmluZzsKfQoKJHByZWZpeCA9IGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAoYXJyYXkpICRwcmVmaXgpKTsKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlKCJ7Xig/OiRwcmVmaXgpfWl1RCIsICcnLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBwYXJlbnQKewppZiAoIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iICE9PSAkY2hhcnMgJiYgIXByZWdfbWF0Y2goJy8vdScsICRjaGFycykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBjaGFycy4nKTsKfQokY2hhcnMgPSBwcmVnX3F1b3RlKCRjaGFycyk7Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgie15bJGNoYXJzXSsrfXVEIiwgJycsICRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdWZmaXgoJHN1ZmZpeCk6IHBhcmVudAp7CmlmICghJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIHBhcmVudDo6dHJpbVN1ZmZpeCgkc3VmZml4KTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJHN1ZmZpeCA9IGl0ZXJhdG9yX3RvX2FycmF5KCRzdWZmaXgsIGZhbHNlKTsKfSBlbHNlaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfQoKJHN1ZmZpeCA9IGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAoYXJyYXkpICRzdWZmaXgpKTsKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlKCJ7KD86JHN1ZmZpeCkkfWl1RCIsICcnLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdXBwZXIoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBtYl9zdHJ0b3VwcGVyKCRzdHItPnN0cmluZywgJ1VURi04Jyk7CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgNzAzMDApIHsKJHN0ci0+c3RyaW5nID0gc3RyX3JlcGxhY2Uoc2VsZjo6VVBQRVJfRlJPTSwgc2VsZjo6VVBQRVJfVE8sICRzdHItPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gd2lkdGgoYm9vbCAkaWdub3JlQW5zaURlY29yYXRpb24gPSB0cnVlKTogaW50CnsKJHdpZHRoID0gMDsKJHMgPSBzdHJfcmVwbGFjZShbIlx4MDAiLCAiXHgwNSIsICJceDA3Il0sICcnLCAkdGhpcy0+c3RyaW5nKTsKCmlmIChmYWxzZSAhPT0gc3RycG9zKCRzLCAiXHIiKSkgewokcyA9IHN0cl9yZXBsYWNlKFsiXHJcbiIsICJcciJdLCAiXG4iLCAkcyk7Cn0KCmlmICghJGlnbm9yZUFuc2lEZWNvcmF0aW9uKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvW1xwe0NjfVx4N0ZdKysvdScsICcnLCAkcyk7Cn0KCmZvcmVhY2ggKGV4cGxvZGUoIlxuIiwgJHMpIGFzICRzKSB7CmlmICgkaWdub3JlQW5zaURlY29yYXRpb24pIHsKJHMgPSBwcmVnX3JlcGxhY2UoJy8oPzpceDFCKD86CiAgICAgICAgICAgICAgICAgICAgXFsgW1x4MzAtXHgzRl0qKyBbXHgyMC1ceDJGXSorIFtceDQwLVx4N0VdCiAgICAgICAgICAgICAgICAgICAgfCBbUFxdWF5fXSAuKj8gXHgxQlxcXFwKICAgICAgICAgICAgICAgICAgICB8IFtceDQxLVx4N0VdCiAgICAgICAgICAgICAgICApfFtccHtDY31ceDdGXSsrKS94dScsICcnLCAkcyk7Cn0KCiRsaW5lV2lkdGggPSAkdGhpcy0+d2Nzd2lkdGgoJHMpOwoKaWYgKCRsaW5lV2lkdGggPiAkd2lkdGgpIHsKJHdpZHRoID0gJGxpbmVXaWR0aDsKfQp9CgpyZXR1cm4gJHdpZHRoOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhZChpbnQgJGxlbiwgc2VsZiAkcGFkLCBpbnQgJHR5cGUpOiBwYXJlbnQKewokc0xlbiA9ICR0aGlzLT5sZW5ndGgoKTsKCmlmICgkbGVuIDw9ICRzTGVuKSB7CnJldHVybiBjbG9uZSAkdGhpczsKfQoKJHBhZExlbiA9ICRwYWQtPmxlbmd0aCgpOwokZnJlZUxlbiA9ICRsZW4gLSAkc0xlbjsKJGxlbiA9ICRmcmVlTGVuICUgJHBhZExlbjsKCnN3aXRjaCAoJHR5cGUpIHsKY2FzZSBcU1RSX1BBRF9SSUdIVDoKcmV0dXJuICR0aGlzLT5hcHBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkZnJlZUxlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKY2FzZSBcU1RSX1BBRF9MRUZUOgpyZXR1cm4gJHRoaXMtPnByZXBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkZnJlZUxlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKY2FzZSBcU1RSX1BBRF9CT1RIOgokZnJlZUxlbiAvPSAyOwoKJHJpZ2h0TGVuID0gY2VpbCgkZnJlZUxlbik7CiRsZW4gPSAkcmlnaHRMZW4gJSAkcGFkTGVuOwokc3RyID0gJHRoaXMtPmFwcGVuZChzdHJfcmVwZWF0KCRwYWQtPnN0cmluZywgaW50ZGl2KCRyaWdodExlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKJGxlZnRMZW4gPSBmbG9vcigkZnJlZUxlbik7CiRsZW4gPSAkbGVmdExlbiAlICRwYWRMZW47CgpyZXR1cm4gJHN0ci0+cHJlcGVuZChzdHJfcmVwZWF0KCRwYWQtPnN0cmluZywgaW50ZGl2KCRsZWZ0TGVuLCAkcGFkTGVuKSkuKCRsZW4gPyAkcGFkLT5zbGljZSgwLCAkbGVuKSA6ICcnKSk7CgpkZWZhdWx0Ogp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHBhZGRpbmcgdHlwZS4nKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdjc3dpZHRoKHN0cmluZyAkc3RyaW5nKTogaW50CnsKJHdpZHRoID0gMDsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJy8vdScsICRzdHJpbmcsIC0xLCBcUFJFR19TUExJVF9OT19FTVBUWSkgYXMgJGMpIHsKJGNvZGVQb2ludCA9IG1iX29yZCgkYywgJ1VURi04Jyk7CgppZiAoMCA9PT0gJGNvZGVQb2ludCAKfHwgMHgwMzRGID09PSAkY29kZVBvaW50IAp8fCAoMHgyMDBCIDw9ICRjb2RlUG9pbnQgJiYgMHgyMDBGID49ICRjb2RlUG9pbnQpIAp8fCAweDIwMjggPT09ICRjb2RlUG9pbnQgCnx8IDB4MjAyOSA9PT0gJGNvZGVQb2ludCAKfHwgKDB4MjAyQSA8PSAkY29kZVBvaW50ICYmIDB4MjAyRSA+PSAkY29kZVBvaW50KSAKfHwgKDB4MjA2MCA8PSAkY29kZVBvaW50ICYmIDB4MjA2MyA+PSAkY29kZVBvaW50KSAKKSB7CmNvbnRpbnVlOwp9CgoKaWYgKDMyID4gJGNvZGVQb2ludCAKfHwgKDB4MDdGIDw9ICRjb2RlUG9pbnQgJiYgMHgwQTAgPiAkY29kZVBvaW50KSAKKSB7CnJldHVybiAtMTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiR0YWJsZVplcm8pIHsKc2VsZjo6JHRhYmxlWmVybyA9IHJlcXVpcmUgX19ESVJfXy4nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3plcm8ucGhwJzsKfQoKaWYgKCRjb2RlUG9pbnQgPj0gc2VsZjo6JHRhYmxlWmVyb1swXVswXSAmJiAkY29kZVBvaW50IDw9IHNlbGY6OiR0YWJsZVplcm9bJHVib3VuZCA9IFxjb3VudChzZWxmOjokdGFibGVaZXJvKSAtIDFdWzFdKSB7CiRsYm91bmQgPSAwOwp3aGlsZSAoJHVib3VuZCA+PSAkbGJvdW5kKSB7CiRtaWQgPSBmbG9vcigoJGxib3VuZCArICR1Ym91bmQpIC8gMik7CgppZiAoJGNvZGVQb2ludCA+IHNlbGY6OiR0YWJsZVplcm9bJG1pZF1bMV0pIHsKJGxib3VuZCA9ICRtaWQgKyAxOwp9IGVsc2VpZiAoJGNvZGVQb2ludCA8IHNlbGY6OiR0YWJsZVplcm9bJG1pZF1bMF0pIHsKJHVib3VuZCA9ICRtaWQgLSAxOwp9IGVsc2Ugewpjb250aW51ZSAyOwp9Cn0KfQoKaWYgKG51bGwgPT09IHNlbGY6OiR0YWJsZVdpZGUpIHsKc2VsZjo6JHRhYmxlV2lkZSA9IHJlcXVpcmUgX19ESVJfXy4nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3dpZGUucGhwJzsKfQoKaWYgKCRjb2RlUG9pbnQgPj0gc2VsZjo6JHRhYmxlV2lkZVswXVswXSAmJiAkY29kZVBvaW50IDw9IHNlbGY6OiR0YWJsZVdpZGVbJHVib3VuZCA9IFxjb3VudChzZWxmOjokdGFibGVXaWRlKSAtIDFdWzFdKSB7CiRsYm91bmQgPSAwOwp3aGlsZSAoJHVib3VuZCA+PSAkbGJvdW5kKSB7CiRtaWQgPSBmbG9vcigoJGxib3VuZCArICR1Ym91bmQpIC8gMik7CgppZiAoJGNvZGVQb2ludCA+IHNlbGY6OiR0YWJsZVdpZGVbJG1pZF1bMV0pIHsKJGxib3VuZCA9ICRtaWQgKyAxOwp9IGVsc2VpZiAoJGNvZGVQb2ludCA8IHNlbGY6OiR0YWJsZVdpZGVbJG1pZF1bMF0pIHsKJHVib3VuZCA9ICRtaWQgLSAxOwp9IGVsc2Ugewokd2lkdGggKz0gMjsKCmNvbnRpbnVlIDI7Cn0KfQp9CgorKyR3aWR0aDsKfQoKcmV0dXJuICR3aWR0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCmNsYXNzIEJ5dGVTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZwp7CnByaXZhdGUgY29uc3QgQUxQSEFCRVRfQUxQSEFOVU1FUklDID0gJzEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpCnsKJHRoaXMtPnN0cmluZyA9ICRzdHJpbmc7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21SYW5kb20oaW50ICRsZW5ndGggPSAxNiwgc3RyaW5nICRhbHBoYWJldCA9IG51bGwpOiBzZWxmCnsKaWYgKCRsZW5ndGggPD0gMCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0Egc3RyaWN0bHkgcG9zaXRpdmUgbGVuZ3RoIGlzIGV4cGVjdGVkLCAiJWQiIGdpdmVuLicsICRsZW5ndGgpKTsKfQoKJGFscGhhYmV0ID0gJGFscGhhYmV0ID8/IHNlbGY6OkFMUEhBQkVUX0FMUEhBTlVNRVJJQzsKJGFscGhhYmV0U2l6ZSA9IFxzdHJsZW4oJGFscGhhYmV0KTsKJGJpdHMgPSAoaW50KSBjZWlsKGxvZygkYWxwaGFiZXRTaXplLCAyLjApKTsKaWYgKCRiaXRzIDw9IDAgfHwgJGJpdHMgPiA1Nikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgbGVuZ3RoIG9mIHRoZSBhbHBoYWJldCBtdXN0IGluIHRoZSBbMl4xLCAyXjU2XSByYW5nZS4nKTsKfQoKJHJldCA9ICcnOwp3aGlsZSAoJGxlbmd0aCA+IDApIHsKJHVyYW5kb21MZW5ndGggPSAoaW50KSBjZWlsKDIgKiAkbGVuZ3RoICogJGJpdHMgLyA4LjApOwokZGF0YSA9IHJhbmRvbV9ieXRlcygkdXJhbmRvbUxlbmd0aCk7CiR1bnBhY2tlZERhdGEgPSAwOwokdW5wYWNrZWRCaXRzID0gMDsKZm9yICgkaSA9IDA7ICRpIDwgJHVyYW5kb21MZW5ndGggJiYgJGxlbmd0aCA+IDA7ICsrJGkpIHsKCiR1bnBhY2tlZERhdGEgPSAoJHVucGFja2VkRGF0YSA8PCA4KSB8IFxvcmQoJGRhdGFbJGldKTsKJHVucGFja2VkQml0cyArPSA4OwoKCgpmb3IgKDsgJHVucGFja2VkQml0cyA+PSAkYml0cyAmJiAkbGVuZ3RoID4gMDsgJHVucGFja2VkQml0cyAtPSAkYml0cykgewokaW5kZXggPSAoJHVucGFja2VkRGF0YSAmICgoMSA8PCAkYml0cykgLSAxKSk7CiR1bnBhY2tlZERhdGEgPj49ICRiaXRzOwoKCgppZiAoJGluZGV4IDwgJGFscGhhYmV0U2l6ZSkgewokcmV0IC49ICRhbHBoYWJldFskaW5kZXhdOwotLSRsZW5ndGg7Cn0KfQp9Cn0KCnJldHVybiBuZXcgc3RhdGljKCRyZXQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gYnl0ZXNBdChpbnQgJG9mZnNldCk6IGFycmF5CnsKJHN0ciA9ICR0aGlzLT5zdHJpbmdbJG9mZnNldF0gPz8gJyc7CgpyZXR1cm4gJycgPT09ICRzdHIgPyBbXSA6IFtcb3JkKCRzdHIpXTsKfQoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZChzdHJpbmcgLi4uJHN1ZmZpeCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nIC49IDEgPj0gXGNvdW50KCRzdWZmaXgpID8gKCRzdWZmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHN1ZmZpeCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGNhbWVsKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCiRwYXJ0cyA9IGV4cGxvZGUoJyAnLCB0cmltKHVjd29yZHMocHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTlceDdmLVx4ZmZdKysvJywgJyAnLCAkdGhpcy0+c3RyaW5nKSkpKTsKJHBhcnRzWzBdID0gMSAhPT0gXHN0cmxlbigkcGFydHNbMF0pICYmIGN0eXBlX3VwcGVyKCRwYXJ0c1swXSkgPyAkcGFydHNbMF0gOiBsY2ZpcnN0KCRwYXJ0c1swXSk7CiRzdHItPnN0cmluZyA9IGltcGxvZGUoJycsICRwYXJ0cyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGNodW5rKGludCAkbGVuZ3RoID0gMSk6IGFycmF5CnsKaWYgKDEgPiAkbGVuZ3RoKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBjaHVuayBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKfQoKaWYgKCcnID09PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiBbXTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gW107Cgpmb3JlYWNoIChzdHJfc3BsaXQoJHRoaXMtPnN0cmluZywgJGxlbmd0aCkgYXMgJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICgkc3VmZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRzdWZmaXggPSAkc3VmZml4LT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHN1ZmZpeCkgfHwgJHN1ZmZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjplbmRzV2l0aCgkc3VmZml4KTsKfSBlbHNlIHsKJHN1ZmZpeCA9IChzdHJpbmcpICRzdWZmaXg7Cn0KCnJldHVybiAnJyAhPT0gJHN1ZmZpeCAmJiBcc3RybGVuKCR0aGlzLT5zdHJpbmcpID49IFxzdHJsZW4oJHN1ZmZpeCkgJiYgMCA9PT0gc3Vic3RyX2NvbXBhcmUoJHRoaXMtPnN0cmluZywgJHN1ZmZpeCwgLVxzdHJsZW4oJHN1ZmZpeCksIG51bGwsICR0aGlzLT5pZ25vcmVDYXNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCRzdHJpbmcgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHN0cmluZyA9ICRzdHJpbmctPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3RyaW5nKSB8fCAkc3RyaW5nIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVxdWFsc1RvKCRzdHJpbmcpOwp9IGVsc2Ugewokc3RyaW5nID0gKHN0cmluZykgJHN0cmluZzsKfQoKaWYgKCcnICE9PSAkc3RyaW5nICYmICR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiAwID09PSBzdHJjYXNlY21wKCRzdHJpbmcsICR0aGlzLT5zdHJpbmcpOwp9CgpyZXR1cm4gJHN0cmluZyA9PT0gJHRoaXMtPnN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIGZvbGRlZCgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cnRvbG93ZXIoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZigkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2YoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgppZiAoJycgPT09ICRuZWVkbGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRpID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBzdHJpcG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQpIDogc3RycG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQpOwoKcmV0dXJuIGZhbHNlID09PSAkaSA/IG51bGwgOiAkaTsKfQoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2ZMYXN0KCRuZWVkbGUsIGludCAkb2Zmc2V0ID0gMCk6ID9pbnQKewppZiAoJG5lZWRsZSBpbnN0YW5jZW9mIHBhcmVudCkgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZkxhc3QoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgppZiAoJycgPT09ICRuZWVkbGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRpID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBzdHJyaXBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KSA6IHN0cnJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNVdGY4KCk6IGJvb2wKewpyZXR1cm4gJycgPT09ICR0aGlzLT5zdHJpbmcgfHwgcHJlZ19tYXRjaCgnLy91JywgJHRoaXMtPnN0cmluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBqb2luKGFycmF5ICRzdHJpbmdzLCBzdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCiR0YWlsID0gbnVsbCAhPT0gJGxhc3RHbHVlICYmIDEgPCBcY291bnQoJHN0cmluZ3MpID8gJGxhc3RHbHVlLmFycmF5X3BvcCgkc3RyaW5ncykgOiAnJzsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgkdGhpcy0+c3RyaW5nLCAkc3RyaW5ncykuJHRhaWw7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gXHN0cmxlbigkdGhpcy0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGxvd2VyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHJlZ2V4cCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGFycmF5CnsKJG1hdGNoID0gKChcUFJFR19QQVRURVJOX09SREVSIHwgXFBSRUdfU0VUX09SREVSKSAmICRmbGFncykgPyAncHJlZ19tYXRjaF9hbGwnIDogJ3ByZWdfbWF0Y2gnOwoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CiRyZWdleHAgLj0gJ2knOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewppZiAoZmFsc2UgPT09ICRtYXRjaCgkcmVnZXhwLCAkdGhpcy0+c3RyaW5nLCAkbWF0Y2hlcywgJGZsYWdzIHwgXFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9CT1RIKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9SSUdIVCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZFN0YXJ0KGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9MRUZUKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKDEgPj0gXGNvdW50KCRwcmVmaXgpID8gKCRwcmVmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHByZWZpeCkpLiRzdHItPnN0cmluZzsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZShzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8pOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoJycgIT09ICRmcm9tKSB7CiRzdHItPnN0cmluZyA9ICR0aGlzLT5pZ25vcmVDYXNlID8gc3RyX2lyZXBsYWNlKCRmcm9tLCAkdG8sICR0aGlzLT5zdHJpbmcpIDogc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBwYXJlbnQKewppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJGZyb21SZWdleHAgLj0gJ2knOwp9CgppZiAoXGlzX2FycmF5KCR0bykpIHsKaWYgKCFcaXNfY2FsbGFibGUoJHRvKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXM6OnJlcGxhY2VNYXRjaGVzKCkiIG11c3QgYmUgY2FsbGFibGUsIGFycmF5IGdpdmVuLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJHJlcGxhY2UgPSAncHJlZ19yZXBsYWNlX2NhbGxiYWNrJzsKfSBlbHNlIHsKJHJlcGxhY2UgPSAkdG8gaW5zdGFuY2VvZiBcQ2xvc3VyZSA/ICdwcmVnX3JlcGxhY2VfY2FsbGJhY2snIDogJ3ByZWdfcmVwbGFjZSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChudWxsID09PSAkc3RyaW5nID0gJHJlcGxhY2UoJGZyb21SZWdleHAsICR0bywgJHRoaXMtPnN0cmluZykpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIGNvZGUuJyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gJHN0cmluZzsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmV2ZXJzZSgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cnJldigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgaW50ICRsZW5ndGggPSBudWxsKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoc3RyaW5nKSBzdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IFxQSFBfSU5UX01BWCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNuYWtlKCk6IHBhcmVudAp7CiRzdHIgPSAkdGhpcy0+Y2FtZWwoKTsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoWycvKFtBLVpdKykoW0EtWl1bYS16XSkvJywgJy8oW2EtelxkXSkoW0EtWl0pLyddLCAnXDFfXDInLCAkc3RyLT5zdHJpbmcpKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaWNlKHN0cmluZyAkcmVwbGFjZW1lbnQsIGludCAkc3RhcnQgPSAwLCBpbnQgJGxlbmd0aCA9IG51bGwpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN1YnN0cl9yZXBsYWNlKCR0aGlzLT5zdHJpbmcsICRyZXBsYWNlbWVudCwgJHN0YXJ0LCAkbGVuZ3RoID8/IFxQSFBfSU5UX01BWCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkZGVsaW1pdGVyLCBpbnQgJGxpbWl0ID0gbnVsbCwgaW50ICRmbGFncyA9IG51bGwpOiBhcnJheQp7CmlmICgxID4gJGxpbWl0ID0gJGxpbWl0ID8/IFxQSFBfSU5UX01BWCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTsKfQoKaWYgKCcnID09PSAkZGVsaW1pdGVyKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGRlbGltaXRlciBpcyBlbXB0eS4nKTsKfQoKaWYgKG51bGwgIT09ICRmbGFncykgewpyZXR1cm4gcGFyZW50OjpzcGxpdCgkZGVsaW1pdGVyLCAkbGltaXQsICRmbGFncyk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJGNodW5rcyA9ICR0aGlzLT5pZ25vcmVDYXNlCj8gcHJlZ19zcGxpdCgneycucHJlZ19xdW90ZSgkZGVsaW1pdGVyKS4nfWlEJywgJHRoaXMtPnN0cmluZywgJGxpbWl0KQo6IGV4cGxvZGUoJGRlbGltaXRlciwgJHRoaXMtPnN0cmluZywgJGxpbWl0KTsKCmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVuayA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICgkcHJlZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0gZWxzZWlmICghXGlzX3N0cmluZygkcHJlZml4KSkgewpyZXR1cm4gcGFyZW50OjpzdGFydHNXaXRoKCRwcmVmaXgpOwp9CgpyZXR1cm4gJycgIT09ICRwcmVmaXggJiYgMCA9PT0gKCR0aGlzLT5pZ25vcmVDYXNlID8gc3RybmNhc2VjbXAoJHRoaXMtPnN0cmluZywgJHByZWZpeCwgXHN0cmxlbigkcHJlZml4KSkgOiBzdHJuY21wKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIFxzdHJsZW4oJHByZWZpeCkpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKGJvb2wgJGFsbFdvcmRzID0gZmFsc2UpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICRhbGxXb3JkcyA/IHVjd29yZHMoJHN0ci0+c3RyaW5nKSA6IHVjZmlyc3QoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9Vbmljb2RlU3RyaW5nKHN0cmluZyAkZnJvbUVuY29kaW5nID0gbnVsbCk6IFVuaWNvZGVTdHJpbmcKewpyZXR1cm4gbmV3IFVuaWNvZGVTdHJpbmcoJHRoaXMtPnRvQ29kZVBvaW50U3RyaW5nKCRmcm9tRW5jb2RpbmcpLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9Db2RlUG9pbnRTdHJpbmcoc3RyaW5nICRmcm9tRW5jb2RpbmcgPSBudWxsKTogQ29kZVBvaW50U3RyaW5nCnsKJHUgPSBuZXcgQ29kZVBvaW50U3RyaW5nKCk7CgppZiAoXGluX2FycmF5KCRmcm9tRW5jb2RpbmcsIFtudWxsLCAndXRmOCcsICd1dGYtOCcsICdVVEY4JywgJ1VURi04J10sIHRydWUpICYmIHByZWdfbWF0Y2goJy8vdScsICR0aGlzLT5zdHJpbmcpKSB7CiR1LT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKcmV0dXJuICR1Owp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewp0cnkgewokdmFsaWRFbmNvZGluZyA9IGZhbHNlICE9PSBtYl9kZXRlY3RfZW5jb2RpbmcoJHRoaXMtPnN0cmluZywgJGZyb21FbmNvZGluZyA/PyAnV2luZG93cy0xMjUyJywgdHJ1ZSk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKdGhyb3cgJGU7Cn0KCiR1LT5zdHJpbmcgPSBpY29udigkZnJvbUVuY29kaW5nID8/ICdXaW5kb3dzLTEyNTInLCAnVVRGLTgnLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAkdTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKaWYgKCEkdmFsaWRFbmNvZGluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgIiVzIiBzdHJpbmcuJywgJGZyb21FbmNvZGluZyA/PyAnV2luZG93cy0xMjUyJykpOwp9CgokdS0+c3RyaW5nID0gbWJfY29udmVydF9lbmNvZGluZygkdGhpcy0+c3RyaW5nLCAnVVRGLTgnLCAkZnJvbUVuY29kaW5nID8/ICdXaW5kb3dzLTEyNTInKTsKCnJldHVybiAkdTsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW0oc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQyIpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHRyaW0oJHN0ci0+c3RyaW5nLCAkY2hhcnMpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltRW5kKHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MEMiKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBydHJpbSgkc3RyLT5zdHJpbmcsICRjaGFycyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDIik6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbHRyaW0oJHN0ci0+c3RyaW5nLCAkY2hhcnMpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB1cHBlcigpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cnRvdXBwZXIoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gd2lkdGgoYm9vbCAkaWdub3JlQW5zaURlY29yYXRpb24gPSB0cnVlKTogaW50CnsKJHN0cmluZyA9IHByZWdfbWF0Y2goJy8vdScsICR0aGlzLT5zdHJpbmcpID8gJHRoaXMtPnN0cmluZyA6IHByZWdfcmVwbGFjZSgnL1tceDgwLVx4RkZdLycsICc/JywgJHRoaXMtPnN0cmluZyk7CgpyZXR1cm4gKG5ldyBDb2RlUG9pbnRTdHJpbmcoJHN0cmluZykpLT53aWR0aCgkaWdub3JlQW5zaURlY29yYXRpb24pOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmc7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKCgoKY2xhc3MgQ29kZVBvaW50U3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RVbmljb2RlU3RyaW5nCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpCnsKaWYgKCcnICE9PSAkc3RyaW5nICYmICFwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHRoaXMtPnN0cmluZyA9ICRzdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoc3RyaW5nIC4uLiRzdWZmaXgpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nIC49IDEgPj0gXGNvdW50KCRzdWZmaXgpID8gKCRzdWZmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHN1ZmZpeCk7CgppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzdHItPnN0cmluZykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXkKewppZiAoMSA+ICRsZW5ndGgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGNodW5rIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwp9CgppZiAoJycgPT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokcnggPSAnLygnOwp3aGlsZSAoNjU1MzUgPCAkbGVuZ3RoKSB7CiRyeCAuPSAnLns2NTUzNX0nOwokbGVuZ3RoIC09IDY1NTM1Owp9CiRyeCAuPSAnLnsnLiRsZW5ndGguJ30pL3VzJzsKCiRzdHIgPSBjbG9uZSAkdGhpczsKJGNodW5rcyA9IFtdOwoKZm9yZWFjaCAocHJlZ19zcGxpdCgkcngsICR0aGlzLT5zdHJpbmcsIC0xLCBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFIHwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpIGFzICRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVua3NbXSA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29kZVBvaW50c0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJG9mZnNldCA/ICR0aGlzLT5zbGljZSgkb2Zmc2V0LCAxKSA6ICR0aGlzOwoKcmV0dXJuICcnID09PSAkc3RyLT5zdHJpbmcgPyBbXSA6IFttYl9vcmQoJHN0ci0+c3RyaW5nLCAnVVRGLTgnKV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICgkc3VmZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKaWYgKCcnID09PSAkc3VmZml4IHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkc3VmZml4KSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gcHJlZ19tYXRjaCgneycucHJlZ19xdW90ZSgkc3VmZml4KS4nJH1pdUQnLCAkdGhpcy0+c3RyaW5nKTsKfQoKcmV0dXJuIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkc3VmZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkc3VmZml4LCAtXHN0cmxlbigkc3VmZml4KSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHNUbygkc3RyaW5nKTogYm9vbAp7CmlmICgkc3RyaW5nIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN0cmluZyA9ICRzdHJpbmctPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3RyaW5nKSB8fCAkc3RyaW5nIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVxdWFsc1RvKCRzdHJpbmcpOwp9IGVsc2Ugewokc3RyaW5nID0gKHN0cmluZykgJHN0cmluZzsKfQoKaWYgKCcnICE9PSAkc3RyaW5nICYmICR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBcc3RybGVuKCRzdHJpbmcpID09PSBcc3RybGVuKCR0aGlzLT5zdHJpbmcpICYmIDAgPT09IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJHN0cmluZywgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAkc3RyaW5nID09PSAkdGhpcy0+c3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZigkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZigkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCmlmICgnJyA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04JykgOiBtYl9zdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04Jyk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2ZMYXN0KCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKaWYgKCcnID09PSAkbmVlZGxlKSB7CnJldHVybiBudWxsOwp9CgokaSA9ICR0aGlzLT5pZ25vcmVDYXNlID8gbWJfc3Rycmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04JykgOiBtYl9zdHJycG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQsICdVVEYtOCcpOwoKcmV0dXJuIGZhbHNlID09PSAkaSA/IG51bGwgOiAkaTsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gbWJfc3RybGVuKCR0aGlzLT5zdHJpbmcsICdVVEYtOCcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoMSA+PSBcY291bnQoJHByZWZpeCkgPyAoJHByZWZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkcHJlZml4KSkuJHRoaXMtPnN0cmluZzsKCmlmICghcHJlZ19tYXRjaCgnLy91JywgJHN0ci0+c3RyaW5nKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0byk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCcnID09PSAkZnJvbSB8fCAhcHJlZ19tYXRjaCgnLy91JywgJGZyb20pKSB7CnJldHVybiAkc3RyOwp9CgppZiAoJycgIT09ICR0byAmJiAhcHJlZ19tYXRjaCgnLy91JywgJHRvKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CiRzdHItPnN0cmluZyA9IGltcGxvZGUoJHRvLCBwcmVnX3NwbGl0KCd7Jy5wcmVnX3F1b3RlKCRmcm9tKS4nfWl1RCcsICR0aGlzLT5zdHJpbmcpKTsKfSBlbHNlIHsKJHN0ci0+c3RyaW5nID0gc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2xpY2UoaW50ICRzdGFydCA9IDAsIGludCAkbGVuZ3RoID0gbnVsbCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBtYl9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoLCAnVVRGLTgnKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaWNlKHN0cmluZyAkcmVwbGFjZW1lbnQsIGludCAkc3RhcnQgPSAwLCBpbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHJlcGxhY2VtZW50KSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RhcnQgPSAkc3RhcnQgPyBcc3RybGVuKG1iX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAwLCAkc3RhcnQsICdVVEYtOCcpKSA6IDA7CiRsZW5ndGggPSAkbGVuZ3RoID8gXHN0cmxlbihtYl9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoLCAnVVRGLTgnKSkgOiAkbGVuZ3RoOwokc3RyLT5zdHJpbmcgPSBzdWJzdHJfcmVwbGFjZSgkdGhpcy0+c3RyaW5nLCAkcmVwbGFjZW1lbnQsICRzdGFydCwgJGxlbmd0aCA/PyBcUEhQX0lOVF9NQVgpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzcGxpdChzdHJpbmcgJGRlbGltaXRlciwgaW50ICRsaW1pdCA9IG51bGwsIGludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAoMSA+ICRsaW1pdCA9ICRsaW1pdCA/PyBcUEhQX0lOVF9NQVgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7Cn0KCmlmICgnJyA9PT0gJGRlbGltaXRlcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgZW1wdHkuJyk7Cn0KCmlmIChudWxsICE9PSAkZmxhZ3MpIHsKcmV0dXJuIHBhcmVudDo6c3BsaXQoJGRlbGltaXRlci4ndScsICRsaW1pdCwgJGZsYWdzKTsKfQoKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkZGVsaW1pdGVyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgbm90IGEgdmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSAkdGhpcy0+aWdub3JlQ2FzZQo/IHByZWdfc3BsaXQoJ3snLnByZWdfcXVvdGUoJGRlbGltaXRlcikuJ31pdUQnLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQpCjogZXhwbG9kZSgkZGVsaW1pdGVyLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQpOwoKZm9yZWFjaCAoJGNodW5rcyBhcyAmJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzdGFydHNXaXRoKCRwcmVmaXgpOiBib29sCnsKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRwcmVmaXgpIHx8ICRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6c3RhcnRzV2l0aCgkcHJlZml4KTsKfSBlbHNlIHsKJHByZWZpeCA9IChzdHJpbmcpICRwcmVmaXg7Cn0KCmlmICgnJyA9PT0gJHByZWZpeCB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHByZWZpeCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJHByZWZpeCwgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAwID09PSBzdHJuY21wKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIFxzdHJsZW4oJHByZWZpeCkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uOwoKaW50ZXJmYWNlIEV4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIFxUaHJvd2FibGUKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvbjsKCmNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvbjsKCmNsYXNzIFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcSW5mbGVjdG9yOwoKZmluYWwgY2xhc3MgRW5nbGlzaEluZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvckludGVyZmFjZQp7CgoKCgoKcHJpdmF0ZSBjb25zdCBQTFVSQUxfTUFQID0gWwoKCgoKCgoKWydhJywgMSwgdHJ1ZSwgdHJ1ZSwgWydvbicsICd1bSddXSwKCgpbJ2VhJywgMiwgdHJ1ZSwgdHJ1ZSwgJ2EnXSwKCgpbJ3NlY2l2cmVzJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3NlcnZpY2UnXSwKCgpbJ2VjaScsIDMsIGZhbHNlLCB0cnVlLCAnb3VzZSddLAoKClsnZXNlZScsIDQsIGZhbHNlLCB0cnVlLCAnb29zZSddLAoKClsnaScsIDEsIHRydWUsIHRydWUsICd1cyddLAoKClsnbmVtJywgMywgdHJ1ZSwgdHJ1ZSwgJ21hbiddLAoKClsnbmVyZGxpaGMnLCA4LCB0cnVlLCB0cnVlLCAnY2hpbGQnXSwKCgpbJ25leG8nLCA0LCBmYWxzZSwgZmFsc2UsICdveCddLAoKClsnc2VjaScsIDQsIGZhbHNlLCB0cnVlLCBbJ2V4JywgJ2l4JywgJ2ljZSddXSwKCgpbJ3NlZG9jJywgNSwgZmFsc2UsIHRydWUsICdjb2RlJ10sCgoKWydzZWlmbGVzJywgNywgdHJ1ZSwgdHJ1ZSwgJ3NlbGZpZSddLAoKClsnc2VpYm1veicsIDcsIHRydWUsIHRydWUsICd6b21iaWUnXSwKCgpbJ3NlaXZvbScsIDYsIHRydWUsIHRydWUsICdtb3ZpZSddLAoKClsnc2VtYW4nLCA1LCB0cnVlLCBmYWxzZSwgJ25hbWUnXSwKCgpbJ3Nlc3V0Y2VwJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3BlY3R1cyddLAoKClsndGVlZicsIDQsIHRydWUsIHRydWUsICdmb290J10sCgoKWydlc2VlZycsIDUsIHRydWUsIHRydWUsICdnb29zZSddLAoKClsnaHRlZXQnLCA1LCB0cnVlLCB0cnVlLCAndG9vdGgnXSwKCgpbJ3N3ZW4nLCA0LCB0cnVlLCB0cnVlLCAnbmV3cyddLAoKClsnc2VpcmVzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3NlcmllcyddLAoKClsnc2VpJywgMywgZmFsc2UsIHRydWUsICd5J10sCgoKWydzZXNzJywgNCwgdHJ1ZSwgZmFsc2UsICdzcyddLAoKClsnc2VzdXRhdHMnLCA4LCB0cnVlLCB0cnVlLCAnc3RhdHVzJ10sCgoKCgoKWydzZXMnLCAzLCB0cnVlLCB0cnVlLCBbJ3MnLCAnc2UnLCAnc2lzJ11dLAoKClsnc2V2aXQnLCA1LCB0cnVlLCB0cnVlLCAndGl2ZSddLAoKClsnc2V2aXJkJywgNiwgZmFsc2UsIHRydWUsICdkcml2ZSddLAoKClsnc2V2aScsIDQsIGZhbHNlLCB0cnVlLCAnaWZlJ10sCgoKWydzZXZvbScsIDUsIHRydWUsIHRydWUsICdtb3ZlJ10sCgoKWydzZXYnLCAzLCB0cnVlLCB0cnVlLCBbJ2YnLCAndmUnLCAnZmYnXV0sCgoKWydzZXhhJywgNCwgZmFsc2UsIGZhbHNlLCBbJ2F4JywgJ2F4ZScsICdheGlzJ11dLAoKClsnc2V4JywgMywgdHJ1ZSwgZmFsc2UsICd4J10sCgoKWydzZXp6JywgNCwgdHJ1ZSwgZmFsc2UsICd6J10sCgoKWydzdWFlJywgNCwgZmFsc2UsIHRydWUsICdlYXUnXSwKCgpbJ3NlZScsIDMsIHRydWUsIHRydWUsICdlZSddLAoKClsnc2VnZCcsIDQsIHRydWUsIHRydWUsICdkZ2UnXSwKCgoKClsnc2UnLCAyLCB0cnVlLCB0cnVlLCBbJycsICdlJ11dLAoKClsnc3V0YXRzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3N0YXR1cyddLAoKClsncycsIDEsIHRydWUsIHRydWUsICcnXSwKCgpbJ3h1YWUnLCA0LCBmYWxzZSwgdHJ1ZSwgJ2VhdSddLAoKClsnZWxwb2VwJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3BlcnNvbiddLApdOwoKCgoKCgpwcml2YXRlIGNvbnN0IFNJTkdVTEFSX01BUCA9IFsKCgoKCgoKClsnYWlyZXRpcmMnLCA4LCBmYWxzZSwgZmFsc2UsICdjcml0ZXJpb24nXSwKCgpbJ2FsdWJlbicsIDYsIGZhbHNlLCBmYWxzZSwgJ25lYnVsYWUnXSwKCgpbJ2RsaWhjJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2NoaWxkcmVuJ10sCgoKWydlY2knLCAzLCBmYWxzZSwgdHJ1ZSwgJ2ljZXMnXSwKCgpbJ2VjaXZyZXMnLCA3LCB0cnVlLCB0cnVlLCAnc2VydmljZXMnXSwKCgpbJ2VmaScsIDMsIGZhbHNlLCB0cnVlLCAnaXZlcyddLAoKClsnZWlmbGVzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3NlbGZpZXMnXSwKCgpbJ2Vpdm9tJywgNSwgdHJ1ZSwgdHJ1ZSwgJ21vdmllcyddLAoKClsnZXN1b2wnLCA1LCBmYWxzZSwgdHJ1ZSwgJ2xpY2UnXSwKCgpbJ2VzdW9tJywgNSwgZmFsc2UsIHRydWUsICdtaWNlJ10sCgoKWydlc29vJywgNCwgZmFsc2UsIHRydWUsICdlZXNlJ10sCgoKWydlcycsIDIsIHRydWUsIHRydWUsICdzZXMnXSwKCgpbJ2Vzb29nJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2dlZXNlJ10sCgoKWydldicsIDIsIHRydWUsIHRydWUsICd2ZXMnXSwKCgpbJ2V2aXJkJywgNSwgZmFsc2UsIHRydWUsICdkcml2ZXMnXSwKCgpbJ2V2aXQnLCA0LCB0cnVlLCB0cnVlLCAndGl2ZXMnXSwKCgpbJ2V2b20nLCA0LCB0cnVlLCB0cnVlLCAnbW92ZXMnXSwKCgpbJ2ZmYXRzJywgNSwgdHJ1ZSwgdHJ1ZSwgJ3N0YXZlcyddLAoKClsnZmYnLCAyLCB0cnVlLCB0cnVlLCAnZmZzJ10sCgoKWydmJywgMSwgdHJ1ZSwgdHJ1ZSwgWydmcycsICd2ZXMnXV0sCgoKWydoYycsIDIsIHRydWUsIHRydWUsICdjaGVzJ10sCgoKWydocycsIDIsIHRydWUsIHRydWUsICdzaGVzJ10sCgoKWydodG9vdCcsIDUsIHRydWUsIHRydWUsICd0ZWV0aCddLAoKClsnbXUnLCAyLCB0cnVlLCB0cnVlLCAnYSddLAoKClsnbmFtJywgMywgdHJ1ZSwgdHJ1ZSwgJ21lbiddLAoKClsnbm9zcmVwJywgNiwgdHJ1ZSwgdHJ1ZSwgWydwZXJzb25zJywgJ3Blb3BsZSddXSwKCgpbJ25vaScsIDMsIHRydWUsIHRydWUsICdpb25zJ10sCgoKWydub3AnLCAzLCB0cnVlLCB0cnVlLCAncG9ucyddLAoKClsnbm9zJywgMywgdHJ1ZSwgdHJ1ZSwgJ3NvbnMnXSwKCgpbJ25vJywgMiwgdHJ1ZSwgdHJ1ZSwgJ2EnXSwKCgpbJ29oY2UnLCA0LCB0cnVlLCB0cnVlLCAnZWNob2VzJ10sCgoKWydvcmVoJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2hlcm9lcyddLAoKClsnc2FsdGEnLCA1LCB0cnVlLCB0cnVlLCAnYXRsYXNlcyddLAoKClsnc2lyaScsIDQsIHRydWUsIHRydWUsICdpcmlzZXMnXSwKCgoKClsnc2lzJywgMywgdHJ1ZSwgdHJ1ZSwgJ3NlcyddLAoKClsnc3MnLCAyLCB0cnVlLCBmYWxzZSwgJ3NzZXMnXSwKCgpbJ3N1YmFsbHlzJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3N5bGxhYmknXSwKCgpbJ3N1YicsIDMsIHRydWUsIHRydWUsICdidXNlcyddLAoKClsnc3VjJywgMywgdHJ1ZSwgdHJ1ZSwgJ2N1c2VzJ10sCgoKWydzdXRhdHMnLCA2LCB0cnVlLCB0cnVlLCBbJ3N0YXR1cycsICdzdGF0dXNlcyddXSwKCgpbJ3N1dGNlcCcsIDYsIHRydWUsIHRydWUsICdwZWN0dXNlcyddLAoKClsnc3UnLCAyLCB0cnVlLCB0cnVlLCAnaSddLAoKClsnc3dlbicsIDQsIHRydWUsIHRydWUsICduZXdzJ10sCgoKWyd0b29mJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2ZlZXQnXSwKCgpbJ3VhZScsIDMsIGZhbHNlLCB0cnVlLCBbJ2VhdXMnLCAnZWF1eCddXSwKCgpbJ3hvJywgMiwgZmFsc2UsIGZhbHNlLCAnb3hlbiddLAoKClsneGFvaCcsIDQsIHRydWUsIGZhbHNlLCAnaG9heGVzJ10sCgoKWyd4ZWRuaScsIDUsIGZhbHNlLCB0cnVlLCBbJ2luZGljaWVzJywgJ2luZGV4ZXMnXV0sCgoKWyd4bycsIDIsIGZhbHNlLCB0cnVlLCAnb3hlcyddLAoKClsneCcsIDEsIHRydWUsIGZhbHNlLCBbJ2NpZXMnLCAneGVzJ11dLAoKClsneGknLCAyLCBmYWxzZSwgdHJ1ZSwgJ2ljZXMnXSwKCgpbJ3knLCAxLCBmYWxzZSwgdHJ1ZSwgJ2llcyddLAoKClsneml1cScsIDQsIHRydWUsIGZhbHNlLCAncXVpenplcyddLAoKClsneicsIDEsIHRydWUsIHRydWUsICd6ZXMnXSwKXTsKCgoKCnByaXZhdGUgY29uc3QgVU5JTkZMRUNURUQgPSBbCicnLAoKCidhdGFkJywKCgoncmVlZCcsCgoKJ2tjYWJkZWVmJywKCgonaHNpZicsCgoKJ29mbmknLAoKCidlc29vbScsCgoKJ3NlaXJlcycsCgoKJ3BlZWhzJywKCgonc2VpY2VwcycsCl07CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2luZ3VsYXJpemUoc3RyaW5nICRwbHVyYWwpOiBhcnJheQp7CiRwbHVyYWxSZXYgPSBzdHJyZXYoJHBsdXJhbCk7CiRsb3dlclBsdXJhbFJldiA9IHN0cnRvbG93ZXIoJHBsdXJhbFJldik7CiRwbHVyYWxMZW5ndGggPSBcc3RybGVuKCRsb3dlclBsdXJhbFJldik7CgoKaWYgKFxpbl9hcnJheSgkbG93ZXJQbHVyYWxSZXYsIHNlbGY6OlVOSU5GTEVDVEVELCB0cnVlKSkgewpyZXR1cm4gWyRwbHVyYWxdOwp9CgoKCgoKZm9yZWFjaCAoc2VsZjo6UExVUkFMX01BUCBhcyAkbWFwKSB7CiRzdWZmaXggPSAkbWFwWzBdOwokc3VmZml4TGVuZ3RoID0gJG1hcFsxXTsKJGogPSAwOwoKCgp3aGlsZSAoJHN1ZmZpeFskal0gPT09ICRsb3dlclBsdXJhbFJldlskal0pIHsKCisrJGo7CgoKCmlmICgkaiA9PT0gJHN1ZmZpeExlbmd0aCkgewoKaWYgKCRqIDwgJHBsdXJhbExlbmd0aCkgewokbmV4dElzVm9jYWwgPSBmYWxzZSAhPT0gc3RycG9zKCdhZWlvdScsICRsb3dlclBsdXJhbFJldlskal0pOwoKaWYgKCEkbWFwWzJdICYmICRuZXh0SXNWb2NhbCkgewoKYnJlYWs7Cn0KCmlmICghJG1hcFszXSAmJiAhJG5leHRJc1ZvY2FsKSB7CgpicmVhazsKfQp9CgokbmV3QmFzZSA9IHN1YnN0cigkcGx1cmFsLCAwLCAkcGx1cmFsTGVuZ3RoIC0gJHN1ZmZpeExlbmd0aCk7CiRuZXdTdWZmaXggPSAkbWFwWzRdOwoKCgoKJGZpcnN0VXBwZXIgPSBjdHlwZV91cHBlcigkcGx1cmFsUmV2WyRqIC0gMV0pOwoKaWYgKFxpc19hcnJheSgkbmV3U3VmZml4KSkgewokc2luZ3VsYXJzID0gW107Cgpmb3JlYWNoICgkbmV3U3VmZml4IGFzICRuZXdTdWZmaXhFbnRyeSkgewokc2luZ3VsYXJzW10gPSAkbmV3QmFzZS4oJGZpcnN0VXBwZXIgPyB1Y2ZpcnN0KCRuZXdTdWZmaXhFbnRyeSkgOiAkbmV3U3VmZml4RW50cnkpOwp9CgpyZXR1cm4gJHNpbmd1bGFyczsKfQoKcmV0dXJuIFskbmV3QmFzZS4oJGZpcnN0VXBwZXIgPyB1Y2ZpcnN0KCRuZXdTdWZmaXgpIDogJG5ld1N1ZmZpeCldOwp9CgoKaWYgKCRqID09PSAkcGx1cmFsTGVuZ3RoKSB7CmJyZWFrOwp9Cn0KfQoKCnJldHVybiBbJHBsdXJhbF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwbHVyYWxpemUoc3RyaW5nICRzaW5ndWxhcik6IGFycmF5CnsKJHNpbmd1bGFyUmV2ID0gc3RycmV2KCRzaW5ndWxhcik7CiRsb3dlclNpbmd1bGFyUmV2ID0gc3RydG9sb3dlcigkc2luZ3VsYXJSZXYpOwokc2luZ3VsYXJMZW5ndGggPSBcc3RybGVuKCRsb3dlclNpbmd1bGFyUmV2KTsKCgppZiAoXGluX2FycmF5KCRsb3dlclNpbmd1bGFyUmV2LCBzZWxmOjpVTklORkxFQ1RFRCwgdHJ1ZSkpIHsKcmV0dXJuIFskc2luZ3VsYXJdOwp9CgoKCgoKZm9yZWFjaCAoc2VsZjo6U0lOR1VMQVJfTUFQIGFzICRtYXApIHsKJHN1ZmZpeCA9ICRtYXBbMF07CiRzdWZmaXhMZW5ndGggPSAkbWFwWzFdOwokaiA9IDA7CgoKCgp3aGlsZSAoJHN1ZmZpeFskal0gPT09ICRsb3dlclNpbmd1bGFyUmV2WyRqXSkgewoKKyskajsKCgoKaWYgKCRqID09PSAkc3VmZml4TGVuZ3RoKSB7CgppZiAoJGogPCAkc2luZ3VsYXJMZW5ndGgpIHsKJG5leHRJc1ZvY2FsID0gZmFsc2UgIT09IHN0cnBvcygnYWVpb3UnLCAkbG93ZXJTaW5ndWxhclJldlskal0pOwoKaWYgKCEkbWFwWzJdICYmICRuZXh0SXNWb2NhbCkgewoKYnJlYWs7Cn0KCmlmICghJG1hcFszXSAmJiAhJG5leHRJc1ZvY2FsKSB7CgpicmVhazsKfQp9CgokbmV3QmFzZSA9IHN1YnN0cigkc2luZ3VsYXIsIDAsICRzaW5ndWxhckxlbmd0aCAtICRzdWZmaXhMZW5ndGgpOwokbmV3U3VmZml4ID0gJG1hcFs0XTsKCgoKCiRmaXJzdFVwcGVyID0gY3R5cGVfdXBwZXIoJHNpbmd1bGFyUmV2WyRqIC0gMV0pOwoKaWYgKFxpc19hcnJheSgkbmV3U3VmZml4KSkgewokcGx1cmFscyA9IFtdOwoKZm9yZWFjaCAoJG5ld1N1ZmZpeCBhcyAkbmV3U3VmZml4RW50cnkpIHsKJHBsdXJhbHNbXSA9ICRuZXdCYXNlLigkZmlyc3RVcHBlciA/IHVjZmlyc3QoJG5ld1N1ZmZpeEVudHJ5KSA6ICRuZXdTdWZmaXhFbnRyeSk7Cn0KCnJldHVybiAkcGx1cmFsczsKfQoKcmV0dXJuIFskbmV3QmFzZS4oJGZpcnN0VXBwZXIgPyB1Y2ZpcnN0KCRuZXdTdWZmaXgpIDogJG5ld1N1ZmZpeCldOwp9CgoKaWYgKCRqID09PSAkc2luZ3VsYXJMZW5ndGgpIHsKYnJlYWs7Cn0KfQp9CgoKcmV0dXJuIFskc2luZ3VsYXIuJ3MnXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEluZmxlY3RvcjsKCgoKCgoKZmluYWwgY2xhc3MgRnJlbmNoSW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9ySW50ZXJmYWNlCnsKCgoKCgpwcml2YXRlIGNvbnN0IFBMVVJBTElaRV9SRUdFWFAgPSBbCgoKCgoKWycvKHN8eHx6KSQvaScsICdcMSddLAoKCgpbJy8oZWF1KSQvaScsICdcMXgnXSwKCgoKWycvXihsYW5kYXUpJC9pJywgJ1wxcyddLApbJy8oYXUpJC9pJywgJ1wxeCddLAoKCgpbJy9eKHBuZXV8YmxldXzDqW1ldSkkL2knLCAnXDFzJ10sClsnLyhldSkkL2knLCAnXDF4J10sCgoKClsnL14oYmFsfGNhcm5hdmFsfGNhcmFjYWx8Y2hhY2FsfGNob3JhbHxjb3JyYWx8w6l0YWx8ZmVzdGl2YWx8csOpY2l0YWx8dmFsKSQvaScsICdcMXMnXSwKWycvYWwkL2knLCAnXDFhdXgnXSwKCgpbJy9eKGFzcGlyfGJ8Y29yfMOpbXxmZXJtfHNvdXBpcnx0cmF2fHZhbnR8dml0cilhaWwkL2knLCAnXDFhdXgnXSwKCgpbJy9eKGJpanxjYWlsbHxjaHxnZW58aGlifGpvdWp8cClvdSQvaScsICdcMW91eCddLAoKClsnL14oY2lucXVhbnRlfHNvaXhhbnRlfG1pbGxlKSQvaScsICdcMSddLAoKClsnL14obW9ufG1hKShzaWV1cnxkYW1lfGRlbW9pc2VsbGV8c2VpZ25ldXIpJC8nLCAnbWVzXDJzJ10sClsnL14oTW9ufE1hKShzaWV1cnxkYW1lfGRlbW9pc2VsbGV8c2VpZ25ldXIpJC8nLCAnTWVzXDJzJ10sCl07CgoKCgpwcml2YXRlIGNvbnN0IFNJTkdVTEFSSVpFX1JFR0VYUCA9IFsKCgoKClsnLygoYXNwaXJ8Ynxjb3J8w6ltfGZlcm18c291cGlyfHRyYXZ8dmFudHx2aXRyKSlhdXgkL2knLCAnXDFhaWwnXSwKCgoKWycvKGVhdSl4JC9pJywgJ1wxJ10sCgoKClsnLyhhbWlyfGFuaW18YXJzZW58Ym9jfGNhbnxjYXBpdHxjYXBvcnxjaGV2fGNyaXN0fGfDqW7DqXJ8aG9waXR8aMO0cGl0fGlkw6l8am91cm58bGl0dG9yfGxvY3xtfG3DqXR8bWluw6lyfHByaW5jaXB8cmFkaWN8dGVybWluKWF1eCQvaScsICdcMWFsJ10sCgoKClsnLyhhdSl4JC9pJywgJ1wxJ10sCgoKClsnLyhldSl4JC9pJywgJ1wxJ10sCgoKClsnLyhiaWp8Y2FpbGx8Y2h8Z2VufGhpYnxqb3VqfHApb3V4JC9pJywgJ1wxb3UnXSwKCgpbJy9ebWVzKGRhbWV8ZGVtb2lzZWxsZSlzJC8nLCAnbWFcMSddLApbJy9eTWVzKGRhbWV8ZGVtb2lzZWxsZSlzJC8nLCAnTWFcMSddLApbJy9ebWVzKHNpZXVyfHNlaWduZXVyKXMkLycsICdtb25cMSddLApbJy9eTWVzKHNpZXVyfHNlaWduZXVyKXMkLycsICdNb25cMSddLAoKClsnL3MkL2knLCAnJ10sCl07CgoKCgoKcHJpdmF0ZSBjb25zdCBVTklORkxFQ1RFRCA9ICcvXihhYmPDqHN8YWNjw6hzfGFidXN8YWxiYXRyb3N8YW5jaG9pc3xhbmdsYWlzfGF1dG9idXN8Ym9pc3xicmViaXN8Y2FycXVvaXN8Y2FzfGNoYXN8Y29saXN8Y29uY291cnN8Y29ycHN8Y291cnN8Y3lwcsOoc3xkw6ljw6hzfGRldmlzfGRpc2NvdXJzfGRvc3xlbWJhcnJhc3xlbmdyYWlzfGVudHJlbGFjc3xleGPDqHN8Zmlsc3xmb2lzfGfDomNoaXN8Z2Fyc3xnbGFzfGjDqXJvc3xpbnRydXN8amFyc3xqdXN8a2VybcOoc3xsYWNpc3xsZWdzfGxpbGFzfG1hcmFpc3xtYXJzfG1hdGVsYXN8bcOpcHJpc3xtZXRzfG1vaXN8bW9yc3xvYnVzfG9zfHBhbGFpc3xwYXJhZGlzfHBhcmNvdXJzfHBhcmRlc3N1c3xwYXlzfHBsdXNpZXVyc3xwb2lkc3xwb2lzfHBvdWxzfHByaW50ZW1wc3xwcm9jZXNzdXN8cHJvZ3LDqHN8cHVpdHN8cHVzfHJhYmFpc3xyYWRpc3xyZWNvcnN8cmVjb3Vyc3xyZWZ1c3xyZWxhaXN8cmVtb3Jkc3xyZW1vdXN8cmljdHVzfHJoaW5vY8Opcm9zfHJlcGFzfHJ1YmlzfHNhbnN8c2FzfHNlY291cnN8c2Vuc3xzb3VyaXN8c3VjY8Ooc3x0YWx1c3x0YXBpc3x0YXN8dGF1ZGlzfHRlbXBzfHRpZXJzfHVuaXZlcnN8dmVsb3Vyc3x2ZXJnbGFzfHZlcm5pc3x2aXJ1cykkL2knOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNpbmd1bGFyaXplKHN0cmluZyAkcGx1cmFsKTogYXJyYXkKewppZiAoJHRoaXMtPmlzSW5mbGVjdGVkV29yZCgkcGx1cmFsKSkgewpyZXR1cm4gWyRwbHVyYWxdOwp9Cgpmb3JlYWNoIChzZWxmOjpTSU5HVUxBUklaRV9SRUdFWFAgYXMgJHJ1bGUpIHsKWyRyZWdleHAsICRyZXBsYWNlXSA9ICRydWxlOwoKaWYgKDEgPT09IHByZWdfbWF0Y2goJHJlZ2V4cCwgJHBsdXJhbCkpIHsKcmV0dXJuIFtwcmVnX3JlcGxhY2UoJHJlZ2V4cCwgJHJlcGxhY2UsICRwbHVyYWwpXTsKfQp9CgpyZXR1cm4gWyRwbHVyYWxdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcGx1cmFsaXplKHN0cmluZyAkc2luZ3VsYXIpOiBhcnJheQp7CmlmICgkdGhpcy0+aXNJbmZsZWN0ZWRXb3JkKCRzaW5ndWxhcikpIHsKcmV0dXJuIFskc2luZ3VsYXJdOwp9Cgpmb3JlYWNoIChzZWxmOjpQTFVSQUxJWkVfUkVHRVhQIGFzICRydWxlKSB7ClskcmVnZXhwLCAkcmVwbGFjZV0gPSAkcnVsZTsKCmlmICgxID09PSBwcmVnX21hdGNoKCRyZWdleHAsICRzaW5ndWxhcikpIHsKcmV0dXJuIFtwcmVnX3JlcGxhY2UoJHJlZ2V4cCwgJHJlcGxhY2UsICRzaW5ndWxhcildOwp9Cn0KCnJldHVybiBbJHNpbmd1bGFyLidzJ107Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNJbmZsZWN0ZWRXb3JkKHN0cmluZyAkd29yZCk6IGJvb2wKewpyZXR1cm4gMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpVTklORkxFQ1RFRCwgJHdvcmQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcSW5mbGVjdG9yOwoKaW50ZXJmYWNlIEluZmxlY3RvckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2luZ3VsYXJpemUoc3RyaW5nICRwbHVyYWwpOiBhcnJheTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGx1cmFsaXplKHN0cmluZyAkc2luZ3VsYXIpOiBhcnJheTsKfQoKQ29weXJpZ2h0IChjKSAyMDE5LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKCgoKCgpjbGFzcyBMYXp5U3RyaW5nIGltcGxlbWVudHMgXFN0cmluZ2FibGUsIFxKc29uU2VyaWFsaXphYmxlCnsKcHJpdmF0ZSAkdmFsdWU7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUNhbGxhYmxlKCRjYWxsYmFjaywgLi4uJGFyZ3VtZW50cyk6IHNlbGYKewppZiAoIVxpc19jYWxsYWJsZSgkY2FsbGJhY2spICYmICEoXGlzX2FycmF5KCRjYWxsYmFjaykgJiYgaXNzZXQoJGNhbGxiYWNrWzBdKSAmJiAkY2FsbGJhY2tbMF0gaW5zdGFuY2VvZiBcQ2xvc3VyZSAmJiAyID49IFxjb3VudCgkY2FsbGJhY2spKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAxIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBhIGNhbGxhYmxlIG9yIGEgW0Nsb3N1cmUsIG1ldGhvZF0gbGF6eS1jYWxsYWJsZSwgIiVzIiBnaXZlbi4nLCBfX01FVEhPRF9fLCBnZXRfZGVidWdfdHlwZSgkY2FsbGJhY2spKSk7Cn0KCiRsYXp5U3RyaW5nID0gbmV3IHN0YXRpYygpOwokbGF6eVN0cmluZy0+dmFsdWUgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJGNhbGxiYWNrLCAmJGFyZ3VtZW50cywgJiR2YWx1ZSk6IHN0cmluZyB7CmlmIChudWxsICE9PSAkYXJndW1lbnRzKSB7CmlmICghXGlzX2NhbGxhYmxlKCRjYWxsYmFjaykpIHsKJGNhbGxiYWNrWzBdID0gJGNhbGxiYWNrWzBdKCk7CiRjYWxsYmFja1sxXSA9ICRjYWxsYmFja1sxXSA/PyAnX19pbnZva2UnOwp9CiR2YWx1ZSA9ICRjYWxsYmFjayguLi4kYXJndW1lbnRzKTsKJGNhbGxiYWNrID0gc2VsZjo6Z2V0UHJldHR5TmFtZSgkY2FsbGJhY2spOwokYXJndW1lbnRzID0gbnVsbDsKfQoKcmV0dXJuICR2YWx1ZSA/PyAnJzsKfTsKCnJldHVybiAkbGF6eVN0cmluZzsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TdHJpbmdhYmxlKCR2YWx1ZSk6IHNlbGYKewppZiAoIXNlbGY6OmlzU3RyaW5nYWJsZSgkdmFsdWUpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDEgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIGEgc2NhbGFyIG9yIGEgc3RyaW5nYWJsZSBvYmplY3QsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKSkpOwp9CgppZiAoXGlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybiBzdGF0aWM6OmZyb21DYWxsYWJsZShbJHZhbHVlLCAnX190b1N0cmluZyddKTsKfQoKJGxhenlTdHJpbmcgPSBuZXcgc3RhdGljKCk7CiRsYXp5U3RyaW5nLT52YWx1ZSA9IChzdHJpbmcpICR2YWx1ZTsKCnJldHVybiAkbGF6eVN0cmluZzsKfQoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1N0cmluZ2FibGUoJHZhbHVlKTogYm9vbAp7CnJldHVybiBcaXNfc3RyaW5nKCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2Ygc2VsZiB8fCAoXGlzX29iamVjdCgkdmFsdWUpID8gbWV0aG9kX2V4aXN0cygkdmFsdWUsICdfX3RvU3RyaW5nJykgOiBcaXNfc2NhbGFyKCR2YWx1ZSkpOwp9CgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNvbHZlKCR2YWx1ZSk6IHN0cmluZwp7CnJldHVybiAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewppZiAoXGlzX3N0cmluZygkdGhpcy0+dmFsdWUpKSB7CnJldHVybiAkdGhpcy0+dmFsdWU7Cn0KCnRyeSB7CnJldHVybiAkdGhpcy0+dmFsdWUgPSAoJHRoaXMtPnZhbHVlKSgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CmlmIChcVHlwZUVycm9yOjpjbGFzcyA9PT0gXGdldF9jbGFzcygkZSkgJiYgX19GSUxFX18gPT09ICRlLT5nZXRGaWxlKCkpIHsKJHR5cGUgPSBleHBsb2RlKCcsICcsICRlLT5nZXRNZXNzYWdlKCkpOwokdHlwZSA9IHN1YnN0cihhcnJheV9wb3AoJHR5cGUpLCAwLCAtXHN0cmxlbignIHJldHVybmVkJykpOwokciA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCR0aGlzLT52YWx1ZSk7CiRjYWxsYmFjayA9ICRyLT5nZXRTdGF0aWNWYXJpYWJsZXMoKVsnY2FsbGJhY2snXTsKCiRlID0gbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignUmV0dXJuIHZhbHVlIG9mICVzKCkgcGFzc2VkIHRvICVzOjpmcm9tQ2FsbGFibGUoKSBtdXN0IGJlIG9mIHRoZSB0eXBlIHN0cmluZywgJXMgcmV0dXJuZWQuJywgJGNhbGxiYWNrLCBzdGF0aWM6OmNsYXNzLCAkdHlwZSkpOwp9CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgNzA0MDApIHsKCnJldHVybiB0cmlnZ2VyX2Vycm9yKCRlLCBcRV9VU0VSX0VSUk9SKTsKfQoKdGhyb3cgJGU7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewokdGhpcy0+X190b1N0cmluZygpOwoKcmV0dXJuIFsndmFsdWUnXTsKfQoKcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5fX3RvU3RyaW5nKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFByZXR0eU5hbWUoY2FsbGFibGUgJGNhbGxiYWNrKTogc3RyaW5nCnsKaWYgKFxpc19zdHJpbmcoJGNhbGxiYWNrKSkgewpyZXR1cm4gJGNhbGxiYWNrOwp9CgppZiAoXGlzX2FycmF5KCRjYWxsYmFjaykpIHsKJGNsYXNzID0gXGlzX29iamVjdCgkY2FsbGJhY2tbMF0pID8gZ2V0X2RlYnVnX3R5cGUoJGNhbGxiYWNrWzBdKSA6ICRjYWxsYmFja1swXTsKJG1ldGhvZCA9ICRjYWxsYmFja1sxXTsKfSBlbHNlaWYgKCRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRyID0gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGNhbGxiYWNrKTsKCmlmIChmYWxzZSAhPT0gc3RycG9zKCRyLT5uYW1lLCAne2Nsb3N1cmV9JykgfHwgISRjbGFzcyA9IFxQSFBfVkVSU0lPTl9JRCA+PSA4MDExMSA/ICRyLT5nZXRDbG9zdXJlQ2FsbGVkQ2xhc3MoKSA6ICRyLT5nZXRDbG9zdXJlU2NvcGVDbGFzcygpKSB7CnJldHVybiAkci0+bmFtZTsKfQoKJGNsYXNzID0gJGNsYXNzLT5uYW1lOwokbWV0aG9kID0gJHItPm5hbWU7Cn0gZWxzZSB7CiRjbGFzcyA9IGdldF9kZWJ1Z190eXBlKCRjYWxsYmFjayk7CiRtZXRob2QgPSAnX19pbnZva2UnOwp9CgpyZXR1cm4gJGNsYXNzLic6OicuJG1ldGhvZDsKfQp9Cjw/cGhwCgoKCgoKCgoKcmV0dXJuIFsKWwo0MzUyLAo0NDQ3LApdLApbCjg5ODYsCjg5ODcsCl0sClsKOTAwMSwKOTAwMSwKXSwKWwo5MDAyLAo5MDAyLApdLApbCjkxOTMsCjkxOTYsCl0sClsKOTIwMCwKOTIwMCwKXSwKWwo5MjAzLAo5MjAzLApdLApbCjk3MjUsCjk3MjYsCl0sClsKOTc0OCwKOTc0OSwKXSwKWwo5ODAwLAo5ODExLApdLApbCjk4NTUsCjk4NTUsCl0sClsKOTg3NSwKOTg3NSwKXSwKWwo5ODg5LAo5ODg5LApdLApbCjk4OTgsCjk4OTksCl0sClsKOTkxNywKOTkxOCwKXSwKWwo5OTI0LAo5OTI1LApdLApbCjk5MzQsCjk5MzQsCl0sClsKOTk0MCwKOTk0MCwKXSwKWwo5OTYyLAo5OTYyLApdLApbCjk5NzAsCjk5NzEsCl0sClsKOTk3MywKOTk3MywKXSwKWwo5OTc4LAo5OTc4LApdLApbCjk5ODEsCjk5ODEsCl0sClsKOTk4OSwKOTk4OSwKXSwKWwo5OTk0LAo5OTk1LApdLApbCjEwMDI0LAoxMDAyNCwKXSwKWwoxMDA2MCwKMTAwNjAsCl0sClsKMTAwNjIsCjEwMDYyLApdLApbCjEwMDY3LAoxMDA2OSwKXSwKWwoxMDA3MSwKMTAwNzEsCl0sClsKMTAxMzMsCjEwMTM1LApdLApbCjEwMTYwLAoxMDE2MCwKXSwKWwoxMDE3NSwKMTAxNzUsCl0sClsKMTEwMzUsCjExMDM2LApdLApbCjExMDg4LAoxMTA4OCwKXSwKWwoxMTA5MywKMTEwOTMsCl0sClsKMTE5MDQsCjExOTI5LApdLApbCjExOTMxLAoxMjAxOSwKXSwKWwoxMjAzMiwKMTIyNDUsCl0sClsKMTIyNzIsCjEyMjgzLApdLApbCjEyMjg4LAoxMjI4OCwKXSwKWwoxMjI4OSwKMTIyOTEsCl0sClsKMTIyOTIsCjEyMjkyLApdLApbCjEyMjkzLAoxMjI5MywKXSwKWwoxMjI5NCwKMTIyOTQsCl0sClsKMTIyOTUsCjEyMjk1LApdLApbCjEyMjk2LAoxMjI5NiwKXSwKWwoxMjI5NywKMTIyOTcsCl0sClsKMTIyOTgsCjEyMjk4LApdLApbCjEyMjk5LAoxMjI5OSwKXSwKWwoxMjMwMCwKMTIzMDAsCl0sClsKMTIzMDEsCjEyMzAxLApdLApbCjEyMzAyLAoxMjMwMiwKXSwKWwoxMjMwMywKMTIzMDMsCl0sClsKMTIzMDQsCjEyMzA0LApdLApbCjEyMzA1LAoxMjMwNSwKXSwKWwoxMjMwNiwKMTIzMDcsCl0sClsKMTIzMDgsCjEyMzA4LApdLApbCjEyMzA5LAoxMjMwOSwKXSwKWwoxMjMxMCwKMTIzMTAsCl0sClsKMTIzMTEsCjEyMzExLApdLApbCjEyMzEyLAoxMjMxMiwKXSwKWwoxMjMxMywKMTIzMTMsCl0sClsKMTIzMTQsCjEyMzE0LApdLApbCjEyMzE1LAoxMjMxNSwKXSwKWwoxMjMxNiwKMTIzMTYsCl0sClsKMTIzMTcsCjEyMzE3LApdLApbCjEyMzE4LAoxMjMxOSwKXSwKWwoxMjMyMCwKMTIzMjAsCl0sClsKMTIzMjEsCjEyMzI5LApdLApbCjEyMzMwLAoxMjMzMywKXSwKWwoxMjMzNCwKMTIzMzUsCl0sClsKMTIzMzYsCjEyMzM2LApdLApbCjEyMzM3LAoxMjM0MSwKXSwKWwoxMjM0MiwKMTIzNDMsCl0sClsKMTIzNDQsCjEyMzQ2LApdLApbCjEyMzQ3LAoxMjM0NywKXSwKWwoxMjM0OCwKMTIzNDgsCl0sClsKMTIzNDksCjEyMzQ5LApdLApbCjEyMzUwLAoxMjM1MCwKXSwKWwoxMjM1MywKMTI0MzgsCl0sClsKMTI0NDEsCjEyNDQyLApdLApbCjEyNDQzLAoxMjQ0NCwKXSwKWwoxMjQ0NSwKMTI0NDYsCl0sClsKMTI0NDcsCjEyNDQ3LApdLApbCjEyNDQ4LAoxMjQ0OCwKXSwKWwoxMjQ0OSwKMTI1MzgsCl0sClsKMTI1MzksCjEyNTM5LApdLApbCjEyNTQwLAoxMjU0MiwKXSwKWwoxMjU0MywKMTI1NDMsCl0sClsKMTI1NDksCjEyNTkxLApdLApbCjEyNTkzLAoxMjY4NiwKXSwKWwoxMjY4OCwKMTI2ODksCl0sClsKMTI2OTAsCjEyNjkzLApdLApbCjEyNjk0LAoxMjcwMywKXSwKWwoxMjcwNCwKMTI3MzUsCl0sClsKMTI3MzYsCjEyNzcxLApdLApbCjEyNzg0LAoxMjc5OSwKXSwKWwoxMjgwMCwKMTI4MzAsCl0sClsKMTI4MzIsCjEyODQxLApdLApbCjEyODQyLAoxMjg3MSwKXSwKWwoxMjg4MCwKMTI4ODAsCl0sClsKMTI4ODEsCjEyODk1LApdLApbCjEyODk2LAoxMjkyNywKXSwKWwoxMjkyOCwKMTI5MzcsCl0sClsKMTI5MzgsCjEyOTc2LApdLApbCjEyOTc3LAoxMjk5MSwKXSwKWwoxMjk5MiwKMTMwNTUsCl0sClsKMTMwNTYsCjEzMzExLApdLApbCjEzMzEyLAoxOTkwMywKXSwKWwoxOTk2OCwKNDA5NTksCl0sClsKNDA5NjAsCjQwOTgwLApdLApbCjQwOTgxLAo0MDk4MSwKXSwKWwo0MDk4MiwKNDIxMjQsCl0sClsKNDIxMjgsCjQyMTgyLApdLApbCjQzMzYwLAo0MzM4OCwKXSwKWwo0NDAzMiwKNTUyMDMsCl0sClsKNjM3NDQsCjY0MTA5LApdLApbCjY0MTEwLAo2NDExMSwKXSwKWwo2NDExMiwKNjQyMTcsCl0sClsKNjQyMTgsCjY0MjU1LApdLApbCjY1MDQwLAo2NTA0NiwKXSwKWwo2NTA0NywKNjUwNDcsCl0sClsKNjUwNDgsCjY1MDQ4LApdLApbCjY1MDQ5LAo2NTA0OSwKXSwKWwo2NTA3MiwKNjUwNzIsCl0sClsKNjUwNzMsCjY1MDc0LApdLApbCjY1MDc1LAo2NTA3NiwKXSwKWwo2NTA3NywKNjUwNzcsCl0sClsKNjUwNzgsCjY1MDc4LApdLApbCjY1MDc5LAo2NTA3OSwKXSwKWwo2NTA4MCwKNjUwODAsCl0sClsKNjUwODEsCjY1MDgxLApdLApbCjY1MDgyLAo2NTA4MiwKXSwKWwo2NTA4MywKNjUwODMsCl0sClsKNjUwODQsCjY1MDg0LApdLApbCjY1MDg1LAo2NTA4NSwKXSwKWwo2NTA4NiwKNjUwODYsCl0sClsKNjUwODcsCjY1MDg3LApdLApbCjY1MDg4LAo2NTA4OCwKXSwKWwo2NTA4OSwKNjUwODksCl0sClsKNjUwOTAsCjY1MDkwLApdLApbCjY1MDkxLAo2NTA5MSwKXSwKWwo2NTA5MiwKNjUwOTIsCl0sClsKNjUwOTMsCjY1MDk0LApdLApbCjY1MDk1LAo2NTA5NSwKXSwKWwo2NTA5NiwKNjUwOTYsCl0sClsKNjUwOTcsCjY1MTAwLApdLApbCjY1MTAxLAo2NTEwMywKXSwKWwo2NTEwNCwKNjUxMDYsCl0sClsKNjUxMDgsCjY1MTExLApdLApbCjY1MTEyLAo2NTExMiwKXSwKWwo2NTExMywKNjUxMTMsCl0sClsKNjUxMTQsCjY1MTE0LApdLApbCjY1MTE1LAo2NTExNSwKXSwKWwo2NTExNiwKNjUxMTYsCl0sClsKNjUxMTcsCjY1MTE3LApdLApbCjY1MTE4LAo2NTExOCwKXSwKWwo2NTExOSwKNjUxMjEsCl0sClsKNjUxMjIsCjY1MTIyLApdLApbCjY1MTIzLAo2NTEyMywKXSwKWwo2NTEyNCwKNjUxMjYsCl0sClsKNjUxMjgsCjY1MTI4LApdLApbCjY1MTI5LAo2NTEyOSwKXSwKWwo2NTEzMCwKNjUxMzEsCl0sClsKNjUyODEsCjY1MjgzLApdLApbCjY1Mjg0LAo2NTI4NCwKXSwKWwo2NTI4NSwKNjUyODcsCl0sClsKNjUyODgsCjY1Mjg4LApdLApbCjY1Mjg5LAo2NTI4OSwKXSwKWwo2NTI5MCwKNjUyOTAsCl0sClsKNjUyOTEsCjY1MjkxLApdLApbCjY1MjkyLAo2NTI5MiwKXSwKWwo2NTI5MywKNjUyOTMsCl0sClsKNjUyOTQsCjY1Mjk1LApdLApbCjY1Mjk2LAo2NTMwNSwKXSwKWwo2NTMwNiwKNjUzMDcsCl0sClsKNjUzMDgsCjY1MzEwLApdLApbCjY1MzExLAo2NTMxMiwKXSwKWwo2NTMxMywKNjUzMzgsCl0sClsKNjUzMzksCjY1MzM5LApdLApbCjY1MzQwLAo2NTM0MCwKXSwKWwo2NTM0MSwKNjUzNDEsCl0sClsKNjUzNDIsCjY1MzQyLApdLApbCjY1MzQzLAo2NTM0MywKXSwKWwo2NTM0NCwKNjUzNDQsCl0sClsKNjUzNDUsCjY1MzcwLApdLApbCjY1MzcxLAo2NTM3MSwKXSwKWwo2NTM3MiwKNjUzNzIsCl0sClsKNjUzNzMsCjY1MzczLApdLApbCjY1Mzc0LAo2NTM3NCwKXSwKWwo2NTM3NSwKNjUzNzUsCl0sClsKNjUzNzYsCjY1Mzc2LApdLApbCjY1NTA0LAo2NTUwNSwKXSwKWwo2NTUwNiwKNjU1MDYsCl0sClsKNjU1MDcsCjY1NTA3LApdLApbCjY1NTA4LAo2NTUwOCwKXSwKWwo2NTUwOSwKNjU1MTAsCl0sClsKOTQxNzYsCjk0MTc3LApdLApbCjk0MTc4LAo5NDE3OCwKXSwKWwo5NDE3OSwKOTQxNzksCl0sClsKOTQxODAsCjk0MTgwLApdLApbCjk0MTkyLAo5NDE5MywKXSwKWwo5NDIwOCwKMTAwMzQzLApdLApbCjEwMDM1MiwKMTAxMTE5LApdLApbCjEwMTEyMCwKMTAxNTg5LApdLApbCjEwMTYzMiwKMTAxNjQwLApdLApbCjExMDU3NiwKMTEwNTc5LApdLApbCjExMDU4MSwKMTEwNTg3LApdLApbCjExMDU4OSwKMTEwNTkwLApdLApbCjExMDU5MiwKMTEwODQ3LApdLApbCjExMDg0OCwKMTEwODgyLApdLApbCjExMDg5OCwKMTEwODk4LApdLApbCjExMDkyOCwKMTEwOTMwLApdLApbCjExMDkzMywKMTEwOTMzLApdLApbCjExMDk0OCwKMTEwOTUxLApdLApbCjExMDk2MCwKMTExMzU1LApdLApbCjEyNjk4MCwKMTI2OTgwLApdLApbCjEyNzE4MywKMTI3MTgzLApdLApbCjEyNzM3NCwKMTI3Mzc0LApdLApbCjEyNzM3NywKMTI3Mzg2LApdLApbCjEyNzQ4OCwKMTI3NDkwLApdLApbCjEyNzUwNCwKMTI3NTQ3LApdLApbCjEyNzU1MiwKMTI3NTYwLApdLApbCjEyNzU2OCwKMTI3NTY5LApdLApbCjEyNzU4NCwKMTI3NTg5LApdLApbCjEyNzc0NCwKMTI3Nzc2LApdLApbCjEyNzc4OSwKMTI3Nzk3LApdLApbCjEyNzc5OSwKMTI3ODY4LApdLApbCjEyNzg3MCwKMTI3ODkxLApdLApbCjEyNzkwNCwKMTI3OTQ2LApdLApbCjEyNzk1MSwKMTI3OTU1LApdLApbCjEyNzk2OCwKMTI3OTg0LApdLApbCjEyNzk4OCwKMTI3OTg4LApdLApbCjEyNzk5MiwKMTI3OTk0LApdLApbCjEyNzk5NSwKMTI3OTk5LApdLApbCjEyODAwMCwKMTI4MDYyLApdLApbCjEyODA2NCwKMTI4MDY0LApdLApbCjEyODA2NiwKMTI4MjUyLApdLApbCjEyODI1NSwKMTI4MzE3LApdLApbCjEyODMzMSwKMTI4MzM0LApdLApbCjEyODMzNiwKMTI4MzU5LApdLApbCjEyODM3OCwKMTI4Mzc4LApdLApbCjEyODQwNSwKMTI4NDA2LApdLApbCjEyODQyMCwKMTI4NDIwLApdLApbCjEyODUwNywKMTI4NTExLApdLApbCjEyODUxMiwKMTI4NTkxLApdLApbCjEyODY0MCwKMTI4NzA5LApdLApbCjEyODcxNiwKMTI4NzE2LApdLApbCjEyODcyMCwKMTI4NzIyLApdLApbCjEyODcyNSwKMTI4NzI3LApdLApbCjEyODczMiwKMTI4NzM1LApdLApbCjEyODc0NywKMTI4NzQ4LApdLApbCjEyODc1NiwKMTI4NzY0LApdLApbCjEyODk5MiwKMTI5MDAzLApdLApbCjEyOTAwOCwKMTI5MDA4LApdLApbCjEyOTI5MiwKMTI5MzM4LApdLApbCjEyOTM0MCwKMTI5MzQ5LApdLApbCjEyOTM1MSwKMTI5NTM1LApdLApbCjEyOTY0OCwKMTI5NjYwLApdLApbCjEyOTY2NCwKMTI5NjcyLApdLApbCjEyOTY4MCwKMTI5NzI1LApdLApbCjEyOTcyNywKMTI5NzMzLApdLApbCjEyOTc0MiwKMTI5NzU1LApdLApbCjEyOTc2MCwKMTI5NzY4LApdLApbCjEyOTc3NiwKMTI5Nzg0LApdLApbCjEzMTA3MiwKMTczNzkxLApdLApbCjE3Mzc5MiwKMTczODIzLApdLApbCjE3MzgyNCwKMTc3OTc3LApdLApbCjE3Nzk3OCwKMTc3OTgzLApdLApbCjE3Nzk4NCwKMTc4MjA1LApdLApbCjE3ODIwNiwKMTc4MjA3LApdLApbCjE3ODIwOCwKMTgzOTY5LApdLApbCjE4Mzk3MCwKMTgzOTgzLApdLApbCjE4Mzk4NCwKMTkxNDU2LApdLApbCjE5MTQ1NywKMTk0NTU5LApdLApbCjE5NDU2MCwKMTk1MTAxLApdLApbCjE5NTEwMiwKMTk1MTAzLApdLApbCjE5NTEwNCwKMTk2NjA1LApdLApbCjE5NjYwOCwKMjAxNTQ2LApdLApbCjIwMTU0NywKMjAxNTUxLApdLApbCjIwMTU1MiwKMjA1NzQzLApdLApbCjIwNTc0NCwKMjYyMTQxLApdLApdOwo8P3BocAoKCgoKCgoKCnJldHVybiBbClsKNzY4LAo4NzksCl0sClsKMTE1NSwKMTE1OSwKXSwKWwoxMTYwLAoxMTYxLApdLApbCjE0MjUsCjE0NjksCl0sClsKMTQ3MSwKMTQ3MSwKXSwKWwoxNDczLAoxNDc0LApdLApbCjE0NzYsCjE0NzcsCl0sClsKMTQ3OSwKMTQ3OSwKXSwKWwoxNTUyLAoxNTYyLApdLApbCjE2MTEsCjE2MzEsCl0sClsKMTY0OCwKMTY0OCwKXSwKWwoxNzUwLAoxNzU2LApdLApbCjE3NTksCjE3NjQsCl0sClsKMTc2NywKMTc2OCwKXSwKWwoxNzcwLAoxNzczLApdLApbCjE4MDksCjE4MDksCl0sClsKMTg0MCwKMTg2NiwKXSwKWwoxOTU4LAoxOTY4LApdLApbCjIwMjcsCjIwMzUsCl0sClsKMjA0NSwKMjA0NSwKXSwKWwoyMDcwLAoyMDczLApdLApbCjIwNzUsCjIwODMsCl0sClsKMjA4NSwKMjA4NywKXSwKWwoyMDg5LAoyMDkzLApdLApbCjIxMzcsCjIxMzksCl0sClsKMjIwMCwKMjIwNywKXSwKWwoyMjUwLAoyMjczLApdLApbCjIyNzUsCjIzMDYsCl0sClsKMjM2MiwKMjM2MiwKXSwKWwoyMzY0LAoyMzY0LApdLApbCjIzNjksCjIzNzYsCl0sClsKMjM4MSwKMjM4MSwKXSwKWwoyMzg1LAoyMzkxLApdLApbCjI0MDIsCjI0MDMsCl0sClsKMjQzMywKMjQzMywKXSwKWwoyNDkyLAoyNDkyLApdLApbCjI0OTcsCjI1MDAsCl0sClsKMjUwOSwKMjUwOSwKXSwKWwoyNTMwLAoyNTMxLApdLApbCjI1NTgsCjI1NTgsCl0sClsKMjU2MSwKMjU2MiwKXSwKWwoyNjIwLAoyNjIwLApdLApbCjI2MjUsCjI2MjYsCl0sClsKMjYzMSwKMjYzMiwKXSwKWwoyNjM1LAoyNjM3LApdLApbCjI2NDEsCjI2NDEsCl0sClsKMjY3MiwKMjY3MywKXSwKWwoyNjc3LAoyNjc3LApdLApbCjI2ODksCjI2OTAsCl0sClsKMjc0OCwKMjc0OCwKXSwKWwoyNzUzLAoyNzU3LApdLApbCjI3NTksCjI3NjAsCl0sClsKMjc2NSwKMjc2NSwKXSwKWwoyNzg2LAoyNzg3LApdLApbCjI4MTAsCjI4MTUsCl0sClsKMjgxNywKMjgxNywKXSwKWwoyODc2LAoyODc2LApdLApbCjI4NzksCjI4NzksCl0sClsKMjg4MSwKMjg4NCwKXSwKWwoyODkzLAoyODkzLApdLApbCjI5MDEsCjI5MDIsCl0sClsKMjkxNCwKMjkxNSwKXSwKWwoyOTQ2LAoyOTQ2LApdLApbCjMwMDgsCjMwMDgsCl0sClsKMzAyMSwKMzAyMSwKXSwKWwozMDcyLAozMDcyLApdLApbCjMwNzYsCjMwNzYsCl0sClsKMzEzMiwKMzEzMiwKXSwKWwozMTM0LAozMTM2LApdLApbCjMxNDIsCjMxNDQsCl0sClsKMzE0NiwKMzE0OSwKXSwKWwozMTU3LAozMTU4LApdLApbCjMxNzAsCjMxNzEsCl0sClsKMzIwMSwKMzIwMSwKXSwKWwozMjYwLAozMjYwLApdLApbCjMyNjMsCjMyNjMsCl0sClsKMzI3MCwKMzI3MCwKXSwKWwozMjc2LAozMjc3LApdLApbCjMyOTgsCjMyOTksCl0sClsKMzMyOCwKMzMyOSwKXSwKWwozMzg3LAozMzg4LApdLApbCjMzOTMsCjMzOTYsCl0sClsKMzQwNSwKMzQwNSwKXSwKWwozNDI2LAozNDI3LApdLApbCjM0NTcsCjM0NTcsCl0sClsKMzUzMCwKMzUzMCwKXSwKWwozNTM4LAozNTQwLApdLApbCjM1NDIsCjM1NDIsCl0sClsKMzYzMywKMzYzMywKXSwKWwozNjM2LAozNjQyLApdLApbCjM2NTUsCjM2NjIsCl0sClsKMzc2MSwKMzc2MSwKXSwKWwozNzY0LAozNzcyLApdLApbCjM3ODQsCjM3OTAsCl0sClsKMzg2NCwKMzg2NSwKXSwKWwozODkzLAozODkzLApdLApbCjM4OTUsCjM4OTUsCl0sClsKMzg5NywKMzg5NywKXSwKWwozOTUzLAozOTY2LApdLApbCjM5NjgsCjM5NzIsCl0sClsKMzk3NCwKMzk3NSwKXSwKWwozOTgxLAozOTkxLApdLApbCjM5OTMsCjQwMjgsCl0sClsKNDAzOCwKNDAzOCwKXSwKWwo0MTQxLAo0MTQ0LApdLApbCjQxNDYsCjQxNTEsCl0sClsKNDE1MywKNDE1NCwKXSwKWwo0MTU3LAo0MTU4LApdLApbCjQxODQsCjQxODUsCl0sClsKNDE5MCwKNDE5MiwKXSwKWwo0MjA5LAo0MjEyLApdLApbCjQyMjYsCjQyMjYsCl0sClsKNDIyOSwKNDIzMCwKXSwKWwo0MjM3LAo0MjM3LApdLApbCjQyNTMsCjQyNTMsCl0sClsKNDk1NywKNDk1OSwKXSwKWwo1OTA2LAo1OTA4LApdLApbCjU5MzgsCjU5MzksCl0sClsKNTk3MCwKNTk3MSwKXSwKWwo2MDAyLAo2MDAzLApdLApbCjYwNjgsCjYwNjksCl0sClsKNjA3MSwKNjA3NywKXSwKWwo2MDg2LAo2MDg2LApdLApbCjYwODksCjYwOTksCl0sClsKNjEwOSwKNjEwOSwKXSwKWwo2MTU1LAo2MTU3LApdLApbCjYxNTksCjYxNTksCl0sClsKNjI3NywKNjI3OCwKXSwKWwo2MzEzLAo2MzEzLApdLApbCjY0MzIsCjY0MzQsCl0sClsKNjQzOSwKNjQ0MCwKXSwKWwo2NDUwLAo2NDUwLApdLApbCjY0NTcsCjY0NTksCl0sClsKNjY3OSwKNjY4MCwKXSwKWwo2NjgzLAo2NjgzLApdLApbCjY3NDIsCjY3NDIsCl0sClsKNjc0NCwKNjc1MCwKXSwKWwo2NzUyLAo2NzUyLApdLApbCjY3NTQsCjY3NTQsCl0sClsKNjc1NywKNjc2NCwKXSwKWwo2NzcxLAo2NzgwLApdLApbCjY3ODMsCjY3ODMsCl0sClsKNjgzMiwKNjg0NSwKXSwKWwo2ODQ2LAo2ODQ2LApdLApbCjY4NDcsCjY4NjIsCl0sClsKNjkxMiwKNjkxNSwKXSwKWwo2OTY0LAo2OTY0LApdLApbCjY5NjYsCjY5NzAsCl0sClsKNjk3MiwKNjk3MiwKXSwKWwo2OTc4LAo2OTc4LApdLApbCjcwMTksCjcwMjcsCl0sClsKNzA0MCwKNzA0MSwKXSwKWwo3MDc0LAo3MDc3LApdLApbCjcwODAsCjcwODEsCl0sClsKNzA4MywKNzA4NSwKXSwKWwo3MTQyLAo3MTQyLApdLApbCjcxNDQsCjcxNDUsCl0sClsKNzE0OSwKNzE0OSwKXSwKWwo3MTUxLAo3MTUzLApdLApbCjcyMTIsCjcyMTksCl0sClsKNzIyMiwKNzIyMywKXSwKWwo3Mzc2LAo3Mzc4LApdLApbCjczODAsCjczOTIsCl0sClsKNzM5NCwKNzQwMCwKXSwKWwo3NDA1LAo3NDA1LApdLApbCjc0MTIsCjc0MTIsCl0sClsKNzQxNiwKNzQxNywKXSwKWwo3NjE2LAo3Njc5LApdLApbCjg0MDAsCjg0MTIsCl0sClsKODQxMywKODQxNiwKXSwKWwo4NDE3LAo4NDE3LApdLApbCjg0MTgsCjg0MjAsCl0sClsKODQyMSwKODQzMiwKXSwKWwoxMTUwMywKMTE1MDUsCl0sClsKMTE2NDcsCjExNjQ3LApdLApbCjExNzQ0LAoxMTc3NSwKXSwKWwoxMjMzMCwKMTIzMzMsCl0sClsKMTI0NDEsCjEyNDQyLApdLApbCjQyNjA3LAo0MjYwNywKXSwKWwo0MjYwOCwKNDI2MTAsCl0sClsKNDI2MTIsCjQyNjIxLApdLApbCjQyNjU0LAo0MjY1NSwKXSwKWwo0MjczNiwKNDI3MzcsCl0sClsKNDMwMTAsCjQzMDEwLApdLApbCjQzMDE0LAo0MzAxNCwKXSwKWwo0MzAxOSwKNDMwMTksCl0sClsKNDMwNDUsCjQzMDQ2LApdLApbCjQzMDUyLAo0MzA1MiwKXSwKWwo0MzIwNCwKNDMyMDUsCl0sClsKNDMyMzIsCjQzMjQ5LApdLApbCjQzMjYzLAo0MzI2MywKXSwKWwo0MzMwMiwKNDMzMDksCl0sClsKNDMzMzUsCjQzMzQ1LApdLApbCjQzMzkyLAo0MzM5NCwKXSwKWwo0MzQ0MywKNDM0NDMsCl0sClsKNDM0NDYsCjQzNDQ5LApdLApbCjQzNDUyLAo0MzQ1MywKXSwKWwo0MzQ5MywKNDM0OTMsCl0sClsKNDM1NjEsCjQzNTY2LApdLApbCjQzNTY5LAo0MzU3MCwKXSwKWwo0MzU3MywKNDM1NzQsCl0sClsKNDM1ODcsCjQzNTg3LApdLApbCjQzNTk2LAo0MzU5NiwKXSwKWwo0MzY0NCwKNDM2NDQsCl0sClsKNDM2OTYsCjQzNjk2LApdLApbCjQzNjk4LAo0MzcwMCwKXSwKWwo0MzcwMywKNDM3MDQsCl0sClsKNDM3MTAsCjQzNzExLApdLApbCjQzNzEzLAo0MzcxMywKXSwKWwo0Mzc1NiwKNDM3NTcsCl0sClsKNDM3NjYsCjQzNzY2LApdLApbCjQ0MDA1LAo0NDAwNSwKXSwKWwo0NDAwOCwKNDQwMDgsCl0sClsKNDQwMTMsCjQ0MDEzLApdLApbCjY0Mjg2LAo2NDI4NiwKXSwKWwo2NTAyNCwKNjUwMzksCl0sClsKNjUwNTYsCjY1MDcxLApdLApbCjY2MDQ1LAo2NjA0NSwKXSwKWwo2NjI3MiwKNjYyNzIsCl0sClsKNjY0MjIsCjY2NDI2LApdLApbCjY4MDk3LAo2ODA5OSwKXSwKWwo2ODEwMSwKNjgxMDIsCl0sClsKNjgxMDgsCjY4MTExLApdLApbCjY4MTUyLAo2ODE1NCwKXSwKWwo2ODE1OSwKNjgxNTksCl0sClsKNjgzMjUsCjY4MzI2LApdLApbCjY4OTAwLAo2ODkwMywKXSwKWwo2OTI5MSwKNjkyOTIsCl0sClsKNjkzNzMsCjY5Mzc1LApdLApbCjY5NDQ2LAo2OTQ1NiwKXSwKWwo2OTUwNiwKNjk1MDksCl0sClsKNjk2MzMsCjY5NjMzLApdLApbCjY5Njg4LAo2OTcwMiwKXSwKWwo2OTc0NCwKNjk3NDQsCl0sClsKNjk3NDcsCjY5NzQ4LApdLApbCjY5NzU5LAo2OTc2MSwKXSwKWwo2OTgxMSwKNjk4MTQsCl0sClsKNjk4MTcsCjY5ODE4LApdLApbCjY5ODI2LAo2OTgyNiwKXSwKWwo2OTg4OCwKNjk4OTAsCl0sClsKNjk5MjcsCjY5OTMxLApdLApbCjY5OTMzLAo2OTk0MCwKXSwKWwo3MDAwMywKNzAwMDMsCl0sClsKNzAwMTYsCjcwMDE3LApdLApbCjcwMDcwLAo3MDA3OCwKXSwKWwo3MDA4OSwKNzAwOTIsCl0sClsKNzAwOTUsCjcwMDk1LApdLApbCjcwMTkxLAo3MDE5MywKXSwKWwo3MDE5NiwKNzAxOTYsCl0sClsKNzAxOTgsCjcwMTk5LApdLApbCjcwMjA2LAo3MDIwNiwKXSwKWwo3MDIwOSwKNzAyMDksCl0sClsKNzAzNjcsCjcwMzY3LApdLApbCjcwMzcxLAo3MDM3OCwKXSwKWwo3MDQwMCwKNzA0MDEsCl0sClsKNzA0NTksCjcwNDYwLApdLApbCjcwNDY0LAo3MDQ2NCwKXSwKWwo3MDUwMiwKNzA1MDgsCl0sClsKNzA1MTIsCjcwNTE2LApdLApbCjcwNzEyLAo3MDcxOSwKXSwKWwo3MDcyMiwKNzA3MjQsCl0sClsKNzA3MjYsCjcwNzI2LApdLApbCjcwNzUwLAo3MDc1MCwKXSwKWwo3MDgzNSwKNzA4NDAsCl0sClsKNzA4NDIsCjcwODQyLApdLApbCjcwODQ3LAo3MDg0OCwKXSwKWwo3MDg1MCwKNzA4NTEsCl0sClsKNzEwOTAsCjcxMDkzLApdLApbCjcxMTAwLAo3MTEwMSwKXSwKWwo3MTEwMywKNzExMDQsCl0sClsKNzExMzIsCjcxMTMzLApdLApbCjcxMjE5LAo3MTIyNiwKXSwKWwo3MTIyOSwKNzEyMjksCl0sClsKNzEyMzEsCjcxMjMyLApdLApbCjcxMzM5LAo3MTMzOSwKXSwKWwo3MTM0MSwKNzEzNDEsCl0sClsKNzEzNDQsCjcxMzQ5LApdLApbCjcxMzUxLAo3MTM1MSwKXSwKWwo3MTQ1MywKNzE0NTUsCl0sClsKNzE0NTgsCjcxNDYxLApdLApbCjcxNDYzLAo3MTQ2NywKXSwKWwo3MTcyNywKNzE3MzUsCl0sClsKNzE3MzcsCjcxNzM4LApdLApbCjcxOTk1LAo3MTk5NiwKXSwKWwo3MTk5OCwKNzE5OTgsCl0sClsKNzIwMDMsCjcyMDAzLApdLApbCjcyMTQ4LAo3MjE1MSwKXSwKWwo3MjE1NCwKNzIxNTUsCl0sClsKNzIxNjAsCjcyMTYwLApdLApbCjcyMTkzLAo3MjIwMiwKXSwKWwo3MjI0MywKNzIyNDgsCl0sClsKNzIyNTEsCjcyMjU0LApdLApbCjcyMjYzLAo3MjI2MywKXSwKWwo3MjI3MywKNzIyNzgsCl0sClsKNzIyODEsCjcyMjgzLApdLApbCjcyMzMwLAo3MjM0MiwKXSwKWwo3MjM0NCwKNzIzNDUsCl0sClsKNzI3NTIsCjcyNzU4LApdLApbCjcyNzYwLAo3Mjc2NSwKXSwKWwo3Mjc2NywKNzI3NjcsCl0sClsKNzI4NTAsCjcyODcxLApdLApbCjcyODc0LAo3Mjg4MCwKXSwKWwo3Mjg4MiwKNzI4ODMsCl0sClsKNzI4ODUsCjcyODg2LApdLApbCjczMDA5LAo3MzAxNCwKXSwKWwo3MzAxOCwKNzMwMTgsCl0sClsKNzMwMjAsCjczMDIxLApdLApbCjczMDIzLAo3MzAyOSwKXSwKWwo3MzAzMSwKNzMwMzEsCl0sClsKNzMxMDQsCjczMTA1LApdLApbCjczMTA5LAo3MzEwOSwKXSwKWwo3MzExMSwKNzMxMTEsCl0sClsKNzM0NTksCjczNDYwLApdLApbCjczNDcyLAo3MzQ3MywKXSwKWwo3MzUyNiwKNzM1MzAsCl0sClsKNzM1MzYsCjczNTM2LApdLApbCjczNTM4LAo3MzUzOCwKXSwKWwo3ODkxMiwKNzg5MTIsCl0sClsKNzg5MTksCjc4OTMzLApdLApbCjkyOTEyLAo5MjkxNiwKXSwKWwo5Mjk3NiwKOTI5ODIsCl0sClsKOTQwMzEsCjk0MDMxLApdLApbCjk0MDk1LAo5NDA5OCwKXSwKWwo5NDE4MCwKOTQxODAsCl0sClsKMTEzODIxLAoxMTM4MjIsCl0sClsKMTE4NTI4LAoxMTg1NzMsCl0sClsKMTE4NTc2LAoxMTg1OTgsCl0sClsKMTE5MTQzLAoxMTkxNDUsCl0sClsKMTE5MTYzLAoxMTkxNzAsCl0sClsKMTE5MTczLAoxMTkxNzksCl0sClsKMTE5MjEwLAoxMTkyMTMsCl0sClsKMTE5MzYyLAoxMTkzNjQsCl0sClsKMTIxMzQ0LAoxMjEzOTgsCl0sClsKMTIxNDAzLAoxMjE0NTIsCl0sClsKMTIxNDYxLAoxMjE0NjEsCl0sClsKMTIxNDc2LAoxMjE0NzYsCl0sClsKMTIxNDk5LAoxMjE1MDMsCl0sClsKMTIxNTA1LAoxMjE1MTksCl0sClsKMTIyODgwLAoxMjI4ODYsCl0sClsKMTIyODg4LAoxMjI5MDQsCl0sClsKMTIyOTA3LAoxMjI5MTMsCl0sClsKMTIyOTE1LAoxMjI5MTYsCl0sClsKMTIyOTE4LAoxMjI5MjIsCl0sClsKMTIzMDIzLAoxMjMwMjMsCl0sClsKMTIzMTg0LAoxMjMxOTAsCl0sClsKMTIzNTY2LAoxMjM1NjYsCl0sClsKMTIzNjI4LAoxMjM2MzEsCl0sClsKMTI0MTQwLAoxMjQxNDMsCl0sClsKMTI1MTM2LAoxMjUxNDIsCl0sClsKMTI1MjUyLAoxMjUyNTgsCl0sClsKOTE3NzYwLAo5MTc5OTksCl0sCl07Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKHU6OmNsYXNzKSkgewpmdW5jdGlvbiB1KD9zdHJpbmcgJHN0cmluZyA9ICcnKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nID8/ICcnKTsKfQp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoYjo6Y2xhc3MpKSB7CmZ1bmN0aW9uIGIoP3N0cmluZyAkc3RyaW5nID0gJycpOiBCeXRlU3RyaW5nCnsKcmV0dXJuIG5ldyBCeXRlU3RyaW5nKCRzdHJpbmcgPz8gJycpOwp9Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cyhzOjpjbGFzcykpIHsKCgoKZnVuY3Rpb24gcyg/c3RyaW5nICRzdHJpbmcgPSAnJyk6IEFic3RyYWN0U3RyaW5nCnsKJHN0cmluZyA9ICRzdHJpbmcgPz8gJyc7CgpyZXR1cm4gcHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykgPyBuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nKSA6IG5ldyBCeXRlU3RyaW5nKCRzdHJpbmcpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcU2x1Z2dlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcQWJzdHJhY3RVbmljb2RlU3RyaW5nOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFVuaWNvZGVTdHJpbmc7CnVzZSBTeW1mb255XENvbnRyYWN0c1xUcmFuc2xhdGlvblxMb2NhbGVBd2FyZUludGVyZmFjZTsKCmlmICghaW50ZXJmYWNlX2V4aXN0cyhMb2NhbGVBd2FyZUludGVyZmFjZTo6Y2xhc3MpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlIHRoZSAiU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFNsdWdnZXJcQXNjaWlTbHVnZ2VyIiBhcyB0aGUgInN5bWZvbnkvdHJhbnNsYXRpb24tY29udHJhY3RzIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQuIFRyeSBydW5uaW5nICJjb21wb3NlciByZXF1aXJlIHN5bWZvbnkvdHJhbnNsYXRpb24tY29udHJhY3RzIi4nKTsKfQoKCgoKY2xhc3MgQXNjaWlTbHVnZ2VyIGltcGxlbWVudHMgU2x1Z2dlckludGVyZmFjZSwgTG9jYWxlQXdhcmVJbnRlcmZhY2UKewpwcml2YXRlIGNvbnN0IExPQ0FMRV9UT19UUkFOU0xJVEVSQVRPUl9JRCA9IFsKJ2FtJyA9PiAnQW1oYXJpYy1MYXRpbicsCidhcicgPT4gJ0FyYWJpYy1MYXRpbicsCidheicgPT4gJ0F6ZXJiYWlqYW5pLUxhdGluJywKJ2JlJyA9PiAnQmVsYXJ1c2lhbi1MYXRpbicsCidiZycgPT4gJ0J1bGdhcmlhbi1MYXRpbicsCidibicgPT4gJ0JlbmdhbGktTGF0aW4nLAonZGUnID0+ICdkZS1BU0NJSScsCidlbCcgPT4gJ0dyZWVrLUxhdGluJywKJ2ZhJyA9PiAnUGVyc2lhbi1MYXRpbicsCidoZScgPT4gJ0hlYnJldy1MYXRpbicsCidoeScgPT4gJ0FybWVuaWFuLUxhdGluJywKJ2thJyA9PiAnR2VvcmdpYW4tTGF0aW4nLAona2snID0+ICdLYXpha2gtTGF0aW4nLAona3knID0+ICdLaXJnaGl6LUxhdGluJywKJ2tvJyA9PiAnS29yZWFuLUxhdGluJywKJ21rJyA9PiAnTWFjZWRvbmlhbi1MYXRpbicsCidtbicgPT4gJ01vbmdvbGlhbi1MYXRpbicsCidvcicgPT4gJ09yaXlhLUxhdGluJywKJ3BzJyA9PiAnUGFzaHRvLUxhdGluJywKJ3J1JyA9PiAnUnVzc2lhbi1MYXRpbicsCidzcicgPT4gJ1NlcmJpYW4tTGF0aW4nLAonc3JfQ3lybCcgPT4gJ1NlcmJpYW4tTGF0aW4nLAondGgnID0+ICdUaGFpLUxhdGluJywKJ3RrJyA9PiAnVHVya21lbi1MYXRpbicsCid1aycgPT4gJ1VrcmFpbmlhbi1MYXRpbicsCid1eicgPT4gJ1V6YmVrLUxhdGluJywKJ3poJyA9PiAnSGFuLUxhdGluJywKXTsKCnByaXZhdGUgJGRlZmF1bHRMb2NhbGU7CnByaXZhdGUgJHN5bWJvbHNNYXAgPSBbCidlbicgPT4gWydAJyA9PiAnYXQnLCAnJicgPT4gJ2FuZCddLApdOwoKCgoKCgpwcml2YXRlICR0cmFuc2xpdGVyYXRvcnMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGRlZmF1bHRMb2NhbGUgPSBudWxsLCAkc3ltYm9sc01hcCA9IG51bGwpCnsKaWYgKG51bGwgIT09ICRzeW1ib2xzTWFwICYmICFcaXNfYXJyYXkoJHN5bWJvbHNNYXApICYmICEkc3ltYm9sc01hcCBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIGFycmF5LCBDbG9zdXJlIG9yIG51bGwsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgXGdldHR5cGUoJHN5bWJvbHNNYXApKSk7Cn0KCiR0aGlzLT5kZWZhdWx0TG9jYWxlID0gJGRlZmF1bHRMb2NhbGU7CiR0aGlzLT5zeW1ib2xzTWFwID0gJHN5bWJvbHNNYXAgPz8gJHRoaXMtPnN5bWJvbHNNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NhbGUoJGxvY2FsZSkKewokdGhpcy0+ZGVmYXVsdExvY2FsZSA9ICRsb2NhbGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbGUoKQp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdExvY2FsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNsdWcoc3RyaW5nICRzdHJpbmcsIHN0cmluZyAkc2VwYXJhdG9yID0gJy0nLCBzdHJpbmcgJGxvY2FsZSA9IG51bGwpOiBBYnN0cmFjdFVuaWNvZGVTdHJpbmcKewokbG9jYWxlID0gJGxvY2FsZSA/PyAkdGhpcy0+ZGVmYXVsdExvY2FsZTsKCiR0cmFuc2xpdGVyYXRvciA9IFtdOwppZiAoJGxvY2FsZSAmJiAoJ2RlJyA9PT0gJGxvY2FsZSB8fCAwID09PSBzdHJwb3MoJGxvY2FsZSwgJ2RlXycpKSkgewoKJHRyYW5zbGl0ZXJhdG9yID0gWydkZS1BU0NJSSddOwp9IGVsc2VpZiAoXGZ1bmN0aW9uX2V4aXN0cygndHJhbnNsaXRlcmF0b3JfdHJhbnNsaXRlcmF0ZScpICYmICRsb2NhbGUpIHsKJHRyYW5zbGl0ZXJhdG9yID0gKGFycmF5KSAkdGhpcy0+Y3JlYXRlVHJhbnNsaXRlcmF0b3IoJGxvY2FsZSk7Cn0KCmlmICgkdGhpcy0+c3ltYm9sc01hcCBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CgoKJHN5bWJvbHNNYXAgPSAkdGhpcy0+c3ltYm9sc01hcDsKYXJyYXlfdW5zaGlmdCgkdHJhbnNsaXRlcmF0b3IsIHN0YXRpYyBmdW5jdGlvbiAoJHMpIHVzZSAoJHN5bWJvbHNNYXAsICRsb2NhbGUpIHsKcmV0dXJuICRzeW1ib2xzTWFwKCRzLCAkbG9jYWxlKTsKfSk7Cn0KCiR1bmljb2RlU3RyaW5nID0gKG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcpKS0+YXNjaWkoJHRyYW5zbGl0ZXJhdG9yKTsKCmlmIChcaXNfYXJyYXkoJHRoaXMtPnN5bWJvbHNNYXApKSB7CiRtYXAgPSBudWxsOwppZiAoaXNzZXQoJHRoaXMtPnN5bWJvbHNNYXBbJGxvY2FsZV0pKSB7CiRtYXAgPSAkdGhpcy0+c3ltYm9sc01hcFskbG9jYWxlXTsKfSBlbHNlIHsKJHBhcmVudCA9IHNlbGY6OmdldFBhcmVudExvY2FsZSgkbG9jYWxlKTsKaWYgKCRwYXJlbnQgJiYgaXNzZXQoJHRoaXMtPnN5bWJvbHNNYXBbJHBhcmVudF0pKSB7CiRtYXAgPSAkdGhpcy0+c3ltYm9sc01hcFskcGFyZW50XTsKfQp9CmlmICgkbWFwKSB7CmZvcmVhY2ggKCRtYXAgYXMgJGNoYXIgPT4gJHJlcGxhY2UpIHsKJHVuaWNvZGVTdHJpbmcgPSAkdW5pY29kZVN0cmluZy0+cmVwbGFjZSgkY2hhciwgJyAnLiRyZXBsYWNlLicgJyk7Cn0KfQp9CgpyZXR1cm4gJHVuaWNvZGVTdHJpbmcKLT5yZXBsYWNlTWF0Y2hlcygnL1teQS1aYS16MC05XSsrLycsICRzZXBhcmF0b3IpCi0+dHJpbSgkc2VwYXJhdG9yKQo7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlVHJhbnNsaXRlcmF0b3Ioc3RyaW5nICRsb2NhbGUpOiA/XFRyYW5zbGl0ZXJhdG9yCnsKaWYgKFxhcnJheV9rZXlfZXhpc3RzKCRsb2NhbGUsICR0aGlzLT50cmFuc2xpdGVyYXRvcnMpKSB7CnJldHVybiAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzWyRsb2NhbGVdOwp9CgoKaWYgKCRpZCA9IHNlbGY6OkxPQ0FMRV9UT19UUkFOU0xJVEVSQVRPUl9JRFskbG9jYWxlXSA/PyBudWxsKSB7CnJldHVybiAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzWyRsb2NhbGVdID0gXFRyYW5zbGl0ZXJhdG9yOjpjcmVhdGUoJGlkLicvQkdOJykgPz8gXFRyYW5zbGl0ZXJhdG9yOjpjcmVhdGUoJGlkKTsKfQoKCmlmICghJHBhcmVudCA9IHNlbGY6OmdldFBhcmVudExvY2FsZSgkbG9jYWxlKSkgewpyZXR1cm4gJHRoaXMtPnRyYW5zbGl0ZXJhdG9yc1skbG9jYWxlXSA9IG51bGw7Cn0KCgppZiAoJGlkID0gc2VsZjo6TE9DQUxFX1RPX1RSQU5TTElURVJBVE9SX0lEWyRwYXJlbnRdID8/IG51bGwpIHsKJHRyYW5zbGl0ZXJhdG9yID0gXFRyYW5zbGl0ZXJhdG9yOjpjcmVhdGUoJGlkLicvQkdOJykgPz8gXFRyYW5zbGl0ZXJhdG9yOjpjcmVhdGUoJGlkKTsKfQoKcmV0dXJuICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJGxvY2FsZV0gPSAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzWyRwYXJlbnRdID0gJHRyYW5zbGl0ZXJhdG9yID8/IG51bGw7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFBhcmVudExvY2FsZSg/c3RyaW5nICRsb2NhbGUpOiA/c3RyaW5nCnsKaWYgKCEkbG9jYWxlKSB7CnJldHVybiBudWxsOwp9CmlmIChmYWxzZSA9PT0gJHN0ciA9IHN0cnJjaHIoJGxvY2FsZSwgJ18nKSkgewoKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBzdWJzdHIoJGxvY2FsZSwgMCwgLVxzdHJsZW4oJHN0cikpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcU2x1Z2dlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcQWJzdHJhY3RVbmljb2RlU3RyaW5nOwoKCgoKCgppbnRlcmZhY2UgU2x1Z2dlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzbHVnKHN0cmluZyAkc3RyaW5nLCBzdHJpbmcgJHNlcGFyYXRvciA9ICctJywgc3RyaW5nICRsb2NhbGUgPSBudWxsKTogQWJzdHJhY3RVbmljb2RlU3RyaW5nOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgVW5pY29kZVN0cmluZyBleHRlbmRzIEFic3RyYWN0VW5pY29kZVN0cmluZwp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHN0cmluZyA9ICcnKQp7CiR0aGlzLT5zdHJpbmcgPSBub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0cmluZykgPyAkc3RyaW5nIDogbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0cmluZyk7CgppZiAoZmFsc2UgPT09ICR0aGlzLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZChzdHJpbmcgLi4uJHN1ZmZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nLigxID49IFxjb3VudCgkc3VmZml4KSA/ICgkc3VmZml4WzBdID8/ICcnKSA6IGltcGxvZGUoJycsICRzdWZmaXgpKTsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGNodW5rKGludCAkbGVuZ3RoID0gMSk6IGFycmF5CnsKaWYgKDEgPiAkbGVuZ3RoKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBjaHVuayBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKfQoKaWYgKCcnID09PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiBbXTsKfQoKJHJ4ID0gJy8oJzsKd2hpbGUgKDY1NTM1IDwgJGxlbmd0aCkgewokcnggLj0gJ1xYezY1NTM1fSc7CiRsZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICdcWHsnLiRsZW5ndGguJ30pL3UnOwoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gW107Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCRyeCwgJHRoaXMtPnN0cmluZywgLTEsIFxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgfCBcUFJFR19TUExJVF9OT19FTVBUWSkgYXMgJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICgkc3VmZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN1ZmZpeCwgJGZvcm0pID86ICRzdWZmaXggPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3VmZml4LCAkZm9ybSk7CgppZiAoJycgPT09ICRzdWZmaXggfHwgZmFsc2UgPT09ICRzdWZmaXgpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IG1iX3N0cmlwb3MoZ3JhcGhlbWVfZXh0cmFjdCgkdGhpcy0+c3RyaW5nLCBcc3RybGVuKCRzdWZmaXgpLCBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUywgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAtIFxzdHJsZW4oJHN1ZmZpeCkpLCAkc3VmZml4LCAwLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRzdWZmaXggPT09IGdyYXBoZW1lX2V4dHJhY3QoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkc3VmZml4KSwgXEdSQVBIRU1FX0VYVFJfTUFYQllURVMsIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgLSBcc3RybGVuKCRzdWZmaXgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCRzdHJpbmcgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokc3RyaW5nID0gJHN0cmluZy0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdHJpbmcpIHx8ICRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZXF1YWxzVG8oJHN0cmluZyk7Cn0gZWxzZSB7CiRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSkgPzogJHN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHJpbmcsICRmb3JtKTsKCmlmICgnJyAhPT0gJHN0cmluZyAmJiBmYWxzZSAhPT0gJHN0cmluZyAmJiAkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gXHN0cmxlbigkc3RyaW5nKSA9PT0gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAmJiAwID09PSBtYl9zdHJpcG9zKCR0aGlzLT5zdHJpbmcsICRzdHJpbmcsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gJHN0cmluZyA9PT0gJHRoaXMtPnN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2YoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2YoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkbmVlZGxlLCAkZm9ybSkgPzogJG5lZWRsZSA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRuZWVkbGUsICRmb3JtKTsKCmlmICgnJyA9PT0gJG5lZWRsZSB8fCBmYWxzZSA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKdHJ5IHsKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IGdyYXBoZW1lX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCkgOiBncmFwaGVtZV9zdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7Cn0gY2F0Y2ggKFxWYWx1ZUVycm9yICRlKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2ZMYXN0KCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJG5lZWRsZSwgJGZvcm0pID86ICRuZWVkbGUgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkbmVlZGxlLCAkZm9ybSk7CgppZiAoJycgPT09ICRuZWVkbGUgfHwgZmFsc2UgPT09ICRuZWVkbGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRzdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKaWYgKDAgPiAkb2Zmc2V0KSB7CgppZiAoMCA+ICRvZmZzZXQgKz0gZ3JhcGhlbWVfc3RybGVuKCRuZWVkbGUpKSB7CiRzdHJpbmcgPSBncmFwaGVtZV9zdWJzdHIoJHN0cmluZywgMCwgJG9mZnNldCk7Cn0KJG9mZnNldCA9IDA7Cn0KCiRpID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBncmFwaGVtZV9zdHJyaXBvcygkc3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KSA6IGdyYXBoZW1lX3N0cnJwb3MoJHN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gam9pbihhcnJheSAkc3RyaW5ncywgc3RyaW5nICRsYXN0R2x1ZSA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBwYXJlbnQ6OmpvaW4oJHN0cmluZ3MsICRsYXN0R2x1ZSk7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gZ3JhcGhlbWVfc3RybGVuKCR0aGlzLT5zdHJpbmcpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplKGludCAkZm9ybSA9IHNlbGY6Ok5GQyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcaW5fYXJyYXkoJGZvcm0sIFtzZWxmOjpORkMsIHNlbGY6Ok5GS0NdLCB0cnVlKSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nLCAkZm9ybSkgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkZm9ybSk7Cn0gZWxzZWlmICghXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZELCBzZWxmOjpORktEXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5zdXBwb3J0ZWQgbm9ybWFsaXphdGlvbiBmb3JtLicpOwp9IGVsc2VpZiAoIW5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcsICRmb3JtKSkgewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsICRmb3JtKTsKJHN0ci0+aWdub3JlQ2FzZSA9IG51bGw7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoMSA+PSBcY291bnQoJHByZWZpeCkgPyAoJHByZWZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkcHJlZml4KSkuJHRoaXMtPnN0cmluZzsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyaW5nICRmcm9tLCBzdHJpbmcgJHRvKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gY2xvbmUgJHRoaXM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkZnJvbSkgPzogJGZyb20gPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkZnJvbSk7CgppZiAoJycgIT09ICRmcm9tICYmIGZhbHNlICE9PSAkZnJvbSkgewokdGFpbCA9ICRzdHItPnN0cmluZzsKJHJlc3VsdCA9ICcnOwokaW5kZXhPZiA9ICR0aGlzLT5pZ25vcmVDYXNlID8gJ2dyYXBoZW1lX3N0cmlwb3MnIDogJ2dyYXBoZW1lX3N0cnBvcyc7Cgp3aGlsZSAoJycgIT09ICR0YWlsICYmIGZhbHNlICE9PSAkaSA9ICRpbmRleE9mKCR0YWlsLCAkZnJvbSkpIHsKJHNsaWNlID0gZ3JhcGhlbWVfc3Vic3RyKCR0YWlsLCAwLCAkaSk7CiRyZXN1bHQgLj0gJHNsaWNlLiR0bzsKJHRhaWwgPSBzdWJzdHIoJHRhaWwsIFxzdHJsZW4oJHNsaWNlKSArIFxzdHJsZW4oJGZyb20pKTsKfQoKJHN0ci0+c3RyaW5nID0gJHJlc3VsdC4kdGFpbDsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBwYXJlbnQ6OnJlcGxhY2VNYXRjaGVzKCRmcm9tUmVnZXhwLCAkdG8pOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgaW50ICRsZW5ndGggPSBudWxsKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDAgJiYgMCA+ICRzdGFydCAmJiBncmFwaGVtZV9zdHJsZW4oJHRoaXMtPnN0cmluZykgPCAtJHN0YXJ0KSB7CiRzdGFydCA9IDA7Cn0KJHN0ci0+c3RyaW5nID0gKHN0cmluZykgZ3JhcGhlbWVfc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGxlbmd0aCA/PyAyMTQ3NDgzNjQ3KTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaWNlKHN0cmluZyAkcmVwbGFjZW1lbnQsIGludCAkc3RhcnQgPSAwLCBpbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiAwID4gJHN0YXJ0ICYmIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKSA8IC0kc3RhcnQpIHsKJHN0YXJ0ID0gMDsKfQokc3RhcnQgPSAkc3RhcnQgPyBcc3RybGVuKGdyYXBoZW1lX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAwLCAkc3RhcnQpKSA6IDA7CiRsZW5ndGggPSAkbGVuZ3RoID8gXHN0cmxlbihncmFwaGVtZV9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpKSA6ICRsZW5ndGg7CiRzdHItPnN0cmluZyA9IHN1YnN0cl9yZXBsYWNlKCR0aGlzLT5zdHJpbmcsICRyZXBsYWNlbWVudCwgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKaWYgKGZhbHNlID09PSAkc3RyLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsIGludCAkbGltaXQgPSBudWxsLCBpbnQgJGZsYWdzID0gbnVsbCk6IGFycmF5CnsKaWYgKDEgPiAkbGltaXQgPSAkbGltaXQgPz8gMjE0NzQ4MzY0Nykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTsKfQoKaWYgKCcnID09PSAkZGVsaW1pdGVyKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGRlbGltaXRlciBpcyBlbXB0eS4nKTsKfQoKaWYgKG51bGwgIT09ICRmbGFncykgewpyZXR1cm4gcGFyZW50OjpzcGxpdCgkZGVsaW1pdGVyLid1JywgJGxpbWl0LCAkZmxhZ3MpOwp9Cgpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJGRlbGltaXRlcikgPzogJGRlbGltaXRlciA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRkZWxpbWl0ZXIpOwoKaWYgKGZhbHNlID09PSAkZGVsaW1pdGVyKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGRlbGltaXRlciBpcyBub3QgYSB2YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHRhaWwgPSAkdGhpcy0+c3RyaW5nOwokY2h1bmtzID0gW107CiRpbmRleE9mID0gJHRoaXMtPmlnbm9yZUNhc2UgPyAnZ3JhcGhlbWVfc3RyaXBvcycgOiAnZ3JhcGhlbWVfc3RycG9zJzsKCndoaWxlICgxIDwgJGxpbWl0ICYmIGZhbHNlICE9PSAkaSA9ICRpbmRleE9mKCR0YWlsLCAkZGVsaW1pdGVyKSkgewokc3RyLT5zdHJpbmcgPSBncmFwaGVtZV9zdWJzdHIoJHRhaWwsIDAsICRpKTsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKJHRhaWwgPSBzdWJzdHIoJHRhaWwsIFxzdHJsZW4oJHN0ci0+c3RyaW5nKSArIFxzdHJsZW4oJGRlbGltaXRlcikpOwotLSRsaW1pdDsKfQoKJHN0ci0+c3RyaW5nID0gJHRhaWw7CiRjaHVua3NbXSA9IGNsb25lICRzdHI7CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoJHByZWZpeCk6IGJvb2wKewppZiAoJHByZWZpeCBpbnN0YW5jZW9mIEFic3RyYWN0U3RyaW5nKSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHByZWZpeCkgfHwgJHByZWZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjpzdGFydHNXaXRoKCRwcmVmaXgpOwp9IGVsc2UgewokcHJlZml4ID0gKHN0cmluZykgJHByZWZpeDsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHByZWZpeCwgJGZvcm0pID86ICRwcmVmaXggPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkcHJlZml4LCAkZm9ybSk7CgppZiAoJycgPT09ICRwcmVmaXggfHwgZmFsc2UgPT09ICRwcmVmaXgpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IG1iX3N0cmlwb3MoZ3JhcGhlbWVfZXh0cmFjdCgkdGhpcy0+c3RyaW5nLCBcc3RybGVuKCRwcmVmaXgpLCBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUyksICRwcmVmaXgsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gJHByZWZpeCA9PT0gZ3JhcGhlbWVfZXh0cmFjdCgkdGhpcy0+c3RyaW5nLCBcc3RybGVuKCRwcmVmaXgpLCBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCnsKaWYgKCFcaXNfc3RyaW5nKCR0aGlzLT5zdHJpbmcpKSB7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCR0aGlzLT5zdHJpbmcpID86ICR0aGlzLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkdGhpcy0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CmlmIChudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHRoaXMtPnN0cmluZykgPzogJHRoaXMtPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCR0aGlzLT5zdHJpbmcpOwp9CgokdGhpcy0+aWdub3JlQ2FzZSA9IGZhbHNlOwp9Cn0KPD9waHAKCmlmIChQSFBfU0FQSSAhPT0gJ2NsaScgJiYgUEhQX1NBUEkgIT09ICdwaHBkYmcnKSB7CiAgICBpZiAoMCA9PT0gc3RycG9zKF9fRklMRV9fLCAncGhhcjonKSAmJiBpbmlfZ2V0KCdyZWdpc3Rlcl9hcmdjX2FyZ3YnKSkgewogICAgICAgIGVjaG8gJ0NvbXBvc2VyIGNhbm5vdCBiZSBydW4gc2FmZWx5IG9uIG5vbi1DTEkgU0FQSXMgd2l0aCByZWdpc3Rlcl9hcmdjX2FyZ3Y9T24uIEFib3J0aW5nLicuUEhQX0VPTDsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIGVjaG8gJ1dhcm5pbmc6IENvbXBvc2VyIHNob3VsZCBiZSBpbnZva2VkIHZpYSB0aGUgQ0xJIHZlcnNpb24gb2YgUEhQLCBub3QgdGhlICcuUEhQX1NBUEkuJyBTQVBJJy5QSFBfRU9MOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDIwNSkgewogICAgZWNobyAnQ29tcG9zZXIgMi4zLjAgZHJvcHBlZCBzdXBwb3J0IGZvciBQSFAgPDcuMi41IGFuZCB5b3UgYXJlIHJ1bm5pbmcgJy5QSFBfVkVSU0lPTi4nLCBwbGVhc2UgdXBncmFkZSBQSFAgb3IgdXNlIENvbXBvc2VyIDIuMiBMVFMgdmlhICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLTIuMiIuIEFib3J0aW5nLicuUEhQX0VPTDsKICAgIGV4aXQoMSk7Cn0KCnNldGxvY2FsZShMQ19BTEwsICdDJyk7CnJlcXVpcmUgX19ESVJfXy4nLy4uL3NyYy9ib290c3RyYXAucGhwJzsKCnVzZSBDb21wb3NlclxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlclxYZGVidWdIYW5kbGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcRXJyb3JIYW5kbGVyOwoKZXJyb3JfcmVwb3J0aW5nKC0xKTsKCi8vIFJlc3RhcnQgd2l0aG91dCBYZGVidWcKJHhkZWJ1ZyA9IG5ldyBYZGVidWdIYW5kbGVyKCdDb21wb3NlcicpOwokeGRlYnVnLT5jaGVjaygpOwp1bnNldCgkeGRlYnVnKTsKCmlmIChkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSAmJiB2ZXJzaW9uX2NvbXBhcmUoSEhWTV9WRVJTSU9OLCAnNC4wJywgJz49JykpIHsKICAgIGVjaG8gJ0hIVk0gNC4wIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yIENvbXBvc2VyLCBwbGVhc2UgdXNlIFBIUCBpbnN0ZWFkLiBBYm9ydGluZy4nLlBIUF9FT0w7CiAgICBleGl0KDEpOwp9CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnaWNvbnYnKSAmJiAhZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewogICAgZWNobyAnVGhlIGljb252IE9SIG1ic3RyaW5nIGV4dGVuc2lvbiBpcyByZXF1aXJlZCBhbmQgYm90aCBhcmUgbWlzc2luZy4nCiAgICAgICAgLlBIUF9FT0wuJ0luc3RhbGwgZWl0aGVyIG9mIHRoZW0gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1pY29udi4nCiAgICAgICAgLlBIUF9FT0wuJ0Fib3J0aW5nLicuUEhQX0VPTDsKICAgIGV4aXQoMSk7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2luaV9zZXQnKSkgewogICAgQGluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgJzEnKTsKCiAgICAvLyBTZXQgdXNlciBkZWZpbmVkIG1lbW9yeSBsaW1pdAogICAgaWYgKCRtZW1vcnlMaW1pdCA9IGdldGVudignQ09NUE9TRVJfTUVNT1JZX0xJTUlUJykpIHsKICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJG1lbW9yeUxpbWl0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgJG1lbW9yeUluQnl0ZXMgPSBmdW5jdGlvbiAoJHZhbHVlKSB7CiAgICAgICAgICAgICR1bml0ID0gc3RydG9sb3dlcihzdWJzdHIoJHZhbHVlLCAtMSwgMSkpOwogICAgICAgICAgICAkdmFsdWUgPSAoaW50KSAkdmFsdWU7CiAgICAgICAgICAgIHN3aXRjaCgkdW5pdCkgewogICAgICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlICo9IDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsgKGN1bXVsYXRpdmUgbXVsdGlwbGllcikKICAgICAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAxMDI0OwogICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrIChjdW11bGF0aXZlIG11bHRpcGxpZXIpCiAgICAgICAgICAgICAgICBjYXNlICdrJzoKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgKj0gMTAyNDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9OwoKICAgICAgICAkbWVtb3J5TGltaXQgPSB0cmltKGluaV9nZXQoJ21lbW9yeV9saW1pdCcpKTsKICAgICAgICAvLyBJbmNyZWFzZSBtZW1vcnlfbGltaXQgaWYgaXQgaXMgbG93ZXIgdGhhbiAxLjVHQgogICAgICAgIGlmICgkbWVtb3J5TGltaXQgIT0gLTEgJiYgJG1lbW9yeUluQnl0ZXMoJG1lbW9yeUxpbWl0KSA8IDEwMjQgKiAxMDI0ICogMTUzNikgewogICAgICAgICAgICBAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzE1MzZNJyk7CiAgICAgICAgfQogICAgICAgIHVuc2V0KCRtZW1vcnlJbkJ5dGVzKTsKICAgIH0KICAgIHVuc2V0KCRtZW1vcnlMaW1pdCk7Cn0KCi8vIFdvcmthcm91bmQgUEhQIGJ1ZyBvbiBXaW5kb3dzIHdoZXJlIGVudiB2YXJzIGNvbnRhaW5pbmcgVW5pY29kZSBjaGFycyBhcmUgbWFuZ2xlZCBpbiAkX1NFUlZFUgovLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3BocC9waHAtc3JjL2lzc3Vlcy83ODk2CmlmIChQSFBfVkVSU0lPTl9JRCA+PSA3MDExMyAmJiAoUEhQX1ZFUlNJT05fSUQgPCA4MDAxNiB8fCAoUEhQX1ZFUlNJT05fSUQgPj0gODAxMDAgJiYgUEhQX1ZFUlNJT05fSUQgPCA4MDEwMykpICYmIFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewogICAgZm9yZWFjaCAoJF9TRVJWRVIgYXMgJHNlcnZlclZhciA9PiAkc2VydmVyVmFsKSB7CiAgICAgICAgaWYgKCgkc2VydmVyVmFsID0gZ2V0ZW52KCRzZXJ2ZXJWYXIpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJF9TRVJWRVJbJHNlcnZlclZhcl0gPSAkc2VydmVyVmFsOwogICAgICAgIH0KICAgIH0KfQoKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfQklOQVJZJywgcmVhbHBhdGgoJF9TRVJWRVJbJ2FyZ3YnXVswXSkpOwoKRXJyb3JIYW5kbGVyOjpyZWdpc3RlcigpOwoKLy8gcnVuIHRoZSBjb21tYW5kIGFwcGxpY2F0aW9uCiRhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbigpOwokYXBwbGljYXRpb24tPnJ1bigpOwoKQ29weXJpZ2h0IChjKSBOaWxzIEFkZXJtYW5uLCBKb3JkaSBCb2dnaWFubwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCm1gSFHbFIF5YVMCYAYuEgBuUkrQgn3ke3T1QXUEe8D9RC3PVnerRNJOIac3w5ZDh5pp0JmEO6pffLow0E+q6cAEAAAAR0JNQg==
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 1
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
composer
2.73 MB
lrwxr-xr-x
2023-11-03 17:20:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).